如何用POI SS打开.xlsx文件?

我想用这个代码(取自http://poi.apache.org/spreadsheet/quick-guide.html#ReadWriteWorkbook )用POI SS打开.xlsx文件:

InputStream inp = new FileInputStream("workbook.xls"); //InputStream inp = new FileInputStream("workbook.xlsx"); Workbook wb = WorkbookFactory.create(inp); Sheet sheet = wb.getSheetAt(0); Row row = sheet.getRow(2); Cell cell = row.getCell(3); if (cell == null) cell = row.createCell(3); cell.setCellType(Cell.CELL_TYPE_STRING); cell.setCellValue("a test"); // Write the output to a file FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); 

我得到这个错误消息:

 Exception in thread "main" java.lang.NoClassDefFoundError: org/dom4j/DocumentException 

我将xbean.jar添加到我的库和我的运行时库。

我怎样才能解决这个exception?

谢谢 !

我没有分析你的错误信息,但看到代码后,我看到有一些不正确的东西。
Wookbook不适用于* .xlsx(Office 2007及以后)文件。 所以你必须使用XSSFWorkbook。 您可能想要将wb初始化更改为:

 XSSFWorkbook wb = (XSSFWorkbook) WorkbookFactory.create(inp); 

你需要dom4j,这是例外情况告诉你的

您可能需要查看POI网站上列出依赖关系的组件页面

此外,由于您有一个File ,直接打开,不要通过一个InputStream 。 在Apache POI常见问题解答中有一部分 ,基本上使用文件比通过streamcaching整个文件更快,内存更低!

修复例外

有两个解决scheme:

  1. 正如Gagravarr已经提到:你需要dom4j来修复你的exception。
  2. 正如乔恩已经提到:你必须更新你的依赖关系,所以你不需要dom4j了。

如果你使用的是Maven,你可以添加必要的依赖关系:(也许检查更新的版本: Maven Repository:org.apache.poi )

 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.12</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> 

打开.xlsx

如果您修复了exception,则可以使用以下代码打开您的file.xlsx文件:

 String path = "Relative/Path/To/Your/File/file.xlsx"; File file = new File(path); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheetAt(0); // Use your sheet ... 

更多的提示

  • 和Gagravarr一样,我也推荐使用文件而不是文件inputstream。
  • 如果你想打开某个工作表,你可以使用workbook.getSheet(String name);
  • 如果你不知道根据你的项目文件的相对path,你可以使用System.out.println("Relative path: " + System.getProperty("user.dir"));来轻松检查它System.out.println("Relative path: " + System.getProperty("user.dir"));

问候,winklerrr

这可以帮助你。

 InputStream is = new FileInputStream(pathOfYourXlsxFile); XSSFWorkbook workbook = new XSSFWorkbook(is); //Get first sheet from the workbook XSSFSheet sheet = workbook.getSheetAt(0); 

对于你的exception,你必须把dom4j.jar放到你的类path中。你可以在这里find它

我意识到线程已经老了,但是今天却让我意识到了同样的问题所需要的答案。

上面build议的页面上的文档(即包括dom4j.jar)说,这不再是必要的:

“OOXMLjar子曾经需要DOM4J,但现在代码已经改为使用JAXP,并且不需要额外的dom4jjar子。

我发现包括以下解决了这个问题:

 poi-3.11-20141221.jar poi-ooxml-3.11-20141221.jar poi-ooxml-schemas-3.11-20141221.jar xmlbeans-2.6.0.jar