Catalog
- Apache POI-操作Excel表格
- 1. 需求
- 2. 優點
- 3. 缺點
- 4. 應用場景
- 5. 使用方法
- 6. SpringBoot工程中處理Excel表格
- 7. Demo示例
Apache POI-操作Excel表格
1. 需求
大多數項目的在運營過程中,會產生運營數據,如外賣系統中需要統計每日的訂單完成數、每種菜品的銷量等數據,這些都是商家關心的事情,如果可以將這些數據整理成Excel表格,可以讓商家更直觀地了解到這些數據。
Apache POI這個開源項目就可以用于處理微軟各式各樣的文件,如讀、寫、創建文件等,這里主要介紹的是如何處理Excel文件。
2. 優點
- 開源免費:不需要側重關心數據安全等方面的問題。
- 跨平臺:Apache POI是使用Java語法編寫的,在任何支持Java語言的平臺下面都可以使用。
- 容易集成:在springboot項目中使用起來非常方便。
3. 缺點
- 操作繁瑣:Apache POI中豐富的api,增加了使用的難度
- 性能:處理大型Excel文件的時候,會大量占用內存
- 不支持新功能:無法及時同步Excel這個軟件更新的功能
4. 應用場景
- 數據導入導出:Apache POI可用于從數據庫導出數據到Excel文件,或者從Excel文件中讀取數據并導入到數據庫中。
- 報表生成:可以使用Apache POI創建自定義的Excel報表,包括圖表、數據分析和格式化等功能。
- 數據處理:可以利用Apache POI對Excel文件中的數據進行處理和分析,如數據清洗、轉換和計算等。
5. 使用方法
Apache POI中提供的api處理Excel表格的大多數邏輯都和直接使用Excel(微軟)這個軟件類似。
在大多數通過Java程序來操作Excel表格的場景中,由于Excel的樣式較為復雜,通過Java程序來設計樣式會很繁瑣,所以大多數的應用場景都是先通過微軟的Excel這個軟件,先將Excel的樣式設計好,如設計表格頭的標題、字體大小、合并單元格和顏色等保存為模板文件到項目工程的resource目錄下面,再通過反射(輸出流)獲取到resource目錄下的資源文件(Excel模板文件)。
最后,直接在模板文件中填充從數據庫中處理好的數據即可。
6. SpringBoot工程中處理Excel表格
-
導入Maven坐標
<!--導入POI坐標--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.16</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><!--用作測試--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency>
-
獲取輸入流(獲取Excel文件)
-
獲取Sheet頁(可設置Sheet的名稱)
-
獲取行(可直接獲取最后一行有內容的行號, 最后一行的行號從0開始的)
-
獲取列(可直接獲取最后一列有內容的行號,最后一行的列號從1開始的)
-
對Excel文件進行讀寫操作
-
獲取輸出流(將Excel文件保存到磁盤上或者輸出到瀏覽器上面)
7. Demo示例
/*** 基于POI向Excel文件中寫入數據*/@Testpublic void writeExcel() throws IOException {//在內存中創建Excel文件XSSFWorkbook excel = new XSSFWorkbook();//創建sheet頁XSSFSheet sheet = excel.createSheet("user");//創建行XSSFRow row0 = sheet.createRow(0);XSSFRow row1 = sheet.createRow(1);XSSFRow row2 = sheet.createRow(2);//創建列row0.createCell(0).setCellValue("name");row0.createCell(1).setCellValue("age");row1.createCell(0).setCellValue("aimin");row1.createCell(1).setCellValue("22");row2.createCell(0).setCellValue("Tony");row2.createCell(1).setCellValue("22");//存入磁盤//創建輸出流,文件路徑寫自己的FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\WORKSPACE-Java\\normal-project\\Apache_POI_test\\files\\info.xlsx"));excel.write(fileOutputStream);//關閉資源fileOutputStream.flush();fileOutputStream.close();excel.close();}/*** 基于POI讀取Excel中的數據*/@Testpublic void readExcel() throws Exception{//通過輸入流獲取Excel文件,文件路徑寫自己的XSSFWorkbook excel = new XSSFWorkbook(new FileInputStream(new File("D:\\WORKSPACE-Java\\normal-project\\Apache_POI_test\\files\\info.xlsx")));//獲取sheet頁XSSFSheet sheet = excel.getSheet("user");//獲取最后一行有內容的行號,用于后期遍歷,行號從0開始,列號從1開始int lastRowNum = sheet.getLastRowNum();//System.out.println("最后一行的行號:" + lastRowNum);for (int i = 0; i <= lastRowNum; i++) {//獲取行XSSFRow row = sheet.getRow(i);//獲取有內容的最后一列的列號short lastCellNum = row.getLastCellNum();//System.out.println("最后一列的列號:" + lastRowNum);for (int j = 0; j < lastCellNum; j++) {System.out.print(row.getCell(j) + " ");}System.out.println();}//關閉流excel.close();}