Java用于读取和写入xlsx的内存不足错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java用于读取和写入xlsx的内存不足错误相关的知识,希望对你有一定的参考价值。

我需要阅读几个xlsx文件,查找特定于员工的数据,同时创建另一个xlsx文件(如果我在任何文件中找到数据),文件名作为员工ID附加到我找到数据的名称。例如。有一个emp id为1的员工,有一些x,x等文件,如A,B,C ......等等;我需要在每个文件中查找与emp id 1相关的数据,对于我得到命中的文件,我需要创建一个名为1_A.xlsx的文件。

现在虽然我已经构建了逻辑并使用Apache POI API进行读写,但是在创建第一个带有数据的文件之后,我的代码会丢失内存错误。并且无法读取其余文件。我尝试过使用SXSSF而不是XSSF,但是会发生同样的OOM。

增加堆空间对我来说不是一个选择。请在此帮助...提前致谢。

这是一段代码:

//Reader:


 Row row = null;
   List<Row> listOfRecords = new ArrayList<Row>();
        try {
            FileInputStream fis = new FileInputStream(metaDataFile);
            new InputStreamReader(fis, "ISO-8859-1");
            XSSFWorkbook wb = new XSSFWorkbook(fis);
            XSSFSheet sheet = wb.getSheetAt(0);
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) {
                row = rowIterator.next();
                if (!isEmptyRow(row)) {
                    listOfRecords.add(row);
                }
            }
            wb.close();
            fis.close();

//Writer
LOGGER.info("in createWorkbook " );
        Workbook empWorkbook = new SXSSFWorkbook(200);
        Sheet empSheet = empWorkbook.createSheet("Itype Sheet For Emp_"
                + personnelNumber);
        int rowNum = listOfRecords.size();
        System.out.println("Creating excel");
        Cell c = null;
        for (int i = 0; i < rowNum; i++) {

            Row record = listOfRecords.get(i);
            Row empRow = empSheet.createRow(i++);
            if (!isEmptyRow(record)) {
                int colNum = record.getLastCellNum() + 1;

                for (int j = 0; j < colNum; j++) {
                    Cell newCell = empRow.createCell(j);

                    System.out.println("cellVal:"
                            + String.valueOf(record.getCell(j)));
                    newCell.setCellValue(String.valueOf(record.getCell(j)));

                }
            }
        }

编写器方法是从读者内部调用的。

答案

读取多个xlsx文件确实很棘手,但我终于解决了它。

我不得不将我的代码分解几次才意识到OOM错误是由于在读取3个文件之后没有剩余的内存来处理其余的文件。 xlsx文件是压缩的xml文件。因此,当我们尝试使用XSSF或SXSSF API读取它们时,它会将整个DOM加载到内存中,然后将其阻塞。我在这里找到了一个很好的解决方案:[https://github.com/monitorjbl/excel-streaming-reader]希望这会帮助那些来到这里遇到同样问题的人。

以上是关于Java用于读取和写入xlsx的内存不足错误的主要内容,如果未能解决你的问题,请参考以下文章

System.AccessViolationException”类型的未经处理的异常在 System.Data.dll 中发生。其它信息:尝试读取或写入受保护的内存。这通常指示其它内存已损坏。(代码片

C++ 内存不足:改为写入文件,在需要时读取数据?

使用 R 和 XLConnect 包时出现“内存不足错误 (Java)”

内存不足错误:Java 堆空间

内存不足错误,java堆空间

JAVA基础-输入输出:1.编写TextRw.java的Java应用程序,程序完成的功能是:首先向TextRw.txt中写入自己的学号和姓名,读取TextRw.txt中信息并将其显示在屏幕上。(代码片