PowerShell转Excel为CSV时日期时间显示为数值的问题求助
解决方案:PowerShell Import-Excel 保留Excel日期时间格式转换为CSV
问题根源
Excel中的日期/时间本质是OLE自动化格式数值(整数部分对应日期,小数部分对应时间),Import-Excel默认读取底层数值而非单元格显示的格式化文本。新供应商的文件未被模块自动识别为日期列,导致直接输出原始数值。
方法一:手动转换数值为指定格式的日期时间
针对已知的日期/时间列,将Excel数值转换为.NET DateTime对象,再格式化为与原Excel一致的字符串:
# 定义文件路径 $excelPath = "C:\共享目录\新供应商文件.xlsx" $csvPath = "C:\共享目录\转换后文件.csv" # 导入并处理数据 $processedData = Import-Excel -Path $excelPath | ForEach-Object { # 转换日期列Datum:从Excel数值转DateTime,格式匹配原Excel的dd/MM/yyyy $_.Datum = [DateTime]::FromOADate($_.Datum).ToString("dd/MM/yyyy") # 转换时间列Tijd:从Excel数值转DateTime,格式匹配原Excel的h:mm:ss tt $_.Tijd = [DateTime]::FromOADate($_.Tijd).ToString("h:mm:ss tt") # 返回处理后的行对象 $_ } # 导出为CSV,保持分号分隔符 $processedData | Export-Csv -Path $csvPath -Delimiter ";" -NoTypeInformation -Encoding UTF8
方法二:直接读取单元格显示的文本
如果希望完全保留Excel中显示的文本内容,可使用-AsText参数指定目标列强制读取为文本:
# 定义文件路径 $excelPath = "C:\共享目录\新供应商文件.xlsx" $csvPath = "C:\共享目录\转换后文件.csv" # 强制读取指定列为Excel显示的文本 $excelData = Import-Excel -Path $excelPath -AsText "Datum", "Tijd" # 导出CSV $excelData | Export-Csv -Path $csvPath -Delimiter ";" -NoTypeInformation -Encoding UTF8
注意事项
- 确保
ImportExcel模块为最新版本,旧版本可能存在列识别问题:Update-Module -Name ImportExcel -Force - 若列名变动,需同步修改代码中的列名(如
Datum/Tijd) - 导出时指定
-Delimiter ";",确保与原文件分隔符一致 - 使用
-Encoding UTF8避免特殊字符乱码
内容的提问来源于stack exchange,提问作者Aad Dijksman
相关产品推荐
相关产品推荐

