当前位置: 首页 > 知识库问答 >
问题:

使用xlsx(XSSF)的POI OutOfMemory异常

闻人博
2023-03-14

我们正在尝试将POI 3.8用于应用程序中的excel组件,该组件必须处理大型excel文件的创建。我很高兴使用SXSSF流媒体方法,它速度快,内存占用少。然而,我无法进行数据验证,必须使用XSSF。

在XSSF中,当我尝试打开xlsx文件(大约5 MB)时,内存会急剧增加,并且大部分会导致OutOfMemory。我的问题是,

>

  • 是否可以使用SXSSF进行数据验证(如从下拉列表中选择)。这将是我的祝福。

    有没有一种方法可以使用XSSF进行数据验证,但内存占用更少。

    是否有另一种快速且内存高效的xlsx数据验证java解决方案。

    提前谢谢你。。

  • 共有3个答案

    百里疏珂
    2023-03-14

    我在解析xlsx文件时也遇到了同样的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;
    
    骆磊
    2023-03-14

    它与ss配合得很好。用户模型(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
    
    姜永贞
    2023-03-14

    调试器POI 3.10.1中可以看到OutOfMemory的原因:

    XSSFWorkbook has ArrayList<XSSFSheet>; 
    XSSFSheet has TreeMap<Integer,XSSFRow>;
    XSSFRow has field _row._textsource._srcAfter found as char[32768]
    

    计数:32768*(行数)=完全浪费内存......在我的情况下超过1 gb。

     类似资料:
    • 根据要求,我的应用程序首先需要读取一个大约75k-100k行和90列的Excel文件。但在XSSFWorkbook加载pkg/file时,我在第2行遇到了以下异常 线程“main”Java.lang.OutOfMemoryError中出现异常:com.sun.org.apache.xerces.internal.dom.DeferredDocumentMPL.CreateChunk中的Java堆空

    • 我正在使用ApachePOI,我创建了一个XSSF工作簿,并尝试打开一个xlsx文件。它在当地的一个地方很有效。但是,当我用Excel打开真正服务器(AWS EC2、Tomcat8、JDK 1.8)上的Excel文件时,它显示文件已损坏(.xls工作)。这是我的代码: 本地Spring4, jdk1.8, tomcat 8.0, maven 真正的AWS EC2亚马逊linux2,jdk1。8、t

    • 这里是ApachePOI4.x。我看到有两种类型的实现: HSSF工作手册 我需要编写一个Java 8应用程序,它可以读取带有“”(xls)或“”(xlsx)扩展名的Excel表格。也就是说,Excel文件是以“旧”(2003年以前)格式保存的,还是更新的格式保存的。 假设我对XLS文件使用HSSF,对XLSX文件使用XSSF,安全吗?或者映射逻辑在这里稍微复杂一点?这个答案似乎表明我是正确的,但

    • 问题内容: 打开并立即关闭使用Apache POI XSSF创建的xlsx文件后,系统提示我保存未保存的更改。据我所知,这是因为我在xlsx文件中使用公式。 根据javadoc,这应该通过设置来绕过。 但是,这不能解决问题。 我还尝试过手动重新计算公式,然后再保存文件而没有成功。 SSCCE: 第一次打开文件后,我该怎么做才能创建文件而又没有提示保存文件? 更新:如此处 所述(https://po

    • Cross-Site Scripting Framework (XSSF)是一款安全工具,使用它可以非常容易的利用跨站脚本(XSS)漏洞。XSSF项目的主要目的是展示XSS的实际危害。

    • 我一直在开发一个android应用程序,在这个应用程序中,我必须打开.xls和.xlsx文件以便进一步实现。在.xls的情况下,一切工作正常,但当我尝试打开.xls x文件时,它给了我异常。下面是我的代码,请帮助我解决这些异常 我正在使用的JAR: null