java文本比较解决方案

参考资料

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.Applicationprivate 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结合着使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/46467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang 创建 Excel 文件

经常会遇到需要导出数据报表的需求,除了可以通过 encoding/csv 导出 CSV 以外,还可以使用 https://github.com/qax-os/excelize 导出 xlsx 等格式的 excel,下面封装了一个方法,支持多 sheet 的 excel 数据生成,导出按需…

Linux网络——套接字与UdpServer

目录 一、socket 编程接口 1.1 sockaddr 结构 1.2 socket 常见API 二、封装 InetAddr 三、网络字节序 四、封装通用 UdpServer 服务端 4.1 整体框架 4.2 类的初始化 4.2.1 socket 4.2.2 bind 4.2.3 创建流式套接字 4.2.4 填充结构体 4.3 服务器的运行 4.3.1 rec…

Windows 使用 MinGW 编译 OpenCV

使用 MinGW 编译 OpenCV 是一个不错的选择,特别是如果您想避免使用 Visual Studio。下面是使用 MinGW 和 CMake 编译 OpenCV 的详细步骤。 准备工作 1. 下载 OpenCV 源代码 从 OpenCV GitHub 仓库下载 OpenCV 源代码。 git clone https://github.com/opencv/ope…

rabbitmq生产与消费

一、rabbitmq发送消息 一、简单模式 概述 一个生产者一个消费者模型 代码 //没有交换机,两个参数为routingKey和消息内容 rabbitTemplate.convertAndSend("test1_Queue","haha");二、工作队列模式 概述 一个生产者,多个消费者&a…

如何将PDF转换成可以直接编辑的CAD图纸?

PDF图纸是为了让用户更好的阅览CAD文件,但是,当我们想要对其进行编辑的时候,PDF图纸就是一个麻烦了。那么PDF转换成CAD后可以编辑吗?如何将PDF转换成可以直接编辑的CAD图纸呢?本篇给你答案。 1、启动迅捷CAD编辑器&…

easyui 列表展示 如何解析 ResponseEntity<Page<Monthlycoefficient>> 这样的返回结构

在使用 EasyUI 展示列表数据时&#xff0c;通常需要将后端返回的数据解析为 EasyUI 数据网格&#xff08;datagrid&#xff09;所需的格式。假设你的后端返回的是一个 ​​ResponseEntity<Page<MonthlyCoefficient>>​​​ 结构&#xff0c;其中 ​​Page​​​ 是…

【python学习】爬虫中常使用的urllib和requests库的的背景、定义、特点、功能、代码示例以及两者的区别

引言 urllib是Python标准库中的一个模块&#xff0c;它提供了一系列用于操作URL的功能 requests是一个Python第三方库&#xff0c;由Kenneth Reitz创建&#xff0c;用于简化HTTP客户端的编程 一、urllib的定义 urllib可以操作url&#xff0c;主要分为以下几个子模块&#xff1…

从人工巡检到智能防控:智慧油气田安全生产的新视角

一、背景需求 随着科技的飞速发展&#xff0c;视频监控技术已成为各行各业保障安全生产、提升管理效率的重要手段。特别是在油气田这一特殊领域&#xff0c;由于其工作环境复杂、安全风险高&#xff0c;传统的监控方式已难以满足实际需求。因此&#xff0c;基于视频监控AI智能…

侧开知识点合集2

一、try .... catch.. AccessViolationException异常触发后&#xff0c;下列程序的输出结果为 static void Main(string[] args) { try { throw new AccessViolationException(); Console.WriteLine("error1"); } catch (Exception e) { Console.WriteLi…

ROS2从入门到精通2-3:机器人3D物理仿真Gazebo与案例分析

目录 0 专栏介绍1 什么是Gazebo&#xff1f;2 Gazebo架构2.1 Gazebo前后端2.2 Gazebo文件格式2.3 Gazebo环境变量 3 Gazebo安装与基本界面4 搭建自己的地图4.1 编辑地图4.2 保存地图4.3 加载地图 5 常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习&#xff0c;掌握ROS2底…

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效

