2016-05-20 17 views
-2

我試圖用ffollowing方法字符串轉換爲數據表,但它沒有「NT工作包含數據串字符串轉換爲DataTable中使用ASP.NET MVC

public static DataTable convertStringToDataTable(string data) 
    { 
     DataTable dataTable = new DataTable(); 
     bool columnsAdded = false; 
     foreach (string row in data.Split('\n')) 
     { 
      DataRow dataRow = dataTable.NewRow(); 
      foreach (string cell in row.Split(',')) 
      { 
       string[] keyValue = cell.Split('"'); 
       if (!columnsAdded) 
       { 
        DataColumn dataColumn = new DataColumn(keyValue[0]); 
        dataTable.Columns.Add(dataColumn); 
       } 
       dataRow[keyValue[0]] = keyValue[1]; 
      } 
      columnsAdded = true; 
      dataTable.Rows.Add(dataRow); 
     } 
     return dataTable; 
    } 

代碼:

StringWriter sw = new StringWriter(); 
        sw.WriteLine("\"NumClient\",\"Raisons Sociale\",\"DateDocument\",\"NumCommandeNAV\",\"Réference\",\"Designation\",\"QteCommandée\",\"QteLivrée\",\"QteAnnulée\",\"Reste à Livrer\",\"Type Disponibilite\",\"DateDisponibilite\""); 

        var EnTete = 
         db.AURES_GROS_EnTeteCommande.Where(e => e.NumCommandeNAV != " " && e.NumCommandeNAV != "_") 
          .OrderBy(x => x.CodeMagasin) 
          .ThenBy(s => s.NumClient) 
          .ThenBy(c => c.DateDocument) 
          .OrderByDescending(x => x.NumCommandeNAV) 
          .ToList(); 

        foreach (var element in EnTete) 
        { 
         string statut = RecuperStatut(element.NumCommandeNAV); 
         if (statut == "A livrer") 
         { 
          Raison = context.Users.First(x => x.No_ == element.NumClient).RaisonSociale; 
          lignes = db.AURES_GROS_LigneCommande.Where(x => x.NumDocument == element.NumDocument).ToList(); 

         foreach (var elt in lignes) 
         { 
          sw.WriteLine(string.Format("\"{0}\",\"{1}\",\"{2}\",\"{3}\",\"{4}\",\"{5}\",\"{6}\",\"{7}\",\"{8}\",\"{9}\",\"{10}\",\"{11}\"", 
              element.NumClient, 
              Raison, 
              element.DateDocument, 
              element.NumCommandeNAV, 
              elt.CodeArticle, 
              elt.Designation, 
              elt.Quantite, 
              0, 
              elt.QteANNULEE, 
              elt.Quantite, 
              element.Couleur, 
              elt.DateDisponibilite 
              )); 
          } 
         } 
        } 
        DataTable t = convertStringToDataTable(sw.ToString()); 

        Response.ClearContent(); 
        Response.ClearHeaders(); 
        Response.BufferOutput = true; 
        Response.ContentType = "text/excel"; 
        Response.AddHeader("Content-Disposition", "attachment; filename=Reliquat" + DateTime.Now.ToString("yyyy_MM_dd") + ".csv"); 
        Response.Write(t); 
        Response.Flush(); 
        Response.Close(); 
        //Response.End(); 

在這段代碼我想我wnat將數據導出到Excel文件

任何一個有解決方案 謝謝,

+0

就是你能不能正常工作的意思,任何錯誤? –

+0

我得到「System.ArgumentException」:列''不屬於表。「int this line:dataRow [keyValue [0]] = keyValue [1]; – Sarra

+2

堆棧溢出不是調試器的替代品。當*你*調試這個,特別是這個錯誤發生在哪裏?什麼時候發生的運行時間值?你爲什麼要尋找一個空字符串作爲名字的列? – David

回答

1

您可以將列的foreach轉換爲一個循環。

public static DataTable convertStringToDataTable(string data) 
    { 
     DataTable dataTable = new DataTable(); 
     bool columnsAdded = false; 
     foreach (string row in data.Split('\n')) 
     { 
      DataRow dataRow = dataTable.NewRow(); 
      string[] cell = row.Split(','); 
      for (int i = 0; i < cell.Length; i++) 
      { 
       string[] keyValue = cell[i].Split('"'); 
       if (!columnsAdded) 
       { 
        DataColumn dataColumn = new DataColumn(); 
        dataTable.Columns.Add(dataColumn); 
       } 
       dataRow[i] = keyValue[1]; 
      } 
      columnsAdded = true; 
      dataTable.Rows.Add(dataRow); 
     } 
     return dataTable; 
    } 

但是,如果你分裂的String [] =的keyValue cell.Split(「「」);沒有返回你期待什麼,你可能需要進一步調查

+0

感謝Scrobi回覆工作幫助我 – Sarra

2

我想你想從一個字符串創建一個DataTable。所以首先拆分「行」,然後是「列」。您正在行循環中添加DataColumns。在循環之前你只需要一次。這裏是處理這個問題和其他邊緣情況另一個實現你還沒有考慮:

public static DataTable ConvertStringToDataTable(string data) 
{ 
    DataTable dataTable = new DataTable(); 
    // extract all lines: 
    string[] lines = data.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries); 
    string header = lines.FirstOrDefault(); 
    if (header == null) 
     return dataTable; 
    // first create the columns: 
    string[] columns = header.Split(','); // using commas as delimiter is brave ;) 
    foreach (string col in columns) 
     dataTable.Columns.Add(col.Trim()); 

    foreach (string line in lines.Skip(1)) 
    { 
     string[] fields = line.Split(','); 
     if(fields.Length != dataTable.Columns.Count) 
      continue; // should not happen 

     DataRow dataRow = dataTable.Rows.Add(); 
     for (int i = 0; i < fields.Length; i++) 
      dataRow.SetField(i, fields[i]); 
    } 
    return dataTable; 
} 
+0

關於分隔符的好評,他們會在以後確定。 –

+0

感謝蒂姆回覆,我得到了一個例外,我試圖修復它 – Sarra

+0

@Sarra:我會盡力幫助,如果你提到它。 –