2013-10-23 56 views
2

我能够使用XSSF读取现有XLSM和使用SXSSF数据写入工作表。最后将其输出为OutputStream的另一个xlsm。
SXSSF是在文档
写XLSX提的是正确的方法来读取和写入大量数据或文件XLSM如果这个解决方案会做会损坏?
这是示例代码的作品,阅读模板XLSM和写作使用SXSSF(POI),大数据,现有工作表

public static void main(String[] args) throws Throwable { 

    OPCPackage pkg = OPCPackage.open(new File("sample.xlsm")); 
     XSSFWorkbook wb_template; 
     wb_template = new XSSFWorkbook(
      pkg 
     ); 
     System.out.println("package loaded"); 
    SXSSFWorkbook wb = new SXSSFWorkbook(wb_template); 
    wb.setCompressTempFiles(true); 

    SXSSFSheet sh = (SXSSFSheet) wb.createSheet(); 
    sh.setRandomAccessWindowSize(100);// keep 100 rows in memory, exceeding rows will be flushed to disk 
    for(int rownum = 4; rownum < 5000; 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); 
     } 

    } 
    FileOutputStream out = new FileOutputStream(new File("C:\\ouput\\new_file.xlsm")); 
    wb.write(out); 
    out.close(); } 
+0

SXSSF。如果你的代码用于加载XSSF,为什么不继续使用它呢? – Gagravarr

+0

@Gagravarr:我试过它作为web应用程序,并获得堆转储并发用户..有没有其他的方式来加载工作簿,然后使用sxssf? – Sva

回答

2

我看不出有任何问题与您当前的代码,但是在apache website它说,SXSSF离开你的计算机上的临时文件,而且必须调用处理如下:

Note that SXSSF allocates temporary files that you must always clean up explicitly, by calling the dispose method. 
SXSSFWorkbook wb = new SXSSFWorkbook(100); 
// dispose of temporary files backing this workbook on disk 
wb.dispose(); 

我会建议执行处置,因为它似乎阻止剩余的信息被存储。它是否是正确的做法,我建议采取一个测试文件,并给它一对夫妇去,如何代码执行的意愿会被你的系统(CPU电源,内存等),你的文件的大小会受到影响处理。

祝你好运!只需要非常大的文件

+0

我得到了你的观点,..会增加部署在我的代码,..是否有与大型数据XLSM任何其他方法(因为堆大小问题XSSF结果)..其实我需要通过XLSM和输出它加入庞大的数据..这种方法需要时间和CPU处理 – Sva

+0

我知道,如果你运行的命令行,你可以从它可能只是导致了缓慢的数据的大小,增加更多的堆空间吧,除了程序,如果你有数量巨大,那么在一定的处理时间内可能没有办法。不幸的是,我从来没有对Excel和大量数据做过任何事情,所以我不知道“最佳”方式。 – Levenal