1

次のコードを実行して、xlsm ファイルを csv に変換しようとしています。

//Workbook wbk = new HSSFWorkbook(new FileInputStream(new File("myFile.xls")));
Workbook wbk = new XSSFWorkbook(new FileInputStream(new File("myFile.xlsm")));

for (int i = 0; i < wbk.getNumberOfNames(); i++) {

    if (wbk.getNameAt(i).getNameName().startsWith("START\\")) {

        // Get SheetName
        sheetName = wbk.getNameAt(i).getSheetName();

        // Get csv Filename
        csvFilename = generateFileName(wbk.getNameAt(i).getNameName(), currentDate);

        // Starting row index for this sheet
        startingRowIndex = getStartingRowIndex(wbk, i);

        // Max column index for this sheet
        maxColumnIndex = getMaxColumnIndex(wbk, wbk.getSheet(sheetName));

        // Convert sheet to csv
        toCSV(csvFilename, startingRowIndex, maxColumnIndex, wbk, sheetName);
    }
}

-Xmx 引数は 1024 に設定され、xslm ファイルを使用します。このファイルは 15 Mo です。

"java.lang.OutOfMemoryError: Java heap space"最初の行でこのエラーが発生します。

xls 形式 (50 Mo) の同じファイルを使用すると、うまく機能します。

Xmx 引数を変更できず、POI 以外の API を使用できません。

この種のメモリの問題にはSAX APIを使用することをお勧めします。

ただし、私のファイルでは、すべてのシートとすべての行を CSV で抽出する必要はありません。そのため、「wbk.getNumberOfNames()」を使用して、(名前マネージャーで) 定義されたすべての名前を取得し、変換するシートを認識します。

SAX API を使用してこれらのプロパティにアクセスする方法を知っていますか?

ありがとう。

よろしく。

4

1 に答える 1

0

次の Apache POI コード例では、SAX パーサーを使用して XLSX ファイルを CSV に変換します。 http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

于 2012-11-18T21:25:18.880 に答える