java文本比较解决方案
创始人
2024-12-26 09:39:42
0

参考资料

VBA计算页码和行号icon-default.png?t=N7T8https://learn.microsoft.com/zh-cn/office/vba/api/word.wdinformation


概述:

最近在做word文档对比的,总结了几种解决方案,记录一下

在java中,常用的文本对比方案有如下几种:

差异比较工具小部分修改合理性大片段修改合理性修改部分定位便捷性容错度
java-diff
beyondCompare
WPS
git

总结:

  • git/jgit 适用于整个段落的增删改,但是对段落内部的细节处理捕捉欠佳,如果一整段话仅仅修改了一个字,那么也会认为是段落的替换;
  •  WPS的比较 适用于细节字符的增删改,但是对大片段落的增删改捕捉欠佳, 如果是一段话替换成了另一段话,那么不会被识别为段落的替换,而是找到里面的相似部分,表现为内部某些字符的增删改;
  • 建议两种插件结合着使用,可以使用字符串相似度等插件,来做到取长补短的效果

具体介绍:

如果对比的word,可以使用VBA进行解析,见本人的VBA系列文章,这里就不做赘述。

1.java-diff

        java-diff-utils网上教程其实很多,这里是一个例子

2. beyondCompare

        beyondCompare是一款PC版的文件对比工具,或许可以尝试用VBA来进行调用,参考文章:

  • Jacob调用Windows桌面软件(Adobe系列,CAD,ABBYY FineReader 等)

3. WPS

        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);     } } 

4.git

java使用Git功能,可以使用Jgit插件,参照本人文档

5.总结

  • 如果两个文档只是细枝末节的差异,没有大段落的差异,使用WPS比较即可
  • 如果只有大段落的增删,建议使用Jgit
  • 如果两者都有,建议WPS和Jgit结合着使用

相关内容

热门资讯

科技新动态!开心跑得快有辅助工... 科技新动态!开心跑得快有辅助工具吗(透明挂)外挂透明挂辅助神器(2021已更新)(哔哩哔哩)1)开心...
4分钟实锤!吉祥麻将,微扑克切... 4分钟实锤!吉祥麻将,微扑克切实是真的有挂,介绍教程(有挂揭秘);一、吉祥麻将AI软件牌型概率发牌机...
实测发现!鄂州晃晃外 挂(透视... 实测发现!鄂州晃晃外 挂(透视)透视辅助工具(2021已更新)(哔哩哔哩)1、鄂州晃晃外 挂系统规律...
三分钟了解!好彩麻将怎样才可以... 三分钟了解!好彩麻将怎样才可以拿好牌(透视辅助)外挂透明挂辅助机制(2020已更新)(哔哩哔哩)1、...
九分钟辅助!斗棋辅助器在哪,w... 九分钟辅助!斗棋辅助器在哪,wepoker本来真的是有挂,教你攻略(有挂教程)1、下载好斗棋辅助器在...
记者揭秘!!广东雀神麻雀辅助器... 记者揭秘!!广东雀神麻雀辅助器在哪里下载(透视)透视辅助app(2020已更新)(哔哩哔哩)1、很好...
终于清楚!皮皮跑胡子输赢规律(... 终于清楚!皮皮跑胡子输赢规律(辅助挂)外挂透明挂辅助机制(2026已更新)(哔哩哔哩)1)皮皮跑胡子...
二分钟科普!花城牌舍系统规律,... 二分钟科普!花城牌舍系统规律,aAPOKER竟然存在有挂,揭秘教程(有挂插件)进入游戏-大厅左侧-新...
一分钟教你!心悦手机麻将辅牌器... 一分钟教你!心悦手机麻将辅牌器(透视辅助)外挂透视辅助挂(2024已更新)(哔哩哔哩)1、每一步都需...
科技新动态!四方河南麻将赢牌技... 科技新动态!四方河南麻将赢牌技巧(透视)外挂透明挂辅助神器(2026已更新)(哔哩哔哩)1、每一步都...