今天遇到一个问题,就是需要把多个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. C++链接两个cpp 文件

    我们在编程中,有没有想过,分别写代码,然后把两个cpp,文件合并,两个自身本不能运行的文件,在一起却可以运行(主要牵扯函数调用,一个有声明和调用,另一个定义).那么具体如何实现呢? 跟着我的步骤: 1 ...

  2. HttpWebRequest向路由器提交基本身份验证

    HttpWebRequest向路由器提交基本身份验证 服务端IIS设置为不允许匿名访问,只选择了基本身份验证,客户端使用HttpWebRequest发送一个get请求,请求一个页面. 基本身份验证,客 ...

  3. Mac下U盘安装系统“未验证的错误”

    bash下 输入下面命令: date 1220141012015.30

  4. winfrom 捕获是否点击关闭按钮关闭的窗体

    const int WM_SYSCOMMAND = 0x0112; const int SC_CLOSE = 0xF060; protected override void WndProc(ref M ...

  5. 前端js 判断输入的必须是数字,判断金钱

    //输入的必须是数字 $(".xzjl").on("keyup", ".num", function () { var v = $(this ...

  6. myeclipse2014激活

    MyEclipse2014破解教程 一. 在破解myeclipse2014之前,要先把环境变量配置好: 1)打开我的电脑--属性--高级--环境变量 2)新建系统变量JAVA_HOME 和CLASSP ...

  7. C语言题库的上机题

    1.编写函数,实现从键盘上输入一个小写字母,将其转化为大写字母. #include<stdio.h> int zhuanhua(char s); void main(){ char s; ...

  8. Java 第29章GUI

    GUI入门 JDBC 连接数据库的过程 注册驱动(class ,forName) 创建连接 创建连接对象 执行SQL语句 statement对象的类型与作用 1.(layout :版面,布局) 2.( ...

  9. Ubuntu grub引导修复

    通过USB启动盘安装系统时将引导程序指定到/dev/sdb1,正常应该是指定到/dev/sdb才是,导致安装之后启动不起来. 重新通过USB启动盘进入试用界面,然后打开终端通过如下操作进行grub引导 ...

  10. ASP.NET使用ConfigurationSection在Web.Config创建自定义配置节

    主要代码,一定要继续System.Configuration.ConfigurationSection,具体的节点名称可以自行修改 using System; using System.Data; u ...