PowerShell中CSV转Excel时如何保留UTF-8特殊字符?
解决PowerShell导出UTF-8 CSV转Excel时特殊字符乱码问题
你的核心问题在于Excel COM对象的Workbooks.Open方法不会自动识别UTF-8编码,而手动通过「数据→自文本」导入时可以指定编码,只需改用OpenText方法模拟手动导入逻辑即可解决。
修正后的代码
$sqlresults = Invoke-Sqlcmd -serverinstance $AppServerInstance -Database $databaseName -ApplicationIntent "ReadOnly" -Credential $Cred -InputFile $inputFile -Variable $dateValues -Verbose $sqlresults | Export-Csv -path $temporaryCsvFile -Encoding UTF8 -noTypeInformation # Export to CSV temporarily $excelObject = New-Object -comObject Excel.Application $excelObject.Visible = $false # 使用OpenText替代Open,明确指定UTF-8编码和CSV格式规则 $excelObject.Workbooks.OpenText( $temporaryCsvFile, [Microsoft.Office.Interop.Excel.XlPlatform]::xlWindows, 1, # 起始行 [Microsoft.Office.Interop.Excel.XlTextParsingType]::xlDelimited, [Microsoft.Office.Interop.Excel.XlTextQualifier]::xlTextQualifierDoubleQuote, $false, # 连续分隔符视为一个 $false, # Tab分隔符 $false, # 分号分隔符 $true, # 逗号分隔符(CSV默认) $false, # 空格分隔符 $false, # 其他分隔符 65001 # UTF-8编码对应的代码值 ) $workbookObject = $excelObject.ActiveWorkbook # 可选:保存为正式Excel文件并清理COM对象 $workbookObject.SaveAs("C:\目标路径\最终文件.xlsx", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlOpenXMLWorkbook) $workbookObject.Close() $excelObject.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($workbookObject) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excelObject) | Out-Null [System.GC]::Collect() [System.GC]::WaitForPendingFinalizers()
关键说明
- 编码指定:
65001是Excel中UTF-8编码对应的标识值,手动导入时选择的「UTF-8」选项本质就是指定这个编码。 - CSV格式匹配:通过参数明确设置逗号为分隔符、双引号为文本限定符,和
Export-Csv生成的CSV格式完全对应,避免解析错误。 - COM对象清理:必须手动释放Excel相关的COM对象,否则会导致Excel进程在后台残留,占用系统资源。
额外注意
如果使用PowerShell 6及以上版本,导出CSV时建议使用-Encoding UTF8BOM代替UTF8,因为无BOM的UTF-8文件在部分Excel版本中依然可能无法被正确识别;PowerShell 5中的-Encoding UTF8默认会添加BOM,无需额外调整。
内容的提问来源于stack exchange,提问作者user2574948
相关产品推荐
相关产品推荐

