我们试图使用POI 3.8作为我们的应用程序中的excel组件,它必须处理创建大型excel文件。我很高兴使用SXSSF流方法,它速度快,内存足印非常少。但是,我无法进行数据验证,必须使用XSSF。
在XSSF中,当我试图打开xlsx文件(~5MB)时,内存会迅速增加,并主要导致OutOfMemory。我的问题是,
谢谢你提前..。
发布于 2014-09-12 20:26:27
OutOfMemory的原因,从调试器中可以看出,POI3.10.1:
XSSFWorkbook has ArrayList<XSSFSheet>;
XSSFSheet has TreeMap<Integer,XSSFRow>;
XSSFRow has field _row._textsource._srcAfter found as char[32768]计数: 32768 *(行数)=完全浪费内存.在我的情况下超过1GB。
发布于 2012-10-04 15:02:15
它在ss.usermodel (http://poi.apache.org/spreadsheet/quick-guide.html#Validation)中运行得很好。
只是不像手册中那样使用XSSF工作簿:
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Data Validation");
DataValidationHelper dvHelper = sheet.getDataValidationHelper();将您的SXSSF工作簿放在那里,以便从SXSSF工作表中提取DataValidationHelper
Workbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet("Data Validation");
DataValidationHelper dvHelper = sheet.getDataValidationHelper();
//stuff with validation发布于 2013-10-20 07:31:32
在解析xlsx file...after两天的斗争中,我也面临着同样的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;https://stackoverflow.com/questions/10721279
复制相似问题