2

大きなExcelファイルの作成を処理する必要があるアプリケーションのExcelコンポーネントにPOI 3.8を使用しようとしています。高速でメモリ フット プリントが非常に少ない SXSSF ストリーミング アプローチを使用できてよかったです。ただし、データ検証を行うことができず、XSSF を使用する必要があります。

XSSF で xlsx ファイル (~5 MB) を開こうとすると、メモリが急増し、ほとんどの場合 OutOfMemory が発生します。私の質問は、

  1. SXSSF を使用して DataValidation (ドロップダウン リストから選択するなど) を実行することは可能ですか? これは私にとって祝福です。

  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();

DataValidationHelper が SXSSF シートから取得されるように、SXSSF ワークブックを配置します。

    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の同じ問題に直面しました...2日間の闘争の後、本当に完璧な以下のコードを最終的に見つけました。

このコードは 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 に答える