Java 使用Apache POI时出现空指针异常
我正在尝试使用ApachePOI包编写excel文件。以下是代码片段:Java 使用Apache POI时出现空指针异常,java,apache-poi,Java,Apache Poi,我正在尝试使用ApachePOI包编写excel文件。以下是代码片段: String basePath = "/home/aman/Desktop"; String fileName = "result.xls"; File file = new File(basePath, fileName); //File not null. checked. OPCPackage pkg = OPCPackage.openOrCreate(file); //pkg not null. checked
String basePath = "/home/aman/Desktop";
String fileName = "result.xls";
File file = new File(basePath, fileName); //File not null. checked.
OPCPackage pkg = OPCPackage.openOrCreate(file); //pkg not null. checked.
Workbook wb = new XSSFWorkbook(pkg); //GenerateReport.java:63
我得到以下错误:
Exception in thread "main" java.lang.NullPointerException
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:382)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:186)
at amazon.category.database.GenerateReport.generateExcel(GenerateReport.java:63)
at amazon.category.database.MerchantAdoptionStats.processAdoptionStats(MerchantAdoptionStats.java:197)
at amazon.category.database.MerchantAdoptionStats.main(MerchantAdoptionStats.java:386)
线程“main”java.lang.NullPointerException中的异常
在org.apache.poi.poimmldocumentpart.read上(poimmldocumentpart.java:382)
在org.apache.poi.POIXMLDocument.load上(POIXMLDocument.java:155)
位于org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:186)
在amazon.category.database.GenerateReport.generateExcel(GenerateReport.java:63)上
位于amazon.category.database.MerchantAdoptionStats.processAdoptionStats(MerchantAdoptionStats.java:197)
位于amazon.category.database.MerchantAdoptionStats.main(MerchantAdoptionStats.java:386)
非常感谢您的帮助。如果一切都是它看起来的样子,您不应该在.xls文件上构建
XSSFWorkbook
,因为它是对.xlsx文件建模的类。您应该使用WorkbookFactory.create()
而不是它,它是一种工厂方法,将为每个案例返回相应的工作簿
实现我在教程网站上找到了以下示例:
你可以试试这种方法
Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(createHelper.createRichTextString("This is a string"));
row.createCell(3).setCellValue(true);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
我自己也用头撞了一下这个。诀窍在于该文件是否存在
//if file is .xls
Workbook workbook;
if(file.exists) {
NPOIFSFileSystem fs = new NPOIFSFileSystem(file);
workbook = new HSSFWorkbook(fs.getRoot(), false);
}
else {
workbook = new HSSFWorkbook();
}
//if file is .xlsx
Workbook workbook;
if(file.exists) {
OPCPackage pkg = OPCPackage.open(file);
workbook = new XSSFWorkbook(pkg);
}
else {
workbook = new XSSFWorkbook();
}
诀窍似乎是(这看起来没有很好的文档记录),仅当文件之前存在时,才使用文件系统或包对象创建工作簿。如果您想要一个新文件,那么不要使用文件系统或包对象来创建工作簿。我猜您误读了堆栈跟踪@ᴍ阿伦ᴍaroun请解释。@Reimeus
File.exists()
为false
,我知道该文件不存在。@Reimeus但这就是我使用openAndCreate()
的原因。我认为你做得不对。为什么不从头开始创建一个新工作簿(不尝试从空文件中读取它;您所做的是用来解析现有的电子表格),然后对它执行任何需要的操作,然后将其写入输出流?我尝试了.xlsx
。同样的结果。你能看一下关于这个问题的评论吗?我读了同样的教程。在文件流部分是我正在做的。这里:也看看这个答案:我认为new hssforkbook()
用于创建,而new hssforkbook(NPOIFSFileSystem)
(+friends)用于读取现有文件,这两个问题的答案相当清楚?还是有什么不清楚的地方?不清楚。老实说,我在ApachePOI的网站上搜索了Javadoc链接,但没有找到。它不应该只是在Javadoc中。它也应该在“如何”部分。因此,我经历了将近两天的挫折,直到我明白了这一点。快速指南的顶部显示了你的真实情况,这不包括在文档中吗?