java - 如何使用 Java 打开、保存和关闭 Excel 启用宏的工作表文件?

标签 java excel save auto-update

原因:

更新现有 Excel 文件中的每个公式结果。

为什么:

为了能够从 Excell 文件中提取最新信息,否则程序仅显示上次打开 Excell 文件时手动保存的结果。

目标:

请有人举例说明如何执行此操作:
打开 -> 保存 -> 关闭
我们将此 Excell 文件命名为:Test.xlsm

解决方案:

最后我找到了一个令人惊讶的解决方案来解决我的问题。可能比 Apache 更好,因为我的 xlsm 文件有许多用户定义的公式,这导致任何使用 Apache 计算公式的尝试都会引发错误和崩溃。

我创建了一个编写在 .vbs 文件内的 VBS 脚本。

Set x_Application = CreateObject("Excel.Application")
Set x_Open_application = x_application.Workbooks.Open("C:\User\Documents\Project\Test.xlsm")
x_application.Calculate
x_Open_application.Save
x_Open_application.Close False

在我开始从 xlsm 文件中提取信息之前,此脚本将随时打开/执行。这可确保 xlsm 中所有公式的结果都是最新

我的java函数会在提取信息之前打开/运行VBS脚本文件:

Desktop.getDesktop().open(new File("./" + VBS_File_Name + ".vbs")); //Run VBS File

此方法的优点:

*通过此方法更新/刷新的 Excel 文件公式对用户不可见 - 工作在后台完成。

*无需 Apache 即可 100% 工作。

*易于实现。

最佳答案

这是使用 POI 读取 Excel 文件的基本演示。参数是 Excel 文件名。


import java.io.*;

import org.apache.poi.ss.usermodel.*;

public class PoiDemo {

    public static void main(final String[] args) {

        try (FileInputStream inputStream = new FileInputStream(args[0]);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                Workbook workbook = WorkbookFactory.create(bufferedInputStream);) {

            final Sheet sheet = workbook.getSheetAt(0);

            for (final Row row : sheet) {
                final String col0 = valueAsString(row, 0);
                final String col2 = valueAsString(row, 2);
                System.out.println("Column 0 =" + col0 + " column 2 = " + col2);
            }
        } catch (final Exception e) {
            throw new IllegalStateException("Exception processing excel input", e);
        }
    }

    private static String valueAsString(final Row row, final int i) {
        final Cell cell = row.getCell(i);
        final CellType ct = cell.getCellType();
        switch (ct) {
        case BOOLEAN:
            return cell.getBooleanCellValue() ? "1" : "0";
        case NUMERIC:
            return String.format("%.0f", cell.getNumericCellValue());
        case FORMULA:
        case STRING:
            return cell.getStringCellValue().trim();
        default:
        }

        return "";
    }
}

关于java - 如何使用 Java 打开、保存和关闭 Excel 启用宏的工作表文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58456860/

相关文章:

java - 将传递的二维 boolean 数组的所有值设置为 false?

java - 使用 Maven 添加另一个项目的 jar 作为资源

Excel 文件混合了日期作为文本和序列号

java - 为什么我要序列化一个对象而不是做一个文件输出?

java - 当用户按下“提交”按钮时如何保存用户的评分和评论?

java - 解析由空格分隔、有序但可选元素组成的字符串

java - java 枚举上的自定义字段未被序列化

vba - 您可以使用 Windows API 更改 VBA 中用户窗体标题栏的颜色吗?

excel - SXSSF 与 Excel 表格

delphi - 如何将程序地址保存在数组中,然后在Delphi中使用它们