Powershell 从数组中填充单词 table

Powershell populate word table from an array

我有一个 PS 脚本,可以将 csv 导入多个数组,我需要它来填充 word 中的 table。我能够将数据获取到数组中,并使用 header 和正确的行数创建 table,但无法将数组中的数据获取到 table 中。进行大量 google 搜索后,我得到了以下代码。非常感谢任何帮助。

My_File.txt样本 行数会有所不同,但 header 行始终存在。

组件,id,iType,

VCT,AD-1234,故事,

VCT,Ad-4567,DR,

$component = @()
$id = @()
$iType =@()
$vFile = Import-CSV ("H:\My_file.txt")
$word = New-Object -ComObject "Word.Application"

$vFile | ForEach-Object {
$component += $_.components
$id += $_.id
$iType +=_.iType
}

$template = $word.Documents.Open ("H:\Test.docx")

$template = $word.Document.Add()
$word.Visible = $True
$Number_rows = ($vFile.count +1)
$Number_cols = 3

$range = $template.range()
$template.Tables.add($range, $Number_rows, $Number_cols) | out-null

$table = $template.Tables.Item(1)
$table.cell(1,1).Range.Text = "Component"
$table.cell(1,2).Range.Text = "ID"
$table.cell(1,3).Range.text = "Type"

for ($i=0; $i -lt; $vFile.count+2, $i++){
$table.cell(($i+2),1).Range.Text = $component[$i].components
$table.cell(($i+2),2).Range.Text = $id[$i].id
$table.cell(($i+2),3).Range.Text = $iType[$i].iType
}

$Table.Style = "Medium Shading 1 - Accent 1"
$template.SaveAs("H:\New_Doc.docx")

不要将解析后的CSV对象数组中的行分成三个数组,而是保留集合as-is并使用数据直接使用该对象数组的属性填充table .

我冒昧地将你的变量 $vFile 重命名为 $data 至少对我来说这更能描述其中的内容。

尝试

$data = Import-Csv -Path "H:\My_file.txt"
$word = New-Object -ComObject "Word.Application"
$word.Visible = $True

$template = $word.Documents.Open("H:\Test.docx")
$Number_rows = $data.Count +1  # +1 for the header
$Number_cols = 3

$range = $template.Range()
[void]$template.Tables.Add($range, $Number_rows, $Number_cols)

$table = $template.Tables.Item(1)
$table.Style = "Medium Shading 1 - Accent 1"

# write the headers
$table.cell(1,1).Range.Text = "Component"
$table.cell(1,2).Range.Text = "ID"
$table.cell(1,3).Range.text = "Type"

# next, add the data rows
for ($i=0; $i -lt $data.Count; $i++){
    $table.cell(($i+2),1).Range.Text = $data[$i].component
    $table.cell(($i+2),2).Range.Text = $data[$i].id
    $table.cell(($i+2),3).Range.Text = $data[$i].iType
}

$template.SaveAs("H:\New_Doc.docx")

完成后,不要忘记关闭文档,退出 word 并清理使用过的 COM 对象:

$template.Close()
$word.Quit()

$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($template)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($word)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()