我已经远距离搜索了,但我还没有找到合适的解决方案。
首先,这是一个使用.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]在应用程序中用于指定它是水印还是封面(它是此用户控件中的属性)。
答案 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,对于这样的事情非常有用!