如何使用 Powershell 生成包含未知 table 大小和 office-specific 配色方案的电子邮件?
How to generate an email with Powershell containing unknown table sizes with office-specific color schemes?
亲爱的程序员们,
我已经尽力找到解决这个问题的方法,但我最终还是决定创建一个 Whosebug 帐户并寻求帮助。
我想做什么:
1. 从多个来源获取数据输入。
2. 将该数据放入 tables 并将它们格式化为 "Grid Table 5 Dark Accent 5".
3. 在电子邮件中输出那些tables。
我遇到了什么问题:
- 由于每次生成电子邮件时列数和行数都不同,因此似乎不可能将 "Grid Table 5 Dark Accent 5" 应用于所有 table 并且仍然作为电子邮件输出。
到目前为止我做了什么:
1. 我尝试将 css 作为一个整体应用于 table,如果我预先知道所有的列和行,这会起作用,但不幸的是我不知道。我无法实现 TR html 标签,只能实现 TH 和 TD。
2. 我还尝试使用 -CSSUri 参数将 css 应用于每个 html 片段 (= table),但这似乎不允许与片段参数结合使用。
代码
下面的代码是示例结果的样子,但不是在开始时应用简单的 html css,而是应将 "Grid Table 5 Dark Accent 5" 应用到所有 table。
将以下代码片段按顺序复制并粘贴到 Powershell IDE 和 运行 中。将出现一封电子邮件。 "Grid Table 5 Dark Accent 5" 应该应用于所有 table,而不是通用的蓝色。
将通用样式应用于所有 table(应该改为 "Grid Table 5 Dark Accent 5"):
function table_style {
$style = "<head><style>BODY{font-size: 12pt;}";
$style += "TABLE{border: 3px solid black; border-collapse: collapse; overflow-x:auto;}";
$style += "TH{border: 2px solid black; background: #4472C4; padding: 4px; }";
$style += "TD{border: 2px solid black; padding: 7px; }";
$style += "</style></head>";
return $style;
}
创建第一个 table(将从 API 中提取数据):
function Table1_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table1_Column1,([string]);
$col2 = New-Object system.Data.DataColumn Table1_Column2,([string]);
$col3 = New-Object system.Data.DataColumn Table1_Column3,([string]);
$Table.columns.add($col1);
$Table.columns.add($col2);
$Table.columns.add($col3);
$Tablerows = "Table1_Column1_Row2","Table1_Column1_Row3","Table1_Column1_Row4","Table1_Column1_Row5","Table1_Column1_Row6";
foreach ($Row in $Tablerows) {
$row = $Row;
$Table.rows.add($row) | Out-Null;
}
return $Table | Select Table1_Column1, Table1_Column2, Table1_Column3 | ConvertTo-Html -Fragment ;
}
正在创建第二个 table(将从 API 中提取数据):
function Table2_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table2_Column1,([string]);
$col2 = New-Object system.Data.DataColumn Tabl2_Column2,([string]);
$Table.columns.add($col1);
$Table.columns.add($col2);
$Tablerows = "Table2_Column1_Row2","Table2_Column1_Row3","Table2_Column1_Row4";
foreach ($Row in $Tablerows) {
$row = $Row;
$Table.rows.add($row) | Out-Null;
}
return $Table | Select Table2_Column1, Tabl2_Column2 | ConvertTo-Html -Fragment;
}
正在创建第三个 table(将从 API 中提取数据):
function Table3_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table3_Column1,([string]);
$col2 = New-Object system.Data.DataColumn Table3_Column2,([string]);
$col3 = New-Object system.Data.DataColumn Table3_Column3,([string]);
$col4 = New-Object system.Data.DataColumn Table3_Column4,([string]);
$col5 = New-Object system.Data.DataColumn Table3_Column5,([string]);
$col6 = New-Object system.Data.DataColumn Table3_Column6,([string]);
$Table.columns.add($col1);
$Table.columns.add($col2);
$Table.columns.add($col3);
$Table.columns.add($col4);
$Table.columns.add($col5);
$Table.columns.add($col6);
$Tablerows = "Table3_Column1_Row2","Table3_Column1_Row3";
foreach ($Row in $Tablerows) {
$row = $Row;
$Table.rows.add($row) | Out-Null;
}
return $Table | Select Table3_Column1, Table3_Column2, Table3_Column3, Table3_Column4, Table3_Column5, Table3_Column6 | ConvertTo-Html -Fragment;
}
使用来自 API 的数据创建具有未知列和行的第 xth table:
#Create tables
正在生成所有 table 并添加标题:
function generate_Table1 {
$html = insert_heading "THIS IS TABLE 1";
$html += Table1_creation;
return $html;
}
function generate_Table2 {
$html = insert_heading "THIS IS TABLE 2";
$html += Table2_creation;
return $html;
}
function generate_Table3 {
$html = insert_heading "THIS IS TABLE 3";
$html += Table3_creation;
return $html;
}
正在生成电子邮件:
function generate_Email {
$mail = $Outlook.CreateItem(0);
$emailHTML = $(table_style);
$emailHTML += if (!$tables) {
generate_Table1;
generate_Table2;
generate_Table3;
} else {
Write-Host -ForegroundColor Red "Error...";
}
Write-Host -ForegroundColor Green "Generating Email...";
$mail.HTMLBody = "$emailHTML";
$inspector = $mail.GetInspector;
$inspector.Display();
}
generate_Email;
如评论所述,您需要做更多的样式来模仿 Word 中的 "Grid Table 5 Dark Accent 5" table 样式。
由于 Outlook 无法像现代浏览器那样处理 HTML 的呈现,因此代码需要相当多的内联样式定义。
由于 ConvertTo-Html -Fragment
无法做到这一点,您需要手动构建 HTML table。
下面的代码在函数 ConvertTo-HtmlTable
中使用。
它需要一个 System.Data.DataTable
对象或 PSCustomObjects 数组作为参数。
# needed for [System.Web.HttpUtility]::HtmlEncode()
Add-Type -AssemblyName System.Web
function ConvertTo-HtmlTable {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, Position = 0)]
[object]$Table
)
if ($Table -is [System.Data.DataTable]) {
# convert to array of PSCustomObjects
$Table = $Table | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors
}
# manually build the HTML table
$tdFirst = '<td style="background: black; color: white; font-weight: bold;">'
$tdOdd = '<td style="background: #999999;">'
$tdEven = '<td style="background: #CCCCCC;">'
# add the headers row
$headers = @($Table[0].PSObject.Properties | Select -ExpandProperty Name)
$tbl = New-Object -TypeName System.Text.StringBuilder
[void]$tbl.Append('<table><thead><tr>')
foreach ($col in $headers) {
[void]$tbl.Append("<th>$col</th>")
}
[void]$tbl.Append('</tr></thead><tbody>')
# next add the data rows
$row = 0
$Table | ForEach-Object {
[void]$tbl.AppendLine('<tr>')
for ($col = 0; $col -lt $headers.Count; $col++) {
[string]$val =$_.$($headers[$col])
$td = if ($col -eq 0) { $tdFirst } elseif ($row -band 1) { $tdOdd } else { $tdEven }
[void]$tbl.Append($td)
$data = if ([string]::IsNullOrWhiteSpace($val)) { ' ' } else { [System.Web.HttpUtility]::HtmlEncode($val) }
[void]$tbl.AppendLine("$data</td>")
}
[void]$tbl.AppendLine('</tr>')
$row++
}
[void]$tbl.Append('</tbody></table>')
return $tbl.ToString()
}
既然我们已经有了这个函数,您就可以像这样在 TableX_creation
函数中使用它:
function Table1_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table1_Column1,([string])
$col2 = New-Object system.Data.DataColumn Table1_Column2,([string])
$col3 = New-Object system.Data.DataColumn Table1_Column3,([string])
$Table.columns.add($col1)
$Table.columns.add($col2)
$Table.columns.add($col3)
$Tablerows = "Table1_Column1_Row2","Table1_Column1_Row3","Table1_Column1_Row4","Table1_Column1_Row5","Table1_Column1_Row6"
foreach ($row in $Tablerows) {
$Table.Rows.Add($row) | Out-Null
}
$result = ConvertTo-HtmlTable $Table
$Table.Dispose()
return $result
}
function Table2_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table2_Column1,([string])
$col2 = New-Object system.Data.DataColumn Tabl2_Column2,([string])
$Table.columns.add($col1)
$Table.columns.add($col2)
$Tablerows = "Table2_Column1_Row2","Table2_Column1_Row3","Table2_Column1_Row4"
foreach ($Row in $Tablerows) {
$Table.Rows.Add($row) | Out-Null
}
$result = ConvertTo-HtmlTable $Table
$Table.Dispose()
return $result
}
function Table3_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table3_Column1,([string])
$col2 = New-Object system.Data.DataColumn Table3_Column2,([string])
$col3 = New-Object system.Data.DataColumn Table3_Column3,([string])
$col4 = New-Object system.Data.DataColumn Table3_Column4,([string])
$col5 = New-Object system.Data.DataColumn Table3_Column5,([string])
$col6 = New-Object system.Data.DataColumn Table3_Column6,([string])
$Table.columns.add($col1)
$Table.columns.add($col2)
$Table.columns.add($col3)
$Table.columns.add($col4)
$Table.columns.add($col5)
$Table.columns.add($col6)
$Tablerows = "Table3_Column1_Row2","Table3_Column1_Row3"
foreach ($Row in $Tablerows) {
$Table.Rows.Add($row) | Out-Null
}
$result = ConvertTo-HtmlTable $Table
$Table.Dispose()
return $result
}
接下来,我做了一个函数将所有这些 HTML 片段放在一起:
function Generate_Html {
Write-Host -ForegroundColor Green "Generating Email Body..."
# main style settings mimicing "Grid Table 5 Dark Accent 5"
$style = @'
<head>
<style>
BODY { font-size: 12pt; font-family: calibri, Arial, Helvetica, sans-serif; }
TABLE { font-size: 11pt; font-family: calibri, Arial, Helvetica, sans-serif;
border: 0.5px solid white; border-collapse: collapse; overflow-x:auto; color: white; width: auto; }
TH { border: none;background: black; padding: 0 8px 0 8px; font-weight: bold; text-align: left; }
TD { border: 0.5px solid white; padding: 0 8px 0 8px; color: black; text-align: left; }
</style>
</head>
'@
$sb = New-Object -TypeName System.Text.StringBuilder
[void]$sb.AppendLine("<html>")
[void]$sb.AppendLine($style)
[void]$sb.AppendLine("<body>")
if (!$tables) {
[void]$sb.AppendLine('<h3>THIS IS TABLE 1</h3>')
[void]$sb.AppendLine((Table1_creation))
[void]$sb.AppendLine('<h3>THIS IS TABLE 2</h3>')
[void]$sb.AppendLine((Table2_creation))
[void]$sb.AppendLine('<h3>THIS IS TABLE 3</h3>')
[void]$sb.AppendLine((Table3_creation))
}
else {
Write-Host -ForegroundColor Red "Error...";
}
[void]$sb.AppendLine("</body></html>")
return $sb.ToString()
}
所以最后你像这样做你的 Outlook:
# I'm guessing you create your `$Outlook` variable sort of like below
if(([System.Diagnostics.Process]::GetProcessesByName("OUTLOOK")).length -gt 0){
$Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
}
else {
$Outlook = New-Object -comObject Outlook.Application
}
$mail = $Outlook.CreateItem(0)
$mail.HTMLBody = Generate_Html
$inspector = $mail.GetInspector
$inspector.Display()
最终结果应该是这样的
另一种方法是将html转换为XmlDocument,然后添加样式属性。
通过使用 XPath,您可以有效地赋予它样式。
filter Add-InlineStyle {
$doc = [xml]$_
# body
$doc.SelectNodes("//body").SetAttribute("style", "font-size: 12pt")
# tables
$doc.SelectNodes("//table").SetAttribute("style", "font-size: 11pt; border: 2px solid black; border-collapse: collapse; overflow-x: auto")
# column headers
$doc.SelectNodes("//th").SetAttribute("style", "border: 0.5px solid white; text-align: center; padding: 0px 5px; font-weight: bold; color: white; background: black")
# row headers
$doc.SelectNodes("//td[1]").SetAttribute("style", "border: 0.5px solid white; text-align: center; padding: 0px 5px; font-weight: bold; color: white; background: black")
# even rows
$doc.SelectNodes("//tr[position() mod 2 = 0]/td[position() != 1]").SetAttribute("style", "border: 0.5px solid white; text-align: right; padding: 0px 5px; background: #CCCCCC")
# odd rows
$doc.SelectNodes("//tr[position() mod 2 = 1]/td[position() != 1]").SetAttribute("style", "border: 0.5px solid white; text-align: right; padding: 0px 5px; background: #999999")
$doc.OuterXml;
}
用法如下
$data1 = @"
Table1,Column1,Column2
Row1,1,2
Row2,3,4
Row3,5,6
Row4,7,8
Row5,9,10
"@
$data2 = @"
Table2,Column1
Row1,1
Row2,2
Row3,3
"@
$data3 = @"
Table3,Column1,Column2,Column3,Column4,Column5
Row1,1,2,3,4,5
Row2,6,7,8,9,10
"@
$html = @(
"<html><body>"
"This is table1"
$data1 | ConvertFrom-Csv | ConvertTo-Html -Fragment
"This is table2"
$data2 | ConvertFrom-Csv | ConvertTo-Html -Fragment
"This is table3"
$data3 | ConvertFrom-Csv | ConvertTo-Html -Fragment
"</body></html>"
) | Out-String | Add-InlineStyle
亲爱的程序员们,
我已经尽力找到解决这个问题的方法,但我最终还是决定创建一个 Whosebug 帐户并寻求帮助。
我想做什么:
1. 从多个来源获取数据输入。
2. 将该数据放入 tables 并将它们格式化为 "Grid Table 5 Dark Accent 5".
3. 在电子邮件中输出那些tables。
我遇到了什么问题:
- 由于每次生成电子邮件时列数和行数都不同,因此似乎不可能将 "Grid Table 5 Dark Accent 5" 应用于所有 table 并且仍然作为电子邮件输出。
到目前为止我做了什么:
1. 我尝试将 css 作为一个整体应用于 table,如果我预先知道所有的列和行,这会起作用,但不幸的是我不知道。我无法实现 TR html 标签,只能实现 TH 和 TD。
2. 我还尝试使用 -CSSUri 参数将 css 应用于每个 html 片段 (= table),但这似乎不允许与片段参数结合使用。
代码
下面的代码是示例结果的样子,但不是在开始时应用简单的 html css,而是应将 "Grid Table 5 Dark Accent 5" 应用到所有 table。
将以下代码片段按顺序复制并粘贴到 Powershell IDE 和 运行 中。将出现一封电子邮件。 "Grid Table 5 Dark Accent 5" 应该应用于所有 table,而不是通用的蓝色。
将通用样式应用于所有 table(应该改为 "Grid Table 5 Dark Accent 5"):
function table_style {
$style = "<head><style>BODY{font-size: 12pt;}";
$style += "TABLE{border: 3px solid black; border-collapse: collapse; overflow-x:auto;}";
$style += "TH{border: 2px solid black; background: #4472C4; padding: 4px; }";
$style += "TD{border: 2px solid black; padding: 7px; }";
$style += "</style></head>";
return $style;
}
创建第一个 table(将从 API 中提取数据):
function Table1_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table1_Column1,([string]);
$col2 = New-Object system.Data.DataColumn Table1_Column2,([string]);
$col3 = New-Object system.Data.DataColumn Table1_Column3,([string]);
$Table.columns.add($col1);
$Table.columns.add($col2);
$Table.columns.add($col3);
$Tablerows = "Table1_Column1_Row2","Table1_Column1_Row3","Table1_Column1_Row4","Table1_Column1_Row5","Table1_Column1_Row6";
foreach ($Row in $Tablerows) {
$row = $Row;
$Table.rows.add($row) | Out-Null;
}
return $Table | Select Table1_Column1, Table1_Column2, Table1_Column3 | ConvertTo-Html -Fragment ;
}
正在创建第二个 table(将从 API 中提取数据):
function Table2_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table2_Column1,([string]);
$col2 = New-Object system.Data.DataColumn Tabl2_Column2,([string]);
$Table.columns.add($col1);
$Table.columns.add($col2);
$Tablerows = "Table2_Column1_Row2","Table2_Column1_Row3","Table2_Column1_Row4";
foreach ($Row in $Tablerows) {
$row = $Row;
$Table.rows.add($row) | Out-Null;
}
return $Table | Select Table2_Column1, Tabl2_Column2 | ConvertTo-Html -Fragment;
}
正在创建第三个 table(将从 API 中提取数据):
function Table3_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table3_Column1,([string]);
$col2 = New-Object system.Data.DataColumn Table3_Column2,([string]);
$col3 = New-Object system.Data.DataColumn Table3_Column3,([string]);
$col4 = New-Object system.Data.DataColumn Table3_Column4,([string]);
$col5 = New-Object system.Data.DataColumn Table3_Column5,([string]);
$col6 = New-Object system.Data.DataColumn Table3_Column6,([string]);
$Table.columns.add($col1);
$Table.columns.add($col2);
$Table.columns.add($col3);
$Table.columns.add($col4);
$Table.columns.add($col5);
$Table.columns.add($col6);
$Tablerows = "Table3_Column1_Row2","Table3_Column1_Row3";
foreach ($Row in $Tablerows) {
$row = $Row;
$Table.rows.add($row) | Out-Null;
}
return $Table | Select Table3_Column1, Table3_Column2, Table3_Column3, Table3_Column4, Table3_Column5, Table3_Column6 | ConvertTo-Html -Fragment;
}
使用来自 API 的数据创建具有未知列和行的第 xth table:
#Create tables
正在生成所有 table 并添加标题:
function generate_Table1 {
$html = insert_heading "THIS IS TABLE 1";
$html += Table1_creation;
return $html;
}
function generate_Table2 {
$html = insert_heading "THIS IS TABLE 2";
$html += Table2_creation;
return $html;
}
function generate_Table3 {
$html = insert_heading "THIS IS TABLE 3";
$html += Table3_creation;
return $html;
}
正在生成电子邮件:
function generate_Email {
$mail = $Outlook.CreateItem(0);
$emailHTML = $(table_style);
$emailHTML += if (!$tables) {
generate_Table1;
generate_Table2;
generate_Table3;
} else {
Write-Host -ForegroundColor Red "Error...";
}
Write-Host -ForegroundColor Green "Generating Email...";
$mail.HTMLBody = "$emailHTML";
$inspector = $mail.GetInspector;
$inspector.Display();
}
generate_Email;
如评论所述,您需要做更多的样式来模仿 Word 中的 "Grid Table 5 Dark Accent 5" table 样式。 由于 Outlook 无法像现代浏览器那样处理 HTML 的呈现,因此代码需要相当多的内联样式定义。
由于 ConvertTo-Html -Fragment
无法做到这一点,您需要手动构建 HTML table。
下面的代码在函数 ConvertTo-HtmlTable
中使用。
它需要一个 System.Data.DataTable
对象或 PSCustomObjects 数组作为参数。
# needed for [System.Web.HttpUtility]::HtmlEncode()
Add-Type -AssemblyName System.Web
function ConvertTo-HtmlTable {
[CmdletBinding()]
param(
[Parameter(Mandatory = $true, Position = 0)]
[object]$Table
)
if ($Table -is [System.Data.DataTable]) {
# convert to array of PSCustomObjects
$Table = $Table | Select-Object * -ExcludeProperty ItemArray, Table, RowError, RowState, HasErrors
}
# manually build the HTML table
$tdFirst = '<td style="background: black; color: white; font-weight: bold;">'
$tdOdd = '<td style="background: #999999;">'
$tdEven = '<td style="background: #CCCCCC;">'
# add the headers row
$headers = @($Table[0].PSObject.Properties | Select -ExpandProperty Name)
$tbl = New-Object -TypeName System.Text.StringBuilder
[void]$tbl.Append('<table><thead><tr>')
foreach ($col in $headers) {
[void]$tbl.Append("<th>$col</th>")
}
[void]$tbl.Append('</tr></thead><tbody>')
# next add the data rows
$row = 0
$Table | ForEach-Object {
[void]$tbl.AppendLine('<tr>')
for ($col = 0; $col -lt $headers.Count; $col++) {
[string]$val =$_.$($headers[$col])
$td = if ($col -eq 0) { $tdFirst } elseif ($row -band 1) { $tdOdd } else { $tdEven }
[void]$tbl.Append($td)
$data = if ([string]::IsNullOrWhiteSpace($val)) { ' ' } else { [System.Web.HttpUtility]::HtmlEncode($val) }
[void]$tbl.AppendLine("$data</td>")
}
[void]$tbl.AppendLine('</tr>')
$row++
}
[void]$tbl.Append('</tbody></table>')
return $tbl.ToString()
}
既然我们已经有了这个函数,您就可以像这样在 TableX_creation
函数中使用它:
function Table1_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table1_Column1,([string])
$col2 = New-Object system.Data.DataColumn Table1_Column2,([string])
$col3 = New-Object system.Data.DataColumn Table1_Column3,([string])
$Table.columns.add($col1)
$Table.columns.add($col2)
$Table.columns.add($col3)
$Tablerows = "Table1_Column1_Row2","Table1_Column1_Row3","Table1_Column1_Row4","Table1_Column1_Row5","Table1_Column1_Row6"
foreach ($row in $Tablerows) {
$Table.Rows.Add($row) | Out-Null
}
$result = ConvertTo-HtmlTable $Table
$Table.Dispose()
return $result
}
function Table2_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table2_Column1,([string])
$col2 = New-Object system.Data.DataColumn Tabl2_Column2,([string])
$Table.columns.add($col1)
$Table.columns.add($col2)
$Tablerows = "Table2_Column1_Row2","Table2_Column1_Row3","Table2_Column1_Row4"
foreach ($Row in $Tablerows) {
$Table.Rows.Add($row) | Out-Null
}
$result = ConvertTo-HtmlTable $Table
$Table.Dispose()
return $result
}
function Table3_creation {
$Table = New-Object System.Data.DataTable
$col1 = New-Object system.Data.DataColumn Table3_Column1,([string])
$col2 = New-Object system.Data.DataColumn Table3_Column2,([string])
$col3 = New-Object system.Data.DataColumn Table3_Column3,([string])
$col4 = New-Object system.Data.DataColumn Table3_Column4,([string])
$col5 = New-Object system.Data.DataColumn Table3_Column5,([string])
$col6 = New-Object system.Data.DataColumn Table3_Column6,([string])
$Table.columns.add($col1)
$Table.columns.add($col2)
$Table.columns.add($col3)
$Table.columns.add($col4)
$Table.columns.add($col5)
$Table.columns.add($col6)
$Tablerows = "Table3_Column1_Row2","Table3_Column1_Row3"
foreach ($Row in $Tablerows) {
$Table.Rows.Add($row) | Out-Null
}
$result = ConvertTo-HtmlTable $Table
$Table.Dispose()
return $result
}
接下来,我做了一个函数将所有这些 HTML 片段放在一起:
function Generate_Html {
Write-Host -ForegroundColor Green "Generating Email Body..."
# main style settings mimicing "Grid Table 5 Dark Accent 5"
$style = @'
<head>
<style>
BODY { font-size: 12pt; font-family: calibri, Arial, Helvetica, sans-serif; }
TABLE { font-size: 11pt; font-family: calibri, Arial, Helvetica, sans-serif;
border: 0.5px solid white; border-collapse: collapse; overflow-x:auto; color: white; width: auto; }
TH { border: none;background: black; padding: 0 8px 0 8px; font-weight: bold; text-align: left; }
TD { border: 0.5px solid white; padding: 0 8px 0 8px; color: black; text-align: left; }
</style>
</head>
'@
$sb = New-Object -TypeName System.Text.StringBuilder
[void]$sb.AppendLine("<html>")
[void]$sb.AppendLine($style)
[void]$sb.AppendLine("<body>")
if (!$tables) {
[void]$sb.AppendLine('<h3>THIS IS TABLE 1</h3>')
[void]$sb.AppendLine((Table1_creation))
[void]$sb.AppendLine('<h3>THIS IS TABLE 2</h3>')
[void]$sb.AppendLine((Table2_creation))
[void]$sb.AppendLine('<h3>THIS IS TABLE 3</h3>')
[void]$sb.AppendLine((Table3_creation))
}
else {
Write-Host -ForegroundColor Red "Error...";
}
[void]$sb.AppendLine("</body></html>")
return $sb.ToString()
}
所以最后你像这样做你的 Outlook:
# I'm guessing you create your `$Outlook` variable sort of like below
if(([System.Diagnostics.Process]::GetProcessesByName("OUTLOOK")).length -gt 0){
$Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
}
else {
$Outlook = New-Object -comObject Outlook.Application
}
$mail = $Outlook.CreateItem(0)
$mail.HTMLBody = Generate_Html
$inspector = $mail.GetInspector
$inspector.Display()
最终结果应该是这样的
另一种方法是将html转换为XmlDocument,然后添加样式属性。 通过使用 XPath,您可以有效地赋予它样式。
filter Add-InlineStyle {
$doc = [xml]$_
# body
$doc.SelectNodes("//body").SetAttribute("style", "font-size: 12pt")
# tables
$doc.SelectNodes("//table").SetAttribute("style", "font-size: 11pt; border: 2px solid black; border-collapse: collapse; overflow-x: auto")
# column headers
$doc.SelectNodes("//th").SetAttribute("style", "border: 0.5px solid white; text-align: center; padding: 0px 5px; font-weight: bold; color: white; background: black")
# row headers
$doc.SelectNodes("//td[1]").SetAttribute("style", "border: 0.5px solid white; text-align: center; padding: 0px 5px; font-weight: bold; color: white; background: black")
# even rows
$doc.SelectNodes("//tr[position() mod 2 = 0]/td[position() != 1]").SetAttribute("style", "border: 0.5px solid white; text-align: right; padding: 0px 5px; background: #CCCCCC")
# odd rows
$doc.SelectNodes("//tr[position() mod 2 = 1]/td[position() != 1]").SetAttribute("style", "border: 0.5px solid white; text-align: right; padding: 0px 5px; background: #999999")
$doc.OuterXml;
}
用法如下
$data1 = @"
Table1,Column1,Column2
Row1,1,2
Row2,3,4
Row3,5,6
Row4,7,8
Row5,9,10
"@
$data2 = @"
Table2,Column1
Row1,1
Row2,2
Row3,3
"@
$data3 = @"
Table3,Column1,Column2,Column3,Column4,Column5
Row1,1,2,3,4,5
Row2,6,7,8,9,10
"@
$html = @(
"<html><body>"
"This is table1"
$data1 | ConvertFrom-Csv | ConvertTo-Html -Fragment
"This is table2"
$data2 | ConvertFrom-Csv | ConvertTo-Html -Fragment
"This is table3"
$data3 | ConvertFrom-Csv | ConvertTo-Html -Fragment
"</body></html>"
) | Out-String | Add-InlineStyle