2016-06-10 62 views
0

我想在Excel中導入一個Excel表格到數據表中。我不斷收到越界異常,因爲列值正在被硬編碼。基於C#中傳入的Excel數據動態創建數據表?

對(INT C = 0; C^< 40; C++){...}

因此,而不是硬編碼此和具有一串在我的數據表中列出的空列的,是有一種方法可以在創建表之前統計傳入的所有列嗎?從而允許我圍繞傳入數據動態創建表格?

以下是我的代碼。

if (fileUpload.HasFile) 
     { 
     DataTable dt = new DataTable(); 
     for (int c = 0; c <40; c++) { dt.Columns.Add(c.ToString(), typeof(string)); } 
     using (Stream fileStream = fileUpload.PostedFile.InputStream) 
     using (StreamReader sr = new StreamReader(fileStream)) 
     { 
      string a = null; 
      while ((a = sr.ReadLine()) != null) 
      { 
      dt.Rows.Add(a.Split(new char[] { ',' }).ToArray()); 
      } 
     } 
     GridView1.DataSource = dt; 
     GridView1.DataBind(); 

回答

1

嘗試使用這樣的事情,而不是:

 DataTable dt; 
     using (Stream fileStream = fileUpload.PostedFile.InputStream) 
     using (StreamReader sr = new StreamReader(fileStream)) 
     { 
      string a = null; 
      while ((a = sr.ReadLine()) != null) 
      { 
       string[] columns = a.Split(','); 
       if (dt == null) 
       { 
        dt = new DataTable(); 
        for (int i = 0; i < columns.Count(); i++) 
         dt.Columns.Add(new DataColumn(i.ToString(), typeof(string))); 
       } 
       dt.Rows.Add(columns); 
      } 
     } 
     GridView1.DataSource = dt; 
     GridView1.DataBind(); 

只要第一行包含了數據的其餘部分中的列的最大數量,你應該準備就緒。

如果第一行是列名,您可以修改代碼以跳過第一遍dt.Rows.Add(columns),並與columns[i].ToString()更換i.ToString()正確命名DataColumn。從整體串

while ((a = sr.ReadLine()) != null) 
{ 
    a = a.Substring(1, a.Length - 2); 
    string[] columns = a.Split(new string[] { "\",\"" }, StringSplitOptions.None); 
    if (dt == null) 
    { 
     dt = new DataTable(); 
     for (int i = 0; i < columns.Count(); i++) 
      dt.Columns.Add(new DataColumn(i.ToString(), typeof(string))); 
    } 
    dt.Rows.Add(a.Split(new char[] { ',' }).ToArray()); 
} 

這將去掉第一個和最後"

如果列/值也用引號(")包圍,那麼你可以修改while上述聲明看起來像這樣,然後拆分爲","。儘管如此,你可能想玩一些,並添加代碼來確定你的字段是如何分隔的,或者有一些你可以指定的輸入字段。也就是說,如果您的輸入在定義方式上是可變的。

+0

現在就試試吧。第一次運行時出現錯誤。 「輸入數組的長度大於此表中的列數。」 –

+1

如果你明白了,那麼嘗試設置一個斷點並查看你的數據。你有一些行比第一行有更多的列嗎?你通常不應該有這樣的問題,除非該文件是以某種奇怪的方式創建的。 – gmiley

+0

是的,我正在通過現在。由於某些數據是「Last,First」格式的名稱,因此逗號分隔會造成問題。 –