Java POI-Excel仍由某些进程保留,无法编辑
我使用POI读取、编辑和编写excel文件。 我的流程就像写一个excel,读一读再写 然后,如果我试图在Java应用程序仍在运行时使用普通桌面excel应用程序编辑文件,excel无法保存,它表示某个进程正在保存excel, 我正在正确关闭所有文件句柄 请帮助并告诉我如何解决此问题Java POI-Excel仍由某些进程保留,无法编辑,java,excel,apache-poi,Java,Excel,Apache Poi,我使用POI读取、编辑和编写excel文件。 我的流程就像写一个excel,读一读再写 然后,如果我试图在Java应用程序仍在运行时使用普通桌面excel应用程序编辑文件,excel无法保存,它表示某个进程正在保存excel, 我正在正确关闭所有文件句柄 请帮助并告诉我如何解决此问题 SXSSFWorkbook wb = new SXSSFWorkbook(WINDOW_SIZE); Sheet sheet = getCurrentSheet();//stores the current she
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()));
}
}
}
}
}
sxsfworkbook wb=新的sxsfworkbook(窗口大小);
Sheet Sheet=getCurrentSheet()//将当前工作表存储在实例变量中
对于(int-rowNum=0;rowNum每个工作表记录){
如果(行数%(每张记录*张数)=1){
numberOfSheets++;
setCurrentSheet(wb.getXSSFWorkbook().createSheet());
sheet=getCurrentSheet();
}
}
最后一行=sheet.createRow(effectiveRowCnt);
for(int columnCount=0;columnCount
代码看起来正确。在out.close()之后代码>,应该没有任何锁了
仍然可能发生的事情:
您还有另一个Java进程(例如挂起在调试器中)。您的新进程尝试写入文件,但失败(因为进程1),并且在最后
中,它尝试打开Excel,但发现了相同的问题。确保将所有异常记录在wb.write(out)中代码>
注意:上面的代码在这方面看起来是正确的,因为它只在out!=空
,只有当Java可以打开文件时才应该是这种情况
可能文件未完全写入(即write()
期间出现异常)。Excel试图打开损坏的文件,并给出错误的错误消息
使用类似的工具,找出哪个进程对文件保持锁定
代码看起来是正确的。在out.close()之后代码>,应该没有任何锁了
仍然可能发生的事情:
您还有另一个Java进程(例如挂起在调试器中)。您的新进程尝试写入文件,但失败(因为进程1),并且在最后
中,它尝试打开Excel,但发现了相同的问题。确保将所有异常记录在wb.write(out)中代码>
注意:上面的代码在这方面看起来是正确的,因为它只在out!=空
,只有当Java可以打开文件时才应该是这种情况
可能文件未完全写入(即write()
期间出现异常)。Excel试图打开损坏的文件,并给出错误的错误消息
使用类似的工具,找出哪个进程对文件保持锁定
我尝试了所有的选择。仔细研究之后,问题似乎是事件用户模型。
我使用以下代码读取数据:
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 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不会保持锁定状态。我实际上已经解决了这个问题。
需要一个非常简单的行,但由于某种原因,新的万圣节文档中没有解释()
我查阅了《忙碌的开发人员指南》,得到了解决方案。
我需要补充一点
pkg.close()//关闭OPCPackage
这增加了我的代码,可以在同一个excel文件上进行任意数量的读写操作。我实际上已经解决了这个问题。
需要一个非常简单的行,但由于某种原因,新的万圣节文档中没有解释()
我查阅了《忙碌的开发人员指南》,得到了解决方案。
我需要补充一点
pkg.close()//关闭OPCPackage
这添加了我的代码,可以在同一excel文件上执行任意数量的读写操作。经过一点测试后,我想我的输出流/其他句柄需要一些时间才能关闭。同样,即使我的Java应用程序在一段时间后继续运行,我也能够编辑和保存文件。那么现在我如何确保我的流已正确关闭?向我们展示一些代码!在不知道您当前正在做什么的情况下,我们无法帮助您解决问题!代码非常庞大,对数据进行了大量复杂的逻辑处理。基本上,代码使用来自POI的SXSSFWorkbook和Sheet API。首先,我将一些数据写入excel。我关闭FileOutputStream。接下来,我阅读相同的excel,进行一些数据处理,并写入相同的excel。现在,当我在MS excel中打开excel并尝试操作一些数据或删除一些数据并保存时,表示excel正在使用。是否可能是因为事件用户模型,就像我使用XSSF工作簿一样,问题似乎没有出现。当我将XSSFReader与SharedStringsTable一起使用时,问题就出现了。经过一点测试后,我想我的输出流/某个其他句柄需要一些时间才能关闭。同样,即使我的Java应用程序在一段时间后继续运行,我也可以