POI读写Excel实现

Apache POI是Apache提供的开放源码函式库,提供API给java对Microsoft Office格式文档读写

1. 处理文档类型

https://poi.apache.org/

  • HSSF - .xls
  • XSSF - .xlsx
  • HWPF - .doc
  • HSLF - .ppt
  • HDGF - .vsd

2. Maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
<!-- xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!-- xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>

3. 测试-写操作

workbook - sheet - row - cell

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
33
34
35
36
37
38
39
40
41
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;

@Test
public void test(){

//创建workbook -xls
Workbook workbook = new HSSFWorkbook();

//根据workbook创建sheet
Sheet sheet = workbook.createSheet("会员列表");

//根据sheet创建row - 第0行
Row row = sheet.createRow(0);

//根据row创建cell - 第0列
row.createCell(0).setCellValue("test1");
//根据row创建cell - 第1列
row.createCell(1).setCellValue("test2");

//项目根路径
String path = System.getProperty("user.dir");

try {
OutputStream outputStream = new FileOutputStream(path+"/src/main/resources/test.xls");

//输出
workbook.write(outputStream);

outputStream.close();
System.out.println("文件生成成功");

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

4. 测试-读操作

workbook - sheet - row - cell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Test
public void read() throws IOException {

//获取文件输入流
String path = System.getProperty("user.dir");
InputStream inputStream = new FileInputStream(path+"/src/main/resources/test.xls");

//传递输入流
Workbook workbook = new HSSFWorkbook(inputStream);

//根据workboot获取sheet
Sheet sheet = workbook.getSheetAt(0);

//根据sheet获取cell - 第0行
Row row = sheet.getRow(0);

//第0列
Cell cell = row.getCell(0);
String value = cell.getStringCellValue();

System.out.println(value);

}

5. 海量数据问题

5.1. 03 .xls-HSSF

5.1.1. 优点–有缓存

过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快

5.1.2. 行最多65536

1
2
3
4
5
Row row =null;
for(int i=0;i<=65537;i++){
row=sheet.createRow(i);
row.createCell(0).setCellValue("test");
}

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)

5.1.3. 列最多16384

1
2
3
for(int i=0;i<=65537;i++){
row.createCell(i).setCellValue("test");
}

java.lang.IllegalArgumentException: Invalid column index (16384). Allowable column range for EXCEL2007 is (0..16383) or (‘A’..’XFD’)

5.2. 07 .xlsx-XSSF

5.2.1. 列最多16384

1
2
3
for(int i=0;i<=65537;i++){
row.createCell(i).setCellValue("test");
}

java.lang.IllegalArgumentException: Invalid column index (16384). Allowable column range for EXCEL2007 is (0..16383) or (‘A’..’XFD’)

5.2.2. 优点–大数据量

可以写较大的数据量,如20万条

5.2.3. 缺点–占内存

写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条

5.3. SXSSF

可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存

将数据分批次写入文件

过程中会产生临时文件,需要清理临时文件

默认由100条记录被保存在内存中,如果查过这数量,则最前面的数据被写入临时文件

如果想自定义内存中数据的数量,可以使用new SXSSFWorkbook(数量)

本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/25/POI读写Excel实现/
  • 发布时间: 2019-09-25 19:57
  • 更新时间: 2021-10-29 14:18
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!