使用 Apache POI 操作 Excel文件,系列文章:
《SpringBoot整合POI實現Excel文件的導出與導入》
《SpringMVC實現文件的上傳與下載》
《C#使用NPOI導出Excel文件》
《NPOI使用手冊》
1、Apache POI 的介紹
Apache POI 是一個基于 Java 的開源庫,專為讀寫 Microsoft Office 格式文件(如 Excel、Word、PowerPoint、Visio 等)而設計,支持 Office 97-2016 版本的文件操作?。其名稱源于“Poor Obfuscation Implementation”(簡潔版的模糊實現)的首字母縮寫?。Apache POI 功能全面,覆蓋 Office 文件的全生命周期操作。?社區活躍,文檔豐富,適用于復雜場景(如:模板替換、動態生成報表)?。
?多格式支持?:
- Excel?:通過 HSSF(.xls 格式)和 XSSF(.xlsx 格式)模塊實現讀寫?。
- Word?:通過 HWPF(.doc 格式)和 XWPF(.docx 格式)模塊處理文檔?。
- PowerPoint?:支持 .ppt 和 .pptx 文件的創建與修改?。
應用場景?:
- ?企業級開發?:生成復雜 Excel 報表、自動化數據導入導出?。
- ?模板化文檔處理?:通過占位符替換動態填充 Word 模板內容?。
- 跨平臺兼容需求?:在非 Windows 系統中實現 Office 文件的讀寫與轉換?。
Apache POI 中文教程:《Apache POI中文教程》
2、Apache POI 的接口
POI 將一個 Excel 文件劃分為如下圖所示的幾個部分,每一個部分都對應一個 POI 接口。其中, Workbook 表示整個 Excel 文件,Sheet 表示 Excel 文件中的分頁,Row 表示 Excel 文件中某一頁的一行,Cell 表示 Excel 文件中某一頁的一個具體的單元格。當讀取 Excel 文件中每一個單元格的數據需要按照“Workbook > Sheet > Row > Cell”順序創建對應 POI 接口的對象。
2.1 創建 Workbook 對象
創建 Workbook 對象有如下兩種方式,這兩種方式都需要使用 WorkbookFactory 工廠類的 create() 方法。
(1)根據 File 對象創建 Workbook 對象。
File file = new File("D:\\demo.xlsx");
Workbook workbook = WorkbookFactory.create(file);
(2)從字節輸入流中創建 Workbook 對象。
InputStream is = new FileInputStream("D:\\demo.xlsx");
Workbook workbook = WorkbookFactory.create(is);
2.2 創建 Sheet 對象
在獲取 Workbook 對象后,就可以創建 Sheet 對象。
Sheet sheet = workbook.getSheetAt(0);
getSheetAt() 方法 中的參數為分頁的索引。其中,第一個分頁的索引為 0。
2.3 創建 Row 對象
在獲取 Sheet 對象后,就可以創建 Row 對象。
Row row = sheet.getRow(0);
getCell() 方法中的參數為列索引。其中,第一列的索引為 0。
2.4 創建 Cell 對象
在獲取 Row 對象后,就可以創建 Cell 對象。
Cell cell = row.getCell(0);
getRow() 方法中的參數為行索引。其中,第一行的索引為 0。
2.5 獲取單元格數據
在獲取 Cell 對象后,也就獲取了單元格中的具體數據。Excel 文件的單元格可以支持不同的數據類型,這些數據類型在 POI 中采用如下的 CellType 枚舉:
CellType.NUMERIC:數字
CellType.STRING:字符串
CellType.FORMULA:公式
CellType.BLANK:空內容
CellType.BOOLEAN:布爾值
CellType.ERROR:錯誤單元格
程序開發人員可以調用 Cell 對象的 getCellType() 方法判斷單元格的數據類型:
if (cell.getCellType() == CellType.NUMERIC) {// 數字格式,需要轉換
}
返回單元格不同類型的方法:
boolean bool = cell.getBooleanCellValue(); //返回布爾值
java.util.Date date = cell.getDateCellValue(); //返回日期對象
double number = cell.getNumericCellValue(); //返回數字
String str = cell.getStringCellValue();//返回文本數據
String formula = cell.getCellFormula(); //返回公式字符串
RichTextString richText = cell.getRichStringCellValue(); //返回富文本
可以將其封裝成一個公共方法:
/*** 解析Excel數據類型,返回單元格的值*/
private Object getCellValue(Cell cell)
{//1.獲取到單元格的屬性類型CellType cellType = cell.getCellType();//2.根據單元格數據類型獲取數據Object value = null;switch (cellType){case STRING:value = cell.getStringCellValue();