我目前有这段代码可以使用 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?
最佳答案
现在我已经下载了最新的软件包:
- poi-src-3.9-20121203.zip(作为源)
- xmlbeans-2.6.0.zip
- jsr173_1.0_api.jar
- 解析器.jar
- xbean.jar
- xbean_xpath.jar
- xmlbeans-qname.jar
- xmlpublic.jar
- ooxml-schemas-1.1.jar
- dom4j-1.6.1.jar
- commons-codec-1.8.jar
- commons-logging-1.1.3.jar
- ant.jar( Ant 1.7)
并且您的test2.xlsx 被读取没有问题:
public static void main(String arg []){
try {
//File existingXlsx = new File("/app/app.xlsx");
File existingXlsx = new File("c:/Java/poi-3.9/test-data/__theproblem/test2.xlsx");
System.out.println("File Exists: " + existingXlsx.exists());
Workbook workbook = WorkbookFactory.create(existingXlsx);
} catch (Exception e) {
e.printStackTrace();
}
}
您确定您正在按照 POI 文档的建议使用 ooxml-schemas-1.1.jar 吗?
编辑
嗯。它也适用于 jar。
我已经从 poi-bin-3.9-20121203.tar.gz 下载了 http://poi.apache.org/download.html
在 Eclipse 中创建一个新项目,从 zip 中提取所有 jar:
- lib/commons-codec-1.5.jar
- lib/commons-logging-1.1.jar
- lib/dom4j-1.6.1.jar
- lib/junit-3.8.1.jar
- lib/log4j-1.2.13.jar
- lib/poi-3.9-20121203.jar
- lib/poi-examples-3.9-20121203.jar
- lib/poi-excelant-3.9-20121203.jar
- lib/poi-ooxml-3.9-20121203.jar
- lib/poi-ooxml-schemas-3.9-20121203.jar
- lib/poi-scratchpad-3.9-20121203.jar
- lib/stax-api-1.0.1.jar
- lib/xmlbeans-2.3.0.jar
- 添加测试 xlsx:
- 测试数据/test2.xlsx
- 测试Java:
- src/XlsxReadTest1.java
来源:
import java.io.File;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class XlsxReadTest1 {
public static void main(String arg []){
try {
File existingXlsx = new File("c:/Java/__Work/apache_POI/poi-3.9-bin/test-data/test2.xlsx");
System.out.println("File Exists: " + existingXlsx.exists());
Workbook workbook = WorkbookFactory.create(existingXlsx);
System.out.println("A1: " + workbook.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行。 (用jdk1.7.0_07、jdk1.6.0_31试过)
结果:
File Exists: true A1: Testing Edit
“测试编辑”是文件第一个工作表上第一个单元格的内容。
我认为,您可以从头开始尝试。
(也许你正在为你的项目使用其他jar,谁在类加载器中干扰这个jar?类加载器是一个狡猾的家伙......)
关于java - 尝试读取 XLSX 文件时出现 NullpointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274995/