【发布时间】:2017-04-27 03:14:42
【问题描述】:
以下是我将数据导出为 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 arouf 131 等等。
这可能是什么原因造成的?我该如何处理?
【问题讨论】:
-
为什么注释掉 writer.Flush() 和 writer.Close() ?这应该将 StreamWriter 的内部缓冲区刷新到 MemoryStream 并解决您的问题。
-
@Ňuf,我刚刚检查了取消注释它们,但仍然是同样的问题。
-
所以可能还有一个类似的问题,虽然我没有看到。你能检查一下 swObj.ToString() 是否返回所有记录吗?这应该可以提示我们问题出在 ExportToCsv() 还是 JsonToCsv() 中。
-
顺便说一句,您可以使用 System.Text.Encoding.UTF8.GetBytes(JsonToCsv(jsonData, ",")) 更轻松地将字符串转换为字节数组,而不需要 StreamWriter 或 MemoryStream,从而避免潜在问题使用 StreamWriter 的缓冲。
-
@Ňuf。 :) 我在 swObj.ToString() 上检查了几个小时。它有正确数量的记录
标签: c# asp.net export-to-csv memorystream csvhelper