基于SSM的商贸平台项目(第五天)

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模板开发

Alt text

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百万数据打印

  1. 从数据库读取数据,LIST在构造时十分耗费内存,还占用CPU资源
  2. Xlsx一个单sheet可以支持1048576条数据。它加工这些数据时,都是暂时放在内存中。报内存堆溢出。
  3. 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文件