Apache POI

Parker

1. 介绍

Apache POI 是一个处理 Miscrosoft Office 各种文件格式的开源 Java 库。我们可以使用 POI 在 Java 程序中对 Miscrosoft Office 各种文件进行读写操作。
一般情况下,POI 都是用于操作 Excel 文件。

Apache POI 的应用场景:

  • 银行网银系统导出交易明细

  • 各种业务系统导出Excel报表

  • 批量导入业务数据

2. 使用案例

Apache POI 既可以将数据写入 Excel 文件,也可以读取 Excel 文件中的数据,接下来分别进行实现。

引入 Apache POI 的 maven 坐标:

1
2
3
4
5
6
7
8
9
10
<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>

2.1 将数据写入 Excel 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@Slf4j
public class POITest {
public static void main(String[] args) throws IOException {
write();
}
/**
* 基于POI向Excel文件写入数据
*/
public static void write() throws IOException {
// 在内存中创建Excel文件对象
XSSFWorkbook sheets = new XSSFWorkbook();
// 创建sheet页
XSSFSheet sheet = sheets.createSheet("info");
// 在sheet中创建行
XSSFRow row = sheet.createRow(0);
// 在sheet中创建单元格并写入数据
row.createCell(0).setCellValue("姓名");
row.createCell(1).setCellValue("城市");
row = sheet.createRow(1);
row.createCell(0).setCellValue("张三");
row.createCell(1).setCellValue("北京");
row = sheet.createRow(2);
row.createCell(0).setCellValue("李四");
row.createCell(1).setCellValue("南京");
// 通过输出流将内存中的Excel写出到磁盘
FileOutputStream fileOutputStream = new FileOutputStream("D://info.xlsx");
sheets.write(fileOutputStream);
log.info("写出Excel文件到磁盘: {}", sheets);
}
}

2.2 读取 Excel 文件中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Slf4j
public class POITest {
public static void main(String[] args) throws IOException {
read();
}
/**
* 基于POI读取Excel文件中的数据
*/
public static void read() throws IOException {
// 通过输入流读取指定的Excel文件
FileInputStream fileInputStream = new FileInputStream("D://info.xlsx");
XSSFWorkbook sheets = new XSSFWorkbook(fileInputStream);
// 获取要读取的sheet页
XSSFSheet sheet = sheets.getSheetAt(0);
// 获取最后一行数据的行号
int lastRowNum = sheet.getLastRowNum();
// 逐行读取数据
for (int i = 0; i <= lastRowNum; i++) {
// 获取当前行
XSSFRow row = sheet.getRow(i);
// 获取单元格数据
String stringCellValue1 = row.getCell(0).getStringCellValue();
String stringCellValue2 = row.getCell(1).getStringCellValue();
// 将该行数据打印到控制台
System.out.println(stringCellValue1 + "\t" + stringCellValue2);
}
// 关闭资源
sheets.close();
fileInputStream.close();
log.info("读取Excel文件: {}", sheets);
}
}
评论