我正在开发一个Java类,它通过Apache POI生成一个xls文件。我需要运行这个类几个并每天打开生成的文件几次。如果我在Excel中仍然打开文件时运行程序,程序不会引发错误,但文件没有更新(我关闭它并重新打开它,它仍然是相同的)。奇怪的是,我没有得到任何例外,例如在this question中报告的。
有没有办法强制更新打开的Excel文件?否则,在写入文件之前是否可以使用系统调用来终止excel窗口(我使用的是Windows)?
答案 0 :(得分:2)
没有。当软件库修改了文件系统上的工作簿时,需要通知Excel。 Excel可以通过监视文件系统本身或要求操作系统通知其更改来实现此目的。然后Excel需要知道如何响应此事件。 对于不同计算机上的多个Excel实例同时访问的网络共享上的文件,Excel会执行类似的操作,但我不知道它是如何实现的。 对于在Excel的控制/知识之外修改工作簿而不是POI特定的任何其他库,答案是相同的。
Windows上的Excel通常会在电子表格上获取独占的操作系统级写锁定,因此如果尝试写入Excel具有死锁功能的工作簿,Java将获得IOException Permission Denied异常。
Linux上的LibreOffice在文件系统上创建锁文件,Java可以忽略并写入文件。 LibreOffice有一个文件>重新加载功能以重新读取磁盘上的任何内容,但这是一个手动过程。
此外,POI不太适合写入读取工作簿的同一文件位置的任务,因为您的选项是: 1)将文件复制到临时位置并读入,然后重复写入某个目的地 2)在FileInputStream中缓冲输入文件,然后写出与读取时相同的位置(这将在初始读取期间消耗更多内存,直到关闭FileInputStream)。 3)写入临时文件位置并重命名磁盘上的文件。
您可能最好找到可通过COM连接或ActiveX服务器与Excel通信的软件,这样可以让您更接近Excel中的实时更新,因为Excel将充当服务器,您的应用程序将是轻量级客户端。