私は現在、Apache POIを使用してxlsxファイルを開くためのこのコードを持っています
File existingXlsx = new File("/app/app.xlsx");
System.out.println("File Exists: " + existingXlsx.exists());
Workbook workbook = WorkbookFactory.create(existingXlsx);
これを実行しようとすると、次の出力が得られます
File Exists: true
java.lang.NullPointerException
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:270)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:186)
at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:91)
開こうとしているファイルは Excel で開くことができ、データを正しく表示できます。POI に XLSX ファイルを読み取らせるにはどうすればよいですか?
破損するファイルは次のとおりです。
https://mega.co.nz/#!FJMWjQKI!CzihQgMVpxOQDTXzSnb3UFYSKbx4yFTb03-LI3iLmkE
編集
私も試しましたが、これは同じエラーになります。
Workbook workbook = new XSSFWorkbook(new FileInputStream(existingXlsx));
編集
例外をスローしている行を見つけました。
WorkbookDocument doc = WorkbookDocument.Factory.parse(getPackagePart().getInputStream());
this.workbook = doc.getWorkbook();
Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
for(POIXMLDocumentPart p : getRelations())
{
if(p instanceof SharedStringsTable) sharedStringSource = (SharedStringsTable)p;
else if(p instanceof StylesTable) stylesSource = (StylesTable)p;
else if(p instanceof ThemesTable) theme = (ThemesTable)p;
else if(p instanceof CalculationChain) calcChain = (CalculationChain)p;
else if(p instanceof MapInfo) mapInfo = (MapInfo)p;
else if (p instanceof XSSFSheet) {
shIdMap.put(p.getPackageRelationship().getId(), (XSSFSheet)p);
}
}
stylesSource.setTheme(theme); <== BREAKS HERE
編集
いくつかの調査 POI が styles.xml と workbook.xml を見つけることができないように思われる後、アーカイブの構造を示す TextWrangler のような単純なリーダーがスタイル xml を表示するため、これは奇妙だと思います。
これを修正するにはどうすればよいですか? アーカイブに挿入できるデフォルトの styles.xml と workbook.xml はありますか?