【问题标题】:How to save an Excel (xlsm) as CSV file with semicolon delimiter?如何使用分号分隔符将 Excel (xlsm) 保存为 CSV 文件?
【发布时间】:2018-10-05 13:43:22
【问题描述】:

对于一个我打算这样做的项目:

  • 使用 powershell 打开一个 excel 文件。 (完成)
  • 使用与网站的数据连接刷新表。 (完成)
  • 将刷新的 Excel 保存在同一路径中。(完成)
  • 将该文件转换为用于加载到 SQL Server 的 CSV(史诗般的失败)

Powershell 使用逗号分隔符保存文件,而不是使用分号:

#Refresh Excel
$app = New-Object -comobject Excel.Application
$app.Visible = $false
$wb = $app.Workbooks.Open("C:\test\test.xlsm")
$wb.Name
$wb.RefreshAll()
$wb.Save()
$wb.Close()
$app.Quit()

#Export To CSV
Function ExportWSToCSV ($excelFileName, $csvLoc)
{
    $excelFile = "C:\test\" + $excelFileName + ".xlsm"
    $E = New-Object -ComObject Excel.Application
    $E.Visible = $false
    $E.DisplayAlerts = $false
    $wb = $E.Workbooks.Open($excelFile)
    foreach ($ws in $wb.Worksheets)
    {
        $n = $excelFileName + "_" + $ws.Name
        write-host $n
        write-host ($csvLoc + $n + ".csv")
        $ws.SaveAs($csvLoc + $n + ".csv",6)
    }
    $E.Quit()
}

ExportWSToCSV -excelFileName "test" -csvLoc "C:\test\new\"

我还需要如何将数据批量插入 SQL Server 的表中...

提前致谢!

【问题讨论】:

  • 所以基本上,您正在尝试将XLSX 转换为CSV。看看this对你有没有价值。
  • 我已经这样做了,问题是我想要分号作为分隔符,而不是逗号。
  • 这是 Excel 问题,不是 Powershell。 Excel CSV 导出是相当可怕的,你不能选择分隔符,编码很容易搞砸。如果分隔符只是问题,您可以在 Excel 设置中将小数分隔符更改为逗号,它将使用分号作为字段分隔符。否则,我会从表格的每一行创建自定义 PSObject,并使用 Export-Csv Cmdlet 创建 CSV 文件。

标签: sql-server excel powershell csv sqlbulkcopy


【解决方案1】:

要使用分号而不是逗号作为分隔符保存 CSV,请尝试为 local 参数指定 $true 值,为 SaveAs 方法:

$ws.SaveAs($csvLoc + $n + ".csv",6, 0, 0, 0, 0, 0, 0, 0, $true)

代替:

$ws.SaveAs($csvLoc + $n + ".csv",6)

这是 MSDN 中解释本地参数的摘录(更多信息here):

本地

类型:System.Object

true 保存文件的语言 Excel(包括控制面板设置); false默认)保存文件 反对 Visual Basic for Applications (VBA) 的语言。

要将您的 CSV 文件批量插入 SQL Server(在此示例中,我的 CSV 文件只有 2 列):

IF  OBJECT_ID('dbo.IMPORT_FROM_CSV') IS NOT NULL
DROP TABLE dbo.IMPORT_FROM_CSV 

CREATE TABLE dbo.IMPORT_FROM_CSV (
  [COL_1]            [VARCHAR] (max) NULL,
  [COL_2]            [VARCHAR] (max) NULL
)

BULK INSERT dbo.IMPORT_FROM_CSV
FROM 'C:\test\new\test_Sheet1.csv'
WITH (
 FIRSTROW = 2,
 FIELDTERMINATOR = ';',
 ROWTERMINATOR = '\n'
)

【讨论】:

  • 这个答案对其他事情很有用。我在英国系统上使用 Powershell 将 .XLSX 转换为 .CSV 并且日期以美国格式出现,即使输入的电子表格有它们在英国并且服务器配置为英国!在 PowerShell 的 .SaveAs 命令中添加“ , 0, 0, 0, 0, 0, 0, 0, $true ” 参数解决了该问题并强制它以英式格式输出。谢谢!
【解决方案2】:

当我遇到分隔符问题时,我通常只在我的代码中添加两行

(Get-Content -Path "C:\test\new\test.csv") | % {$_ -replace ';' , '|'}|
Out-File -FilePath "C:\test\new\test.csv" -Encoding UTF8

您可以调整分隔符并替换它们,我使用“|”一个,因为它很难作为文本的一部分找到。

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2021-04-26
    • 1970-01-01
    相关资源
    最近更新 更多