2013-10-23 94 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