如何使用脚本将Excel转换为分号或管道分隔文件?

时间:2017-11-14 07:51:13

标签: excel csv vbscript automation

我正在尝试自动执行将Excel工作簿转换为CSV文件的任务。生成的文件应为分号和管道分隔。但是我只能获得逗号分隔文件。我尝试使用SaveAs参数,但没有帮助。

有人可以建议在VBScript中执行此操作。

这是我的代码,可以将工作簿转换为CSV。我甚至试图用管道或分号替换逗号,但这是超级错误导致不正确的数据。

Dim strExcelFileName
Dim strCSVFileName
strDelimiter = "|"

strExcelFileName = "file_temp" '

Set fso = CreateObject ("Scripting.FileSystemObject") 
strScript = WScript.ScriptFullName
strScriptPath = fso.GetAbsolutePathName(strScript & "\..")
WScript.Echo strScriptPath

'If the Input file is NOT qualified with a path, default the current path
LPosition = InStrRev(strExcelFileName, "\")
If LPosition = 0 Then 'no folder path
    strExcelFileName = strScriptPath & "\file\" & strExcelFileName
    strScriptPath = strScriptPath & "\"
Else 'there is a folder path, use it for the output folder path also
    strScriptPath = Mid(strExcelFileName, 1, LPosition)
End If
'MsgBox LPosition & " - " & strExcelFileName & " - " & strScriptPath  ' use this for debugging

Set objXL = CreateObject("Excel.Application")
Set objWorkBook = objXL.Workbooks.Open(strExcelFileName)
objXL.DisplayAlerts = False

'loop over worksheets
For Each sheet In objWorkBook.Sheets
    'only saveAS sheets that are NOT empty
    If objXL.Application.WorksheetFunction.CountA(sheet.Cells) <> 0 Then
        sheet.Rows(1).Delete  ' this will remove Row 1 or the header Row
        Select Case sheet.Name 
        Case "Sales"
            sheet.SaveAs strScriptPath & "abc_sales.csv", 23, local=true 'CSV
        Case "Goals"
            sheet.SaveAs strScriptPath & "abc_file_goals.csv", 6 'CSV
        Case "Commissions"
            sheet.SaveAs strScriptPath & "abc_file_coms.csv", 6 'CSV
        Case Else
            sheet.SaveAs strScriptPath & "abc_file_coms.csv", 6 'CSV
        End Select
    End If
Next

'clean up
objWorkBook.Close
objXL.Quit
Set objXL = Nothing
Set objWorkBook = Nothing
Set fso = Nothing

编辑我在下面的代码中尝试了强制本地设置和windows csv格式。但它是stil生成逗号分隔文件。本地设置被设置为管道。

sheet.SaveAs strScriptPath & "abc.csv", 23, local=true

2 个答案:

答案 0 :(得分:0)

测试它:更新(字段local位置 10!

- for VBScript -
,,,,,,,,,,真实的最后位置是'本地' (ty @Lankymart)

- for VBA -
FileFormat:= xlCSVWindows,Local:= True

然后来自区域设置的分隔符

默认为

本地:=假(默认)
永远','

https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbook-saveas-method-excel

Workbook.SaveAs方法(Excel)

<强>语法
表达。 SaveAs(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)

本地 可选变体

True会根据Microsoft Excel语言保存文件(包括控制面板设置)。 False(默认)将文件保存为Visual Basic for Applications(VBA)的语言(除非运行Workbooks.Open的VBA项目是旧的国际化XL5 / 95 VBA项目,否则它通常是美国英语)。

对于TextVisualLayout和TextCodepage,

Description列中写道:

  

忽略Microsoft Excel中的所有语言。

因此,恕我直言,该函数中的参数数量从12减少到10

并将文件格式设置为23:

XlFileFormat Enumeration (Excel)

名称值描述

xlCSV 6 CSV
xlCSVMac 22 Macintosh CSV
xlCSVMSDOS 24 MSDOS CSV
xlCSVWindows 23 Windows CSV

现在这里有趣的部分发生了......默认情况下,Excel会使用逗号作为分隔符,但如果你打开控制面板 - &gt;区域和语言,然后单击底部的其他设置按钮...

现在仔细查看“列表分隔符”项,该字段通常在字段中有逗号,但为了说明的目的,我已将其切换为管道字符。

List separator Change

我希望这有帮助!

简短示例中的最终解决方案:for VBScript (放在档案* .vbs中)

Set objXL = CreateObject("Excel.Application")
Path = Replace(WScript.ScriptFullName,WScript.ScriptName, "")
Set objWorkBook = objXL.Workbooks.Open(Path & "file_temp")

objXL.DisplayAlerts = False

'eight comma
objWorkBook.WorkSheets("Sales").SaveAs Path & "abc_sales", 23 , , , , , , , , True

'clean up
objWorkBook.Close
objXL.Quit
Set objXL = Nothing
Set objWorkBook = Nothing

脚本在脚本文件夹中创建文件abc_sales(CSV类型),文件为file_temp(Excel的类型为1张“Sales”)。

在上面的字段List Separator中设置分隔符

Delimiter set in field <code>List Separator</code>

或全自动变体:

strDelimiter = "|"
strDelimiterPath = "HKCU\Control Panel\International\sList"

Set WshShell = WScript.CreateObject("WScript.Shell")
strOldDelimiter = WshShell.RegRead(strDelimiterPath)
WshShell.RegWrite strDelimiterPath, strDelimiter, "REG_SZ"

Set objXL = CreateObject("Excel.Application")
strPath = Replace(WScript.ScriptFullName,WScript.ScriptName, "")
Set objWorkBook = objXL.Workbooks.Open(strPath & "file_temp")

objXL.DisplayAlerts = False

'eight comma
objWorkBook.WorkSheets("Sales").SaveAs Path & "abc_sales", 23 , , , , , , , , True

'clean up
WshShell.RegWrite strDelimiterPath, strOldDelimiter, "REG_SZ"
objWorkBook.Close
objXL.Quit
Set objXL = Nothing
Set objWorkBook = Nothing

简短示例中的最终解决方案:VBА (放在file_temp.xlsm的模块中)

Attribute VB_Name = "Module1"
Sub Sheets2CSV()
Set awb = ActiveWorkbook
Sheets.Copy
For Each Sheet In ActiveWorkbook.Sheets
    'only saveAS sheets that are NOT empty
    If Sheet.Application.WorksheetFunction.CountA(Sheet.Cells) <> 0 Then
        Sheet.Rows(1).Delete  ' this will remove Row 1 or the header Row
        Select Case Sheet.Name
        Case "Sales"
            Sheet.SaveAs awb.Path & "\abc_sales", xlCSVWindows, local:=True
        Case "Goals"
            Sheet.SaveAs awb.Path & "\abc_file_goals", xlCSVWindows, local:=True
        Case "Commissions"
            Sheet.SaveAs awb.Path & "\abc_file_coms", xlCSVWindows, local:=True
        Case Else
            Sheet.SaveAs awb.Path & "\abc_file_sheet_" & Sheet.Name, xlCSVWindows, local:=True
        End Select
    End If
Next
ActiveWorkbook.Close 0
End Sub

答案 1 :(得分:0)

作为pointed out in the comments,您必须定义命名常量,因为VBScript无法访问Excel对象类型库,因此不知道如何将它们与其数值相关联。

VBScript也不支持命名参数语法,例如;

Sheet.SaveAs Filename:=strScriptPath & "abc_sales" & ".csv", FileFormat:=xlCSVWindows, local:=True

将失败

  

Microsoft VBScript编译错误:
  语法错误

因为Filename:=对VBScript没有任何意义。

相反,你想做这样的事情;

'Define your Named Constants
'XlFileFormat Enumeration
Const xlCSVWindows = 23

'...

'SaveAs call should match the number of arguments (optional or not).
Call sheet.SaveAs(strScriptPath & "abc.csv", xlCSVWindows, , , , , , , , , , True)

... - 表示示例中未包含的现有代码。

有用的链接

- 根据comments

中的https://stackoverflow.com/a/47281574/692942进行回答