本文简要分析一下如何如何使用C#简单实现合并和拆分word文档。平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档中,有的时候也会想要将文档拆分。在Word中,合并或拆分文档最简单的方式就是打开一个原文档的副本文件,复制我们需要的部分,删除不需要的部分,然后再保存文档。使用这种方法在文档比较多或者比较大时手动操作起来比较费时,以下是使用C#实现合并一个Word文档的某一个section到另一个文档或者合并两个完整的Word文档到一个单独的文档以及如何根据section和page break来拆分一个Word文档的方法。

第一部分:合并Word文档

为了数据的保密性,我新创建了两个简单的word文档,如下图:

文档1

文档2

合并一个Word文档的某一个section到另一个文档

//加载文档1和文档2
Document doc1 = new Document();
doc1.LoadFromFile("Sales Report.docx", FileFormat.Docx);
Document doc2 = new Document();
doc2.LoadFromFile("Stories.docx", FileFormat.Docx);
//获取文档2的第一个section
Section sec = doc2.Sections[];
//克隆该section并把它添加到文档1
doc1.Sections.Add(sec.Clone());
doc1.SaveToFile("Mergesection.docx", FileFormat.Docx);

效果图:

合并两个完整的Word文档到一个单独的文档

//加载文档1
Document document = new Document();
document.LoadFromFile("Sales Report.docx", FileFormat.Docx);
//将文档2的所有内容插入到文档1
document.InsertTextFromFile("Stories.docx", FileFormat.Docx);
//将结果另存为到另一个单独的文档
document.SaveToFile("MergeFiles.docx", FileFormat.Docx);

效果图:

第二部分:拆分Word文档

根据section break拆分Word文档

//加载源文档
Document document = new Document();
document.LoadFromFile("Stories.docx");
//定义一个新的文档对象
Document newWord;
//遍历源文档的所有section,克隆每个section并将其添加至一个新的word文档,然后保存文档
for (int i = ; i < document.Sections.Count; i++)
{
newWord = new Document();
newWord.Sections.Add(document.Sections[i].Clone());
newWord.SaveToFile(String.Format(@"test\output_{0}.docx", i));
}

效果图:

根据page break拆分Word文档

如下文档含有两个page break分别在第一页和第二页的末尾:

//加载源文档
Document original = new Document();
original.LoadFromFile("New Zealand.docx"); //创建一个新的文档并给它添加一个section
Document newWord = new Document();
Section section = newWord.AddSection(); int index = ;
//遍历源文档的所有section,检测page break并根据page break拆分文档
foreach (Section sec in original.Sections)
{
foreach (DocumentObject obj in sec.Body.ChildObjects)
{
if (obj is Paragraph)
{
Paragraph para = obj as Paragraph;
section.Body.ChildObjects.Add(para.Clone()); foreach (DocumentObject parobj in para.ChildObjects)
{
if (parobj is Break && (parobj as Break).BreakType == BreakType.PageBreak)
{
int i = para.ChildObjects.IndexOf(parobj);
for (int j = i; j < para.ChildObjects.Count; j++)
{
section.Body.LastParagraph.ChildObjects.RemoveAt(i);
}
newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx); index++;
newWord = new Document();
section = newWord.AddSection();
section.Body.ChildObjects.Add(para.Clone());
while (i >= )
{
section.Paragraphs[].ChildObjects.RemoveAt(i);
i--;
} if (section.Paragraphs[].ChildObjects.Count == )
{
section.Body.ChildObjects.RemoveAt();
}
}
}
}
if (obj is Table)
{
section.Body.ChildObjects.Add(obj.Clone());
}
}
}
newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx);

效果图:

完整代码:

合并

using Spire.Doc;

namespace Merge_Word_Document
{
class Program
{
static void Main(string[] args)
{
//合并一个Word文档的某一个section到另一个文档
/*Document doc1 = new Document();
doc1.LoadFromFile("Sales Report.docx", FileFormat.Docx);
Document doc2 = new Document();
doc2.LoadFromFile("Stories.docx", FileFormat.Docx);
Section sec = doc2.Sections[0];
doc1.Sections.Add(sec.Clone());
doc1.SaveToFile("Mergesection.docx", FileFormat.Docx);*/ //合并两个完整的Word文档到一个单独的文档
Document document = new Document();
document.LoadFromFile("Sales Report.docx", FileFormat.Docx);
document.InsertTextFromFile("Stories.docx", FileFormat.Docx);
document.SaveToFile("MergeFiles.docx", FileFormat.Docx);
}
}
}

拆分

using System;
using Spire.Doc;
using Spire.Doc.Documents; namespace Split_Word_Document
{
class Program
{
static void Main(string[] args)
{
//根据section拆分
/*Document document = new Document();
document.LoadFromFile("Stories.doc");
Document newWord;
for (int i = 0; i < document.Sections.Count; i++)
{
newWord = new Document();
newWord.Sections.Add(document.Sections[i].Clone());
newWord.SaveToFile(String.Format(@"test\out_{0}.docx", i));
}*/ //根据page break拆分
Document original = new Document();
original.LoadFromFile("New Zealand.docx");
Document newWord = new Document();
Section section = newWord.AddSection(); int index = ;
foreach (Section sec in original.Sections)
{
foreach (DocumentObject obj in sec.Body.ChildObjects)
{
if (obj is Paragraph)
{
Paragraph para = obj as Paragraph;
section.Body.ChildObjects.Add(para.Clone());
foreach (DocumentObject parobj in para.ChildObjects)
{
if (parobj is Break && (parobj as Break).BreakType == BreakType.PageBreak)
{
int i = para.ChildObjects.IndexOf(parobj);
for (int j = i; j < para.ChildObjects.Count; j++)
{
section.Body.LastParagraph.ChildObjects.RemoveAt(i);
}
newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx); index++;
newWord = new Document();
section = newWord.AddSection();
section.Body.ChildObjects.Add(para.Clone());
while (i >= )
{
section.Paragraphs[].ChildObjects.RemoveAt(i);
i--;
}
if (section.Paragraphs[].ChildObjects.Count == )
{
section.Body.ChildObjects.RemoveAt();
}
}
}
}
if (obj is Table)
{
section.Body.ChildObjects.Add(obj.Clone());
}
}
}
newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx);
}
}
}

