C#如何将excel的特定列名导入DataTable

时间:2017-02-11 10:08:26

标签: c# excel import

我尝试使用条件将excel导入到我的DataTable中。 示例: - 用户拥有我提供的excel导入模板,第一行0作为列标题(ItemCode,QTY,SerialNo,备注)。但由于用户可能会在我的每个就绪列的任何位置意外插入一些不需要的列名,或者删除我的一个列名。

我尝试构建代码,无论发生什么,系统只检测我的标准就绪列标题(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;
    }   

我试图谷歌周围,发现许多提示,但仍然无法使其工作。 谢谢你的任何建议。

3 个答案:

答案 0 :(得分:0)

如果您只是想忽略额外的列,可以使用

 ... 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()); 

然后,您需要构建select语句,以仅包含所需的列以及excel表中存在的列。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我通过使用不同的方法解决了这个问题,我从你们两个人的建议中得到了这个想法。事实上,在我对我发布的原始代码进行一些测试后,它只会根据我定义的列名进行导入,即ItemCode,Qty,SerialNo&amp;我的gridView上的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();
        }

谢谢大家的帮助。最后我找到了虫子的位置。