java使用jacob同意word docx文本修订时报错 集合所要求的成员不存在

项目场景:

java使用jacob同意word docx文本修订时报错 集合所要求的成员不存在


问题描述

com.jacob.com.ComFailException: Invoke of: Item

Source: Microsoft Word

Description: 集合所要求的成员不存在


原因分析:

同意修订时,存在一次同意两个修订的情况,导致下一次循环报错

解决方案:

同意修订前,重新获取修订项数量,确保索引有效

// 重新获取修订项数量,确保索引有效
count = Dispatch.get(revisions, "Count").getInt();
if (i > count) {
    // 索引超出范围,跳过本次循环
    continue;
}
public static void wordAcceptAllRevisionsOfJacob(String docFilePhysicalPath) {
        ActiveXComponent app = null;
        Dispatch doc = null;
        try {
            //创建 COM 对象并打开 Word 文档
            app = new ActiveXComponent("Word.Application");
            app.setProperty("Visible", new Variant(false));
            Dispatch docs = app.getProperty("Documents").toDispatch();
            doc = Dispatch.call(docs, "Open", docFilePhysicalPath).toDispatch();

            //获取文档的“Revisions”对象,该对象包含所有修订
            Dispatch revisions = Dispatch.get(doc, "Revisions").toDispatch();
            //获取修订的数量
            int count = Dispatch.get(revisions, "Count").getInt();
            //从后往前循环处理每个修订。对于每个修订,获取其 ActiveX 对象,然后调用“Accept”方法以同意它。
            for (int i = count; i >= 1; i--) {
                // 同意修订时,存在一次同意两个修订的情况,导致下一次循环报错
                // 重新获取修订项数量,确保索引有效
                count = Dispatch.get(revisions, "Count").getInt();
                if (i > count) {
                    // 索引超出范围,跳过本次循环
                    continue;
                }
                Dispatch revision = Dispatch.call(revisions, "Item", new Variant(i)).toDispatch();
                Dispatch.call(revision, "Accept");
            }

            //第一个参数指定要保存的文件的路径和名称。第二个参数是 VARIANT 类型的常量,用于指定要将文档保存为哪种格式。使用数字 12 表示保存为 .docx 格式
            Dispatch.call(doc, "SaveAs", docFilePhysicalPath, 12);
        } catch (Exception e) {
            Log4jUtils.getLogger().error("word文档接受所有修订失败:", e);
        } finally {
            try {
                //关闭文件
                Dispatch.call(doc, "Close", false);
            } catch (Exception e) {
                Log4jUtils.getLogger().error("word文档接受所有修订,关闭文件时失败", e);
            }
            if (app != null) {
                app.invoke("Quit", new Variant[]{});
            }
            //如果没有这句话,winword.exe进程将不会关闭
            ComThread.Release();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值