注意:这里我使用了一个免费的word API(http://freeword.codeplex.com)。

C# 合并及拆分Word文档的更多相关文章

  1. java 在线拆分 word文档采用什么技术比较好?

    在Java项目开发中,偶尔会遇到通过程序动态拆分word文档的需求,由于Java本身不能操作Word文档,在网上也都是讨论如何动态合并word,所以这个需求实现起来相当困难,下面就将近期对于Word文 ...

  2. Java 合并、拆分PDF文档

    处理PDF文档时,我们可以通过合并的方式,来任意组几个不同的PDF文件或者通过拆分将一个文件分解成多个子文件,这样的好处是对文档的存储.管理很方便.下面将通过Java程序代码介绍具体的PDF合并.拆分 ...

  3. [.NET开发] C# 合并、拆分PDF文档

    在整理文件时,将多个同类型文档合并是实现文档归类的有效方法,也便于文档管理或者文档传输.当然,也可以对一些比较大的文件进行拆分来获取自己想要的部分文档.可以任意地对文档进行合并.拆分无疑为我们了提供极 ...

  4. C# 实现将多个word文档合并成一个word文档的功能

    前段时间项目上遇到这么一个需求,需要将多个OCR识别的word文档合并成一个,于是就在网上找了找,自己修改了一下.在这里跟大家分享一下,希望有用的到的. 要做多word文档合并,首先要导入Micros ...

  5. JAVA合并多个word文档根据文章标题生成目录

    此产品版本是免费版的,我也是在用免费,除了只能单次识别25张一下的word和生成pdf有限制,其他的功能都和正式版差不多. 如果你几十个文档,每个文档几页,输出出来超过25页,那没关系,依然可以使用. ...

  6. 合并两个word文档,保持样式不变

    一.需求说明 例如将封面插入到word正文上方 二.导入依赖 <dependency> <groupId>org.apache.poi</groupId> < ...

  7. POI生成word文档完整案例及讲解

    一,网上的API讲解 其实POI的生成Word文档的规则就是先把获取到的数据转成xml格式的数据,然后通过xpath解析表单式的应用取值,判断等等,然后在把取到的值放到word文档中,最后在输出来. ...

  8. C#使用NPOI对Word文档进行导出操作的dll最新版2.5.1

    Npoi导出非模板 最近使用NPOI做了个导出Word文档的功能,因为之前都是导出Excel很方便(不用模板),所以导出Word也选用了Npoi(也没有用模板,

  9. Word文档合并的一种实现

    今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多.这个问题,如果是在服务端的话,直接 ...

随机推荐

  1. node中的cmd规范

    你应该熟悉nodejs模块中的exports对象,你可以用它创建你的模块.例如:(假设这是rocker.js文件) exports.name = function() { console.log('M ...

  2. Mac OS、Ubuntu 安装及使用 Consul

    Consul 概念(摘录): Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb 的 SmartStac ...

  3. 微信网页开发之获取用户unionID的两种方法--基于微信的多点登录用户识别

    假设网站A有以下功能需求:1,pc端微信扫码登录:2,微信浏览器中的静默登录功能需求,这两种需求就需要用到用户的unionID,这样才能在多个登录点(终端)识别用户.那么这两种需求下用户的unionI ...

  4. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

  5. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  6. Flexible 弹性盒子模型之CSS flex-shrink 属性

    实例 让第二个元素收缩到其他元素的三分之一: 效果预览 div:nth-of-type(2){flex-shrink:3;} 浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号. 紧跟在 - ...

  7. ES6之变量常量字符串数值

    ECMAScript 6 是 JavaScript 语言的最新一代标准,当前标准已于 2015 年 6 月正式发布,故又称 ECMAScript 2015. ES6对数据类型进行了一些扩展 在js中使 ...

  8. js 基础篇(点击事件轮播图的实现)

    轮播图在以后的应用中还是比较常见的,不需要多少行代码就能实现.但是在只掌握了js基础知识的情况下,怎么来用较少的而且逻辑又简单的方法来实现呢?下面来分析下几种不同的做法: 1.利用位移的方法来实现 首 ...

  9. 在 SharePoint Server 2016 本地环境中设置 OneDrive for Business

    建议补丁 建议在sharepoint2016打上KB3127940补丁,补丁下载地址 https://support.microsoft.com/zh-cn/kb/3127940 当然不打,也可以用O ...

  10. CRM 数据密钥 忘记 解决方案

    UPDATE EmailServerProfile SET IncomingPassword=nullUPDATE EmailServerProfile SET OutgoingPassword=nu ...