首页 > 解决方案 > 将 XLSX 转换为 CSV(另存为)更改日期格式

问题描述

我看到这种类型的问题被问了很多次,但在 Powershell 中却没有,也找不到答案,所以......

我正在使用以下代码将 XLSX 文件转换为 CSV:

$sheet = "SHEET1"
$xls = "C:\temp\XLSX.xlsx"
$csv = "C:\temp\CSV.csv"
$objExcel = New-Object -ComObject Excel.Application
$objExcel.Visible = $False
$objExcel.DisplayAlerts = $False
$WorkBook = $objExcel.Workbooks.Open($xls)
$WorkSheet = $WorkBook.sheets.item("$Sheet")
$xlCSV = 6
$WorkSheet.SaveAs($csv,$xlCSV)
$objExcel.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($objExcel)

除日期外,该转换工作正常。XLSX 文件包含格式为 dd/MM/yyyy 的日期,但在上述代码将我的工作表保存为 CSV 之后,这些日期最终的格式为 M/d/yyyy。当我导入我的 CSV 并执行脚本的其余部分时,这当然会导致问题。许多日期也变成“不被识别为有效的日期时间”。

我可以在代码中添加一些内容以使这些日期保持相同的格式吗?

标签: powershell

解决方案


省去您的麻烦,并获得ImportExcel 模块,这使得它变得非常容易。另请注意, ImportExcel 模块不需要 Excel 即可运行。这使得它非常适合可能无法安装 Excel 等的服务器端工作。

我刚刚写了一个快速测试电子表格,其中包含如下行

number date
------ ----
     1 8/13/2021
     2 8/14/2021
     3 8/15/2021

转换为 csv 的一行:

Import-Excel C:\temp\TestDates.xlsx | 
Export-Csv C:\temp\TestDates.csv -NoTypeInformation

由于单元格是正确的日期,Import-Excel 命令返回它们并随后将它们导出,如下所示:

number date
------ ----
     1 8/13/2021 12:00:00 AM
     2 8/14/2021 12:00:00 AM
     3 8/15/2021 12:00:00 AM

注意: Import-Csv 不会保留日期输入。您可以在导入时轻松处理它,将其存储为根据需要格式化的字符串。

Import-Excel C:\temp\TestDates.xlsx | 
Select-Object Number,@{Name = 'Date'; Expression = { $_.Date.ToString('mm/dd/yyyy')}} | 
Export-Csv C:\temp\TestDates.csv -NoTypeInformation

根据您的描述,混合物中可能存在一些畸形细胞。[DateTime]::Parse()您可能必须使用或::ParseExact()静态方法检查它们是否可转换为导入日期。


推荐阅读