VBA计算页码和行号https://learn.microsoft.com/zh-cn/office/vba/api/word.wdinformation
最近在做word文档对比的,总结了几种解决方案,记录一下
在java中,常用的文本对比方案有如下几种:
差异比较工具 | 小部分修改合理性 | 大片段修改合理性 | 修改部分定位便捷性 | 容错度 |
java-diff | 差 | 差 | 差 | 差 |
beyondCompare | 差 | 差 | 差 | 差 |
WPS | 优 | 中 | 优 | 优 |
git | 差 | 优 | 差 | 差 |
总结:
如果对比的word,可以使用VBA进行解析,见本人的VBA系列文章,这里就不做赘述。
java-diff-utils网上教程其实很多,这里是一个例子
beyondCompare是一款PC版的文件对比工具,或许可以尝试用VBA来进行调用,参考文章:
Jacob调用Windows桌面软件(Adobe系列,CAD,ABBYY FineReader 等)
WPS有word对比功能,在Word软件中的审阅→比较选项
可以使用VBA来使用此功能,参照文档,
下面是一段jacob代码
package com.example.worddemo.test.jacob; import com.example.worddemo.test.jacob.enums.FileMacroEnum; import com.example.worddemo.utils.IdUtil; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * @program: word-demo * @description: 文档对比 最简单方式的文档对比方式 * @author: wjl * @create: 2024-03-26 14:36 **/ public class CompareDocuments { // 这里需要根据当前环境安装的是 MicroSoft Office还是WPS来选择 // 如果安装的是WPS,则需要使用 KWPS.Application // 如果安装的是微软的 Office,需要使用 Word.Application private static final String MS_OFFICE_APPLICATION = "Word.Application"; private static final String WPS_OFFICE_APPLICATION = "KWPS.Application"; public static void main(String[] args) { ComThread.InitSTA(); // 初始化 COM 线程 FileMacroEnum macroEnum = FileMacroEnum.WORD_2003_DOC; String targetPath = "D:\\"+ IdUtil.upper()+macroEnum.getSuffix(); String sourceWordPath = "D:\\3.doc"; String targetWordPath = "D:\\3 - 1.doc"; try { ActiveXComponent app = new ActiveXComponent( WPS_OFFICE_APPLICATION); app.setProperty("Visible", new Variant(false)); Dispatch docs = app.getProperty("Documents").toDispatch(); Dispatch sourceDoc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] {sourceWordPath, new Variant(false), new Variant(true)} , new int[1]).toDispatch(); //打開word文檔 Dispatch targetDoc = Dispatch.invoke(docs, "Open", Dispatch.Method, new Object[] {targetWordPath, new Variant(false), new Variant(true)} , new int[1]).toDispatch(); //打開word文檔 // 然后进行比较 只填写必须的 其他的使用默认值 Dispatch compareDoc = app.invoke("CompareDocuments", new Variant(sourceDoc), new Variant(targetDoc)).toDispatch(); // 然后将 比较后的文档进行保存 Dispatch.call(compareDoc, "SaveAs", targetPath, macroEnum.getMacro()); Dispatch.call(compareDoc, "Close", false); Dispatch.call(sourceDoc, "Close", false); Dispatch.call(targetDoc, "Close", false); app.invoke("Quit",0); }catch (Exception e) { e.printStackTrace(); } finally { ComThread.Release(); // 释放 COM 线程 } System.out.println("转换后的文件路径为:"+targetPath); } }
java使用Git功能,可以使用Jgit插件,参照本人文档