C#实现合并多个word文档的方法

 更新时间:2014年09月19日 10:32:28   投稿:shichen2014  
这篇文章主要介绍了C#实现合并多个word文档的方法,是C#针对Word文档操作的一个非常重要的技巧,需要的朋友可以参考下

本文实例讲述了C#实现合并多个word文档的方法,是非常具有实用价值的技巧。分享给大家供大家参考。

具体实现方法如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.Office.Interop.Word;
using System.Reflection;
using System.IO;
using System.Diagnostics;

namespace driverexam.WordReport
{
  public class WordDocumentMerger
  {
    private ApplicationClass objApp = null;
    private Document objDocLast = null;
    private Document objDocBeforeLast = null;
    public WordDocumentMerger()
    {
      objApp = new ApplicationClass();
    }
    #region 打开文件
    private void Open(string tempDoc)
    {
      object objTempDoc = tempDoc;
      object objMissing = System.Reflection.Missing.Value;

   objDocLast = objApp.Documents.Open(
      ref objTempDoc, //FileName 
      ref objMissing, //ConfirmVersions 
      ref objMissing, //ReadOnly 
      ref objMissing, //AddToRecentFiles 
      ref objMissing, //PasswordDocument 
      ref objMissing, //PasswordTemplate 
      ref objMissing, //Revert 
      ref objMissing, //WritePasswordDocument 
      ref objMissing, //WritePasswordTemplate 
      ref objMissing, //Format 
      ref objMissing, //Enconding 
      ref objMissing, //Visible 
      ref objMissing, //OpenAndRepair 
      ref objMissing, //DocumentDirection 
      ref objMissing, //NoEncodingDialog 
      ref objMissing //XMLTransform 
      );
      objDocLast.Activate();
    }
    #endregion

    #region 保存文件到输出模板
    private void SaveAs(string outDoc)
    {
      object objMissing = System.Reflection.Missing.Value;
      object objOutDoc = outDoc;
      objDocLast.SaveAs(
      ref objOutDoc, //FileName 
      ref objMissing, //FileFormat 
      ref objMissing, //LockComments 
      ref objMissing, //PassWord 
      ref objMissing, //AddToRecentFiles 
      ref objMissing, //WritePassword 
      ref objMissing, //ReadOnlyRecommended 
      ref objMissing, //EmbedTrueTypeFonts 
      ref objMissing, //SaveNativePictureFormat 
      ref objMissing, //SaveFormsData 
      ref objMissing, //SaveAsAOCELetter, 
      ref objMissing, //Encoding 
      ref objMissing, //InsertLineBreaks 
      ref objMissing, //AllowSubstitutions 
      ref objMissing, //LineEnding 
      ref objMissing //AddBiDiMarks 
      );
    }
    #endregion

    #region 循环合并多个文件(复制合并重复的文件)
    /// <summary> 
    /// 循环合并多个文件(复制合并重复的文件) 
    /// </summary> 
    /// <param name="tempDoc">模板文件</param> 
    /// <param name="arrCopies">需要合并的文件</param> 
    /// <param name="outDoc">合并后的输出文件</param> 
    public void CopyMerge(string tempDoc, string[] arrCopies, string outDoc)
    {
      object objMissing = Missing.Value;
      object objFalse = false;
      object objTarget = WdMergeTarget.wdMergeTargetSelected;
      object objUseFormatFrom = WdUseFormattingFrom.wdFormattingFromSelected;
      try
      {
        //打开模板文件 
        Open(tempDoc);
        foreach (string strCopy in arrCopies)
        {
          objDocLast.Merge(
          strCopy, //FileName 
          ref objTarget, //MergeTarget 
          ref objMissing, //DetectFormatChanges 
          ref objUseFormatFrom, //UseFormattingFrom 
          ref objMissing //AddToRecentFiles 
          );
          objDocBeforeLast = objDocLast;
          objDocLast = objApp.ActiveDocument;
          if (objDocBeforeLast != null)
          {
            objDocBeforeLast.Close(
            ref objFalse, //SaveChanges 
            ref objMissing, //OriginalFormat 
            ref objMissing //RouteDocument 
            );
          }
        }
        //保存到输出文件 
        SaveAs(outDoc);
        foreach (Document objDocument in objApp.Documents)
        {
          objDocument.Close(
          ref objFalse, //SaveChanges 
          ref objMissing, //OriginalFormat 
          ref objMissing //RouteDocument 
          );
        }
      }
      finally
      {
        objApp.Quit(
        ref objMissing, //SaveChanges 
        ref objMissing, //OriginalFormat 
        ref objMissing //RoutDocument 
        );
        objApp = null;
      }
    }
    /// <summary> 
    /// 循环合并多个文件(复制合并重复的文件) 
    /// </summary> 
    /// <param name="tempDoc">模板文件</param> 
    /// <param name="arrCopies">需要合并的文件</param> 
    /// <param name="outDoc">合并后的输出文件</param> 
    public void CopyMerge(string tempDoc, string strCopyFolder, string outDoc)
    {
      string[] arrFiles = Directory.GetFiles(strCopyFolder);
      CopyMerge(tempDoc, arrFiles, outDoc);
    }
    #endregion

