1. 程式人生 > >POI操作Excel

POI操作Excel

遍歷 || group merge 用戶 post enc 瀏覽器信息 使用

一、POI概述

  Apache POI是Apache軟件基金會的開放源碼函式庫,POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能。

  結構:
    • HSSF - 提供讀寫Microsoft Excel格式檔案的功能。
    • XSSF - 提供讀寫Microsoft Excel OOXML格式檔案的功能。
    • HWPF - 提供讀寫Microsoft Word格式檔案的功能。
    • HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能。
    • HDGF - 提供讀寫Microsoft Visio格式檔案的功能。

  使用必須引入依賴

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

  註:3.17版本是支持jdk6的最後版本

二、HSSF概況

  HSSF 是Horrible SpreadSheet Format的縮寫,通過HSSF,你可以用純Java代碼來讀取、寫入、修改Excel文件。HSSF 為讀取操作提供了兩類API:usermodel和eventusermodel,即“用戶模型”和“事件-用戶模型”。

三、 POI EXCEL文檔結構類

  • HSSFWorkbook excel文檔對象
  • HSSFSheet excel的sheet
  • HSSFRow excel的行
  • HSSFCell excel的單元格
  • HSSFFont excel字體
  • HSSFName 名稱
  • HSSFDataFormat 日期格式
  • HSSFHeader sheet頭
  • HSSFFooter sheet尾
  • HSSFCellStyle cell樣式
  • HSSFDateUtil 日期
  • HSSFPrintSetup 打印
  • HSSFErrorConstants 錯誤信息表

四、EXCEL的讀寫操作

1、讀取“區域數據.xls”並儲存於list集合中,“區域數據.xls”如下圖

技術分享圖片

 1 public List<Area> importXLS(){
 2 
 3     ArrayList<Area> list = new ArrayList<>();
 4     try {
 5      //1、獲取文件輸入流
6      InputStream inputStream = new FileInputStream("/Users/Shared/區域數據.xls"); 7      //2、獲取Excel工作簿對象 8 HSSFWorkbook workbook = new HSSFWorkbook(inputStream); 9      //3、得到Excel工作表對象 10 HSSFSheet sheetAt = workbook.getSheetAt(0); 11 //4、循環讀取表格數據 12      for (Row row : sheetAt) { 13        //首行(即表頭)不讀取 14 if (row.getRowNum() == 0) { 15 continue; 16 } 17 //讀取當前行中單元格數據,索引從0開始 18        String areaNum = row.getCell(0).getStringCellValue(); 19 String province = row.getCell(1).getStringCellValue(); 20 String city = row.getCell(2).getStringCellValue(); 21 String district = row.getCell(3).getStringCellValue(); 22 String postcode = row.getCell(4).getStringCellValue(); 23 24 Area area = new Area(); 25 area.setCity(city); 26 area.setDistrict(district); 27 area.setProvince(province); 28        area.setPostCode(postcode); 29 list.add(area); 30 } 31      //5、關閉流 32 workbook.close(); 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36   return list; 37 }

2、導出數據到“區域數據.xls”文件中,頁面數據如下圖:

技術分享圖片

 1 public void exportExcel() throws IOException {
 2 
 3         Page<Area> page = areaService.pageQuery(null);
 4         List<Area> list = page.getContent();
 5 
 6         //1.在內存中創建一個excel文件
 7         HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
 8         //2.創建工作簿
 9         HSSFSheet sheet = hssfWorkbook.createSheet();
10         //3.創建標題行
11         HSSFRow titlerRow = sheet.createRow(0);
12         titlerRow.createCell(0).setCellValue("省");
13         titlerRow.createCell(1).setCellValue("市");
14         titlerRow.createCell(2).setCellValue("區");
15         titlerRow.createCell(3).setCellValue("郵編");
16         titlerRow.createCell(4).setCellValue("簡碼");
17         titlerRow.createCell(5).setCellValue("城市編碼");
18 
19         //4.遍歷數據,創建數據行
20         for (Area area : list) {
21             //獲取最後一行的行號
22             int lastRowNum = sheet.getLastRowNum();
23             HSSFRow dataRow = sheet.createRow(lastRowNum + 1);
24             dataRow.createCell(0).setCellValue(area.getProvince());
25             dataRow.createCell(1).setCellValue(area.getCity());
26             dataRow.createCell(2).setCellValue(area.getDistrict());
27             dataRow.createCell(3).setCellValue(area.getPostcode());
28             dataRow.createCell(4).setCellValue(area.getShortcode());
29             dataRow.createCell(5).setCellValue(area.getCitycode());
30         }
31         //5.創建文件名
32         String fileName = "區域數據統計.xls";
33         //6.獲取輸出流對象
34         HttpServletResponse response = ServletActionContext.getResponse();
35         ServletOutputStream outputStream = response.getOutputStream();
36 
37         //7.獲取mimeType
38         ServletContext servletContext = ServletActionContext.getServletContext();
39         String mimeType = servletContext.getMimeType(fileName);
40         //8.獲取瀏覽器信息,對文件名進行重新編碼
41         HttpServletRequest request = ServletActionContext.getRequest();
42         fileName = FileUtils.filenameEncoding(fileName, request);
43 
44         //9.設置信息頭
45         response.setContentType(mimeType);
46         response.setHeader("Content-Disposition","attachment;filename="+fileName);
47         //10.寫出文件,關閉流
48         hssfWorkbook.write(outputStream);
49         hssfWorkbook.close();
50     }

工具類

 1 public class FileUtils {
 2 
 3     public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
 4         String agent = request.getHeader("User-Agent"); //獲取瀏覽器
 5         if (agent.contains("Firefox")) {
 6             BASE64Encoder base64Encoder = new BASE64Encoder();
 7             filename = "=?utf-8?B?"
 8                     + base64Encoder.encode(filename.getBytes("utf-8"))
 9                     + "?=";
10         } else if(agent.contains("MSIE")) {
11             filename = URLEncoder.encode(filename, "utf-8");
12         } else if(agent.contains ("Safari")) {
13             filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
14         } else {
15             filename = URLEncoder.encode(filename, "utf-8");
16         }
17         return filename;
18     }
19 }

寫出xls文件:

技術分享圖片

五、 EXCEL常用操作方法

1、 得到Excel常用對象

 1 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); 
 2 //得到Excel工作簿對象 
 3 HSSFWorkbook wb = new HSSFWorkbook(fs); 
 4 //得到Excel工作表對象 
 5 HSSFSheet sheet = wb.getSheetAt(0); 
 6 //得到Excel工作表的行 
 7 HSSFRow row = sheet.getRow(i); 
 8 //得到Excel工作表指定行的單元格 
 9 HSSFCell cell = row.getCell((short) j); 
