繁体   English   中英

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

[英]How to convert Excel to semicolon or pipe delimited file using script?

我正在尝试自动化将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格式。 但是它仍然生成逗号分隔的文件。 本地设置被设置为管道。

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

测试它: UPDATED( local字段为位置10!

- 对于VBScript-
,,,,,,,,,True
最后一个职位是“本地”
(ty @Lankymart)

- 对于VBA-
FileFormat:= xlCSVWindows,Local:= True

然后从区域设置中定界


默认为

本地:=假(默认)
总是','

https://msdn.microsoft.com/zh-CN/vba/excel-vba/articles/workbook-sa​​veas-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的列Description中,BUT的写法是:

忽略Microsoft Excel中的所有语言。

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


并将文件格式设置为23:

XlFileFormat枚举(Excel)

名称值说明

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


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

现在,请仔细查看“列表分隔符”项,该字段通常在该字段中带有逗号,但是出于说明目的,我将其切换为Pipe字符。

列表分隔符更改

我希望这有帮助!

简短示例的最终解决方案: 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

脚本make文件abc_sales脚本的文件夹,并用文件(CSV类型的) file_temp (含1片“销售”类型的Excel)。

在上方字段List Separator符中设置的定界符

在字段<code>列表分隔符</ 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

注释中指出的 ,您必须定义命名常量,因为VBScript无法访问Excel对象类型库,因此不知道如何将它们与它们的数值关联。

VBScript也不支持诸如这样的命名参数语法;

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

会因失败而失败

Microsoft VBScript编译错误:
语法错误

as 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)

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


有用的链接


-根据来自https://stackoverflow.com/a/47281574/692942的 评论进行回答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM