使用 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();