【问题标题】:How can I export my csv from Excel with quotes?如何使用引号从 Excel 导出我的 csv?
【发布时间】:2019-07-03 13:23:02
【问题描述】:

我需要使用 VBScript 从 Excel 导出为 CSV。我将 CSV 导入的数据库希望数据用引号引起来。

' Set output type constant
Const xlCSV = 23
Const xlYes = 1
Const xlAscending = 1
Const xlDescending = 2

' Open Excel in background
Set objExcel = CreateObject("Excel.Application")
objExcel.DisplayAlerts = FALSE

' Make Excel object visible
objExcel.visible = TRUE

' Open source file   
Set obj2 = objExcel.Workbooks.open("\\ntptc\Public\test\bins\DomesticCollectionItemsV2.csv")

' Set data format
obj2.Worksheets("DomesticCollectionItemsV2").range("D:E").NumberFormat = "0"
obj2.Worksheets("DomesticCollectionItemsV2").range("Q:R").NumberFormat = "dd/mm/yyyy"
obj2.Worksheets("DomesticCollectionItemsV2").range("X:Y").NumberFormat = "dd/mm/yyyy"

'Sort data
Set objWorksheet = obj2.Worksheets(1)
Set objRange = objWorksheet.UsedRange
Set objRange1 = objExcel.Range("N1")
Set objRange2 = objExcel.Range("O1")
objRange.Sort objRange1,xlYes

' Remove duplicates
obj2.Worksheets("DomesticCollectionItemsV2").range("A:EE").RemoveDuplicates Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15), xlYes
obj2.Worksheets("DomesticCollectionItemsV2").range("A:EE").RemoveDuplicates Array(12,13,14,15,16,17,18,19,20,21,22,23,24,25), xlYes

' Remove Expired and erroneous data 
Dim myRow
    For myRow = 5000 To 1 Step -1
        If (obj2.Worksheets("DomesticCollectionItemsV2").Cells(myRow, 14).Value = "Expired") Then
            obj2.Worksheets("DomesticCollectionItemsV2").Rows(myRow).EntireRow.Delete
        End If

        If (obj2.Worksheets("DomesticCollectionItemsV2").Cells(myRow, 14).Value = "Quotation") Then
            obj2.Worksheets("DomesticCollectionItemsV2").Rows(myRow).EntireRow.Delete
        End If
    Next

'Sort data
objRange.Sort objRange1, xlAscending, objRange2, , xlAscending, , , xlYes

' Remove Expired and erroneous data 
Dim myRow1
    For myRow1 = 10000 To 1 Step -1

        If (obj2.Worksheets("DomesticCollectionItemsV2").Cells(myRow1, 15).Value = "Assisted Collection Contract") Then
            obj2.Worksheets("DomesticCollectionItemsV2").Rows(myRow1).EntireRow.Delete
        End If

        If (obj2.Worksheets("DomesticCollectionItemsV2").Cells(myRow1, 15).Value = "Clinical Waste Collection Service Contract") Then
            obj2.Worksheets("DomesticCollectionItemsV2").Rows(myRow1).EntireRow.Delete
        End If

        If (obj2.Worksheets("DomesticCollectionItemsV2").Cells(myRow1, 15).Value = "NULL") Then  
            obj2.Worksheets("DomesticCollectionItemsV2").Rows(myRow1).EntireRow.Delete
        End If
    Next

' Open template   
Set obj1 = objExcel.Workbooks.open("\\ntptc\Public\test\bins\toby\When-is-my-bin-day(new3).xlsx")

' Copy from source file to template
obj2.Worksheets("DomesticCollectionItemsV2").range("A1:AE110000").copy
obj1.Worksheets("DataTransform").range("A:AE").pastespecial
obj1.Worksheets("DataTransform").range("D:E").NumberFormat = "0"
obj1.Worksheets("DataTransform").range("Q:R").NumberFormat = "dd/mm/yyyy"
obj1.Worksheets("DataTransform").range("X:Y").NumberFormat = "dd/mm/yyyy"