    #region 循环合并多个文件(插入合并文件)
    /// <summary> 
    /// 循环合并多个文件(插入合并文件) 
    /// </summary> 
    /// <param name="tempDoc">模板文件</param> 
    /// <param name="arrCopies">需要合并的文件</param> 
    /// <param name="outDoc">合并后的输出文件</param> 
    public void InsertMerge(string tempDoc, string[] arrCopies, string outDoc)
    {
      object objMissing = Missing.Value;
      object objFalse = false;
      object confirmConversion = false;
      object link = false;
      object attachment = false;
      try
      {
        //打开模板文件 
        Open(tempDoc);
        foreach (string strCopy in arrCopies)
        {
          objApp.Selection.InsertFile(
          strCopy,
          ref objMissing,
          ref confirmConversion,
          ref link,
          ref attachment
          );
        }
        //保存到输出文件 
        SaveAs(outDoc);
        foreach (Document objDocument in objApp.Documents)
        {
          objDocument.Close(
          ref objFalse, //SaveChanges 
          ref objMissing, //OriginalFormat 
          ref objMissing //RouteDocument 
          );
        }
      }
      finally
      {
        objApp.Quit(
        ref objMissing, //SaveChanges 
        ref objMissing, //OriginalFormat 
        ref objMissing //RoutDocument 
        );
        objApp = null;
      }
    }
    /// <summary> 
    /// 循环合并多个文件(插入合并文件) 
    /// </summary> 
    /// <param name="tempDoc">模板文件</param> 
    /// <param name="arrCopies">需要合并的文件</param> 
    /// <param name="outDoc">合并后的输出文件</param> 
    public void InsertMerge(string tempDoc, string strCopyFolder, string outDoc)
    {
      string[] arrFiles = Directory.GetFiles(strCopyFolder);
      InsertMerge(tempDoc, arrFiles, outDoc);
    }
    #endregion
  }
}

相信本文所述对大家的C#程序设计有一定的借鉴价值。

相关文章

  • 经典的委托排序(深入分析)

    经典的委托排序(深入分析)

    本篇文章是对委托排序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • c#不使用系统api实现可以指定区域屏幕截屏功能

    c#不使用系统api实现可以指定区域屏幕截屏功能

    这篇文章主要介绍了不使用系统API通过纯c#实现屏幕指定区域截屏功能,截屏后还可以保存图象文件,大家参考使用吧
    2014-01-01
  • C#实现Winform无边框移动的方法

    C#实现Winform无边框移动的方法

    这篇文章主要介绍了C#实现Winform无边框移动的方法,涉及C#针对WinForm窗口操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • C#用RabbitMQ实现消息订阅与发布

    C#用RabbitMQ实现消息订阅与发布

    在消息队列模型中,如何将消息广播到所有的消费者,这种模式成为“发布/订阅”。本文主要以一个简单的小例子,简述通过fanout交换机,实现消息的发布与订阅,仅供学习分享使用,如有不足之处,还请指正。
    2021-05-05
  • c# 读取XML文件的示例

    c# 读取XML文件的示例

    这篇文章主要介绍了c# 读取XML文件的示例,帮助大家更好的理解和使用c# 编程语言,感兴趣的朋友可以了解下。
    2020-11-11
  • C#中ArrayList的使用方法

    C#中ArrayList的使用方法

    这篇文章主要介绍了
    2013-12-12
  • WinForm相对路径的陷阱

    WinForm相对路径的陷阱

    这篇文章主要介绍了WinForm相对路径的陷阱,是在进行C#程序设计中尤其需要注意的问题,需要的朋友可以参考下
    2014-08-08
  • C# 使用HttpClient上传文件并附带其他参数的步骤

    C# 使用HttpClient上传文件并附带其他参数的步骤

    这篇文章主要介绍了C# 使用HttpClient上传文件并附带其他参数的步骤,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2020-12-12
  • c#多线程之间的排他锁的实现

    c#多线程之间的排他锁的实现

    我们很多时候会碰到这样的问题,使用多线程刷一个表的数据时需要多个线程不能重复提取数据,那么这个时候就需要使用到线程的排他锁了,本文就详细的介绍一下
    2021-08-08
  • C#异步编程之async/await详解

    C#异步编程之async/await详解

    异步这个概念在不同语境下有不同的解释,不同的编程语言有不同异步编程方法,在C#语言中,常常使用async/await等关键字,和Task等类来实现异步编程。本文就来和大家聊聊async与await吧
    2023-03-03

最新评论