次のコードを実行して、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 を使用してこれらのプロパティにアクセスする方法を知っていますか?
ありがとう。
よろしく。