Word文档合并的一种实现

 

今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多。这个问题,如果是在服务端的话,直接使用OpenXML技术,读写文档就可以实现,这样性能较稳定,但是需要对OpenXML有一定的了解。如果在客户端机器上,可以使用Word PIA实现。

由于本人对于Word PIA较熟悉,所以采用了该方法。但是在实现的过程中,也是有很多种思路的。

  1. 将b.doc打开,将其中的内容选中,复制到剪贴板,然后打开目标文件a.doc,通过代码将光标移到文档末尾,粘贴。粘贴一次保存一下文件,然后在打开c.doc重复以上过程,知道所有文件均添加完成。
  2. 将b.doc打开,将其中的内容选中,获取Range对象,然后打开目标文件a.doc,在里面通过代码插入b的内容。

以上两种方法都涉及到打开和读取待合并的文档。完成之后还需要及时关掉已释放资源。对于一些复杂的对象,比如说具有行或者列合并的表格对象,采用第二种方式在目标文档中创建表格,然后循环遍历待合并文档中的表格,并给目标文档中的表格进行赋值会出现问题。效果都不太好。

在查找了一些资料后,发现Word自带有添加文档内容到打开文档中的功能。

这样就简单多了,通常最简单的做法是录制宏。

操作步骤如下:

  1. 点击录制宏
  2. 打开目标文件a.doc
  3. 然后按住键盘 Ctrl+End 键,跳转到文档a的末尾。
  4. 点击 Insert­(插入)->Object(对象)->Text from file(文件中的文字)
  5. 选中待插入的文件b.doc,确定
  6. 停止录制宏

点击宏编辑,然后可以看到我们刚才操作的步骤与之对应的代码。然后我们将它转为.NET中调用的方式即可。在Office开发中,这是一种很有用的技巧。

Sub Macro1()
Selection.EndKey Unit:=wdStory
ChangeFileOpenDirectory "D:\"
Selection.InsertFile FileName:="b.docx", Range:="", _
ConfirmConversions:=False, Link:=False, Attachment:=False
End Sub

这里的关键方法有两个,一个是Selection.EndKey,用来跳转到文档的最后,一个是InsertFile,从文档中导入文本。将上面的VBA代码转为.NET中C#代码如下:

private void btnCombine_Click(object sender, EventArgs e)
{
//创建WordApp对象
Word.Application wordApp = null;
try
{
wordApp = (Word.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Word.Application");
}
catch (System.Runtime.InteropServices.COMException ex)
{
wordApp = new Word.Application();
}
//源文件,待合并的文件
object missing = Type.Missing;
object targetfilename = @"D:\a.docx";
Word.Document docTarget = wordApp.Documents.Open(ref targetfilename, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing,
ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); //所有的要往源文件中合并的文件,注意顺序
//在实际操作中把这部分替换为 遍历文件夹下的所有想合并的word文档的名称即可
for (int count = 0; count <= 3; count++)
{
string sourcefilename = @"D:\b.docx";
//移动光标到文档末尾
docTarget.Application.Selection.EndKey(WdUnits.wdStory);
//在文档末尾插入待合并内容
docTarget.Application.Selection.InsertFile(sourcefilename, ref missing, false, false, false);
//保存
docTarget.Save();
} docTarget.Save(); Marshal.ReleaseComObject(wordApp);
MessageBox.Show("Success");
}

代码中需要注意的是,创建Word.Application对象的方式,以及资源释放的方式。

Word文档合并的更多相关文章

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

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

  2. 多个 Word 文档合并为一个

    如果您工作中经常要跟 Word 文档打交道,时不时的您可能需要将多个 Word 文档合并为一个.信息量少的时候,我们可以直接使用复制粘贴.除此之外,还有没有其它办法呢? 借助word2010/2007 ...

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

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

  4. word文档批量合并工具

    #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. ; #Warn ; En ...

  5. Java 合并Word文档

    合并文档可以是将两个包含一定逻辑关系的文档合并成一个完整的文档,也可以是出于方便文档存储.管理的目的合并多个文档为一个文档.下面,就将以上文档操作需求,通过Java程序来实现Word文档合并.合并文档 ...

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

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

  7. C# 合并及拆分Word文档

    本文简要分析一下如何如何使用C#简单实现合并和拆分word文档.平时我们在处理多个word文档时,可能会想要将两个文档合并为一个,或者是将某个文档的一部分添加到另一个文档中,有的时候也会想要将文档拆分 ...

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

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

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

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

随机推荐

  1. 体验VS2015正式版

    初次体验VS2015正式版,安装详细过程.   阅读目录 介绍 安装 介绍    纽约时间7月20日,微软发布了vs 2015 正式版,换算到我们的北京时间就是晚上了,今天回到家里,就下下来了,装上去 ...

  2. 我的MYSQL学习心得(五)

    原文:我的MYSQL学习心得(五) 我的MYSQL学习心得(五) 我的MYSQL学习心得(一) 我的MYSQL学习心得(二) 我的MYSQL学习心得(三) 我的MYSQL学习心得(四) 我的MYSQL ...

  3. 【UVA】11137-Ingenuous Cubrency

    DP问题,须要打表. dp[i][j]代表利用大小不超过i的数字组成j的方法. 状态方程是 dp[i][j] = d[i - 1][j] + sum{dp[i - 1][j - k * i * i * ...

  4. android开源系列:CircleImageView采用圆形控制它们的定义

    1.定义自己的圆形控制github住址:https://github.com/hdodenhof/CircleImageView 基本的类: package de.hdodenhof.circleim ...

  5. hdu 5066 Harry And Physical Teacher(Bestcoder Round #14)

    Harry And Physical Teacher Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  6. keil程序在外部RAM中调试的问题总结(个人的一点经验总结)

    keil程序在内部RAM调试的基本步骤网上已经有非常多了,我就不再赘述,大家能够在网上搜到非常多. 可是有些时候内部RAM并不够用,这就须要将程序装入外部RAM中调试,而在这个过程中可能会出现各种各样 ...

  7. 私人定制javascript中对象小知识点(Only For Me)

    废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说 ...

  8. GitFlow使用说明

    ———————安装--------------- $ git clone --recursive git://github.com/nvie/gitflow.git $ cd gitflow $ [s ...

  9. IOS中 类扩展 xib

    一.类扩展(class extension,匿名分类) .格式 @interface 类名 () { // 成员变量... } // 方法声明... @end .作用 > 写在.m文件中 > ...

  10. MVC5控制器、路由、返回类型、选择器、过滤器

    ASP.NET MVC5 学习笔记-1 控制器.路由.返回类型.选择器.过滤器   [TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序, ...