如何从内存流中获取所有数据到 CSV?
how to get all the data to CSV from 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.Then 没问题。但是当数据为 100 或 150+ 时,最后 15-20 条记录不会写入 csv 文件。
假设如果记录数是175条,那么我得到的csv大约是163条左右。
如果记录数是 150,那么我将进入 csv arounf 131 等等。
这可能是什么原因造成的?我该如何处理?
我的 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;
}
}
希望这对您有所帮助 :)
下面是我将数据导出到 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.Then 没问题。但是当数据为 100 或 150+ 时,最后 15-20 条记录不会写入 csv 文件。
假设如果记录数是175条,那么我得到的csv大约是163条左右。 如果记录数是 150,那么我将进入 csv arounf 131 等等。
这可能是什么原因造成的?我该如何处理?
我的 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;
}
}
希望这对您有所帮助 :)