修复了数组的显示方式后

Powershell修复Excel报表的显示格式


当你把数据发送到Microsoft Excel时,它会使用.NET中内置ToString()方法,将对象转换成文本格式。这种方法通常在转换数组或者其它非基本数据类型时不给力。

下面的例子会说明这个问题。它会将最新的10条事件日志中的错误事件生成一个报表。

$Path = "$env:temp\$(Get-Random).csv"

Get-EventLog -LogName System -EntryType Error -Newest 10 | 
  Select-Object EventID, MachineName, Data, Message, Source, ReplacementStrings, InstanceId, TimeGenerated |
  Export-Csv -Path $Path -Encoding UTF8 -NoTypeInformation -UseCulture

Invoke-Item -Path $Path
数组的ToString方法形同虚设

数组的ToString方法形同虚设

其中自定义的“Data”和 “ReplacementStrings” 没什么用,由于这两个属性的类型都是数组,自动转换只是简单地显示成类型名称,这个现象经常发生在对象数据转换成的EXCEL报表中。

要改善这个报表,你可以使用PowerShell引擎显示地将对象转换成文本,然后将多行文本合并成单行文本。

针对任何显示不正常的列都可以使用这个方法来处理。下面我们改善前面的例子中的报表,对Message、Data和ReplacementStrings这几个列开个小灶:

$Path = "$env:temp\$(Get-Random).csv"

Get-EventLog -LogName System -EntryType Error -Newest 10 | 
  Select-Object EventID, MachineName, Data, Message, Source, ReplacementStrings, InstanceId, TimeGenerated |
  ForEach-Object {
    $_.Message = ($_.Message | Out-String -Stream) -join ' '
    $_.Data = ($_.Data | Out-String -Stream) -join ', '
    $_.ReplacementStrings = ($_.ReplacementStrings | Out-String -Stream) -join ', '

    $_
  } |
  Export-Csv -Path $Path -Encoding UTF8 -NoTypeInformation -UseCulture

Invoke-Item -Path $Path 
修复了数组的显示方式后

修复了数组的显示方式后

现在所有的列都显示正常了。注意,这些问题列先被发送给Out-String(使用PowerShell的内部机制将数据转换成有意义的文本),然后-join负责将信息转换成单行文本。

还有一点要注意啦,Message列是怎么处理的。这一列看起来似乎无需处理,事实上它是多行文本。多行文本默认在Excel中只显示第一行,然后追加省略号。在使用了空格Join后,Excel就会显示完整信息了。

荔非苔注:个人觉得这篇实用性非常强,就稍微把本文重新编辑了下,再加了两张图片。

原文地址:Fixing Display in Excel Reports

本文链接: https://www.pstips.net/fixing-display-in-excel-reports.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注