3~4年前に問題があったことは知っています(ASF バグ 57699.xlsx
)ファイルの読み取り(https://stackoverflow.com/questions/37749841/org-apache-poi-poixmlexception-strict-ooxml-isnt-currently-supported-please-se)。
今日、Apache POI 4.1 を試してみましたが、次の 1 行のコードでバグ #57699 がまだ表示されます。
XSSFWorkbook workbook = new XSSFWorkbook(uploadFile.getInputStream());
例外メッセージは以下のとおりです。
org.apache.poi.ooxml.POIXMLException: Strict OOXML isn't currently supported, please see bug #57699
異なる形式を使用する以外に、バグ #57699 の回避策はありますか?
答え1
私は@PJFanningのooxmlコンバーターを少し修正したバージョンを使用していますhttps://github.com/pjfanning/ooxml-strict-converter厳密な Excel ワークブックを (ストリームとして) チェックして変換し、POI で読み取ります。限られたテストでは機能しているようですが、私が持っているファイルは非常に単純です。
検出するには、InputStream を BufferedInputStream でラップし、Zip ファイル内の XML (xlsx ファイルは実際には zip ファイル内の XML ファイルのコレクションです) を調べて、厳密な形式であることを示す名前空間マーカーを探します。
答え2
https://github.com/pjfanning/excel-streaming-readerこの形式の xlsx ファイルの読み取りをサポートしています。
サポートはまだ進化中です。OOXML Strict 形式のサポートに関心がある場合は、利用可能な最新の excel-streaming-reader バージョンを使用することをお勧めします。
xlsx ファイルを読み取るとき、excel-streaming-reader はファイルが Strict OOXML 形式であることを自動的に認識します。