【问题标题】:Null pointer exception while using Apache POI使用 Apache POI 时出现空指针异常
【发布时间】:2014-01-09 15:28:38
【问题描述】:

我正在尝试使用 Apache POI 包编写一个 excel 文件。这是代码sn-p:

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)

任何帮助表示赞赏。

【问题讨论】:

  • 我猜你误读了堆栈跟踪。
  • @ᴍarounᴍaroun 请解释一下。
  • @Reimeus File.exists()false,我知道该文件不存在。
  • @Reimeus 但这就是我使用openAndCreate()的原因。
  • 我认为你做错了。你为什么不从头开始创建一个新的工作簿(而不是试图从一个空文件中读取它;你正在做的是用来解析现有的电子表格),用它做任何你需要的事情,然后.write()它到一个输出流?

标签: java apache-poi


【解决方案1】:

我在教程网站上找到了这个例子: here 你可以试试这个方法。

    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();

【讨论】:

【解决方案2】:

我自己用头撞了一会儿。诀窍在于该文件之前是否存在。

//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();
}

诀窍似乎是(而且这看起来不像记录得很好),您可以从文件系统或打包对象中创建工作簿只有在 该文件之前存在。如果您想要一个新文件,那么不要使用文件系统或包对象来创建您的工作簿。

【讨论】:

  • 我认为HSSFWorkbook constructor java docs 非常清楚new HSSFWorkbook() 用于创建,new HSSFWorkbook(NPOIFSFileSystem) (+friends) 用于读取现有文件?还是有什么不清楚的地方?
  • 不清楚。老实说,我在 Apache POI 的网站上搜索了 Javadoc 链接,但找不到。它不应该只是在 Javadoc 中。它也应该在“如何”部分。因此,在我弄清楚这一点之前,我经历了将近两天的挫折。
  • 快速指南顶部附近是How to create a new workbook,它显示了您的情况,文档中没有涵盖您吗?
【解决方案3】:

如果一切都像它看起来的那样,您应该无法在 .xls 文件上构建XSSFWorkbook,因为它是一个用于建模 .xlsx 文件的类。您应该使用WorkbookFactory.create() 而不是那个,这是一个工厂方法,它将为每种情况返回适当的Workbook 实现

【讨论】:

  • 我试过.xlsx。结果相同。能否请您查看有关问题的 cmets 以获得实际问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2020-03-21
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多