1

我正在使用 POI 来读取、编辑和编写 excel 文件。我的流程就像写一个excel,读一遍然后再写。

然后,如果我在我的 Java 应用程序仍在运行时尝试使用普通桌面 excel 应用程序编辑文件,则无法保存 excel,它表示某些进程正在保存 excel,我正在正确关闭所有文件句柄。

请帮助并告诉我如何解决此问题。

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()));
                }
            }
        }

    }

}
4

3 回答 3

2

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

仍然可能发生的事情:

  1. 您有另一个 Java 进程(例如挂在调试器中)。您的新进程尝试写入文件,但失败(由于进程 1)并且在 中finally,它尝试打开遇到相同问题的 Excel。确保记录所有发生的异常wb.write(out);

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

  2. 也许文件没有完全写入(即在 期间出现异常write())。Excel 尝试打开损坏的文件并给您错误的错误消息。

  3. 使用Process Explorer之类的工具来找出哪个进程保持对文件的锁定。

于 2013-09-06T13:44:48.437 回答
2

我尝试了所有选项。仔细看后,问题似乎出在 Event User 模型上。我正在使用下面的代码来读取数据:

    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不会保持锁定状态。

于 2013-09-10T06:15:18.430 回答
0

我其实想通了。需要一个非常简单的行,但由于某些原因,新万圣节文档 ( http://poi.apache.org/spreadsheet/how-to.html#sxssf )中没有解释它

我查看了 Busy Developer's Guide 并得到了解决方案。我需要添加

pkg.close(); //关闭OPCPackage

这增加了我的代码可以在同一个 excel 文件上进行任意数量的读取和写入。

于 2013-09-10T08:11:37.177 回答