通过OledbCommand在Excel工作表的第一列中检索非空行

时间:2011-02-04 09:07:15

标签: c# .net vb.net excel oledb

我的要求是读取第一列中非空的excel表的所有行,这些行是非数字的,并且长度在15到20之间。

例如:

358218033354974
359473035499561
358218036156129
354022038366247
358218032490035
359473030516492
353210040325399

此列可能有一个非数字标题,可能有空行。通过SqlBulkCopy导入它时会导致异常。所以我想通过OleDbCommand预过滤正确的行。

到目前为止我所尝试的是(C#也表示赞赏):

Using connection As New OleDbConnection(sExcelConnectionString)
   connection.Open()
   Dim schemaTable As DataTable = _
       connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
       New Object() {Nothing, Nothing, Nothing, "TABLE"})
   For Each row As DataRow In schemaTable.Rows
      'loop every Worksheet
      Dim OleDbCmd As OleDbCommand = New OleDbCommand("SELECT * FROM [" & row("TABLE_NAME").ToString & "]", connection)
      Dim dr As OleDbDataReader = OleDbCmd.ExecuteReader()
      Dim bulkCopy As SqlBulkCopy = New SqlBulkCopy(sSqlConnectionString)
      bulkCopy.DestinationTableName = destTable
      bulkCopy.WriteToServer(dr)
   Next
End Using

但是如果存在空行或者值的格式不正确,则抛出异常。所以我的问题是:

问:如何将OleDbCommand的行限制为:

  • 仅获取每个工作表的第一列
  • 所有数字值
  • 跳过空值
  • 理想情况下,只有长度介于15和20之间的值

编辑:如果有人只能告诉我如何跳过空行,我会很高兴。或者我必须选择整个数据表?我希望由于性能原因,只能通过一个查询来实现这一点。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

这是我的解决方案,也许它会以某种方式帮助某人:

Using connection As New OleDbConnection(sExcelConnectionString)
    connection.Open()
    Dim schemaTable As DataTable = _
        connection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, _
        New Object() {Nothing, Nothing, Nothing, "TABLE"})
    Dim schemaColTable As DataTable = _
        connection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, _
        New Object() {Nothing, Nothing, Nothing, Nothing})
    Dim firstWorkSheet As String = schemaTable.Rows(0)("TABLE_NAME").ToString
    Dim firstColumnName As String = schemaColTable.Rows(0)("COLUMN_NAME").ToString
    Dim OleDbSQL As String = String.Format( _
        "SELECT TRIM([{1}]) AS IMEI " & _
        "FROM [{0}] " & _
        "WHERE LEN(TRIM([{1}])) BETWEEN 10 AND 15 " & _
        "ORDER BY [{1}]", firstWorkSheet, firstColumnName)
    Dim OleDbCmd As OleDbCommand = New OleDbCommand(OleDbSQL, connection)
    Using bulkCopy As New SqlBulkCopy(sSqlConnectionString)
         bulkCopy.DestinationTableName = destTable
         bulkCopy.WriteToServer(OleDbCmd.ExecuteReader)
    End Using
End Using

Convert to C#

答案 1 :(得分:1)

我不明白为什么你不应该使用SQL:

 "SELECT F1 from [Sheet1$] WHERE Len(F1)>14 AND Len(F1)<21 AND IsNumeric(F1)"

当连接字符串中的HDR设置为NO时,字段名称将分配为F1,F2等,从选择的第一列开始编号。如果您确定A列中有数据,也可以使用[Sheet1 $ A:A]。请注意,表格架构中都会返回命名范围和工作表。