2个word内容合并

要在Java中实现将两个Word文档的内容合并,可以使用Apache POI库来操作Word文档。
下面2个word合并包括以下内容的合并和处理:

1、段落、标题合并以及样式处理
2、表格合并以及样式处理
3、单元个内容样式处理
4、带word模板占位符内容处理

步骤:

  1. 使用Apache POI读取两个Word文档。
  2. 将第二个文档的内容追加到第一个文档的末尾。
  3. 保存合并后的Word文档。

依赖配置:

首先,需要在项目中添加Apache POI相关的依赖。如果使用Maven,可以在pom.xml文件中加入以下依赖:

  <dependency><groupId>org.apache.commons</groupId><artifactId>commons-compress</artifactId><version>1.21</version></dependency><!-- Apache POI for Excel --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><!-- Apache POI for Word --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><!-- Apache POI dependencies --><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>3.1.0</version></dependency>

代码实现:

package com.meritdata.ddc.common.util;import org.apache.poi.xwpf.usermodel.*;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;/*** @author dongxiajun* @since 2024-11-14 15:15*/
public class WordMerger {/*** 合并两个Word文档,将第二个文件合并到第一个文件中** @param firstFile    第一个文件* @param secondStream 上传的文件* @param outputFile   输出文件* @throws IOException IOException*/public static void mergeWordDocuments(String firstFile, InputStream secondStream, String outputFile) throws IOException {// 使用 try-with-resources 自动关闭资源try (FileInputStream fis1 = new FileInputStream(firstFile);FileOutputStream out = new FileOutputStream(outputFile)) {// 加载第一个文档XWPFDocument doc1 = new XWPFDocument(fis1);// 加载第二个文档XWPFDocument doc2 = new XWPFDocument(secondStream);// 合并文档appendDocument(doc1, doc2);// 保存合并后的文档doc1.write(out);}}/*** 合并两个Word文档,将第二个文件合并到第一个文件中** @param firstFile  第一个文件* @param secondFile 第二个文件* @param outputFile 输出文件* @throws IOException IOException*/public static void mergeWordDocuments(String firstFile, String secondFile, String outputFile) throws IOException {// 使用 try-with-resources 自动关闭资源try (FileInputStream fis1 = new FileInputStream(firstFile);FileInputStream fis2 = new FileInputStream(secondFile);FileOutputStream out = new FileOutputStream(outputFile)) {// 加载第一个文档XWPFDocument doc1 = new XWPFDocument(fis1);// 加载第二个文档XWPFDocument doc2 = new XWPFDocument(fis2);// 合并文档appendDocument(doc1, doc2);// 保存合并后的文档doc1.write(out);}}public static void appendDocument(XWPFDocument doc1, XWPFDocument doc2) {// 获取第二个文档的所有部分,保持顺序合并for (IBodyElement element : doc2.getBodyElements()) {// 根据元素的类型进行不同的处理if (element instanceof XWPFParagraph) {XWPFParagraph paragraph = (XWPFParagraph) element;XWPFParagraph newParagraph = doc1.createParagraph();copyParagraph(paragraph, newParagraph);} else if (element instanceof XWPFTable) {XWPFTable table = (XWPFTable) element;XWPFTable newTable = doc1.createTable();copyTable(table, newTable);}}}private static void copyParagraph(XWPFParagraph source, XWPFParagraph target) {// 只复制段落的布局属性(例如对齐、缩进、行距等),但不包括段落样式(避免改变标题级别)target.getCTP().setPPr(source.getCTP().getPPr());// 复制对齐方式、缩进、行间距等样式target.setAlignment(source.getAlignment());target.setVerticalAlignment(source.getVerticalAlignment());target.setIndentationLeft(source.getIndentationLeft());target.setIndentationRight(source.getIndentationRight());target.setIndentationFirstLine(source.getIndentationFirstLine());target.setSpacingBefore(source.getSpacingBefore());target.setSpacingAfter(source.getSpacingAfter());target.setSpacingBetween(source.getSpacingBetween());// 复制段落中的每个runfor (XWPFRun run : source.getRuns()) {XWPFRun newRun = target.createRun();newRun.setText(run.text());// 复制格式newRun.setBold(run.isBold());newRun.setItalic(run.isItalic());newRun.setUnderline(run.getUnderline());newRun.setColor(run.getColor());newRun.setFontSize(run.getFontSize());newRun.setFontFamily(run.getFontFamily());}if (source.getStyle() != null) {target.setStyle(source.getStyle());}}// 复制源表格到目标表格,包括其行和单元格的样式和内容private static void copyTable(XWPFTable source, XWPFTable target) {// 删除目标表格中的默认创建的第一行,确保从空状态开始复制target.removeRow(0);// 遍历源表格的每一行for (XWPFTableRow sourceRow : source.getRows()) {// 在目标表格中创建新行XWPFTableRow newTableRow = target.createRow();// 复制源行的样式和内容到目标新行copyTableRow(sourceRow, newTableRow);}}// 将源表格行的样式和内容复制到目标表格行private static void copyTableRow(XWPFTableRow source, XWPFTableRow target) {// 复制行的样式属性target.getCtRow().setTrPr(source.getCtRow().getTrPr());// 遍历源行的每一个单元格for (int i = 0; i < source.getTableCells().size(); i++) {XWPFTableCell sourceCell = source.getCell(i);XWPFTableCell targetCell;// 如果目标行的单元格还不够,则创建新单元格if (i < target.getTableCells().size()) {targetCell = target.getCell(i);} else {targetCell = target.addNewTableCell();}String text = source.getCell(0).getText();if (text.contains("{{$fe")) {// 复制单元格的样式属性targetCell.getCTTc().setTcPr(sourceCell.getCTTc().getTcPr());targetCell.setText(sourceCell.getText());} else {// 复制单元格的样式和内容copyTableCell(sourceCell, targetCell);}}}// 将源单元格的样式和内容复制到目标单元格private static void copyTableCell(XWPFTableCell source, XWPFTableCell target) {// 复制单元格的样式属性target.getCTTc().setTcPr(source.getCTTc().getTcPr());// 清除目标单元格的段落target.getParagraphs().clear();// 复制每个段落for (XWPFParagraph sourceParagraph : source.getParagraphs()) {XWPFParagraph targetParagraph = target.addParagraph();copyParagraph(sourceParagraph, targetParagraph);}}}

说明:

