Java POI-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

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

    }

}
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应用程序在一段时间后继续运行,我也可以