Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java打开、保存和关闭启用Excel宏的工作表文件?_Java_Excel_Save_Auto Update - Fatal编程技术网

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

如何使用Java打开、保存和关闭启用Excel宏的工作表文件?,java,excel,save,auto-update,Java,Excel,Save,Auto Update,原因: 更新现有Excell文件中的每个公式结果 为什么: 为了能够从Excell文件中提取最新信息,否则程序只显示上次打开Excell文件时手动保存的结果 目标: 请某人举例说明如何执行此操作:打开->保存->关闭 让我们调用这个Excell文件:Test.xlsm 解决方案: 最后,我为我的问题找到了一个令人惊讶的解决办法。可能比Apache更好,因为我的xlsm文件有许多用户定义的公式,这导致任何使用Apache计算公式的尝试都会抛出错误和崩溃 我创建了一个写在.VBS文件中的VBS脚本

原因

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

为什么

为了能够从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 "";
    }
}


您可以使用。我很抱歉,但请您向我展示一个从Apache for xlsm文件执行该操作的代码。我真的搞不懂。。。在一点上停留6个多小时,却不知道我做错了什么。请你帮我一下好吗。一段代码,只需打开Test.xlsm,然后刷新公式结果/值-保存并关闭Test.xlsm文件。