1.POI解决什么问题
JXL,POI都是操作excel
Excel一些企业小的应用都直接用excel来实现,例如:工资报表,人员名单,进销存
作为数据的备份和恢复(导入、导出)
Jxl 它只能操作excel 2003版本,它导入导出数据量小时性能很高
POI 它可以操作office系列软件word、excel、ppt、visio(画网络布局、家装),在早期版本中它在导出海量数据时,容易崩溃。在新版本中它解决了这个海量数据时,进行了优化,解决了这个问题。
2.POI初体验
@Test
public void testHSSF_base() throws IOException{
/*
* 开发步骤:
* 1、创建一个工作簿
* 2、创建一个工作表
* 3、创建一个行对象
* 4、创建一个单元格对象,指定它的列
* 5、给单元格设置内容
* 6、样式进行修饰(跳过)
* 7、保存,写文件
* 8、关闭对象
*/
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row nRow = sheet.createRow(7); //第八行
Cell nCell = nRow.createCell(4); //第五列
nCell.setCellValue("传智播客万年长!");
OutputStream os = new FileOutputStream("c:\\testpoi.xls"); //excel 2003
wb.write(os);
os.flush();
os.close();
}
2.1小结
Poi本身操作极其简单,只要记住使用的api即可。
但是它在处理单元格时
1) 不能直接看中间结果,必须运行完才可以看到
2) HSSF构造的对象都在内存中,创建非常多的对象,当对象量越来越多时,容易造成堆溢出。
3.POI模板开发
InputStream is = new FileInputStream(new File("c:\\tOUTPRODUCT.xls"));
Workbook wb = new HSSFWorkbook(is); //打开一个模板文件,工作簿
Sheet sheet = wb.getSheetAt(0); //获取到第一个工作表
Row nRow = null;
Cell nCell = null;
int rowNo = 0; //行号
int colNo = 1; //列号
//获取模板上的单元格样式
nRow = sheet.getRow(2);
//客户的样式
nCell = nRow.getCell(1);
CellStyle customStyle = nCell.getCellStyle();
4.POI百万数据打印
- 从数据库读取数据,LIST在构造时十分耗费内存,还占用CPU资源
- Xlsx一个单sheet可以支持1048576条数据。它加工这些数据时,都是暂时放在内存中。报内存堆溢出。
- POI意识到这个问题,它在高版本解决了海量数据导出时性能问题。可以实现非常平滑的导出。
4.1解决方法
4.1.1 POI ooxml SXSSF对象
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
4.1.2 它解决思路:
在打印过程中,已经加工完的对象,临时存到一个临时文件中,它采用xml临时文件。最终处理完时,将这些临时内容写入到最终的xlsx文件中。
Workbook wb = new SXSSFWorkbook(100); //创建excel文件,内存只有100条记录【关键语句】
public SXSSFWorkbook(int rowAccessWindowSize){
this(null /*workbook*/, rowAccessWindowSize);
}
每rowAccessWindowSize条对象时,写一次缓存。
!!!! 这个对象不能使用模板。只能用于到数据量的导出。(没有格式)
5. CSV文件,导入到数据库中
CSV是一个标准的导入导出文件格式,实际是一个txt文件