【问题标题】:C# How to import specific column name of excel into DataTableC#如何将excel的特定列名导入DataTable
【发布时间】:2017-02-11 10:08:25
【问题描述】:

我尝试将一个带有条件的 Excel 导入我的 DataTable。 示例: - 用户有我提供的 excel 导入模板,第一行 0 作为列标题(ItemCode、QTY、SerialNo、Remarks)。但是由于用户可能会不小心在我准备好的列的任何地方插入一些不需要的列名,或者删除我的列名之一。

无论发生什么,我都会尝试构建代码,系统只检测到我的标准就绪列标题(ItemCode、QTY、SerialNo、Remarks)。并且只会在excel中添加列而忽略那些不小心删除的列名。

在允许将那些特定列导入dataTable之前,对列名检测进行编码的最佳方法是什么?

下面是我当前的excel导入代码(我尝试添加上面的条件代码)

    private DataTable ReadExcelToDataTable(string filePath)
    {
        tableSalesOrder = new DataTable("dtSO");
        string strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"", filePath);
        using (OleDbConnection dbConnection = new OleDbConnection(strConn))
        {
            dbConnection.Open();
            DataTable dtExcelSchema = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            string sSheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();

            dbConnection.Close();

            using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter("SELECT DISTINCT * FROM [" + sSheetName + "]", dbConnection)) //rename sheet if required!
                dbAdapter.Fill(tableSalesOrder);
        }
        return tableSalesOrder;
    }   

我尝试用谷歌搜索,发现很多提示,但仍然无法使其工作。 谢谢你的建议。

【问题讨论】:

    标签: c# excel import


    【解决方案1】:

    如果你只是想忽略多余的列,你可以使用

     ... new OleDbDataAdapter("Select Distinct ItemCode, QTY, SerialNo, Remarks FROM [" + sSheetName + "] ...
    

    如果您需要处理其中一些列丢失的问题,那么它会稍微复杂一些。您需要获取 excel 工作表中的列列表,例如

    DataTable dt = dbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, 
                    new object[] { null,null, sSheetName, null });
    
    List<string> columnNames = new List<string>();
    foreach (DataRow row in dt.Rows)
        columnNames.Add(row["Column_name"].ToString()); 
    

    然后,您需要构建您的选择语句以仅包含您想要的并且存在于 Excel 工作表中的列。

    【讨论】:

      【解决方案2】:

      您可以使用命名范围和extract those 设置工作簿。这样,即使他们不小心更改了名称或插入了额外的列,它也能正常工作。您可以使用以下方式选择命名范围:

      var sql = "SELECT * FROM [Workbook$MyNamedRange]"
      using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter(sql, dbConnection));
      dbAdapter.Fill(tableSalesOrder);
      

      【讨论】:

        【解决方案3】:

        我用不同的方法解决了这个问题,我从你们两个人的建议中得到了这个想法。事实上,在我对发布的原始代码进行一些测试后,它只会根据我定义的列名导入,即我的 gridView 中的 ItemCode、Qty、SerialNo 和 Remakrs,我的 dataTable 已将其分配给它作为数据源。

        唯一的问题是当其中一列被删除时,我的导入过程将面临问题。这是由于数据表在创建后从未分配任何列名。 我通过改进dataTable集并将列名重新定义为It来解决它。

                if (tableSalesOrder == null)
                {
                    tableSalesOrder = new DataTable("dtSO");
                    DataColumn colItemCode = new DataColumn("ItemCode",typeof(string));
                    ......
        
                    tableSalesOrder.Columns.Add(colItemCode);
                    ......
                }
                else
                {
                    tableSalesOrder.Clear();
                }
        

        感谢大家的帮助。最后我找到了错误所在。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-06
          • 1970-01-01
          • 2021-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-18
          • 1970-01-01
          相关资源
          最近更新 更多