在发布之前我搜索过但没有得到解决方案。
我有一个更大的excel文件可能是.xls / xlsx的> 10 MB当我正在阅读小excel文件时,它读取正常。但当它的大,它说内存/堆。有人说要增加堆大小,但我认为它不是一个好的解决方案。 我正在上传excel文件并阅读:
byte b[] = file.getBytes();
InputStream ips = new ByteArrayInputStream(b);
Workbook workbook = WorkbookFactory.create(ips);
Sheet sheet = workbook.getSheetAt(0);
// ============
int i = 0;
List<String> colName = new ArrayList<>();
Map<Integer, Object> lhm = null;
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext())
{
lhm = new LinkedHashMap<>();
Row row = rowIterator.next();
// For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
Cell cell = cellIterator.next();
// Check the cell type and format accordingly
switch (cell.getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
// System.out.print(cell.getNumericCellValue() + "--");
if (DateUtil.isCellDateFormatted(cell))
{
lhm.put(cell.getColumnIndex(), Utils.getDateStringFromString(cell.getDateCellValue().toString(), "yyyy-MM-dd"));
} else
{
lhm.put(cell.getColumnIndex(), String.valueOf(cell.getNumericCellValue()));
}
break;
case Cell.CELL_TYPE_STRING:
if (i == 0)
{
colName.add(cell.getStringCellValue());
} else
{
// System.out.print(cell.getStringCellValue() +
// "==");
lhm.put(cell.getColumnIndex(), cell.getStringCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
// System.out.print(cell.getBooleanCellValue() + "--");
lhm.put(cell.getColumnIndex(), String.valueOf(cell.getBooleanCellValue()));
break;
}
}
此代码不适用于大型excel文件。什么是xls / xlsx文件的解决方案。我正在使用apache POI API。
答案 0 :(得分:1)
如果文件变得非常庞大并且可能总是超出可用内存,您可以查看Apache POI中的流式API,例如:看看https://poi.apache.org/spreadsheet/how-to.html#event_api
它带有一个可立即运行的示例。
对于.xlsx / XSSF格式的文件,有一种类似的方式可以更好地提供工作簿中的数据,请参阅https://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api