2

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

在 XSSF 中,当我尝试打开 xlsx 文件 (~5 MB) 时,内存会猛增,主要导致 OutOfMemory。我的问题是,

  1. 是否可以使用 SXSSF 进行数据验证(如从下拉列表中选择)。这对我来说将是一种祝福。

  2. 有没有办法使用 XSSF 进行数据验证,但内存占用更少。

  3. 是否有用于 xlsx 数据验证的替代 Java 解决方案,它快速且内存高效。

先感谢您..

4

3 回答 3

1

从调试器 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。

于 2014-09-12T20:26:27.133 回答
0

它适用于 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
于 2012-10-04T15:02:15.550 回答
0

我在解析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;
于 2013-10-20T07:31:32.990 回答