上传后如何读取大尺寸excel文件

pb3s4cty  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(346)

发帖前我搜索了一下,但没有找到答案。
我有一个更大的excel文件可能是大于10 mb的.xls/xlsx。当我读小excel文件,然后它读ok。但当它很大时,它表示内存/堆不足。有人说要增加堆大小,但我认为这不是一个好的解决方案。我正在上传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文件的解决方案是什么。我正在使用ApachePOIAPI。

sg2wtvxw

sg2wtvxw1#

如果文件可能变得非常巨大,并且可能总是超出可用内存,那么您可以查看apachepoi中的流式api,例如https://poi.apache.org/spreadsheet/how-to.html#event_api
它附带了一个准备运行的示例。
对于.xlsx/xssf格式的文件,有一种类似的方法可以更好地提供工作簿中的数据,请参见https://poi.apache.org/spreadsheet/how-to.html#xssf_sax_api

相关问题