2017-02-11 81 views
0

我試圖用條件將excel導入到我的DataTable中。 示例: - 用戶有我提供的excel導入模板,第一行爲0作爲列標題(ItemCode,QTY,SerialNo,Remarks)。但是由於用戶可能會意外地在我的準備就緒列的任何位置插入少量不需要的列名,或者刪除我的一個列名。C#如何將excel的特定列名導入到DataTable中

無論發生什麼事情,我都嘗試構建代碼,系統僅檢測標準就緒列標題(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; 
    } 

我已經嘗試谷歌周圍,發現了許多線索,但仍無法使其工作。 謝謝你的任何建議。

回答

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

0

您可以使用命名範圍和extract those來設置工作簿。這樣即使他們意外更改了名稱或插入了額外的列,它也可以工作。你可以選擇這樣的命名範圍:

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

我通過使用不同的方法解決了這個問題,我從你們兩個人的建議中得到了這個想法。事實上,在我對我發佈的源代碼進行了一些測試之後,它只會根據我定義的列名進行導入,哪些是ItemCode,數量,序列號& Remakrs在我的gridView中,我的dataTable已將其指定爲數據源。

唯一的問題是當刪除其中一列時,我的導入過程會面臨問題。這是由於datatable在創建後從未分配任何列名稱。 我通過改進dataTable集來解決它,並將列名重新定義爲It。

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

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

謝謝你們的幫助。最後我找到了錯誤所在。

相關問題