用C#来合并WORD文档

本文档介绍了如何使用C#编程将多个修改过的Word文档合并到一起,以供管理员查看和审批。通过创建一个ASP.NET项目,利用Microsoft Word的自动化功能,实现了从文件夹中读取用户上传的文档副本,将它们合并到原始文档中,最终保存为新的合并文档。该方法适用于跟踪用户对文档的修改,方便批量审批。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序代码 

介绍:
在我当前的项目中,客户希望管理者可以在网站上发布文件,客户的文章(不管是改动或添加什么)都可以将改过的版本上传回网站。然后,管理员可以浏览课余关于文章修改的摘要,允许他可以批准或否定。
尽管我开始以为会很难实现,翻了一些资料,发现除了对单词“跟踪变化”这一特性之外,将几个文档合并为一个是可以做到的,这样一个文档里的所有变化都是允许的。当然可以通过VBA来应用该方法;.net也可以实现。
解决方法:


为了做到这些,我用Visual Studio .NET 2003建立了一个C# ASP.NET项目:
在一个外壳里,Default.apsx页面是主页,DocMerger实现了真正的合并操作,是在 "files"文件夹中("OriginalDoc"包含了文件的原始版本,"Copies"保存的是用户上传的文件,"Output"是添加了摘要的文档)。
网站允许每个人下载原始的文档,上传一个修改的版本并建立输出文档。


服务器通过选择"Track Changes"选项发布引入版本,这样用户的每个变化将被轻易识别。
以下是实现代码:


private void btnGo_Click(object sender, System.EventArgs e)
{
 string strBaseDir = Server.MapPath("files/copies");
 string strFileName = Guid.NewGuid().ToString().Replace("{","").Replace("}","");
 upload.PostedFile.SaveAs(Path.Combine(strBaseDir, strFileName + ".doc"));
}
下面是先前的例子,三个用户分别对文档做了改动。
User 1

User 2

User 3

"copies"文件夹里是不同用户上传的拷贝文档


DocMerger类有一个Merge方法,是用来进行文党的合并,我写的是一个文件夹的过载操作而不是文件的列表。
 Collapse   
       

   
    /// <summary>
    /// 用一些复制的文件合并一个文党
    /// </summary>
    /// <param name="strOrgDoc">
    /// 原始文件名
    /// </param>
    /// <param name="arrCopies">
    /// 修改过的文件名
    /// </param>
    /// <param name="strOutDoc">
    /// 结果文件名
    /// </param>
    public void Merge(string strOrgDoc, string[] arrCopies, string strOutDoc)
    {
      ApplicationClass objApp = null;

      //boxing of default values for COM interop purposes
      //为COM组件设初值
      object objMissing = Missing.Value;
      object objFalse = false;
      object objTarget = WdMergeTarget.wdMergeTargetSelected;
      object objUseFormatFrom = WdUseFormattingFrom.wdFormattingFromSelected;

      try
      {
        objApp = new ApplicationClass();
        object objOrgDoc = strOrgDoc;
       
        Document objDocLast = null;
        Document objDocBeforeLast = null;

        objDocLast = objApp.Documents.Open(
          ref objOrgDoc,    //文件名
          ref objMissing,   //确认版本
          ref objMissing,   //只读
          ref objMissing,   //添加到最近的文件
          ref objMissing,   //密码文件
          ref objMissing,   //密码摸板
          ref objMissing,   //回复
          ref objMissing,   //写密码文件
          ref objMissing,   //写密码摸板
          ref objMissing,   //格式
          ref objMissing,   //加密
          ref objMissing,   //可视
          ref objMissing,   //打开并修复
          ref objMissing,   //直接文党
          ref objMissing,   //没加密的对话框
          ref objMissing    //XML传输
          );

        foreach(string strCopy in arrCopies)
        {
          Debug.WriteLine("Merging file " + strCopy);
          objDocLast.Merge(
            strCopy,                //   文件名
            ref objTarget,          //目标合并
            ref objMissing,         //检测格式变化
            ref objUseFormatFrom,   //使用格式表格
            ref objMissing          //添加到最近到文党中
            );
          objDocBeforeLast = objDocLast;
          objDocLast = objApp.ActiveDocument;
          Debug.WriteLine("The active document is " + objDocLast.Name);

          if (objDocBeforeLast != null)
          {
            Debug.WriteLine("Closing " + objDocBeforeLast.Name);
            objDocBeforeLast.Close(
              ref objFalse,     //保存变化
              ref objMissing,   //原始格式
              ref objMissing    //路径文党
              );
          }
           
         
        }

        object objOutDoc = strOutDoc;
     
        objDocLast.SaveAs(   
          ref objOutDoc,      //文件名
          ref objMissing,     //文件格式
          ref objMissing,     //锁定目录
          ref objMissing,     //     密码
          ref objMissing,     //添加到当前文件
          ref objMissing,     //写密码
          ref objMissing,     //推荐只读
          ref objMissing,     //嵌入TRUE类型
          ref objMissing,     //保存本地图片格式
          ref objMissing,     //保存表格数据
          ref objMissing,     //S保存为AOCE
          ref objMissing,     //加密
          ref objMissing,     //插入行结束
          ref objMissing,     //允许替换
          ref objMissing,     //行结束
          ref objMissing      //添加BiDi标签
          );

        foreach(Document objDocument in objApp.Documents)
        {
          objDocument.Close(
            ref objFalse,     //保存变化
            ref objMissing,   //原始格式
            ref objMissing    //路径文党
            );
        }
       
      }
      finally
      {
        objApp.Quit(         
          ref objMissing,     //保存变化
          ref objMissing,     //原始格式
          ref objMissing      //路径文党
          );
        objApp = null;
      }
    }
   
    /// <summary>
    /// 用一些复制的文件合并一个文党
    /// </summary>
    /// <param name="strOrgDoc">
    /// 原始文件名
    /// </param>
    /// <param name="arrCopies">
    /// 修改过的文件名
    /// </param>
    /// <param name="strOutDoc">
    /// 结果文件名
    /// </param>
    public void Merge(string strOrgDoc, string strCopyFolder, string strOutDoc)
    {
      string[] arrFiles = Directory.GetFiles(strCopyFolder);
      Merge(strOrgDoc, arrFiles, strOutDoc);
    }
   

The WebForm invokes this method:

    private void btnMerge_Click(object sender, System.EventArgs e)
    {
      string strOrigFile = Server.MapPath("files/originaldoc/thedocument.doc");
      string strCopiesDir = Server.MapPath("files/copies");
      string strOutputDir = Server.MapPath("files/output/output.doc");
      DocMerger objMerger = new DocMerger();
      objMerger.Merge(strOrigFile, strCopiesDir, strOutputDir);
      lnkResult.NavigateUrl = "files/output/output.doc";
      lnkResult.Visible = true;
    }

最终的输出是一个由所有用户修改过合并的文党:


用这种方式,管理员可以一次性检查所有的修改,批准或否决。
这里的代码包含了所有文章里描述的内容,但你还需要在思想中保留:
我扩展了Office 2003的功能。你必须从新导入Office的类型库(我想应该运行在Office XP,2000甚至97)并从新编译该项目
微软在Office网络自动化方面有不足之处。但是,我做的所有测试是有必要的。可是,如果需要,DocMerger类可以被移植到其它项目中,将主页变成程序界面。
结论:
使用.NET framework的自动化,完成Office进一步的操作是很容易的,并且它允许快速的传输并出色的完成操作。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值