Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Apache POI时出现空指针异常_Java_Apache Poi - Fatal编程技术网

Java 使用Apache POI时出现空指针异常

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

我正在尝试使用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.
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中。它也应该在“如何”部分。因此,我经历了将近两天的挫折,直到我明白了这一点。快速指南的顶部显示了你的真实情况,这不包括在文档中吗?