You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中Export-Csv转换Excel日期列变为数字的问题求助

问题描述

我有一个包含3列数据的Excel文件,列名分别为Business_Key、Business_Type、Start_Date,数据示例如下:

  • Business_Key:1000,Business_Type:Service,Start_Date:1/1/2007
  • Business_Key:1001,Business_Type:Other,Start_Date:12/1/2008

使用Import-Excel和Export-Csv转换为CSV后,Start_Date列变成了Excel日期序列号(如39083、39783),而非原日期格式。使用的PowerShell脚本如下:

$ens = Get-ChildItem "Z:\Informatica\IICS\ProjectFolders\Dev\Commerce\CenterIC\" -filter Customer*.xlsx
$OutFile= (Get-ChildItem "Z:\Informatica\IICS\ProjectFolders\Dev\Commerce\CenterIC\Customer*.xlsx").BaseName
foreach($file in $ens)
{
   Import-Excel "Z:\Informatica\IICS\ProjectFolders\Dev\Commerce\CenterIC\$file" -Startrow 13 -HeaderName 'Business_Key','Business_Type','Start_Date' | Select-Object Business_Key,Business_Type,Start_Date | Export-Csv Z:\Informatica\IICS\ProjectFolders\Dev\Commerce\CenterIC\$file.csv -noTypeInformation -Encoding utf8 -UseCulture -verbose}
解决方案

出现这个问题是因为Excel内部用序列号存储日期,而Import-Excel默认可能未将这些序列号解析为DateTime对象,或者Export-Csv输出时未按指定格式转换日期字符串。以下是两种可行的解决方法:

方法1:指定列类型导入,再格式化导出

先通过-ColumnType参数告诉Import-Excel将Start_Date列解析为DateTime类型,然后在导出前将DateTime对象格式化为你需要的日期字符串:

$ens = Get-ChildItem "Z:\Informatica\IICS\ProjectFolders\Dev\Commerce\CenterIC\" -filter Customer*.xlsx
foreach($file in $ens)
{
    Import-Excel $file.FullName -Startrow 13 -HeaderName 'Business_Key','Business_Type','Start_Date' -ColumnType 'Int32', 'String', 'DateTime' |
        Select-Object Business_Key, Business_Type, @{
            Name = 'Start_Date'
            Expression = { $_.Start_Date.ToString('MM/dd/yyyy') } # 可修改为你需要的格式,比如'yyyy-MM-dd'
        } |
        Export-Csv "$($file.FullName).csv" -NoTypeInformation -Encoding utf8 -UseCulture -Verbose
}
  • -ColumnType参数按HeaderName的顺序指定列类型:Business_Key设为Int32,Business_Type设为String,Start_Date设为DateTime,确保日期被正确解析。
  • 通过计算属性将DateTime对象转换为指定格式的字符串,避免Export-Csv使用默认格式或输出序列号。

方法2:手动将序列号转换为日期

如果Import-Excel未能自动解析日期(仍输出序列号),可以直接将数字转换为DateTime对象,再格式化:

$ens = Get-ChildItem "Z:\Informatica\IICS\ProjectFolders\Dev\Commerce\CenterIC\" -filter Customer*.xlsx
foreach($file in $ens)
{
    Import-Excel $file.FullName -Startrow 13 -HeaderName 'Business_Key','Business_Type','Start_Date' |
        Select-Object Business_Key, Business_Type, @{
            Name = 'Start_Date'
            Expression = { 
                # Excel日期序列号基于1900年基准,使用FromOADate转换
                [DateTime]::FromOADate($_.Start_Date).ToString('MM/dd/yyyy') 
            }
        } |
        Export-Csv "$($file.FullName).csv" -NoTypeInformation -Encoding utf8 -UseCulture -Verbose
}
  • [DateTime]::FromOADate()方法可以直接将Excel的日期序列号转换为.NET DateTime对象,再通过ToString()指定输出格式。
注意事项
  • 日期格式字符串可以根据需求修改,比如'yyyy-MM-dd'、'dd/MM/yyyy'等,确保和原Excel格式一致。
  • 脚本中$file.FullName可以直接获取文件的完整路径,避免手动拼接路径时出现错误。

内容的提问来源于stack exchange,提问作者pavan kumar kasaraneni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:44:59