2016-12-12 1 views
1

다음은 데이터를 CSV로 내보내는 방법입니다.memorystream에서 모든 데이터를 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 

레코드 수가 100 개 미만인 경우 문제가 없습니다. 그러나 데이터가 100 또는 150+ 일 때 마지막 15-20 레코드는 CSV 파일에 기록되지 않습니다.

레코드 수가 175면 약 csv가 약 163가됩니다. 레코드 수가 150면 csv arounf 131 & 등이됩니다.

무엇이 원인 일 수 있습니까? 어떻게해야합니까?

+0

왜 writer.Flush()와 writer.Close을() 주석습니까? 이 shloud StreamStream의 내부 버퍼를 MemoryStream으로 플러시하고 문제를 해결하십시오. –

+0

@ Àuuf, 나는 단지 주석을 달았지만 여전히 같은 문제에 체크했다. –

+0

그래서 나는 그것을 보지 않지만 이것과 비슷한 문제가 하나 더 있습니다. swObj.ToString()이 모든 레코드를 반환하는지 확인할 수 있습니까? 이렇게하면 문제가 ExportToCsv() 또는 JsonToCsv()에 있는지 여부를 알 수 있습니다. –

답변

1

public 방법의 작은 업데이트로 내 문제가 해결되었습니다.

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; 
} 

}

희망이 도움이 :)

관련 문제