1 POI报表的概述
1.1 需求说明
在应用开发中,Excel报表使用中常见的报表需求。Excel报表开发一般分为两种形式:
- 为了方便操作,基于Excel的报表批量上传数据。
- 通过Java代码生成Excel报表。
1.2 Excel的两种形式
| Excel 2003 | Excel 2007 | |
|---|---|---|
| 后缀 | xls | xlsx |
| 结构 | 二进制结构,其核心结构是复合文档类型的结构 | XML类型结构 |
| 单sheet数据量 | 行:65535 列:256 | 行:1048576 列:16384 |
| 特点 | 存储容量有限 | 基于xml压缩,占用空间小,操作效率高 |
Excel2003 是一个特有的二进制格式,其核心结构是复合文档类型的结构,存储数据量较小; Excel2007 的核心结构是XML类型的结构,采用的是基于XML的压缩方式,使其占用的空间更小,操作效率更高;
1.3 常见Excel操作工具
Java 中常见的用来操作 Excel 的方式一般有2种:JXL和 POl。 JXL 只能对 Excel 进行操作,属于比较老的框架,它只支持到 Excel 95-2000 的版本。现在已经停止更新和维护; POl 是 apache 的项目,可对微软的 Word , Excel , PPT 进行操作,包括 office2003 和 2007,Excel 2003 和 2007。poi 现在 直有更新。所以现在主流使用POI。
1.4 POI的概述
Apache POl是Apache软件基金会的开源项目,由Java编写的免费开源的跨平台的Java API,Apache POI提供API给lava语言操作Microsoft Office的功能。
1.5 POl的应用场景
- 数据报表生成
- 数据备份
- 数据批量上传
2 POI 的入门操作
2.1 搭建环境
<dependencies>
<!--核心坐标-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<!--对2007+版本支持坐标-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
</dependencies>
2.2 POI结构说明
- HSSF提供读写Microsoft ExcelXLS格式档案的功能;
- XSSF提供读写Microsoft ExcelOOXMLXLSX格式档案的功能;
- HWPF提供读写Microsoft Word DOC格式档案的功能;
- HSLF提供读写Microsoft PowerPoint格式档案的功能;
- HDGF提供读Microsoft Visio格式档案的功能;
- HPBF提供读Microsoft Publisher格式档案的功能;
- HSMF提供读Microsoft Outlook格式档案的功能;
2.3 示例
2.3.1 使用 POI 创建 Excel 并创建单元格然后设置数据示例
/**
* 使用 POI 创建 Excel 并创建单元格然后设置数据示例
*/
public class POIExcelExample2 {
public static void main(String[] args) throws IOException {
// 创建一个工作簿
Workbook workbook = new XSSFWorkbook();
// 创建一个工作表
Sheet sheet = workbook.createSheet("sheet1");
// 创建一个行和单元格 从0开始 第一行 第一列 A1,写入内容为 hello world
sheet.createRow(0).createCell(0).setCellValue("hello world");
// 文件流
FileOutputStream fileOutputStream = new FileOutputStream("D:\test.xlsx");
// 写入文件
workbook.write(fileOutputStream);
fileOutputStream.close();
}
}
2.3.2 使用 POI 读取 Excel 并解析
/**
* 使用 POI 读取 Excel 并解析
*/
public class POIExcelExample2 {
public static void main(String[] args) throws IOException {
// 创建一个工作簿,使用 try-with-resources 语句自动关闭资源
try (Workbook workbook = new XSSFWorkbook("D:\test.xlsx")) {
// 获取一个工作表
Sheet sheet = workbook.getSheetAt(0);
// 获取Sheat中的每一行和每一个单元格
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
Row row = sheet.getRow(rowNum);
// 使用 StringBuilder 代替 StringBuffer,提高性能
StringBuilder stringBuilder = new StringBuilder();
for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++) {
Cell cell = row.getCell(cellNum);
Object callValue = getCallValue(cell);
stringBuilder.append(callValue).append(" ");
}
System.out.println(stringBuilder.toString());
}
}
}
/**
* 根据单元格的类型获取单元格的值
* @param cell 单元格对象
* @return 单元格的值,可能为 String, Double, Boolean 或 String 类型
*/
public static Object getCallValue(Cell cell) {
Object value = null;
switch (cell.getCellType()) {
case STRING:
value = cell.getStringCellValue();
break;
case NUMERIC:
value = cell.getNumericCellValue();
break;
case BOOLEAN:
value = cell.getBooleanCellValue();
break;
case FORMULA:
value = cell.getCellFormula();
break;
default:
break;
}
return value;
}
}