vb.net xls到csv与报价?

我有一个xls文件,或不带引号的csv,并使用vb.net需要把它变成一个csv与每个单元格引号。 如果我在MS Access中打开不带引号的xls / csv,请将每列设置为文本,然后将其导出为我需要的格式。 有更容易的方法吗? 如果没有,我怎么做在vb.net复制这个? 谢谢。

如果使用.Net OLE DB提供程序 ,则可以在数据文件所在的文件夹的schema.ini文件中指定.csv格式的详细信息。对于“未加引号的”.csv,规范应该看起来像

[noquotes.csv] <-- file name ColNameHeader=True <-- or False CharacterSet=1252 <-- your encoding Format=Delimited(,) <-- TextDelimiter= <-- important: no " in source file Col1=VendorID Integer <-- your columns, of course Col2=AccountNumber Char Width 15 

对于'quoted'.csv,只需更改名称并删除TextDelimiter =行(将引号放在文本字段是默认值)。

然后连接到文本数据库并执行语句

 SELECT * INTO [quotes.csv] FROM [noquotes.csv] 

(因为这会创buildquotes.csv,您可能希望在每个实验运行之前删除文件)

添加处理“空字段必须引用”

这是一个VBScript演示,但重要的东西是.GetString()的参数,您可以轻松地将其移植到VB:

  Dim sDir : sDir = resolvePath( "§LibDir§testdata\txt" ) Dim sSrc : sSrc = "noquotes.csv" Dim sSQL : sSQL = "SELECT * FROM [" & sSrc & "]" Dim oTxtDb : Set oTxtDb = New cADBC.openDb( Array( "jettxt", sDir ) ) WScript.Echo goFS.OpenTextFile( goFS.BuildPath( sDir, sSrc ) ).ReadAll() Dim sAll : sAll = oTxtDb.GetSelectFRO( sSQL ).GetString( _ adClipString, , """,""", """" & vbCrlf & """", "" _ ) WScript.Echo """" & Left( sAll, Len( sAll ) - 1 ) 

和输出:

  VendorID;AccountNumber;SomethingElse 1;ABC 123 QQQ;1,2 2;IJK 654 ZZZ;2,3 3;;3,4 "1","ABC 123 QQQ","1,2" "2","IJK 654 ZZZ","2,3" "3","","3,4" 

(德语区域,因此字段分隔符和小数点符号)

这个VB.Net代码的输出相同:

  Imports ADODB ... Sub useGetString() Console.WriteLine("useGetString") Const adClipString As Integer = 2 Dim cn As New ADODB.Connection Dim rs As ADODB.Recordset Dim sAll As String cn.ConnectionString = _ "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=M:\lib\kurs0705\testdata\txt\;" _ & "Extended Properties=""text;""" cn.Open() rs = cn.Execute("SELECT * FROM [noquotes.csv]") sAll = rs.GetString( adClipString, , """,""", """" & vbCrLf & """", "" ) cn.Close() sAll = """" & Left( sAll, Len( sAll ) - 1 ) Console.WriteLine( sAll ) End Sub 

查看这个链接的方法。 你可以做什么,以确保引号四处追加引号到循环的每列数据的开始和结束,这是列数据在文件中。

例如使这样的循环:

 For InnerCount = 0 To ColumnCount - 1 Str &= """" & DS.Tables(0).Rows(OuterCount).Item(InnerCount) & """," Next 
 Public Class clsTest Public Sub Test Dim s as string = "C:\!Data\Test1.csv" Dim Contents As String = System.IO.File.ReadAllText(s) Dim aryLines As String() = Contents.Split(New String() { Environment.Newline }, StringSplitOptions.None) Dim aryParts() As String Dim aryHeader() As String Dim dt As System.Data.DataTable For i As Integer = 0 To aryLines.Length - 1 aryParts = SplitCSVLine(aryLines(i)) If dt Is Nothing And aryHeader Is Nothing Then aryHeader = CType(aryParts.Clone, String()) ElseIf dt Is Nothing And aryHeader IsNot Nothing Then dt = DTFromStringArray(aryParts, 1000, "", aryHeader) Else DTAddStringArray(dt, aryParts) End If Next dt.dump End Sub Public Shared Function SplitCSVLine(strCSVQuotedLine As String) As String() Dim aryLines As String() = strCSVQuotedLine.Split(New String() {Environment.NewLine}, StringSplitOptions.None) Dim aryParts As String() = Nothing For i As Integer = 0 To aryLines.Length - 1 Dim regx As New Text.RegularExpressions.Regex(",(?=(?:[^\""]*\""[^\""]*\"")*(?![^\""]*\""))") aryParts = regx.Split(aryLines(i)) For p As Integer = 0 To aryParts.Length - 1 aryParts(p) = aryParts(p).Trim(" "c, """"c) Next Next Return aryParts End Function Public Shared Function DTFromStringArray(ByVal aryValues() As String, Optional ByVal intDefaultColumnWidth As Integer = 255, Optional ByVal strTableName As String = "tblArray", Optional ByVal aryColumnNames() As String = Nothing) As DataTable If String.IsNullOrWhiteSpace(strTableName) Then strTableName = "tblArray" Dim dt As DataTable = New DataTable(strTableName) Dim colNew(aryValues.GetUpperBound(0)) As DataColumn If aryColumnNames Is Nothing Then ReDim aryColumnNames(aryValues.Length) Else If aryColumnNames.GetUpperBound(0) < aryValues.GetUpperBound(0) Then ReDim Preserve aryColumnNames(aryValues.Length) End If End If For x As Integer = aryColumnNames.GetLowerBound(0) To aryColumnNames.GetUpperBound(0) If String.IsNullOrWhiteSpace(aryColumnNames(x)) Then aryColumnNames(x) = "Field" & x.ToString Else aryColumnNames(x) = aryColumnNames(x) End If Next For i As Integer = 0 To aryValues.GetUpperBound(0) colNew(i) = New DataColumn With colNew(i) .ColumnName = aryColumnNames(i) '"Value " & i .DataType = GetType(String) .AllowDBNull = False .DefaultValue = "" .MaxLength = intDefaultColumnWidth .Unique = False End With Next dt.Columns.AddRange(colNew) Dim pRow As DataRow = dt.NewRow For i As Integer = aryValues.GetLowerBound(0) To aryValues.GetUpperBound(0) pRow.Item(i) = aryValues(i) Next dt.Rows.Add(pRow) Return dt End Function Public Shared Sub DTAddStringArray(ByRef dt As DataTable, ByVal aryRowValues() As String) Dim pRow As DataRow pRow = dt.NewRow For i As Integer = aryRowValues.GetLowerBound(0) To aryRowValues.GetUpperBound(0) pRow.Item(i) = aryRowValues(i) Next dt.Rows.Add(pRow) End Sub End Class