我在 Visual Studio 2022 中创建了一个 C# MS Word VSTO 插件,它循环遍历文档中的页脚,并将文本框和字段代码注入到不同部分的页脚中。此代码适用于 .docx 文档。但是,对于处于兼容模式的 .doc 文档,
WdHeaderFooterIndex.wdHeaderFooterFirstPage
会被误认为 Word.WdHeaderFooterIndex.wdHeaderFooterPrimary
。因此,当代码请求首页页脚时,程序会将文本框和字段代码插入到主页脚中。这会导致没有内容插入到首页页脚中,并且不会将重复内容插入到主页脚中。
这是代码:
foreach (Word.Section section in activeDoc.Sections)
{
foreach (Word.HeaderFooter footer in section.Footers)
{
activeDoc.PageSetup.DifferentFirstPageHeaderFooter = -1;
// Calculate the width of the page
float pageWidth = activeDoc.PageSetup.PageWidth;
// Calculate the top position for the text box
float textBoxHeight = 24;
float topPosition = activeDoc.PageSetup.PageHeight - textBoxHeight;
// Insert the shape
Word.Shape docIdTextBox = footer.Shapes.AddTextbox(
Office.MsoTextOrientation.msoTextOrientationHorizontal,
0, topPosition, pageWidth, textBoxHeight);
//additional code for formatting the text box/inserting the field code
}
}
我尝试了以下方法但没有成功:
WdHeaderFooterIndex.wdHeaderFooterFirstPage
时,索引被正确识别,内容被错误插入到 Word.WdHeaderFooterIndex.wdHeaderFooterPrimary
if (activeDoc.CompatibilityMode == (int)Word.WdCompatibilityMode.wdWord2003)
识别兼容模式文档,并使用不同的代码语句插入不同的形状、文本等。activeDoc.Sections[1].Footers[Word.WdHeaderFooterIndex.wdHeaderFooterFirstPage].Range;
而不使用循环其他注意事项:
非常感谢所有帮助。
我能够确定是文本框形状(以及一般形状)导致 .doc 兼容模式文档错误识别或跳过
WdHeaderFooterIndex.wdHeaderFooterFirstPage
并将用于该页脚的内容放置在 Word.WdHeaderFooterIndex.wdHeaderFooterPrimary
中。为了解决这个问题,我手动创建了一个包含形状(在我的例子中是文本框)的 MS Word 构建块,并将其放置在自己的模板文件中,该模板文件将在 Word 启动时通过 STARTUP 目录加载。然后,我通过代码将构建块添加到需要内容的页脚(包括第一页页脚)。一旦文本框位于正确页脚的 Range
中,Word 365 就允许我对形状执行所有编程功能,包括循环页脚以查找和操作形状。
这是我的代码:
using Word = Microsoft.Office.Interop.Word;
Word.Document activeDoc = Globals.ThisAddIn.Application.ActiveDocument;
Word.Template bblocksTemplate = Globals.ThisAddIn.Application.Templates[BBlocksTemplatePath];
Word.BuildingBlock textBoxBuildingBlock = bblocksTemplate.BuildingBlockEntries.Item("NameOfBuildingBlock");
textBoxBuildingBlock.Insert(footer.Range, true); //footer was passed into this method
foreach (Word.Shape shape in footer.Range.ShapeRange)
{
if (shape.Type == Office.MsoShapeType.msoTextBox)
{
Word.Range fieldRange = shape.TextFrame.TextRange;
//Add field code, text, formatting, etc.
}
}