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
| <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency>
<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 workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("会员列表");
Row row = sheet.createRow(0);
row.createCell(0).setCellValue("test1"); 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);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(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(数量)