今天遇到一个问题,就是需要把多个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. Word文档合并

    Word文档合并的一种实现   今天遇到一个问题,就是需要把多个Word文档的内容追加到一个目标Word文档的后面,如果我有目标文档a.doc以及其他很多个文档b.doc,c.doc…等等数量很多.这 ...

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

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

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

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

  4. Java 合并Word文档

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

  5. word文档批量合并工具

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

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

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

  7. 自动化工具word文档批量转html

    企业有很多的科室,科室的每个人或多或少都会写一些文档,有些文档领导需要浏览,解决的办法是将编辑的文档打印出来,供领导浏览,或是为了节约企业成本,文档就在人与人这间或部门之间copy过来,copy过去. ...

  8. C#用Open与Add方法打开word文档的区别

    C#打开word文档常用有两种方法:Add与Open. Microsoft.Office.Interop.Word._Document doc = (Document)appWord.Document ...

  9. Java将数据写入word文档(.doc)

    Java可用org.apache.poi包来操作word文档.org.apache.poi包可于官网上下载,解压后各jar作用如下图所示: 可根据需求导入对应的jar. 一.HWPFDocument类 ...

随机推荐

  1. Thinkphp Exception捕获异常失败

    try catch 比较坑,默认这样是走TP 的错误模板页面 自定义的话: try { } catch ( \Exception $e ) {}加个\

  2. archive成功了,但是在输出ipa时要求有账号密码

    archive成功了,但是在输出ipa时要求有账号密码 可以通过命令行方式输出,绕开账号检查1.进入Windows-Organizer-Archives,找到要输出的scarchive列表项:2.右键 ...

  3. sql server convert 日期

    ),) --2016/11 ),) --2016-11-03 17:46:47

  4. maven使用

    Maven是一个项目管理和构建自动化工具.但是对于我们程序员来说,我们最关心的是它的项目构建功能,它定义了项目开发的几个标准步骤:编译,发布,单元测试及部署以帮助项目开发 最简单的时候场景是,在pom ...

  5. 华硕U303L通过U盘装系统

    开机,按esc,进入bios,选择security,将secure boot control设置为disable.   在boot下,将launch csm 改为enable,按F10保存退出,重启. ...

  6. linux搞大头,bang bang bang

    偶遇网站打不开,人懵逼了,然后各种查询资料,查到可能跟服务器的问题有关,于是乎连接linux服务器,开始一段苦逼旅程. 其实主要是一些简单的linux命令,对我这个没怎么接触linux的小白来说,何等 ...

  7. J2EE中EL表达式

    EL全名为Expression Language. EL语法很简单,主要的语法结构是${sessionScope.user.sex}所有EL都是以${为起始.以}为结尾的. 上述EL范例的意思是:从S ...

  8. Java 第8章 循环结构进阶

    循环结构进阶 什么是二重循环? 二重循环的执行顺序是什么?

  9. mysql远程快速导出csv格式数据工具

    如需转载,请经本人同意. 之前本人曾经写过一个使用 select ....into outfile原理导出数据的脚本,但该脚本值适用于本地快速导出,并不支持远程服务,故又编写了下面这个支持远程导出的脚 ...

  10. JavaScript-navigator_userAgent-编写一段代码能够区分浏览器的主流和区分

    1 userAgent:包含浏览器名称和版本号的字符串 <!DOCTYPE html> <html> <head lang="en"> < ...