我使用WorkbookFactory.create(new File("path/to/xlsx"))
构建了一个新的工作簿。但是,当我尝试在启动应用程序后在Excel中编辑文件时,我收到一条错误消息,指出该文件正在使用中。我是否必须释放文件,如果是,如何? (我在api文档中找不到像Workbook.close()
这样的东西)或者我是否必须在其他地方查找?
我不知道在哪里可以看;应用程序不会导致csv和excel文件出现这些问题我只是调用转换器(xls => csv)这是唯一的区别。
(我正在使用POI 3.8)
答案 0 :(得分:17)
在传递给WorkbookFactory.create()
的InputStream上维护句柄似乎工作正常,并且在完成工作簿时简单地关闭InputStream。例如:
InputStream is = // initialize
try {
Workbook wb = WorkbookFactory.create(is);
// use the workbook
} finally {
if (is != null) is.close()
}
答案 1 :(得分:10)
如果您需要完全控制资源何时关闭,您应该事先自己创建OPCPackage,然后将其传递给WorkbookFactory。 OPCPackage提供了您所追求的密切方法。在垃圾收集之前,工作簿将保持打开状态
您的代码看起来像:
File f = new File("/path/to/excel/file");
Workbook wb = null;
NPOIFSFileSystem npoifs = null;
OPCPackage pkg = null;
try {
npoifs = new NPOIFSFileSystem(f);
wb = WorkbookFactory.create(npoifs);
} catch(OfficeXmlFileException ofe) {
pkg = OPCPackage.open(f);
wb = WorkbookFactory.create(pkg);
}
// Use it
if (npoifs != null) { npoifs.close(); }
if (pkg != null) { pkg.close(); }
答案 2 :(得分:1)
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
try{
File workbookFile = new File("C:\\repo\\yourfile.xslx");
FileInputStream file = new FileInputStream(workbookFile);
Workbook wb = WorkbookFactory.create(file);
Sheet sheet = wb.getSheetAt(0);
//use the instance of wb.
file.close();
}
catch(Exception e){
System.out.println("Fail");
}
答案 3 :(得分:0)
首先,您需要关闭写入工作簿的流:
workBook.write(outputStream);
outputStream.close();
之后你应该关闭workBook(不再进行操作)并处理临时文件:
//Close the workBook
workBook.close();
//deleting the temporary files
workBook.dispose();
答案 4 :(得分:0)
从 2021 年开始遇到同样的问题。:(,使用 poi 3.9 版时。
我只是发现如果我们把poi版本升级到3.17(以防你还在用Java 7,其中poi版本4或以上只支持Java 8或以上),
然后工作簿将实现 AutoCloseable
。
因此可以使用 Try-With-Resources
块来自动关闭文件。
这是演示代码。
try (Workbook workbook = WorkbookFactory.create(new File(fileLocation))) {
// operate on the workbook here...
}
我认为上面的代码比@Gagravarr解决方案更好,因为它复制了create方法在外面所做的事情,不熟悉poi库的开发人员不知道它是什么。
附言 事实上,这个问题是作为一个 bug 放在 bugzilla 中的,参见 https://bz.apache.org/bugzilla/show_bug.cgi?id=56537,并在 poi 3.11 或更高版本中得到解决和代码合并。所以有和我们一样问题的朋友可以看看,用完后关闭资源。