使用POI读取大型Excel时遇到内存问题

我正在努力的地方,我需要阅读和大型xlsx转换为CSV文件。 我需要读取每行中特定数量的单元格(预定义)。 inputxlsx表单包含100万条logging,最大150 MB大小。 我已经使用POI API。 它工作正常与小xlsx文件和大文件抛出Java堆空间错误。 请看下面的代码并提供解决scheme。 我不太了解Event / SAXParser api,并假设它将适合读取大的xls文件。

package test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Iterator; import org.apache.commons.lang.StringUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class XLSXToCSVConverterNew { public static void xlsx(File inputFile, File outputFile,int expectedColumns) { // For storing data into CSV files StringBuffer data = new StringBuffer(); String separetorString="|"; try { if(outputFile.exists()) outputFile.delete(); FileOutputStream fos = new FileOutputStream(outputFile); XSSFWorkbook wBook = new XSSFWorkbook(new FileInputStream(inputFile)); XSSFSheet sheet = wBook.getSheetAt(0); Row row; System.out.println("Number of rows in sheet are :"+sheet.getLastRowNum()); Iterator<Row> rowIterator = sheet.iterator(); while (rowIterator.hasNext()) { row = rowIterator.next(); //check whether content is there in atleast one cell out of expected columns count if (containsValue(row, 0, expectedColumns-1) == true){ for(int i=0; i<=expectedColumns-1; i++) { Cell cell = row.getCell(i); switch (cell.getCellType()) { case Cell.CELL_TYPE_BOOLEAN: cell.setCellType(Cell.CELL_TYPE_STRING); if(i!=expectedColumns-1) data.append(cell.getStringCellValue() + separetorString); else data.append(cell.getStringCellValue() ); break; case Cell.CELL_TYPE_NUMERIC: cell.setCellType(Cell.CELL_TYPE_STRING); if(i!=expectedColumns-1) data.append(cell.getStringCellValue() + separetorString); else data.append(cell.getStringCellValue() ); break; case Cell.CELL_TYPE_STRING: if(i!=expectedColumns-1) data.append(cell.getStringCellValue() + separetorString); else data.append(cell.getStringCellValue() ); break; case Cell.CELL_TYPE_BLANK: if(i!=expectedColumns-1) data.append("" + separetorString); else data.append(""); break; default: if(i!=expectedColumns-1) data.append(cell + separetorString); else data.append(cell); } } if(data.length()!=0){ data.append('\n'); fos.write(data.toString().getBytes()); data.delete(0, data.length()); } } } fos.close(); } catch (Exception ioe) { ioe.printStackTrace(); } } public static boolean containsValue(Row row, int fcell, int lcell) { boolean flag = false; for (int i = fcell; i < lcell; i++) { if (StringUtils.isEmpty(String.valueOf(row.getCell(i))) == true || StringUtils.isWhitespace(String.valueOf(row.getCell(i))) == true || StringUtils.isBlank(String.valueOf(row.getCell(i))) == true || String.valueOf(row.getCell(i)).length() == 0 || row.getCell(i) == null) { } else { flag = true; } } return flag; } public static void main(String[] args) { File inputFile = new File("/home/mypc/Desktop/poi/test.xlsx"); File outputFile = new File("/home/mypc/Desktop/poi/test.csv"); xlsx(inputFile, outputFile,30); } }