首页 > 编程语言 >C# 合并及拆分Word文档

C# 合并及拆分Word文档

时间:2022-12-30 12:06:10浏览次数:44  
标签:docx Word C# section 文档 newWord ChildObjects Document


C# 合并及拆分Word文档


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


第一部分:合并Word文档

我新创建了两个简单的word文档,如下图:

C# 合并及拆分Word文档_C#

                                                                              文档1

C# 合并及拆分Word文档_拆分word文档_02

                                                                                       文档2

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

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

效果图:

C# 合并及拆分Word文档_Word_03


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

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

效果图:

C# 合并及拆分Word文档_加载_04


第二部分:拆分Word文档

根据sectionbreak拆分Word文档

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

效果图:

C# 合并及拆分Word文档_合并word文档_05


根据pagebreak拆分Word文档

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

C# 合并及拆分Word文档_合并word文档_06

 

参考如下代码来根据page break拆分以上文档:

//加载源文档
Document original = new Document();
original.LoadFromFile("NewZealand.docx");
//创建一个新的文档并给它添加一个section
Document newWord = new Document();
Section section = newWord.AddSection();

int index = 0;
//遍历源文档的所有section,检测page break并根据page break拆分文档
foreach (Section sec in original.Sections)
{
foreach (DocumentObjectobj in sec.Body.ChildObjects)
{
if (obj is Paragraph)
{
Paragraph para = obj asParagraph;
section.Body.ChildObjects.Add(para.Clone());
foreach (DocumentObjectparobj in para.ChildObjects)
{
if (parobj isBreak && (parobj as Break).BreakType== BreakType.PageBreak)
{
int i =para.ChildObjects.IndexOf(parobj);
for (intj = 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 >= 0)
{
section.Paragraphs[0].ChildObjects.RemoveAt(i);
i--;
}
if(section.Paragraphs[0].ChildObjects.Count == 0)
{
section.Body.ChildObjects.RemoveAt(0);
}
}
}
}
if (obj is Table)
{
section.Body.ChildObjects.Add(obj.Clone());
}
}
}
newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx);

效果图:

C# 合并及拆分Word文档_Word_07


完整代码:

合并

using Spire.Doc;

namespace Merge_Word_Document
{
class Program
{
static void Main(string[] args)
{
//合并一个Word文档的某一个section到另一个文档
/*Document doc1 = new Document();
doc1.LoadFromFile("SalesReport.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 = newDocument();
document.LoadFromFile("SalesReport.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 = newDocument();
original.LoadFromFile("New Zealand.docx");
Document newWord = newDocument();
Section section = newWord.AddSection();
int index = 0;
foreach (Sectionsec in original.Sections)
{
foreach (DocumentObjectobj in sec.Body.ChildObjects)
{
if (obj isParagraph)
{
Paragraph para = obj as Paragraph;
section.Body.ChildObjects.Add(para.Clone());

foreach (DocumentObject parobj in para.ChildObjects)
{
if (parobj is Break && (parobj asBreak).BreakType == BreakType.PageBreak)
{
inti = 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 >= 0)
{
section.Paragraphs[0].ChildObjects.RemoveAt(i);
i--;
}
if (section.Paragraphs[0].ChildObjects.Count == 0)
{
section.Body.ChildObjects.RemoveAt(0);
}
}
}
}
if (obj isTable)
{
section.Body.ChildObjects.Add(obj.Clone());
}
}
}
newWord.SaveToFile(String.Format("result/out-{0}.docx", index), FileFormat.Docx);
}
}
}


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

 

 

标签:docx,Word,C#,section,文档,newWord,ChildObjects,Document
From: https://blog.51cto.com/u_15656056/5979828

相关文章

  • C#/VB.NET 读取条码类型及条码在图片中的坐标位置
    我们在创建条形码时,如果以图片的方式将创建好的条码保存到指定文件夹路径,可以在程序中直接加载图片使用;已生成的条码图片,需要通过读取图片中的条码信息,如条码类型、条码绘制......
  • C# 复制PDF页面到另一个PDF文档
    C#复制PDF页面到另一个PDF文档有时候我们可能有这样一个需求,那就是把PDF页面从一个PDF文档复制到另一个PDF文档中。由于PDF文档并不像word文档那样好编辑,因此复制也相对没......
  • C# 在excel中查找及替换数据
    在使用Excel处理数据时,有时候工作表内容很多,如果手动地一行一行的找数据很难发现它们在哪个地方。微软Excel给我们提供了一个很强大的数据处理功能-查找和替换,通过这个功能,......
  • 在C#里面给PPT添加注释
    平常开会或者做总结报告的时候我们通常都会用到PowerPoint演示文稿,我们可以在单个幻灯片或者全部幻灯片里面添加注释,这样观众可以从注释内容里面获取更多的相关信息。有些朋......
  • C# 提取Word中插入的多媒体文件(视频、音频)
    在Word中可将文件通过OLE对象嵌入的方式插入到文档,包括Word、excel、PDF、PPT、图片、宏文件、文件包等在内的多种文件类型。对文档中已插入的文档对象,也可通过本文中的方法......
  • C# Excel批注“哪种开发语言最好”
    Excel批注常用于为个别的单元格添加注释,读者能够从注释中获取额外的信息。批注可隐藏,只会在单元格右上方显示红色三角,添加后不会对单元格的内容喧宾夺主。在日常编程处理Exc......
  • C# Excel 生成图表,添加趋势线、误差线
    Excel图表能够将数据可视化,在图表中另行添加趋势线和误差线,可对数据进行进一步的数据分析和统计的可视化处理。Excel中的趋势线可用于趋势预测/回归分析,共6中类型:指数(X),线性(L......
  • C#/VB.NET 在PDF表格中添加条形码
    条码的应用已深入生活和工作的方方面面。在处理条码时,常需要和各种文档格式相结合。当需要在文档中插入、编辑或者删除条码时,可借助于一些专业的类库工具来实现。本文,以操作......
  • C# Powerpoint 禁止或允许修改形状
    在设定形状属性后,可禁止对形状某些属性的编辑,以达到保护形状格式的目的。常用方法有:锁定形状禁止选择,和禁止对形状的具体属性进行修改。前者保护形状的所有格式,无法选取,无......
  • .NET Word 文件格式转换
    不同格式的文件有不同的应用领域和优势,因此在日常开发中我们需要对文件格式进行转换。在微软Word中,可以在“文件—另存为—保存类型”中实现Word文件格式的转换。这篇文章,旨......