如何从内存流中获取所有数据到 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;
}

}

希望这对您有所帮助 :)