将 Excel 工作表导出为 CSV,并附带区域设置

将 Excel 工作表导出为 CSV,并附带区域设置

我想使用 powershell 将 excel 表导出为 CSV。我遇到的问题是区域设置不受尊重。他们说使用分号作为分隔符,但实际使用的是逗号。如果我在 Excel 中手动另存为,我会得到正确的分隔符。

我尝试使用 $Local:true 但似乎没有帮助:

$Excel = New-Object -ComObject Excel.Application
$wb = $Excel.Workbooks.Open($excelFile, $Local:True)

$ws = $wb.Worksheets("Issue_Data")

$ws.SaveAs("$myDir\" + $File + ".csv", 62, $Local:True)

我在这里做错了什么?如何让此脚本尊重区域设置?

答案1

在 PowerShell 中使用 Excel COM 对象有时需要做一些事情。
当使用一个需要多个参数的方法时,你只想设置其中一些参数,你还需要设置中间的参数,因为该方法的参数用作位置参数(遗憾的是没有像 VBA 那样命名)

尝试这个:

$excelFile  = 'D:\Test\test.xlsx'
$outputFile = 'D:\Test\Output.csv'

$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $false
$Excel.DisplayAlerts = $false

$wb = $Excel.Workbooks.Open($excelFile)
$ws = $wb.Worksheets("Issue_Data")
# activate the worksheet or you'll risk saving a different sheet !
$ws.Activate()

# use [Type]::Missing for parameters that should remain at their default values
$useDefault = [Type]::Missing

# do the call, and specify all parameters, even the ones you will leave at their default values
# in this case, the 'Local' parameter is the last in line and here set to $true
# see https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.saveas
$ws.SaveAs($outputFile,62,$useDefault,$useDefault,$false,$false,$false,$useDefault,$useDefault,$true)            

$Excel.Quit()
# clean up the com objects from memory
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ws)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($wb)
$null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

笔记:

格式遗憾的是,xlCSVUTF8 (62) 不适用于 Excel 2016 版及以下版本。
要在这些版本上创建 UTF8 csv 文件,请参阅这个答案

答案2

如果 $ws 变量已经格式正确,我怀疑您可以通过简单地将其导出为 CSV 并设置分隔符来简化它:

$ws | Export-Csv -NoTypeInformation -Delimiter ";" -Path "X\Your\Path\Here.csv"

另外,虽然使用 Com 对象是一件高尚的事,而且曾经是必要的,但你有没有看过非常有用的导入Excel? 使用 ImportExcel 创建和操作 Excel 文件比使用 Com 对象容易得多!

相关内容