【问题标题】:Read column when importing excel sheet导入excel表时读取列
【发布时间】:2012-06-15 14:17:23
【问题描述】:

我正在将一个 Excel 工作表导入我的 sql 数据库。一切正常,但我想将列标题作为静态值读取。不知道该怎么做。这是我用来阅读表格的代码:

    'Connection String to Excel Workbook   
    Dim excelConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & MyFile & ";Extended Properties=""Excel 12.0;HDR=Yes;"""

    ' Create Connection to Excel Workbook   
    Using connection As New System.Data.OleDb.OleDbConnection(excelConnectionString)

        'List columns you need from the Excel file   
        Dim command As New System.Data.OleDb.OleDbCommand("Select * FROM [" & txtSheetName.Text & "$]", connection)
        connection.Open()

        ' Create DbDataReader to Data Worksheet   
        Using dr As System.Data.OleDb.OleDbDataReader = command.ExecuteReader()

            Dim strSql As String = ""

            strSql = "INSERT INTO tblMine (" & _
                    "Header1, Field1, Field2 " & _
                     ") VALUES (" & _
                    "Header1, Field1, Field2)"

            Try
                If dr.HasRows() Then

                    While dr.Read()

                        If Convert.ToString(dr.Item(1)) <> "" Then

                            Dim cmd As New SqlClient.SqlCommand
                            cmd.Connection = cn
                            cmd.CommandType = CommandType.Text
                            cmd.CommandText = strSql
                            'DataTable1.Columns[0].ColumnName 
                            cmd.Parameters.Add("@Header1", SqlDbType.VarChar).Value = ???
                            cmd.Parameters.Add("@Field1", SqlDbType.VarChar).Value = Convert.ToString(dr.Item(0))
                            cmd.Parameters.Add("@Field2", SqlDbType.Int).Value = Convert.ToInt32(dr.Item(1))

                            cmd.ExecuteScalar()

                        End If

                    End While

                End If

【问题讨论】:

  • OleDbDataReader 无法知道标题(也称为列名)。填充 DataTable 的 OleDbDataAdapter 可能会做。

标签: vb.net excel


【解决方案1】:

不是一个非常干净的代码,但这给出了 Header1(或第一行中的名称,您的工作表的第一列名为 [" &amp; txtSheetName.Text &amp; "$]"

Dim cmd2 As OleDbCommand = New OleDbCommand("SELECT * FROM [" & txtSheetName.Text & "$] where 1=0", connection)
Dim da As OleDbDataAdapter = new OleDbDataAdapter(cmd2)
Dim dt As DataTable = new DataTable()
da.Fill(dt)
string header1 = dt.Columns(0).ColumnName

一点优化

     Dim cmd As New SqlClient.SqlCommand
     cmd.Connection = cn
     cmd.CommandType = CommandType.Text
     cmd.CommandText = strSql
     cmd.Parameters.AddWithValue("@Header1", header1) ' this is invariant
     cmd.Parameters.AddWithValue("@Field1", string.Empty) ' this is a dummy value
     cmd.Parameters.AddWithValue("@Field2", 0)  ' this is a dummy value
     While dr.Read()
         If Convert.ToString(dr.Item(1)) <> "" Then
              cmd.Parameters("@Field1").Value = Convert.ToString(dr.Item(0))
              cmd.Parameters("@Field2").Value = Convert.ToInt32(dr.Item(1))
              cmd.ExecuteScalar()
         End If
    End While

【讨论】:

  • 非常感谢您的帮助。对不起,代码不是很好。我是自学的。如果你觉得还有什么不好的地方,你能说说你会改变什么吗?
  • @Mike,我说的是我的,不是你的。
  • @Mike,看你的代码,我会在内部循环之外优化用于更新SqlServer的参数的创建和初始化。这会更快一点,而且对内存碎片的攻击性更小
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
相关资源
最近更新 更多