POI到量大的数据到EXCEL

根据官网ex:

SXSSF(包:org.apache.poi.xssf.streaming)是一种API-compatible流扩展XSSF时使用 非常大的电子表格制作,和堆空间是有限的。 SXSSF达到低内存占用通过限制访问的行 在一个滑动窗口,而XSSF给访问的所有行吗 文档。 老行不再是在窗口变得无法访问, 他们将被写入到磁盘。

您可以指定在工作簿窗口大小通过施工时间 新SXSSFWorkbook(int windowSize) 或者你可以把它per-sheet通过 SXSSFSheet # setRandomAccessWindowSize(int windowSize)

当创建一个新行通过createRow()和总数 不能记录将超过指定的窗口大小,然后 行索引值最低的刷新和无法访问 通过getRow()了。

默认的窗口大小 100年 并通过SXSSFWorkbook.DEFAULT_WINDOW_SIZE定义。

windowSize 1表示无限的访问。 在这种情况下所有的 记录没有被调用刷新flushRows()是可用的 随机存取。

注意,SXSSF分配临时文件 必须 总是显式清理,通过调用dispose方法。

SXSSFWorkbook默认使用内联字符串而不是共享的字符串 表。 这是非常有效的,因为不需要保存在文档内容 内存,但也是产生不兼容的文档 一些客户。 与所有独特的字符串在字符串启用共享文档 必须保存在内存中。 根据你的文档内容可以使用 比使用共享更多的资源字符串禁用。

仔细检查你的记忆在决定前预算和兼容性的需求 是否启用共享字符串。

下面的例子写一张100行之窗。 当行数达到101, rownum = 0的行是刷新到磁盘,从内存,当rownum达到102然后rownum = 1的行是刷新,等等。

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

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(100); // keep 100 rows in memory, exceeding rows will be flushed to disk
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

        }

        // Rows with rownum < 900 are flushed and not accessible
        for(int rownum = 0; rownum < 900; rownum++){
          Assert.assertNull(sh.getRow(rownum));
        }

        // ther last 100 rows are still in memory
        for(int rownum = 900; rownum < 1000; rownum++){
            Assert.assertNotNull(sh.getRow(rownum));
        }

        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
    }

下一个示例关闭清洗法(windowSize = 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.usermodel.Workbook;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

    public static void main(String[] args) throws Throwable {
        SXSSFWorkbook wb = new SXSSFWorkbook(-1); // turn off auto-flushing and accumulate all rows in memory
        Sheet sh = wb.createSheet();
        for(int rownum = 0; rownum < 1000; rownum++){
            Row row = sh.createRow(rownum);
            for(int cellnum = 0; cellnum < 10; cellnum++){
                Cell cell = row.createCell(cellnum);
                String address = new CellReference(cell).formatAsString();
                cell.setCellValue(address);
            }

           // 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
           }

        }

        FileOutputStream out = new FileOutputStream("/temp/sxssf.xlsx");
        wb.write(out);
        out.close();

        // dispose of temporary files backing this workbook on disk
        wb.dispose();
   }

SXSSF冲单数据在临时文件(每单临时文件),这些临时文件的大小 可以长到一个非常大的价值。 例如,对于一个20 MB csv数据大小的临时xml成为超过十亿字节。 如果临时文件的大小是一个问题,你可以告诉SXSSF使用gzip压缩:

SXSSFWorkbook wb = new SXSSFWorkbook();
  wb.setCompressTempFiles(true); // temp files will be gzipped
时间: 2024-10-10 23:55:59

POI到量大的数据到EXCEL的相关文章

poi大数据读写excel

一.描述 前端时间写了注解方式Excel的读取和写入,它是根据注解完成Excel的操作,虽说支持大数据,但对于超大数据就无能为力了,因为它的读写期间都是将所有数据放入系统内存的,除非你有超大的内存. 因项目需要对超大数据的Excel读写操作,于是网上找了个超大数据的读写代码,这个不需要太大内存.并对此进行了简单的修改. 原理如下: Excel超大数据读取:抽象Excel2007读取器,excel2007的底层数据结构是xml文件,采用SAX的事件驱动的方法解析 xml,需要继承DefaultHa

java POI 写入百万数据到 excel

.xls文件只支持6w+的数据写入 .xlsx文件只支持104w+数据的写入 在java中jxl工具类只能操作.xls的文件,不能操作.xlsx的文件 POI工具类能够支持.xlsx的文件操作. excel的数据读写都相应的简单,网上也有很多的代码,我这里要说的是怎么样写入100w+的数据到Excel中. 在POI中,XSSFWorkbook  wb = new XSSFWorkbook ();创建的工作簿能够写入大量的数据,但很大的可能下会虚拟机内存不够而报错 在这种情况下有两种解决方案: 1

使用poi导出大量数据到excel遇到的问题

最近在工作遇到利用poi导出大量数据到excel并提供下载的运用场景,并遇到了一个问题,当数据量过大时(几十万),后台在进行数据写入excel中的过程会非常耗时,导致迟迟没有响应前台,结果数据还没导完,前台页面就已经崩掉了. 解决思路:接收到前台导出excel请求之后,开一个线程,在线程里进行数据的写入和将写入完成的excel保存到服务器中等耗时操作,前台定时发送ajax请求检测是否已经导出完成,如果完成则提供一个下载链接到前台供用户下载. 想到解决思路之后,自己写了一个小demo,顺便学习下利

JAVA Apache POI 之sax 解析10万级大数量数据

第一步让我们来看看我们的大量数据的excel 文件 好的下面第二步看一下代码: package com.chinait.utils; /** * 写这个东西主要是最近做了一个联通的数据迁移工作,他们就是这样导出的数据,所以我们写了这个代码. * 还有一个就是网上n 多都是半成品,代码不能直接运行,我这个代码能够直接运行. * java poi 之sax 解析10万级大数量数据,其实百万,千万都是可以的, * 但是想到这么大的数据一般不会使用excel 进行导入数据的行为,所以我采用了这个方法只是

Java使用POI实现数据导出excel报表

在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF .所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表.在java中有很多实现数据导出excel报表的第三方jar包.但在比较了一下感觉还是POI相对来

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab

hsql数据量大的时候 left join 查询非常慢

最近遇到使用hsql查询两张表的时候,发现一旦left join就差些很慢,单独查很快,不知道为什么. 然后听说hsql只要数据量稍微大点,再 join一下就很慢,绞尽脑汁想到了一天终于想到办法了. 于是拆分sql把依然使用left join,但是事先把两个表的结果集变小就可以left join了.例子如下 select p.parent_id, p.id, p.pid, p.c_name, p.path, p.params, p.p_type, p.area_code, p.appid, SU

sql:日期操作注意的,如果以字符串转日期时的函数,因为数据量大,会出问题

---1.以日期字符操作转换日期 如果是VIP1生日不对,可以以上传的数据日期为生日 begin declare @NowBirthday datetime, @birthday datetime,@stat datetime,@end datetime,@statbirthday datetime,@endbirthday datetime,@thirdbirthday datetime,@firthbirthday datetime, @year int,@month int , @day

java利用poi导出数据到excel

背景: 上一篇写到利用jtds连接数据库获取相应的数据,本篇写如何用poi将数据到处到excel中,此程序为Application 正文: 第三方poi jar包:poi驱动包下载 代码片段: /** * 将数据导出到excel中 * @param data 将要被导入到excel中的数据 * @throws IOException */ public void crateTempFile(ArrayList<LinkedHashMap<String, String>> data)