项目场景:
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();
}
}