我正在尝试在 vb.net 中以编程方式创建一个 Word 文档页脚,它有 3 行或更多行,具有 3 种不同的字体颜色和字体样式。我似乎只能让第一个颜色和款式“粘住”其他两个永远不会改变。 我正在使用 Microsoft.Office.Interop.Word,并且对使用它进行编码还很陌生。我宁愿不使用宏。
页脚不应在第一页上可见。第二页应仅包含 2 行,所有其他页将包含全部 3 行。第三行将包含页码,格式为(页码 X,共 XX)。
这是我到目前为止所拥有的:
For Each section As Word.Section In moApp.Sections
Dim footer As Microsoft.Office.Interop.Word.HeaderFooter = section.Footers(Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary)
Dim footerRange As Word.Range = section.Footers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Range
footerRange.Font.ColorIndex = Word.WdColorIndex.wdGray50
footerRange.Font.Size = 12
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 1"
footerRange.Font.ColorIndex = Word.WdColorIndex.wdBlue
footerRange.Font.Size = 10
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 2"
footerRange.Font.ColorIndex = Word.WdColorIndex.wdRed
footerRange.Font.Size = 8
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 3 that will include the page numbers"
Next
当我运行此命令时,我的结果会在页脚中显示具有相同字体和样式的所有 3 行。我需要 3 个不同的。如有任何帮助,我们将不胜感激!
您的问题是您正在为属性分配值,然后用其他值覆盖它们,导致仅显示最后写入的值。
这是一个更简单的例子:
Dim x As Integer = 0
x = 1
x = 2
尽管分配给 x 的所有其他值,只有最后一个分配的值(
x = 2
)会对最终值产生影响。这三行运行后,x
将始终是2
,因为这是最后分配的值。仅仅因为您可能多次运行这些行并不会改变这一点。
因此,为了回到您的问题,我将把
For Each
循环内部的一部分细分为三个部分:
footerRange.Font.ColorIndex = Word.WdColorIndex.wdGray50
footerRange.Font.Size = 12
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 1"
footerRange.Font.ColorIndex = Word.WdColorIndex.wdBlue
footerRange.Font.Size = 10
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 2"
footerRange.Font.ColorIndex = Word.WdColorIndex.wdRed
footerRange.Font.Size = 8
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 3 that will include the page numbers"
这些部分按照它们的排序顺序连续运行。因此,与前面的示例类似,每个部分都会分配一个值,然后分配第二个值,然后分配第三个值是它结尾的值。因此,这三个部分的组合结果与没有前两个部分的最后一个部分的结果相同:
footerRange.Font.ColorIndex = Word.WdColorIndex.wdRed
footerRange.Font.Size = 8
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 3 that will include the page numbers"
我猜你想做的就是这样的事情:
Dim sectionIdx As Integer = 0
For Each section As Word.Section In moApp.Sections
Dim footer As Microsoft.Office.Interop.Word.HeaderFooter = section.Footers(Microsoft.Office.Interop.Word.WdHeaderFooterIndex.wdHeaderFooterPrimary)
Dim footerRange As Word.Range = section.Footers(Word.WdHeaderFooterIndex.wdHeaderFooterPrimary).Range
If sectionIdx = 0 Then
footerRange.Font.ColorIndex = Word.WdColorIndex.wdGray50
footerRange.Font.Size = 12
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 1"
ElseIf sectionIdx = 1 Then
footerRange.Font.ColorIndex = Word.WdColorIndex.wdBlue
footerRange.Font.Size = 10
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 2"
ElseIf sectionIdx = 2 Then
footerRange.Font.ColorIndex = Word.WdColorIndex.wdRed
footerRange.Font.Size = 8
footerRange.Font.Name = "Calibri"
footerRange.Text = "This is Line # 3 that will include the page numbers"
End If
sectionIdx += 1
Next
我多年来没有测试过 VB.NET,也没有使用过 VB.NET,所以这只是我的猜测。上述内容可能会或可能不会按预期工作。但是,即使没有,它也不会导致您的代码无法工作的原因无效,这一点我更加确定,所以即使没有,您也可以根据给定的情况自行找到解决方案我给你的都是正确的。
哦,请记住,即使它确实按预期运行,上面的代码也仅适用于
For Each
循环的前三个迭代,因此您可能需要直接使用 sectionIdx
进行一些字符串连接如果你想能够完成所有页面。我只让它只做前三个,因为这就是你原来的代码似乎想要做的。
编码快乐!
(记得点赞并接受答案来解决您的问题!:))