从用户生成的Word文档中检索构建块

时间:2014-04-14 08:54:08

标签: c# ms-word openxml

我已经远距离搜索了,但我还没有找到合适的解决方案。

首先,这是一个使用.NET 4.0和DevExpress的WinForms应用程序。

我一直试图从Word文档(.docx)或至少用户生成的模板文件(.dotx)中检索用户上传到我的应用程序的构建块(水印,封面等),然后将保存到数据库中。

我必须能够检索该文件中使用的所有构建块。

我尝试了很多不同的方法来检索它们,但我只能从位于以下位置的Built-In Building Blocks.dotx文件中检索它们:

C:\Users\<username>\AppData\Roaming\Microsoft\Document Building Blocks\1033\14\Built-In Building Blocks.dotx

我还没弄明白如何从用户生成的文件中提取它们。

以下是我正在使用的正在进行的代码(许多迭代,因此我可以轻松地对其进行调试):

private void SaveBuildingBlock(string savedFile)
{
  try
  {
    Microsoft.Office.Interop.Word.ApplicationClass wordApplication = null;
    wordApplication = new Microsoft.Office.Interop.Word.ApplicationClass();
    Microsoft.Office.Interop.Word.Document wordDocument = wordApplication.Documents.OpenNoRepairDialog(savedFile);

    object missing = System.Type.Missing;

    Database.ToolbarItemsWordInsertFileData.FileData = FileHandler.FileByteLocked(savedFile);
    Database.ToolbarItemsWordInsertFileData.Id = 0;
    Database.ToolbarItemsWordInsertFileData.ToolbarItemId = ToolbarId;
    Database.ToolbarItemsWordInsertFileData.Save();

    ListBuildingBlocks(wordApplication, wordPage);
  }
  catch (Exception err)
  {
    Logger.Log(err);
  }
}

下一个方法:

private void ListBuildingBlocks(Microsoft.Office.Interop.Word.Application wordApplication, WordPages wordPage)
{
  Microsoft.Office.Interop.Word.WdBuildingBlockTypes type = wordPage == WordPages.CoverPage ? type = Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeCoverPage : type = Microsoft.Office.Interop.Word.WdBuildingBlockTypes.wdTypeWatermarks;
  for (int i = 1; i <= wordApplication.Templates.Count; i++)
  {
    try
    {
      if (wordApplication.Templates[i] != null)
      {
        Microsoft.Office.Interop.Word.Categories categories = wordApplication.Templates[i].BuildingBlockTypes.Item(type).Categories;
        for (int c = 1; c <= categories.Count; c++)
        {
          try
          {
            //Category cat = categories.Application[0];
            Microsoft.Office.Interop.Word.BuildingBlocks buildingBlocks = wordApplication.Templates[i].BuildingBlockTypes.Item(type).Categories.Item(categories.Item(c).Name).BuildingBlocks;
            for (int b = 1; b <= buildingBlocks.Count; b++)
            {
              try
              {
                Microsoft.Office.Interop.Word.BuildingBlock buildingBlock = buildingBlocks.Item(b);
                if (buildingBlock != null)
                {
                  //saving to database occurs here
                }
              }
              catch (Exception err)
              {
                MessageBox.Show(err.Message);
              }
            }
          }
          catch (Exception err)
          {
            MessageBox.Show(err.Message);
          }
        }
      }
    }
    catch (Exception err)
    {
      MessageBox.Show(err.Message);
    }
  }
}

WordPages参数[wordPage]在应用程序中用于指定它是水印还是封面(它是此用户控件中的属性)。

1 个答案:

答案 0 :(得分:0)

您需要将其添加到当前的加载项列表中,然后您可以将其作为模板打开以使用构建块。除了更改附加的模板并以这种方式加载之外,我还没有看到任何其他方式:

    Dim app = Globals.ThisAddIn.Application

    'load the file containing the building blocks
    app.AddIns.Add("\\Path to File.dotx")

    'get the object for the loaded template
    Dim template = app.Templates(app.AddIns.Count)

    'go through each building block in the file
    For I = 1 to template.BuildingBlockEntries.Count
        Dim bb = template.BuildingBlockEntries.Item(i)
    Next

如果你需要沿着xml路径走下去,那么构建块就会存储在word \ glossary \ document.xml中的包中,如果你在这个服务器端做这个可能更容易,那么你就不需要使用word对象模型,只需使用Open Xml SDK,对于这样的事情非常有用!