繁体   English   中英

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

[英]C# How to import specific column name of excel into DataTable

我尝试将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;
    }   

我尝试在Google周围搜索,发现了很多提示,但仍然无法使它正常工作。 感谢您的任何建议。

如果您只想忽略多余的列,则可以使用

 ... 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工作表中存在的列。

您可以使用命名范围设置工作簿,然后将其提取出来 这样,即使他们不小心更改了名称或插入了额外的列,它也将起作用。 您可以使用以下方式选择命名范围:

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

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

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

        if (tableSalesOrder == null)
        {
            tableSalesOrder = new DataTable("dtSO");
            DataColumn colItemCode = new DataColumn("ItemCode",typeof(string));
            ......

            tableSalesOrder.Columns.Add(colItemCode);
            ......
        }
        else
        {
            tableSalesOrder.Clear();
        }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM