在C#中使用Microsoft.Office.Interop.Word合并和拆分Word文档

时间:2013-06-14 23:07:25

标签: c# asp.net ms-word office-interop

我需要将许多Word文件合并到一个文件中,将其发送给一个revisor并将其再次拆分为相同的分隔文件。大约有200个小Word文档。

所以,当我进行合并时,我需要添加任何类型的标记作为参考,以便何时进行拆分。我实际上是在添加一个带有原始文件名的标签,最终的Word文件将是这样的:

  

[c:\ doc \ file1.doc]

     

Lorem ipsum dolor坐下来,念诵adipistur   ELIT。 Duis eget ipsum non est ultricies bibendum ac a sapien。 Etiam   facilisis nunc ut arcu tincidunt,in fermentum ipsum pretium。   Phasellus non viverra orci。 Vestibulum varius vulputate leo quis   发酵。 Phasellus adipiscing diam ultricies odio accumsan,et   dapibus velit dapibus。 Sed eleifend lectus et lacinia facilisis。   Pellentesque eleifend,purus in convallis faucibus,sapien purus   fringilla arcu,volutpat dolor arcu ullamcorper purus。在viverra   magna neque,eget imperdiet urna luctus at。在hac habitasse platea   dictumst。 Praesent aliquam arcu diam,quis fermentum lacus   pellentesque ut。 Aliquam nulla eros,porttitor quis molestie eu,   mollis vel lacus。 Sed nec aliquam libero。 Donec vel congue sapien,sed   dignissim nisl。 Praesent dui nulla,fringilla iaculis lorem id,   lacinia imperdiet odio。

     

[c:\ doc \ file1.doc]

     

[c:\ doc \ file2.doc]

     

Proin eu consectetur turpis,vel sagittis arcu。   Mauris iaculis lacus ut orci adipiscing,vitae eleifend ipsum egestas。   Suspendisse ullamcorper consequat laoreet。 Nullam interdum augue eget   ante tempor porttitor。 Sed dignissim nulla libero,eu ultricies urna   前庭。 Phasellus rhoncus leo sed leo gravida,nec   ullamcorper neque tempor。 Sed sollicitudin,nisi ut lobortis   sollicitudin,dui enim tristique leo,ac sodales leo elit quis odio。   Nulla dictum mattis mi in tempus。

     

[c:\ doc \ file2.doc]

我正在使用此代码合并文件,工作正常:

using System;
using System.Collections.Generic;
using Word = Microsoft.Office.Interop.Word;

namespace MyDocs
{
  public class MsWord
  {
    public static void Merge(List<string> filesToMerge, string outputFilename, string documentTemplate)
    {
      object defaultTemplate = documentTemplate;
      object missing = System.Type.Missing;
      object outputFile = outputFilename;

      // Create  a new Word application
      Word._Application wordApplication = new Word.Application();

      try
      {
        // Create a new file based on our template
        Word._Document wordDocument = wordApplication.Documents.Add(ref defaultTemplate, ref missing, ref missing, ref missing);

        // Make a Word selection object.
        Word.Selection selection = wordApplication.Selection;

        // Loop thru each of the Word documents
        foreach(var file in filesToMerge)
        {
            // create a tag with the file name
            string uid = String.Format("\n[ {0} ]\n", file);

            selection.TypeText(uid);
            selection.InsertFile(file, ref missing, ref missing, ref missing, ref missing);
            selection.TypeText(uid);
        }

        // Save the document to it's output file.
        wordDocument.SaveAs(ref outputFile, 
                            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);

        // Clean up!
        wordDocument = null;
      }
      catch (Exception ex)
      {
        //I didn't include a default error handler so i'm just throwing the error
        throw ex;
      }
      finally
      {
        // Finally, Close our Word application
        wordApplication.Quit(ref missing, ref missing, ref missing);
      }
    }
  }
}

现在我被困了,我现在不怎么分裂,我不理解Interop类,我需要阅读整个Word,找到标签并将其拆分成单独的文件。

我认为标签不是最佳方式,因为我不需要显示它。我尝试使用这样的Section对象:

foreach(var file in filesToMerge)
{
    selection.Sections.Add();
    selection.InsertFile(Environment.CurrentDirectory + @"\" + file, ref missing, ref missing, ref missing, ref missing);
}

在阅读完这样的文件之后:

foreach (Word.Section section in wordDocument.Sections)
{
    // do save stuff                    
}

但现在只返回了2个部分:(

1 个答案:

答案 0 :(得分:2)

在我看来,最好的选择(而不是标签)将是使用书签。书签是:

  1. 容易添加!!类似于Activedocument.bookmarks.add...(基于VBA语法)
  2. 很容易找到(按名称),
  3. 它们可以由for each loop迭代,其中迭代经过bookmark name
  4. 他们有range object property,可让您在文档中找到书签所在的确切位置
  5. 如果需要,可以zero length range
  6. 如果名称以_开头,它们可能是不可见的(下划线标记,只有在以编程方式添加书签时才有效)