POI – Excel仍然由某个进程持有,无法编辑

我正在使用POI来读取,编辑和编写excel文件。 我的stream程就像写一个excel,阅读并再次写入。

然后,如果我尝试使用普通桌面excel应用程序编辑文件,而我的Java应用程序仍在运行,则不能保存excel,它说某个进程正在保存excel,正确closures所有文件句柄。

请帮助,并告诉我如何解决这个问题。

SXSSFWorkbook wb = new SXSSFWorkbook(WINDOW_SIZE); Sheet sheet = getCurrentSheet();//stores the current sheet in a instance variable for (int rowNum = 0; rowNum < data.size(); rowNum++) { if (rowNum > RECORDS_PER_SHEET) { if (rowNum % (RECORDS_PER_SHEET * numberOfSheets) == 1) { numberOfSheets++; setCurrentSheet(wb.getXSSFWorkbook().createSheet()); sheet = getCurrentSheet(); } } final Row row = sheet.createRow(effectiveRowCnt); for (int columnCount = 0; columnCount < data.get(rowNum).size(); columnCount++) { final Object value = data.get(rowNum).get(columnCount); final Cell cell = row.createCell(columnCount); //This method creates the row and cell at the given loc and adds value createContent(value, cell, effectiveRowCnt, columnCount, false, false); } } public void closeFile(boolean toOpen) { FileOutputStream out = null; try { out = new FileOutputStream(getFileName()); wb.write(out); } finally { try { if (out != null) { out.close(); out = null; if(toOpen){ // Open the file for user with default program final Desktop dt = Desktop.getDesktop(); dt.open(new File(getFileName())); } } } } } 

代码看起来正确。 out.close();之后 ,不应该有任何锁。

事情还可能发生:

  1. 你有另一个Java进程(例如挂在debugging器中)。 你的新进程试图写入文件,失败(因为进程1),并在finally ,它试图打开看到同样的问题的Excel。 确保你logging了在wb.write(out);中发生的所有exceptionwb.write(out);

    注意:上面的代码在这方面看起来是正确的,因为它只在out != null时才启动Excel,并且只有Java可以打开该文件时才是这种情况。

  2. 也许这个文件没有写完(即write()有个exception)。 Excel试图打开损坏的文件,并给你错误的错误信息。

  3. 使用诸如Process Explorer之类的工具来找出哪个进程对文件进行locking。

我尝试了所有的select。 彻底查看后,似乎问题是事件用户模型。 我正在使用下面的代码来读取数据:

  final OPCPackage pkg = OPCPackage.open(getFileName()); final XSSFReader r = new XSSFReader(pkg); final SharedStringsTable sst = r.getSharedStringsTable(); final XMLReader parser = fetchSheetParser(sst); final Iterator<InputStream> sheets = r.getSheetsData(); while (sheets.hasNext()) { final InputStream sheet = sheets.next(); final InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); } 

我认为excel是由于这个过程持续了一段时间的某种原因。 如果我删除这个代码并使用下面的代码:

  final File file = new File(getFileName()); final FileInputStream fis = new FileInputStream(file); final XSSFWorkbook xWb = new XSSFWorkbook(fis); 

该过程工作正常的Excel不会保持locking。

我真的想到了。 一个非常简单的线是必需的,但有一些原因没有解释在新万圣节文件( http://poi.apache.org/spreadsheet/how-to.html#sxssf

我查了一下繁忙的开发者指南,得到了解决办法。 我需要补充

pkg.close(); //closuresOPCPackage

这增加了我的代码工作正常与任何数量的读取和写入相同的Excel文件。