【发布时间】:2013-08-16 13:53:39
【问题描述】:
我目前有这段代码可以使用 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?
【问题讨论】:
-
你有资源吗?你可以调试它
-
您对文件有读取权限吗?您还确定它不是目录吗?除此之外,我会按照@nachokk 所说的进行调试。
-
查看编辑,该行与stylesSource.setTheme(theme);
-
您使用的是什么版本的 Apache POI?如果它不是最新的,您是否尝试过升级?
-
我能够下载您的 xls 表并通过 POI 3.9 阅读它。 style.xml 和 workbook.xml 由 POI 自动检索/生成。在我的运行中,没有 NullPointerException,因为 stylesSource 在 for 循环中已正确初始化。我怀疑你的类路径或使用的 jars 有问题。你能创建一个新的非常简单的 xls 文件,在 1 个单元格中只添加 1 个值,看看你是否能够使用当前设置读取它?只是想确认您是否遇到问题将所有 xls 文件或只是这个..
标签: java excel apache-poi