2012-05-23 272 views
2

我們試圖在我們的應用程序中使用POI 3.8來處理創建大型Excel文件的應用程序。我很高興使用SXSSF流式處理方法,該方法速度快而且內存佔用少。但是,我無法進行數據驗證並必須使用XSSF。使用xlsx(XSSF)POI OutOfMemory異常

在XSSF中,當我嘗試打開xlsx文件(〜5 MB)時,內存開始出現並且主要導致OutOfMemory。我的問題是,

  1. 是否有可能做資料驗證(比如從下拉列表中選擇),使用SXSSF。這對我來說是一件幸事。

  2. 是否有一種方法可以使用XSSF進行數據驗證,但內存足跡較少。

  3. 是否有替代Java解決方案的xlsx數據驗證,它具有快速和高效的內存。

預先感謝您..

+0

建議您詢問poi用戶郵件列表,甚至打開帶有測試用例的JIRA。 – bmargulies

回答

0

它工作得很好用ss.usermodel使用XSSF工作簿就像剛代替(http://poi.apache.org/spreadsheet/quick-guide.html#Validation

其在手冊中:

Workbook workbook = new XSSFWorkbook();  
Sheet sheet = workbook.createSheet("Data Validation"); 
    DataValidationHelper dvHelper = sheet.getDataValidationHelper(); 

放在那裏你的SXSSF工作簿,這樣DataValidationHelper將被從SXSSF表中取出

Workbook workbook = new SXSSFWorkbook();  
    Sheet sheet = workbook.createSheet("Data Validation"); 
     DataValidationHelper dvHelper = sheet.getDataValidationHelper(); 
//stuff with validation 
0

我在解析xlsx文件時也遇到了同樣的OOM問題......經過兩天的努力,我終於找到了下面的代碼,它非常完美;

此代碼基於sjxlsx。它讀取xlsx並將其存儲在HSSF表單中。內存不足的

  // read the xlsx file 
     SimpleXLSXWorkbook = new SimpleXLSXWorkbook(new File("C:/test.xlsx")); 

     HSSFWorkbook hsfWorkbook = new HSSFWorkbook(); 

     org.apache.poi.ss.usermodel.Sheet hsfSheet = hsfWorkbook.createSheet(); 

     Sheet sheetToRead = workbook.getSheet(0, false); 

     SheetRowReader reader = sheetToRead.newReader(); 
     Cell[] row; 
     int rowPos = 0; 
     while ((row = reader.readRow()) != null) { 
      org.apache.poi.ss.usermodel.Row hfsRow = hsfSheet.createRow(rowPos); 
      int cellPos = 0; 
      for (Cell cell : row) { 
       if(cell != null){ 
        org.apache.poi.ss.usermodel.Cell hfsCell = hfsRow.createCell(cellPos); 
        hfsCell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING); 
        hfsCell.setCellValue(cell.getValue()); 
       } 
       cellPos++; 
      } 
      rowPos++; 
     } 
     return hsfSheet; 
0
原因

,如從調試器看到的,POI 3.10.1:

XSSFWorkbook has ArrayList<XSSFSheet>; 
XSSFSheet has TreeMap<Integer,XSSFRow>; 
XSSFRow has field _row._textsource._srcAfter found as char[32768] 

計數:32768 *(行數)=的存儲器完全是浪費....超過1 GB在我的情況。