为什么不从Excel中加载信息(* .xlsx)(使用Apache POI)?

尝试从Excel文件(* .xlsx)使用Apache POI 3.15加载JSP上的信息。

查看excel中的信息

num解决scheme

1首先

2秒

3三

尝试使用代码

try { InputStream ExcelFileToRead = new FileInputStream("C:\\server\\to_db.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead); XSSFWorkbook test = new XSSFWorkbook(); XSSFSheet sheet = wb.getSheetAt(0); XSSFRow row; XSSFCell cell; Iterator rows = sheet.rowIterator(); while (rows.hasNext()) { row = (XSSFRow) rows.next(); Iterator cells = row.cellIterator(); while (cells.hasNext()) { cell = (XSSFCell) cells.next(); if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING) { out.print(cell.getStringCellValue() + " "); } else if (cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC) { out.print(cell.getNumericCellValue() + " "); } else { //U Can Handel Boolean, Formula, Errors } } out.println("Succefully!!!"); } } catch (Exception e) { out.println( "exception: "+e); } 

得到一个奇怪的结果:

没有错误,缺less关于JSP的信息….

问题在所有浏览器中都被重现。 如果我尝试打开C:\ server \ to_db.xlsx操作系统Windows响应“文件忙”。 可能是什么问题以及如何解决?

打开FileInputStreamFileOutputStream ,需要将其closures,否则根据所使用的操作系统(尤其是Windows操作系统),进程可能会locking文件。 更一般的说,你需要close所有你可以使用的Closeable对象来防止任何泄漏或像这样的问题。

所以你应该把你的代码重写为next,以便使用try-with-resources语句来自动closures资源。

 try (InputStream ExcelFileToRead = new FileInputStream("C:\\server\\to_db.xlsx"); XSSFWorkbook wb = new XSSFWorkbook(ExcelFileToRead)) { ... 

事实上,在你的代码中你有2个可Closeable对象,它们是ExcelFileToReadwb

我想你必须使用“.close()”closures文件。 这可能会帮助你。

在lib目录中缺less一些公共库

commons-collections4-4.1.jar,commons-codec-1.10.jar,commons-fileupload-1.3.jar

他们的存在解决了问题