java - 在 Excel 中打开 xls 文件时使用 Apache POI 更新该文件

标签 java excel apache-poi

我正在开发一个 Java 类,它通过 Apache POI 生成 xls 文件。我需要多次运行该类并每天多次打开生成的文件。如果我在文件在 Excel 中仍处于打开状态时运行该程序,则该程序不会引发错误,但该文件不会更新(我关闭它并重新打开它,它仍然是相同的)。奇怪的是,我没有遇到任何异常,如 this question 中报告的那样.

有没有办法强制更新打开的 Excel 文件?否则,是否可以在写入文件之前使用系统调用来终止Excel窗口(我使用的是Windows)?

最佳答案

没有。当软件库修改文件系统上的工作簿时,需要通知 Excel。 Excel 可以通过监视文件系统本身或要求操作系统通知其更改来实现此目的。然后 Excel 需要知道如何响应此事件。 Excel 对不同计算机上的多个 Excel 实例同时访问网络共享上的文件执行类似的操作,但我不知道它是如何实现这一点的。 对于在 Excel 控制/知识之外修改工作簿的任何其他库来说,答案都是相同的,并且不特定于 POI。

Windows 上的 Excel 通常会在电子表格上获取独占操作系统级写入锁,因此如果尝试写入 Excel 已死机的工作簿,Java 将收到 IOException Permission Denied 异常。

Linux 上的 LibreOffice 在文件系统上创建锁定文件,Java 无论如何都可以忽略该文件并写入该文件。 LibreOffice 具有"file">“重新加载”功能,可以重新读取磁盘上的任何内容,但这是一个手动过程。

此外,POI 不太适合写入读取工作簿的同一文件位置的任务,因为您的选项是: 1)将文件复制到临时位置并读入,然后重复写出到某个目的地 2) 将输入文件缓冲在 FileInputStream 中,然后写入到读取时的同一位置(这将在初始读取期间消耗更多内存,直到关闭 FileInputStream)。 3) 写入临时文件位置并重命名磁盘上的文件。

您可能最好找到可以通过 COM 连接或 ActiveX 服务器与 Excel 进行通信的软件,这将使您更接近 Excel 中的实时更新,因为 Excel 将充当服务器,而您的应用程序将充当轻量级客户端。

关于java - 在 Excel 中打开 xls 文件时使用 Apache POI 更新该文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369571/

相关文章:

java - 使用 Xerces 解析 XML 文档时是否可以获取当前行号?

Java字符串函数不能被调用,因为它不是静态的

java - 当后台线程运行时,如何测试 JavaFX 应用程序中的 main 方法?

c# - 如何使用 C# 从 Excel 工作表中删除 VB 代码?

java - 使用循环打印图案

excel - 将数据从一个复制到另一个

java - 是否可以从 POI 将 VB 添加到 Excel 工作表?

java - 如何在 POI 中使用 DOCX 中的预定义格式?

java - 使用 Apache POI 更改 Excel 折线图中的数据范围

java - 在java中删除数值后的小数