以前、Excel 拡張子 (xls) (xlsx) 両方に対応した操作 Apache POI として、
oboe2uran.hatenablog.com
を書いた。
しかし、ファイルシステムによっては、Excel WorkBook の認識に、
Your InputStream was neither an OLE2 stream, nor an OOXML stream
or you haven't provide the poi-ooxml*.jar in the classpath/modulepath - FileMagic:
と、エラーになってしまうことがある。
どうも、POI の先読みの方法とPushBackInputStream の使い方が悪いように見える。
そこで、前のコンストラクタで InputStream を渡して Book を生成する部分を以下のように修正する。
public class ExcelWorker implements Closeable{ private Workbook book; private static final int MAX_PATTERN_LENGTH = 44; public ExcelWorker(InputStream inst) throws EncryptedDocumentException, IOException { PushbackInputStream inp = new PushbackInputStream(inst, MAX_PATTERN_LENGTH); byte[] data = new byte[MAX_PATTERN_LENGTH]; inp.read(data, 0, MAX_PATTERN_LENGTH); inp.unread(data); FileMagic fm = FileMagic.valueOf(data); if (FileMagic.OOXML==fm){ book = new XSSFWorkbook(inp); }else if(FileMagic.OLE2==fm){ book = new HSSFWorkbook(inp); }else { book = WorkbookFactory.create(inp); } }