目录

POI

Apache POI 项目的任务是创建和维护 Java API,用于处理基于 Office Open XML 标准 (OOXML) 和 Microsoft 的 OLE 2 复合文档格式 (OLE2) 的各种文件格式。简而言之,您可以使用 Java 读写 MS Excel 文件。此外,您可以使用 Java 读写 MS Word 和 MS PowerPoint 文件。Apache POI 是您的 Java Excel 解决方案(适用于 Excel 97-2008)。

Excel97-2003版本,一个sheet最大行数65536,最大列数256。

Excel2007版本开始,一个sheet最大行数1048576,最大列数16384。

HSSF:是操作 Microsoft Excel 97 (-2003),扩展名为.xls。

XSSF:是操作 Microsoft Excel XML (2007+),扩展名为.xlsx。

SXSSF:是在XSSF基础上,POI 3.8 版本开始提供的一种支持低内存占用的操作方式,扩展名为.xlsx。

SXSSF 是 XSSF 的 API 兼容的流式扩展,可在必须生成非常大的电子表格且堆空间有限时使用。SXSSF 通过限制对滑动窗口内行的访问来实现其低内存占用,而 XSSF 允许访问文档中的所有行。不再在窗口中的旧行变得不可访问,因为它们被写入磁盘。

在自动刷新模式下,可以指定访问窗口的大小,以在内存中保存一定数量的行。当达到该值时,创建附加行会导致索引最低的行从访问窗口中删除并写入磁盘。或者,可以将窗口大小设置为动态增长;它可以根据需要通过显式调用 flushRows(int keepRows) 定期修剪。

由于实现的流性质,与 XSSF 相比存在以下限制:

  • 在某个时间点只能访问有限数量的行。
  • 不支持 Sheet.clone()。
  • 不支持公式评估

poi 大量数据导出

@Async 避免超时异步执行提前返回

APIs

converting existing HSSF Usermodel code to SS Usermodel (for XSSF and HSSF)

 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// import org.apache.poi.ss.usermodel.*;
Workbook[] wbs = new Workbook[] { new HSSFWorkbook(), new XSSFWorkbook() };
for(int i=0; i<wbs.length; i++) {
   Workbook wb = wbs[i];
   CreationHelper createHelper = wb.getCreationHelper();
   // create a new sheet
   Sheet s = wb.createSheet();
   // declare a row object reference
   Row r = null;
   // declare a cell object reference
   Cell c = null;
   // create 2 cell styles
   CellStyle cs = wb.createCellStyle();
   CellStyle cs2 = wb.createCellStyle();
   DataFormat df = wb.createDataFormat();
   // create 2 fonts objects
   Font f = wb.createFont();
   Font f2 = wb.createFont();
   // Set font 1 to 12 point type, blue and bold
   f.setFontHeightInPoints((short) 12);
   f.setColor( IndexedColors.RED.getIndex() );
   f.setBoldweight(Font.BOLDWEIGHT_BOLD);
   // Set font 2 to 10 point type, red and bold
   f2.setFontHeightInPoints((short) 10);
   f2.setColor( IndexedColors.RED.getIndex() );
   f2.setBoldweight(Font.BOLDWEIGHT_BOLD);
   // Set cell style and formatting
   cs.setFont(f);
   cs.setDataFormat(df.getFormat("#,##0.0"));
   // Set the other cell style and formatting
   cs2.setBorderBottom(cs2.BORDER_THIN);
   cs2.setDataFormat(df.getFormat("text"));
   cs2.setFont(f2);
   // Define a few rows
   for(int rownum = 0; rownum < 30; rownum++) {
	   Row r = s.createRow(rownum);
	   for(int cellnum = 0; cellnum < 10; cellnum += 2) {
		   Cell c = r.createCell(cellnum);
		   Cell c2 = r.createCell(cellnum+1);
   
		   c.setCellValue((double)rownum + (cellnum/10));
		   c2.setCellValue(
		         createHelper.createRichTextString("Hello! " + cellnum)
		   );
	   }
   }
   
   // Save
   String filename = "workbook.xls";
   if(wb instanceof XSSFWorkbook) {
     filename = filename + "x";
   }
 
   FileOutputStream out = new FileOutputStream(filename);
   wb.write(out);
   out.close();
}

HSSF对应:HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell……

XSSF对应:XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell……

SXSSF对应:SXSSFWorkbook、Sheet、Row、Cell……

大量数据导出

  • 数据分组,处理完清空内存。
  • 使用 SXSSF (Streaming User API)
  • 大于100万拆分 sheet

SXSSF

SXSSF是XSSF API的兼容流式扩展,在必须生成非常大的电子表格、并且堆空间有限时使用。 SXSSF通过限制对滑动窗口内数据的访问实现低内存占用,而XSSF允许访问文档中的所有行。 不在窗口中的数据将变得不可访问,因为它们已经被写入磁盘。

可以通过SXSSFWorkbook(int windowSize)在工作簿创建时指定窗口大小,也可以通过SXSSFSheet.setRandomAccessWindowSize(int windowSize)在每个工作表中设置

默认窗口大小为100,由SXSSFWorkbook.DEFAULT_WINDOW_SIZE定义。

windowSize为-1表示无限制访问。在这种情况下,所有未通过调用flushRows()刷新的记录都可随机访问。

请注意,SXSSF通过调用dispose方法来分配必须始终明确清理的临时文件。

请注意,根据使用的功能不同,仍然可能会消耗大量内存,例如: 合并区域、超链接、注释等仍然只存储在内存中,因此如果广泛使用可能仍需要大量内存。

SXSSF是一种低内存占用的操作方式,因为其提供了一个新的方法:

SXSSFWorkbook w3= new SXSSFWorkbook(100);//内存中保留100条数据,其余写入硬盘临时文件

在数据量超过设置的值时,会在硬盘生成临时文件保存之前的数据,而且POI会根据规则自动删除生成的这些临时文件。

POI生成的临时文件

System.out.println(System.getProperty("java.io.tmpdir"));