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 - Java 编译器如何为具有多个边界的参数化类型选择运行时类型?

Java 将字符串作为 URL 保存到 Excel 文件

sql - 如何将 SQL 语句结果导出到 Excel 文件

excel - 从 URL HTTPS 下载 xls 文件

java - 如何对 apache-poi 中的sheet.getMergedRegions()的结果进行排序

java - Apache POI 不更新公式

java - EWS API Java : the request failed. 空

java - 无法在Android中播放Telegram Ogg音频文件

java - 每次单击链接时 web View 中的进度对话框

java - 读取 excel 文件 --> 使用 java 的 xlsx 格式