2016-12-12 9 views
1

Unten ist meine Methode, Daten in CSV zu exportieren.Wie bekomme ich alle Daten vom Arbeitsspeicher in CSV?

public MemoryStream ExportToCsv(string jsonData, HttpResponseBase response, string fileName) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     StreamWriter writer = new StreamWriter(stream); 
     try 
     { 
      String s = JsonToCsv(jsonData, ","); 
      writer.Write(s); 
      stream.Position = 0; 
     } 
     catch (Exception ex) 
     { 
      clsErrorHandling.WriteLog("CSVExport", "GenerateStreamFromString", ex.Message); 
      throw; 
     } 
     finally 
     { 
      writer.Flush(); 
      writer.Close(); 
      response.Clear(); 
      response.Buffer = true; 
      response.ContentType = "application/csv"; 
      response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ""); 
      response.BinaryWrite(stream.ToArray()); 
     } 

     return stream; 
    } 
} 

#region Private CSV Block 

private String JsonToCsv(string jsonData, string delimiter) 
{ 
    try 
    { 
     using (StringWriter swObj = new StringWriter()) 
     { 
      using (var csv = new CsvWriter(swObj)) 
      { 
       csv.Configuration.SkipEmptyRecords = true; 
       csv.Configuration.WillThrowOnMissingField = false; 
       csv.Configuration.Delimiter = delimiter; 

       using (var dt = jsonStringToTable(jsonData)) 
       { 
        foreach (DataColumn col in dt.Columns) 
        { 
         csv.WriteField(col.ColumnName); 
        } 
        csv.NextRecord(); 

        foreach (DataRow row in dt.Rows) 
        { 
         for (var i = 0; i < dt.Columns.Count; i++) 
         { 
          csv.WriteField(row[i]); 
         } 
         csv.NextRecord(); 
        } 
       } 

      } 
      return swObj.ToString(); 
     } 

    } 
    catch (Exception ex) 
    { 
     clsErrorHandling.WriteLog("CSVExportHandler", "JsonToCsv", ex.Message); 
     return null; 
    } 
} 

private DataTable jsonStringToTable(string jsonContent) 
{ 
    DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent); 
    return dt; 
} 

#endregion 

Wenn die Anzahl der Datensätze ist weniger als 100.Then kein Problem. Wenn die Daten jedoch 100 oder 150+ sind, werden die letzten 15-20 Datensätze nicht in die CSV-Datei geschrieben.

Angenommen, die Anzahl der Datensätze ist 175, dann bekomme ich in csv einige um 163. Wenn die Anzahl der Datensätze ist 150 dann bekomme ich in csv aroun 131 & so weiter.

Was könnte das verursachen? Wie soll ich damit umgehen?

+0

Warum hast du einen Kommentar aus writer.Flush() und writer.Close()? Dies spült interne Puffer von StreamWriter zu MemoryStream und löst Ihr Problem. –

+0

@ Ňuf, ich habe gerade mit Uncommenting sie aber immer noch das gleiche Problem. –

+0

Also gibt es wahrscheinlich ein weiteres ähnliches Problem, obwohl ich es nicht sehe. Könnten Sie überprüfen, ob swObj.ToString() alle Datensätze zurückgibt? Dies sollte uns einen Hinweis geben, ob das Problem in ExportToCsv() oder JsonToCsv() liegt. –

Antwort

1

Eine Reihe kleiner Updates in meiner public Methode behoben mein Problem.

public MemoryStream ExportToCsv(string jsonData, HttpResponseBase response, string fileName) 
{ 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      StreamWriter writer = new StreamWriter(stream); 
      try 
      { 
       response.Clear(); 
       response.Buffer = true; 
       response.ContentType = "application/csv"; 
       response.AddHeader("Content-Disposition", "attachment; filename=" + fileName + ""); 
       String s = JsonToCsv(jsonData, ","); 
       writer.Write(s); 
       writer.Flush(); 

       stream.Position = 0; 
       response.BinaryWrite(stream.ToArray()); 
      } 
      catch (Exception ex) 
      { 

       throw; 
      } 
      finally 
      { 
       writer.Close(); 
      } 
    return stream; 
} 

}

this helps :)

Verwandte Themen