2016-12-01 14:18:11 lipinganq 阅读数 3143
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森
  1. 官网介绍地址(页面最下方SXSSF (Since POI 3.8 beta3)

  2. 从3.8-beta3版本开始,POI提供了一个低内存的SXSSF API构建在XSSF之上。

  3. SXSSFXSSF的API兼容的流扩展,当必须产生非常大的sheet表格,并且堆空间有限时使用。

  4. XSSF可以访问文档中的所有行;而SXSSF通过限制对滑动窗口中的行的访问来实现其低内存占用,不再位于滑动窗口中的旧行将无法访问,因为它们已写入磁盘。

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

  6. 由于实现的流传输性质,与XSSF相比存在以下限制:
    <1>在一个时间点只能访问有限数量的行(取决于windowSize的大小)。
    <2>不支持Sheet.clone()。
    <3>不支持公式计算

  7. 详情请参阅 SXSSF How-To

  8. 下表汇总了POI的电子表格API的比较功能:
    电子表格API功能摘要
    这里写图片描述

2016-12-02 18:08:16 lipinganq 阅读数 4382
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森

1.下面的示例编写了一个包含100行窗口的工作表。 当行计数达到101时,将rownum = 0的行刷新到磁盘并从内存中删除,当rownum达到102时,则刷新rownum = 1的行等。

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.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test;

import com.esen.util.StrFunc;

/**
 * 下面的示例编写了一个包含100行窗口的工作表。 
 * 当行计数达到101时,将rownum = 0的行刷新到磁盘并从内存中删除,
 * 当rownum达到102时,则刷新rownum = 1的行
 * */
public class SXSSF {
    @Test
    public void Test() throws Exception {
        long start1 = System.currentTimeMillis();
        // keep 100 rows in memory, exceeding rows will be flushed to disk
        SXSSFWorkbook wb1 = new SXSSFWorkbook(100);
        for (int sheetnum = 0; sheetnum < 20; sheetnum++) {
            Sheet sh1 = wb1.createSheet();
            for(int rownum = 0; rownum < 50000; rownum++){
                Row row1 = sh1.createRow(rownum);
                for(int cellnum = 0; cellnum < 10; cellnum++){
                    Cell cell1 = row1.createCell(cellnum);
                    String address1 = new CellReference(cell1).formatAsString();
                    cell1.setCellValue(address1);
                }
            }
        }
        FileOutputStream out1 = new FileOutputStream("C:\\Users\\Administrator\\Desktop\\sxssf1.xlsx");
        wb1.write(out1);
        out1.close();
        wb1.dispose();
        System.out.println("for循环内定义对象,耗时:" + StrFunc.formatTime(System.currentTimeMillis()-start1));
        // for循环内定义对象,耗时:116698毫秒
        // for循环内定义对象,耗时:118691毫秒
        // for循环内定义对象,耗时:121567毫秒
        // for循环内定义对象,耗时:117721毫秒
        // for循环内定义对象,耗时:13048毫秒
}
  1. 下一个示例关闭自动刷新(windowSize = -1),代码手动控制部分数据如何写入磁盘
    /**
     * 关闭自动刷新(windowSize = -1)
     * 代码控制将部分满足要求的数据写入磁盘
     * @throws Exception 
     * */
    @Test
    public void TestPartData () throws Exception {
        /**
         * turn off auto-flushing and accumulate all rows in memory
         * windowSize = -1表示关闭自动刷新
         * 所有的行都存放在内存中
         * */ 
        SXSSFWorkbook wb = new SXSSFWorkbook(-1); // 
        Sheet sh = wb.createSheet();
        Row row = null;
        Cell cell = null;
        String address = null;
        for(int rownum = 0; rownum < 10000; rownum++){
            row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                cell = row.createCell(cellnum);
                address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

            /**
             * manually control how rows are flushed to disk 
             * 手动控制行如何刷新到磁盘
             * */ 
            if(rownum % 100 == 0) {
                /**
                 * retain 100 last rows and flush all others
                 * 保留最后一行并刷新所有其他行
                 * */
                ((SXSSFSheet)sh).flushRows(100); 

                /**
                 * ((SXSSFSheet)sh).flushRows() is a shortcut for ((SXSSFSheet)sh).flushRows(0),
                 * this method flushes all rows
                 * ((SXSSFSheet)sh).flushRows()是((SXSSFSheet)sh).flushRows(0)的快捷方式,
                 *  此方法flushRows()刷新所有行
                 * */
            }
        }

        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();
        /**
         * dispose of temporary files backing this workbook on disk
         * 处理在磁盘上备份此工作簿的临时文件
         * SXSSF分配临时文件,您必须始终清除显式,通过调用dispose方法 
         * */ 
        wb.dispose();
    }
2013-05-17 08:38:59 iteye_9301 阅读数 92
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森
前几天使用用POI做报表统计,感觉挺方便的,有模板导出,可以直接操作对象,不用繁琐的创建表格对象等,以下是源码.
2012-10-23 11:24:03 xtadg 阅读数 768
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森


POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用。SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入会引起老一行的数据刷新到硬盘。

       比如内存中限制行数为100,当行号到达101时,行号为0的记录刷新到硬盘并从内存中删除,当行号到达102时,行号为1的记录刷新到硬盘,并从内存中删除,以此类推。

       rowAccessWindowSize代表指定的内存中缓存记录数,默认为100,此值可以通过

new SXSSFWorkbook(int rowAccessWindowSize)或SXSSFSheet.setRandomAccessWindowSize(intwindowSize)来设置。

       SXSSF在把内存数据刷新到硬盘时,是把每个SHEET生成一个临时文件,这个临时文件可能会很大,有可以会达到G级别,如果文件的过大对你来说是一个问题,你可以使用下面的方法让SXSSF来进行压缩,当然性能也会有一定的影响。

               SXSSFWorkbook wb = new SXSSFWorkbook();               wb.setCompressTempFiles(true); // temp files will be gzipped

 

例子:

生成三个SHEET,每个SHEET有6000行记录,共18万行记录

 

importjava.io.FileOutputStream;

 

importorg.apache.poi.ss.usermodel.Cell;

importorg.apache.poi.ss.usermodel.Row;

importorg.apache.poi.ss.usermodel.Sheet;

importorg.apache.poi.ss.util.CellReference;

importorg.apache.poi.xssf.streaming.SXSSFSheet;

importorg.apache.poi.xssf.streaming.SXSSFWorkbook;

 

public classSXSSFWorkBookUtil {

    public voidtestWorkBook() {

       try{

           longcurr_time=System.currentTimeMillis();

 

           introwaccess=100;//内存中缓存记录行数

           /*keep 100 rowsin memory,exceeding rows will be flushed to disk*/

           SXSSFWorkbook wb = newSXSSFWorkbook(rowaccess); 

 

           intsheet_num=3;//生成3个SHEET

           for(inti=0;i<sheet_num;i++){

              Sheet sh = wb.createSheet();

              //每个SHEET有60000ROW

              for(intrownum = 0; rownum < 60000; rownum++) {

                  Row row = sh.createRow(rownum);

                  //每行有10个CELL

                  for(intcellnum = 0; cellnum < 10; cellnum++) {

                     Cell cell = row.createCell(cellnum);

                     String address = newCellReference(cell).formatAsString();

                     cell.setCellValue(address);

                  }

 

                  //每当行数达到设置的值就刷新数据到硬盘,以清理内存

                  if(rownum%rowaccess==0){

                     ((SXSSFSheet)sh).flushRows();

                  }

              }

           }

 

           /*写数据到文件中*/

           FileOutputStream os = newFileOutputStream("d:/data/poi/biggrid.xlsx");    

           wb.write(os);

           os.close();

 

           /*计算耗时*/

           System.out.println("耗时:"+(System.currentTimeMillis()-curr_time)/1000);

       } catch(Exception e) {

           e.printStackTrace();

       }

    }

}

 

对于不同的rowAccessWindowSize值,用上面的例子进行耗时测试,结果如下:

 

rowAccessWindowSize    Time(s)

5000    293

1000    69

500    43

100    20

50    18

10    16

1    15

 

以上测试结果是在个人笔记本电脑上进行的,配置为:

Dual-Core CPU T4400 2.2GHz 2.19GHz

Memory 1.86GB

以上测试过程只是进行了一次,并没有多次测试求平均值,数据也只想表达当设置不同的rowAccessWindowSize值,耗时的一种趋势。

可见一般情况下,使用默认值100即可。

2014-12-12 19:35:57 fantasy0126 阅读数 5485
  • 基于SSM的POI导入导出Excel实战

    本课程将给大家分享如何基于SSM实现POI导入导出Excel,并讲解目前企业级JavaWeb应用mvc三层模式的开发流程,可让初学者或者职场萌新掌握如何基于SSM整合第三方框架并采用mvc三层开发模式实现自己的业务模块!

    1269 人正在学习 去看看 钟林森

1  apache POI-HSSF and POI-XSSF 项目介绍URL   http://poi.apache.org/spreadsheet/index.html

2 api 文档 http://poi.apache.org/apidocs/

3 下载地址 http://poi.apache.org/download.html


4 jsp 页面代码

   $("#export").on("click", function () {
                var form = $("<form>");
                form.attr('style', 'display:none');
                form.attr('target', '');
                form.attr('method', 'post');
                form.attr('action', "/testproject/export");


                nameS= $('<input>');
                nameS.attr('type', 'hidden');
                nameS.attr('name', 'nameS');
                nameS.attr('value', $("#myform input[name='nameS']").val());

               
                createTimeLeft = $('<input>');
                createTimeLeft.attr('type', 'hidden');
                createTimeLeft.attr('name', 'createTimeLeft');
                createTimeLeft.attr('value', $("#myform input[name='createTimeLeft']").val());

                createTimeRight = $('<input>');
                createTimeRight.attr('type', 'hidden');
                createTimeRight.attr('name', 'createTimeRight');
                createTimeRight.attr('value', $("#myform input[name='createTimeRight']").val());
                $('body').append(form);  //将表单放置在web中
                //将查询参数控件提交到表单上
         
                form.append(sname);

                form.append(createTimeLeft);
                form.append(createTimeRight);
                form.submit();

            });

controller

@RequestMapping(value = "/export") 
public void export(HttpServletRequest request, HttpServletResponse response) {
    response.setCharacterEncoding("utf-8");
    response.setContentType("multipart/form-data");
    String fileName = System.currentTimeMillis() + ".xlsx";
    response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
    Map<String, Object> mapMessage = new HashMap<String, Object>();

    try { //从数据库中得到结果
        List<PointwallTasklog> list = queryFromDatabase();
        OutputStream out = response.getOutputStream();
        SXSSFWorkbook wb = new SXSSFWorkbook(-1);
        // turn off auto-flushing and accumulate all rows in memory
        wb.setCompressTempFiles(true); //使用gzip压缩,减小空间占用
        Sheet sh = wb.createSheet("下载日志");
        //设置每一列的宽度,注意 要乘以256,因为1代表excel中一个字符的1/256的宽度
        sh.setColumnWidth(0, 40 * 256);
        sh.setColumnWidth(1, 40 * 256);
        sh.setColumnWidth(2, 22 * 256);
        Row rowHeader = sh.createRow(0);
        Cell cellHeader = rowHeader.createCell(0);
        cellHeader.setCellValue("id");
        cellHeader = rowHeader.createCell(1);
        cellHeader.setCellValue("name");
        cellHeader = rowHeader.createCell(2);
        cellHeader.setCellValue("create_time");
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        for(int rownum = 1; rownum < list.size() + 1; rownum++) {
            Row row = sh.createRow(rownum);
            Cell cell = row.createCell(0);
            cell.setCellValue(list.get(rownum - 1).getId());
            cell = row.createCell(1);
            cell.setCellValue(list.get(rownum - 1).getName());
            cell = row.createCell(2);
            cell.setCellValue(simpleDateFormat.format(list.get(rownum - 1).getCreateTime()));

            // manually control how rows are flushed to disk
            if(rownum % 100 == 0) {  // ((SXSSFSheet)sh).flushRows(100); // retain 100 last rows and flush all others
                ((SXSSFSheet) sh).flushRows();
                //is a shortcut for ((SXSSFSheet)sh).flushRows(0),
                // this method flushes all rows
            }
        }

        wb.write(out);
        out.close();
        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    } catch(Exception e) {
        e.printStacktrace();
    }
}


</pre><pre>
没有更多推荐了,返回首页