我期待写编程使用Java的Excel(.xls的MS Excel 2003中的格式)文件。 Excel的输出文件可包含我打算分割在张数(每片64k的行,由于高强极限)〜200,000行。
我已经使用Apache POI API的尝试,但它似乎是一个内存猪由于API对象模型。 我不得不细胞/表添加到工作簿对象在内存中,只有当所有数据添加,我可以在工作簿写一个文件! 这里的Apache如何建议我写使用他们的API Excel文件的示例:
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
//Create a row and put some cells in it
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
显然,写作〜20K行(每行10-20一些列)给了我可怕的“java.lang.OutOfMemoryError:Java堆空间”。
我曾尝试增加JVM初始堆大小和最大堆大小使用-Xms和XMX参数Xms512m和Xmx1024。 仍然无法写出超过15万行的文件。
我在寻找一种方式,以流式传输到一个Excel文件,而不是将其写入磁盘,希望这将节省大量的内存使用之前建设的全部内存文件。 任何替代API或解决方案,将不胜感激,但我限制到Java的使用。 谢谢! :)
所有现有的Java API尝试一次建立RAM整个文档。 试着写一个符合新XSLX文件格式,而不是一个XML文件。 让你开始,我建议建立在Excel所需形式的小文件并保存它。 然后打开它,并检查结构和更换你想要的部分。
维基百科有一个关于全盘格式化好文章 。
尝试使用SXSSF工作簿,对巨大的XLS文件,它的构建文档那是伟大的事情,并在所有不吃RAM,使用becase的NIO
我有我的文件分割成几个Excel文件,以克服堆空间异常。 我想,大约5K行与22列此而已,所以我只是做了我的逻辑,这样每个5K行我也将相应结束文件,开始一个新的,公正且具文件。
在这里我不得不写20K +行我会代表数据4+不同的文件的情况。
看一看在HSSF串行起了茧子工程。
该HSSF串行捕获SAX事件,并创建使用Microsoft Excel的XLS格式电子表格
还有就是JExcelApi的,但其使用更多的内存。 我想你应该创建.csv文件,并在Excel中打开它。 它允许你传递大量的数据,但您将无法做任何的“创先争优神奇”。
考虑使用CSV格式。 这样,你是记忆也许只有预先填充数据为CSV期间不限再暴病死,但可以有效地进行为好,例如,使用例如从数据库中查询行的子集LIMIT/OFFSET
,并马上记到文件,而不是写任何行之前拖了整个数据库表的内容转换成Java的内存。 在一个“表”量行的Excel的限制将增加至约100万人次。
这就是说,如果数据实际上是从一个数据库来的话,我会强烈重新考虑,如果Java是最适合这个工作的工具。 最体面的DB的有出口到CSV功能,可以undoubtely做这个任务更有效率。 在例如MySQL的情况下,你可以使用LOAD DATA INFILE
命令这一点。
我们开发了一个Java库,用于此目的,它是目前可以作为开源项目https://github.com/jbaliuka/x4j-analytic 。 我们使用它的运营报告。 我们产生巨大的Excel文件,〜20万应该没有问题的工作时,Excel设法太打开此类文件。 我们的代码使用POI加载模板,但生成的内容被直接流到而不在存储器XML或对象模型层到文件。
当您将数据插入到细胞这个内存问题发生时,或进行数据运算/生成?
如果你要加载的文件到Excel是由预定义的静态模板的格式,然后更好地节省模板,并重复使用多个时间。 通常情况下,模板时,你会生成每日销售报告或等发生...
否则,每次你需要创建新行,边境,从头柱等。
到目前为止,Apache的POI是我发现的唯一选择。
“很显然,写入〜20K行(每行10-20一些列)给了我可怕的‘java.lang.OutOfMemoryError:Java堆空间’。”
“IT企业”
你可以做的是 - 执行批处理数据插入。 创建一个queuetask表,每次生成1页,休息秒后,然后继续第二部分。 如果您的队列任务期间对动态数据变化的担心,可以先得到主键导入到Excel(通过隐藏并锁定从用户视图的列)。 首先运行将被插入主键,然后第二个队列跑起将记事本中读出,并通过部分做任务部分。
我们做的相当类似,相同的数据量,我们不得不切换到了JExcelApi因为POI是对资源的那么重。 尝试JExcelApi的,当你有操作大的Excel文件,你会不会后悔!