CSS技巧专栏:一日一例 8 - 纯CSS利用mask属性实现按钮边框对称包围特效 上篇作业解题 在前一篇文章的最后,给各位看官留了一个作业,如上图所示。本篇文章,我们来公布一下它的源码。 主要实现的思路 四个渐变色的线段,沿着四个方向的依次运动,(运动在加载前执行)使用 …

均值滤波算法及实现

均值滤波器的使用场景&#xff1a; 均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景 红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区&#xff08;也即延时周期&#xff09;&#xff0c;使得测量值经过缓冲不会出现特别大的变化。 黄色曲线为高斯噪声…

【iOS】—— 消息传递和消息转发

【iOS】—— 消息传递和消息转发 1. 消息传递SEL选择子IMP快速查找汇编代码查找过程总结消息转送快速查找IMP 慢速查找总结消息传递慢速查找IMP 2. 消息转发动态决议动态解析添加方法 快速转发慢速转发 总结动态决议消息转发消息的三次拯救 1. 消息传递 在iOS中&#xff0c;消…

一、单例模式

文章目录 1 基本介绍2 实现方式2.1 饿汉式2.1.1 代码2.1.2 特性 2.2 懒汉式 ( 线程不安全 )2.2.1 代码2.2.2 特性 2.3 懒汉式 ( 线程安全 )2.3.1 代码2.3.2 特性 2.4 双重检查2.4.1 代码2.4.2 特性 2.5 静态内部类2.5.1 代码2.5.2 特性 2.6 枚举2.6.1 代码2.6.2 特性 3 实现的要…

【乐吾乐2D可视化组态编辑器】快捷键

快捷键 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 快捷键描述空格 鼠标拖拽移动画布鼠标右键拖拽移动画布Ctrl 滚轮缩放画布Ctrl 点击 Pen多选Ctrl A全选Ctrl C复制Ctrl X剪切Ctrl V粘贴&#xff0c;alt视图中心粘贴&#xff0c;shift原位粘贴…

查询优化 -- UNION 用法

union 不返回重复行&#xff08;所有字段值相同的行&#xff09; union all 返回所有行 // 每类最多统计100条 select server_id,count(1) as logs from ( SELECT server_id FROM log WHERE log.type "a" AND server_id1 limit 100 ) UNION select server_id,coun…

谷粒商城-全文检索-ElasticSearch

1.简介 一个分布式的开源搜索和分析引擎,可以 秒 级的从海量数据中检索 主要功能:做数据的检索和分析(MySQL专攻于数据的持久化存储与管理CRUD达到百万以上的数据MSQL就会很慢,海量数据的检索和分析还是要用ElasticSearch) 用途:我们电商项目里的所有的检索功能都是由Elasti…

Java中为什么不能直接创建泛型数组

在Java中&#xff0c;不能直接创建泛型数组的主要原因是类型擦除和类型安全问题。 类型擦除 Java中的泛型是通过类型擦除&#xff08;Type Erasure&#xff09;实现的&#xff0c;这意味着在编译时&#xff0c;泛型类型会被转换成原始类型&#xff08;如 List<T> 会被转…

网络安全-网络安全及其防护措施9

41.网络故障排除 网络故障排除的定义和重要性 网络故障排除是指通过系统化的方法和工具&#xff0c;识别、诊断和解决网络中出现的问题&#xff0c;以恢复正常的网络服务和性能。有效的故障排除可以减少停机时间&#xff0c;提升网络的稳定性和可靠性。 故障排除的步骤 问题…

基于X86+FPGA+AI数字化医疗设备:全自动尿沉渣检测仪

助力数字医疗发展&#xff0c;信迈可提供全自动尿沉渣检测仪专用计算机 随着信息技术的不断进步&#xff0c;医疗也进入了一个全新的数字化时代。首先是医疗设备的数字化&#xff0c;大大丰富了医疗信息的内涵和容量&#xff0c;具有广阔的市场发展前景。 数字化医疗设备&…