【问题标题】:how to get all the data to CSV from memorystream?如何从内存流中获取所有数据到 CSV?
【发布时间】: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


【解决方案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;
}

}

希望这会有所帮助:)

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2022-07-20
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多