Java 将100万条记录写入包含300列的Excel文件

Java 将100万条记录写入包含300列的Excel文件,java,apache-poi,excel-2007,Java,Apache Poi,Excel 2007,我正在使用ApachePOI流式API-SXSSFWorkbook将数据写入excel文件。 但是,如果Excel文件的大小大于100Mb,则超过100000条记录(通常为300列)的Excel文件将被破坏。有没有办法将大量数据写入excel文件 class Test1 { public static void main(String[] args) throws FileNotFoundException, { SXSSFWorkbook workbook = new SX

我正在使用ApachePOI流式API-SXSSFWorkbook将数据写入excel文件。 但是,如果Excel文件的大小大于100Mb,则超过100000条记录(通常为300列)的Excel文件将被破坏。有没有办法将大量数据写入excel文件

class Test1 {
   public static void main(String[] args) throws FileNotFoundException,  {


    SXSSFWorkbook workbook = new SXSSFWorkbook(100);

    workbook.setCompressTempFiles(true);
    Sheet sheet = null;
    Row row = null;
    Cell cell = null;
    sheet =  workbook.createSheet("Demo1");
    FileOutputStream outStream = new FileOutputStream("D:\\Test1.xlsx");
    try {

        for (int i = 0; i < 100000; i++) {
            row = sheet.createRow(i);
            for (int j = 0; j < 300; j++) {
                cell = row.createCell(j);
                cell.setCellValue(" row : "+i +" col: "+ j);
            }
        }


        workbook.write(outStream);

    } catch (Exception exception) {
        exception.printStackTrace();
    } finally {
        workbook.dispose();
        try {
            outStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
类Test1{
公共静态void main(字符串[]args)引发FileNotFoundException{
SXSSFWorkbook工作簿=新的SXSSFWorkbook(100);
workbook.setCompressTempFiles(true);
Sheet=null;
行=空;
Cell=null;
工作表=工作簿。创建工作表(“演示1”);
FileOutputStream outStream=新的FileOutputStream(“D:\\Test1.xlsx”);
试一试{
对于(int i=0;i<100000;i++){
行=表。创建行(i);
对于(int j=0;j<300;j++){
cell=row.createCell(j);
cell.setCellValue(“行:+i+”列:+j);
}
}
练习册。写(扩展);
}捕获(异常){
异常。printStackTrace();
}最后{
workbook.dispose();
试一试{
exptream.close();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
编辑1:

我发现,这不是Apache POI流式Api的问题。它正在生成包含100万条记录的文件。但Excel没有加载该文件。它给出了“内存不足,无法完成此操作”错误

我使用的是Excel 2013 32位版本,最多只能使用2GB内存。我创建的包含100k条记录和300列的Excel文件的文件大小为108MB。当我尝试在Excel中打开此文件时,它会占用大量系统内存。一旦内存消耗达到1.7MB,Excel就会给出一个错误

加载使用Apache流式API生成的100万行的最低配置是什么?如有任何帮助,将不胜感激

谢谢

编辑2:
如果我以zip格式打开使用Apache流式Api生成的Excel文件(通过将.xlsx重命名为.zip),xl->worksheets文件夹中的xml文件大小约为2GB,可容纳100k条记录和300列。是否有任何方法可以减小此xml文件的大小。

我本人从未尝试生成超过100到120列的xml文件。但最大255列的限制并不令人惊讶(旧Excel格式就是这样)。您观察到,100k行200列运行良好,而100k行300列运行失败,这是此类限制的有力指标

然后,您应该能够生成包含多达255列的100万行(确切地说是1048576行)工作表。对于任何额外的行和额外的列,您都需要创建额外的工作表

所以,对于300列目标,您将生成包含前255列的sheet1(如果有合理的逻辑分组,则生成更少的列),以及包含其他列的sheet2

对于更多行,使用一对新的图纸重复2张图纸方法,直到生成所有行

顺便说一句,

您是否意识到使用SXSSFWorkbook时,RowAccessWindowsSize为“1”时性能最佳?

问题出在哪里?我正在使用SXSSF流媒体编写大型XLSX文件,没有遇到任何问题。(除了有足够的输出和tmp区域的磁盘空间)。当我尝试使用Excel 2007打开文件时,它会显示“Excel发现无法读取的内容”。非常感谢您提供的任何帮助。您是否验证了是否有足够的磁盘空间?生成工作Excel文件的代码是否相同?是否只生成了一些行(例如<100k)?是否使用较少的列(.例如<256)?是的,它正在创建包含100k行和200列的工作excel文件。我有足够的磁盘空间。我正在使用jdk 1.8和apche poi 3.14-finalThen。您知道XLSX格式只允许1048576行包含excel文件。因此,最大行数(基于零的索引!)是1048575。如果你有更多的行,你需要使用不同的技术。例如,开始一个新的工作表。谢谢你的回复。你使用哪个office版本来打开包含100列和100行的文件。我使用的是Excel 2007 32位版本。如果我试图打开文件,它就没有足够的资源来显示错误消息。个人使用LibreOffice。但是错误消息听起来好像你的机器太小,无法打开文件。你能分享用于加载使用Apache流媒体API生成的100万条记录的系统配置详细信息吗。谢谢。2 8core Xeon E5,3GHz,256GB主内存,512GB交换,NetBSD 6你真的不应该在第一个页面中尝试生成这么大的Excel我认为Excel是人类消费的东西,但没有人能够阅读或查看100万行意义(而不是ONYL,因为它需要大量的时间来打开)。我真正的处理是使用文本文件(CSV)。Excel仅仅是为了满足客户的请求。(我只是生成它并验证它是否正常。我假设,客户端没有人试图打开Excel。他们只是将其存储起来以备文档使用。)