10 cellStyle = cell.getCellStyle();//得到單元格樣式

2、建立Excel常用對象

1 HSSFWorkbook wb = new HSSFWorkbook();//創建Excel工作簿對象 
2 HSSFSheet sheet = wb.createSheet("new sheet");//創建Excel工作表對象 
3 HSSFRow row = sheet.createRow((short)0); //創建Excel工作表的行 
4 cellStyle = wb.createCellStyle();//創建單元格樣式 
5 row.createCell((short)0).setCellStyle(cellStyle); //創建Excel工作表指定行的單元格 
6 row.createCell((short)0).setCellValue(1); //設置Excel工作表的值

3、設置sheet名稱和單元格內容

1 wb.setSheetName(1, "第一張工作表",HSSFCell.ENCODING_UTF_16); 
2 cell.setEncoding((short) 1); 
3 cell.setCellValue("單元格內容");

4、取得sheet的數目

1 wb.getNumberOfSheets()

5、 根據index取得sheet對象

1 HSSFSheet sheet = wb.getSheetAt(0);

6、取得有效的行數

1 int rowcount = sheet.getLastRowNum();

7、取得一行的有效單元格個數

1 row.getLastCellNum();

8、單元格值類型讀寫

1 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //設置單元格為STRING類型 
2 cell.getNumericCellValue();//讀取為數值類型的單元格內容 

9、設置列寬、行高

1 sheet.setColumnWidth((short)column,(short)width); 
2 row.setHeight((short)height);

10、添加區域,合並單元格

1 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo 
2 ,(short)columnTo);//合並從第rowFrom行columnFrom列 
3 sheet.addMergedRegion(region);// 到rowTo行columnTo的區域 
4 //得到所有區域 
5 sheet.getNumMergedRegions() 

11、保存Excel文件

1 FileOutputStream fileOut = new FileOutputStream(path); 
2 wb.write(fileOut);

12、根據單元格不同屬性返回字符串數值

 1 public String getCellStringValue(HSSFCell cell) { 
 2   String cellValue = ""; 
 3   switch (cell.getCellType()) { 
 4     case HSSFCell.CELL_TYPE_STRING://字符串類型 
 5         cellValue = cell.getStringCellValue(); 
 6         if(cellValue.trim().equals("")||cellValue.trim().length()<=0) 
 7           cellValue=" "; 
 8         break; 
 9     case HSSFCell.CELL_TYPE_NUMERIC: //數值類型 
10         cellValue = String.valueOf(cell.getNumericCellValue()); 
11         break; 
12     case HSSFCell.CELL_TYPE_FORMULA: //公式 
13         cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); 
14         cellValue = String.valueOf(cell.getNumericCellValue()); 
15         break; 
16     case HSSFCell.CELL_TYPE_BLANK: 
17         cellValue=" "; 
18         break; 
19     case HSSFCell.CELL_TYPE_BOOLEAN: 
20         break; 
21     case HSSFCell.CELL_TYPE_ERROR: 
22         break; 
23     default: 
24         break; 
25   } 
26   return cellValue; 
27 }

13、常用單元格邊框格式

1 HSSFCellStyle style = wb.createCellStyle(); 
2 style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下邊框 
3 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左邊框 
4 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框 
5 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框

14、設置字體和內容位置

 1 HSSFFont f = wb.createFont(); 
 2 f.setFontHeightInPoints((short) 11);//字號 
 3 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 
 4 style.setFont(f); 
 5 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 
 6 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 
 7 style.setRotation(short rotation);//單元格內容的旋轉的角度 
 8 HSSFDataFormat df = wb.createDataFormat(); 
 9 style1.setDataFormat(df.getFormat("0.00%"));//設置單元格數據格式 
10 cell.setCellFormula(string);//給單元格設公式 
11 style.setRotation(short rotation);//單元格內容的旋轉的角度

15、插入圖片

 1 //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray 
 2 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 
 3 BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); 
 4 ImageIO.write(bufferImg,"jpg",byteArrayOut); 
 5 //讀進一個excel模版 
 6 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); 
 7 fs = new POIFSFileSystem(fos); 
 8 //創建一個工作薄 
 9 HSSFWorkbook wb = new HSSFWorkbook(fs); 
10 HSSFSheet sheet = wb.getSheetAt(0); 
11 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 
12 HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); 
13 patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));

16、調整工作表位置

1 HSSFWorkbook wb = new HSSFWorkbook(); 
2 HSSFSheet sheet = wb.createSheet("format sheet"); 
3 HSSFPrintSetup ps = sheet.getPrintSetup(); 
4 sheet.setAutobreaks(true); 
5 ps.setFitHeight((short)1); 
6 ps.setFitWidth((short)1);

POI操作Excel