  1. XWPFDocument:用于读取和写入Word文档(.docx格式)。我们首先通过FileInputStream读取Word文档。
  2. mergeDocuments:该方法将第二个Word文档的所有段落复制到第一个文档中。我们获取第二个文档的所有段落,并将其逐个添加到第一个文档。
  3. XWPFParagraph:表示Word文档中的一个段落。每个段落包含多个“运行”(XWPFRun),每个“运行”代表文档中的一部分文本。
  4. XWPFRun:表示段落中的一段文本,可以设置文本的样式(如字体、大小、加粗、斜体等)。

注意:

  1. 合并逻辑:本例中只是简单地将第二个文档的所有段落复制到第一个文档。你可以根据需求修改合并的细节(如按页、按段落或按表格等方式进行合并)。
  2. 合并样式:此示例中也将复制了文本的样式(如字体、大小、加粗等)。如果需要更复杂的样式保留,可以根据具体的需求进行调整。
  3. 处理表格、图片等:如果文档中包含表格或图片,你可能需要额外的逻辑来处理这些内容。

结果:

运行以上代码后,你将得到一个新的Word文档,内容包含了两个原始文档的所有内容。

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

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

相关文章

idea 弹窗 delete remote branch origin/develop-deploy

想删除远程分支&#xff0c;就选delete&#xff0c;仅想删除本地分支&#xff0c;选cancel&#xff1b; 在 IntelliJ IDEA 中遇到弹窗提示删除远程分支 origin/develop-deploy&#xff0c;这通常是在 Git 操作过程中出现的情况&#xff0c;可能是在执行如 git branch -d 或其他…

第四十五章 Vue之Vuex模块化创建(module)

目录 一、引言 二、模块化拆分创建方式 三、模块化拆分完整代码 3.1. index.js 3.2. module1.js 3.3. module2.js 3.4. module3.js 3.5. main.js 3.6. App.vue 3.7. Son1.vue 3.8. Son2.vue 四、访问模块module的state ​五、访问模块中的getters ​六、mutati…

【OpenEuler】配置虚拟ip

OpenEuler系统手动配置虚ip 介绍操作方法临时生效永久生效 验证 介绍 我们知道通过keepalived服务可以为linux服务器设置虚拟ip&#xff0c;但是有些特殊场景下若无法安装部署keepalived服务&#xff0c;则需要通过手动设置的方式&#xff0c;配置服务器的虚拟ip。 本方案提供…

CCI3.0-HQ:用于预训练大型语言模型的高质量大规模中文数据集

摘要 我们介绍了 CCI3.0-HQ&#xff0c;它是中文语料库互联网 3.0&#xff08;CCI3.0&#xff09;的一个高质量500GB子集&#xff0c;采用新颖的两阶段混合过滤管道开发&#xff0c;显著提高了数据质量。为了评估其有效性&#xff0c;我们在不同数据集的100B tokens上从头开始…

fastadmin多个表crud连表操作步骤

1、crud命令 php think crud -t xq_user_credential -u 1 -c credential -i voucher_type,nickname,user_id,voucher_url,status,time --forcetrue2、修改控制器controller文件 <?phpnamespace app\admin\controller;use app\common\controller\Backend;/*** 凭证信息…

安装SQL server中python和R

这两个都是编程语言 R 是一种专门为统计计算和数据分析而设计的语言&#xff0c;它具有丰富的统计函数和绘图工具&#xff0c;常用于学术研究、数据分析和统计建模等领域。 Python 是一种通用型编程语言&#xff0c;具有简单易学、语法简洁、功能强大等特点。它在数据科学、机…

项目技术栈-解决方案-web3去中心化

web3去中心化 Web3 DApp区块链:钱包:智能合约:UI:ETH系开发技能树DeFi应用 去中心化金融P2P 去中心化网络参考Web3 DApp 区块链: 以以太坊(Ethereum)为主流,也包括Solana、Aptos等其他非EVM链。 区块链本身是软件,需要运行在一系列节点上,这些节点组成P2P网络或者半…

【linux】centos7 换阿里云源

查看yum配置文件 yum的配置文件通常位于/etc/yum.repos.d/目录下。你可以使用以下命令查看这些文件&#xff1a; ls /etc/yum.repos.d/ # 或者 ll /etc/yum.repos.d/备份当前的yum配置文件 建议备份当前的yum配置文件&#xff1a; sudo cp /etc/yum.repos.d/CentOS-Base.re…

Python 中.title()函数和.lower()函数

一.title()函数 1.title()函数的功能 将字符串中的每一单词的首字母大写 2.举例 S1"i love you" S2S1.title() print(S2)3.输出 二.lower()函数 1.lower()函数的功能 将字符串中的每一大写字母都变成的小写字母 2.举例 S1"I LOVE YOU" S2S1.lower()…

[DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题

背景 今天有一台服务器到期了&#xff0c;准备把后端迁移到另一台服务器上&#xff0c;结果前端在测试的时候&#xff0c;出现了 304 的跨域问题。 调试过程中出现的问题&#xff0c;包括但不限于&#xff1a; set the request’s mode to ‘no-cors’Redirect is not allow…

【AI构思渲染】网络直播——建筑绘图大模型生成渲染图

家人们&#xff01;&#xff01;好消息来了&#xff01;&#xff01; 2024年11月19日&#xff0c;上午10:00-11:00 构力学堂将会给大家带来一场直播课《AI构思渲染第一课&#xff0c;建筑绘图大模型生成渲染图》 课程亮点&#xff1a; 1、AI插件相关介绍 2、AI构思渲染安装…

初级数据结构——栈

目录 前言一、栈的基本概念二、栈的实现方式三、栈的性能分析四、栈的应用场景五、栈的变体六、出栈入栈的动态图解七、代码模版八、总结结语 前言 数据结构栈&#xff08;Stack&#xff09;是一种线性的数据结构&#xff0c;它只允许在序列的一端&#xff08;称为栈顶&#x…

ESLint 使用教程(五):ESLint 和 Prettier 的结合使用与冲突解决

前言 在现代前端开发中&#xff0c;代码质量与代码风格的统一是两个非常重要的方面。良好的代码质量能减少 bug 的产生&#xff0c;而统一的代码风格则能提高团队协作的效率。为了实现这两个目标&#xff0c;我们通常会使用一些工具。 为了保证代码的可读性和维护性&#xff0…

简易入手《SOM神经网络》的本质与原理

原创文章&#xff0c;转载请说明来自《老饼讲解神经网络》:www.bbbdata.com 关于《老饼讲解神经网络》&#xff1a; 本网结构化讲解神经网络的知识&#xff0c;原理和代码。 重现matlab神经网络工具箱的算法&#xff0c;是学习神经网络的好助手。 目录 一、入门原理解说 01.…

数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用

昨天帮助社区IC训练营学员远程协助解决一个Calibre DRC案例。通过这个DRC Violation向大家分享下Innovus和ICC2中如何批量约束cell的spacing rule。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案 下图所示为T12nm A55项目的Ca…

深度学习神经网络在机器人领域应用的深度剖析:原理、实践与前沿探索

深度学习神经网络在机器人领域的应用非常广泛&#xff0c;以下是详细介绍&#xff1a; 主要应用方向 环境感知与识别&#xff1a; 物体识别与分类&#xff1a;机器人利用深度学习神经网络能够准确识别周围环境中的各种物体&#xff0c;比如区分不同形状、颜色、材质的物品&…

自动化工具 Gulp

自动化工具 gulp 摘要 概念&#xff1a;gulp用于自动化开发流程。 理解&#xff1a;我们只需要编写任务&#xff0c;然后gulp帮我们执行 核心概念&#xff1a; 任务&#xff1a;通过定义不同的任务来组织你的构建流程。 管道&#xff1a;通过管道方式将文件从一个插件传递…

基于Spring Boot与Redis的令牌主动失效机制实现

目录 前言1. 项目结构和依赖配置1.1 项目依赖配置1.2 Redis连接配置 2. 令牌主动失效机制的实现流程2.1 登录成功后将令牌存储到Redis中2.2 使用拦截器验证令牌2.3 用户修改密码后删除旧令牌 3. Redis的配置与测试4. 可能的扩展与优化结语 前言 在现代Web系统中&#xff0c;用…

llama factory lora 微调 qwen2.5 7B Instruct模型

项目背景 甲方提供一台三卡4080显卡 需要进行qwen2.5 7b Instruct模型进行微调。以下为整体设计。 要使用 LLaMA-Factory 对 Qwen2.5 7B Instruct模型 进行 LoRA&#xff08;Low-Rank Adapters&#xff09;微调&#xff0c;流程与之前提到的 Qwen2 7B Instruct 模型类似。LoRA …

GPT-5 要来了:抢先了解其创新突破

Microsoft 的工程师计划于 2024 年 11 月在 Azure 上部署 Orion (GPT-5)。虽然这一版本不会向公众开放&#xff0c;但其上线被视为人工智能领域的一个重要里程碑&#xff0c;并将产生深远的影响。 文章目录 GPT-5 真的要来了GPT-4 的局限性GPT-5 的创新突破与遗留挑战GPT-5 预期…