如何用PowerShell将XLSX文件转为带双引号的CSV文件
解决XLSX转CSV时所有值加双引号的问题
你当前使用的Excel COM对象SaveAs方法(格式代码62),只会给包含逗号、换行等特殊字符的字段自动添加双引号,无法实现所有值都带引号的需求。以下提供两种可行的解决方法:
方法一:使用ImportExcel模块(推荐)
这个PowerShell模块专门处理Excel文件,导出CSV时可以直接指定强制给所有字段加引号,操作更简洁且无需处理COM对象残留问题。
# 首次运行需安装模块(执行一次即可) # Install-Module -Name ImportExcel -Scope CurrentUser -Force Function ExcelToCsvWithQuotes ($File) { $myDir = "C:\temp\" $excelFile = Join-Path $myDir "$File.xlsx" $csvFile = Join-Path $myDir "$File.csv" # 读取Excel并导出所有字段带双引号的CSV Import-Excel -Path $excelFile | Export-Csv -Path $csvFile -NoTypeInformation -UseQuotes Always } $FileName = "test_file" ExcelToCsvWithQuotes -File $FileName
方法二:原生PowerShell手动处理(无需额外模块)
如果不想安装第三方模块,可以遍历Excel的每个单元格,手动给值添加双引号后拼接成CSV内容:
Function ExcelToCsvWithQuotes ($File) { $myDir = "C:\temp\" $excelFile = Join-Path $myDir "$File.xlsx" $csvFile = Join-Path $myDir "$File.csv" $Excel = New-Object -ComObject Excel.Application $Excel.Visible = $false $wb = $Excel.Workbooks.Open($excelFile) foreach ($ws in $wb.Worksheets) { $rows = @() $maxRow = $ws.UsedRange.Rows.Count $maxCol = $ws.UsedRange.Columns.Count # 逐行逐列处理单元格 for ($row = 1; $row -le $maxRow; $row++) { $currentRow = @() for ($col = 1; $col -le $maxCol; $col++) { $cellValue = $ws.Cells.Item($row, $col).Text $currentRow += "`"$cellValue`"" } $rows += $currentRow -join "," } $rows | Out-File -Path $csvFile -Encoding utf8 } # 清理COM对象,避免Excel后台进程残留 $Excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb) | Out-Null [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null [GC]::Collect() [GC]::WaitForPendingFinalizers() } $FileName = "test_file" ExcelToCsvWithQuotes -File $FileName
两种方法都能输出你需要的格式:
Name,CompanyName "Joe Bloggs","Contoso Company"
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

