首页 > 解决方案 > Powershell 中 MS Word 的范围算术

问题描述

我正在尝试使用 Powershell 自动将新表添加到 Word 文档中。

我编写了一个 Powershell 脚本,用于在适当位置添加基于整个文档的汇总表。它从文件内容中收集信息,然后在选定的范围内创建一个新的汇总表。该表始终插入到范围的末尾(这是文档中的一章)。该范围基于列表标题。但是,在将新表添加到所选范围时,我无法强制 Word 保留下一个被选为范围结尾的标题。它被删除。

例如:我的文件中有从 1.1 到 1.10 的章节,我选择在 1.1 章的末尾添加一个新表格,就在 1.2 章之前。整章 1.2。标题被删除,第 1.3 章现在标记为 1.2。

Range.End我尝试按照 Microsoft 文档 ( https://docs.microsoft.com/en-us/office/vba/api/word.range.end ) 中的信息从属性中减去各种数字,但似乎没有给出任何结果。

代码(快捷方式):

Add-Type -AssemblyName Microsoft.Office.Interop.Word

$word = New-Object -ComObject Word.application
$report = $word.Documents.Open("C:\file.docx")

#information gathering here

#find the right location and add a new table
$start = $report.Paragraphs | ? {$_.Range.ListFormat.ListString -eq '1.1'} | % {$_.Range}
$end = $report.Paragraphs | ? {$_.Range.ListFormat.ListString -eq '1.2'} | % {$_.Range}
$first_table = $report.Range($start.Start, $end.Start).Tables.Add($end, 24, 4, [ref]$DefaultTableBehavior::wdWord9TableBehavior, [ref]$AutoFitBehavior::wdAutoFitFixed)

#continue with filling up the table

标签: powershellms-word

解决方案


部分问题在于,如果您有一系列空的自动编号段落,则将表格插入其中一个将意味着后续段落将放置在表格内。

此外,如果您的 1.1 部分可以包含材料,则 AFAICS 您的 $start 将包含其第一段的范围,这不是很有用 - 您真正需要的只是您要在之前插入的段落的位置。

作为替代方案,我建议您首先在 1.2 标题之前插入段落标记,然后插入表格。

例如像这样:

#$start = $report.Paragraphs | ? {$_.Range.ListFormat.ListString -eq '1.1'} | % {$_.Range}
$end = $report.Paragraphs | ? {$_.Range.ListFormat.ListString -eq '1.2'} | % {$_.Range}
$place = $report.Range($end.Start - 1, $end.Start-1)
$place.InsertParagraph()
$place = $report.Range($end.Start - 1, $end.Start-1)
$first_table = $place.Tables.Add($place, 24, 4, [ref]$DefaultTableBehavior::wdWord9TableBehavior, [ref]$AutoFitBehavior::wdAutoFitFixed)

如果你不想要那个额外的段落标记,你可以删除它,如果你真的想要,你可以使用

$report.Range($end.Start-1, $end.Start).Text = ""

表插入后。


推荐阅读