PowerShell将CSV文件转换成Excel文件


PowerShell可以非常方便的使用Export-Csv来生成 CSV文件,如果你的系统中已经安装了Microsoft Excel,那么你还可以借助Excel将CSV文件转换成后缀名为 XLSX 真正的Excel文件。

下面的示例演示如何通过Get-Process获取一些数据,然后将它输出到CSV文件中。Export-Csv使用了一个选项UseCulture用来确保CSV文件中的分隔符和你当前系统中安装的Excel版本匹配。

$FileName = "$env:temp\Report"

# create some CSV data
Get-Process | Export-Csv -UseCulture -Path "$FileName.csv" -NoTypeInformation -Encoding UTF8

# load into Excel
$excel = New-Object -ComObject Excel.Application 
$excel.Visible = $true
$excel.Workbooks.Open("$FileName.csv").SaveAs("$FileName.xlsx",51)
$excel.Quit()

explorer.exe "/Select,$FileName.xlsx"

接下来,使用Excel打开CSV文件,然后另存为XLSX文件。运行很完美,除非你遇到下面这种异常:

 
PS>  $excel.Workbooks.Open("$FileName.csv")
Exception  calling "Open" with "1" argument(s): "Old format or  invalid type library. (Exception from HRESULT: 0x80028018 
(TYPE_E_INVDATAREAD))"
At line:1 char:1
+  $excel.Workbooks.Open("$FileName.csv")
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [],  MethodInvocationException
    + FullyQualifiedErrorId :  ComMethodTargetInvocation
 

这种问题属于已知的问题,当你的Excel的语言版本和你操作系统的语言版本不一致时,才可能会发生。你可能没注意到你的Windows操作系统使用的是本地化的MUI安装包。

想要尽快回避这个问题,你可以临时将进程的culture设置成你的Excel所期望的culture。

$FileName = "$env:temp\Report"

# create some CSV data
Get-Process | Export-Csv -Path "$FileName.csv" -NoTypeInformation -Encoding UTF8

# load into Excel
$excel = New-Object -ComObject Excel.Application 
$excel.Visible = $true

# change thread culture
[System.Threading.Thread]::CurrentThread.CurrentCulture = 'en-US'

$excel.Workbooks.Open("$FileName.csv").SaveAs("$FileName.xlsx",51)
$excel.Quit()

explorer.exe "/Select,$FileName.xlsx"

这样做也有后遗症,当你在en-US的culture下调用Excel’s的Open方法时,就不再需要使用本地的分隔符了。而是需要一个传统的逗号分隔的文件,这也是为什么我们本文的第二个例子中使用 -UseCulture参数了。

原文链接:Converting CSV to Excel File

×用微信扫描并分享
本文链接: https://www.pstips.net/converting-csv-to-excel-file.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

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