' Close Source file
obj2.Close False

' Copy within template
obj1.Worksheets("DataTransform").range("AN:AP").copy
obj1.Worksheets("Export File").range("A:C").PasteSpecial -4163
'obj1.Worksheets("Export File").range("A:A").NumberFormat = "0"
obj1.Worksheets("Export File").range("C:C").NumberFormat = "dd/mm/yyyy"
obj1.Worksheets("DataTransform").range("AR:BB").copy
obj1.Worksheets("Export File").range("D:N").PasteSpecial -4163

' Remove duplicates
obj1.Worksheets("Export File").range("A:N").RemoveDuplicates Array(1,2,3,4,5,6,7,8,9,10,11,12,13,14), xlYes

' Set worksheet to be exported
Set obj3 = obj1.Worksheets("Export File")

' Save output as CSV
obj3.SaveAs "\\ntptc\Public\test\bins\KESCollections.csv", xlCSV

' Close Template
obj1.Close False

' Close Excel                                             
objExcel.Quit

如果我在 Excel 中添加引号或格式化单元格以添加引号,它会在单元格数据的每一侧输出三个引号。

我尝试使用"\0\""\@\" 将列格式化为自定义。我已经尝试在 VBS 中添加引号,但无论我做什么,我仍然在 CSV 中得到太多引号

原始输出

100060018803,Garden Waste Collection Service,09/07/2019

实际输出

"""100060018803""","""Garden Waste Collection Service""","""09/07/2019"""

期望的输出

"100060018803","Garden Waste Collection Service","09/07/2019"

有没有办法让它只用一组引号输出 CSV?

【问题讨论】:

  • 那是因为Excel是按照标准的csv格式导出的。它只在需要时添加双引号。你想要的不是标准的csv。

标签: excel vba csv vbscript


【解决方案1】:

我刚刚有了一个想法,我可以在包含三个引号的输出文件 CSV 上运行另一个脚本并将其替换为一个。

Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("test.csv", ForReading)

strText = objFile.ReadAll
objFile.Close
strNewText = Replace(strText, CHR(34) & CHR(34) & CHR(34), CHR(34))

Set objFile = objFSO.OpenTextFile("test.csv", ForWriting)
objFile.WriteLine strNewText

objFile.Close

【讨论】:

    【解决方案2】:

    你可以写下每一行,按照你想要的方式格式化。

    但不确定速度问题。

    Option Explicit
    Sub due()
        Dim FSO As FileSystemObject
        Dim TS As TextStream
        Dim WS As Worksheet
        Dim WB As Workbook
        Dim myData As Variant
        Dim I As Long
    
    Set WB = ThisWorkbook
    Set WS = WB.Worksheets("sheet2")
    
    With WS
        myData = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp)).Resize(columnsize:=3)
    End With
    
    Set FSO = New FileSystemObject
    Set TS = FSO.CreateTextFile("C:\Users\Ron\tester.csv", True, False)
    
    'Don't put header row in quotes
    '  as spec said **Data in Quotes**
    
    With TS
        .WriteLine Join(WorksheetFunction.Index(myData, 1, 0), Chr(44))
        For I = 2 To UBound(myData, 1)
            TS.WriteLine Chr(34) & Join(WorksheetFunction.Index(myData, I, 0), Chr(34) & Chr(44) & Chr(34)) & Chr(34)
        Next I
        TS.Close
    End With
    
    End Sub
    

    工作表上的原始数据

    记事本++中的结果

    如果日期列需要采用特定格式,您可以对该列进行预处理,例如:

    For I = 2 To UBound(myData, 1)
        myData(I, 3) = Format(myData(I, 3), "dd/mm/yyyy")
    Next I
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-15
      • 2017-01-11
      • 2021-12-16
      • 2013-07-15
      • 2020-12-28
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      相关资源
      最近更新 更多