簡體   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