wie man all die Daten im CSV-Format aus dem memorystream?

Unten ist meine Methode zum exportieren von Daten in 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

Wenn die Anzahl der Datensätze kleiner als 100 ist.Dann kein Problem. Aber wenn die Daten mit 100 oder 150+ , letzten 15-20records sind nicht geschrieben, um die csv-Datei.

Angenommen, wenn die Anzahl der Datensätze ist auf 175, dann bekomme ich in der csv etwas um 163.
Wenn die Anzahl der Datensätze ist 150 dann bekomme ich in der csv-arounf 131 & so weiter.

Was könnte die Ursache HIERFÜR ? Wie soll ich umgehen?

  • Warum haben Sie sich Kommentar-Schreiber.Flush() und writer.Schließen() ? Diese shloud flush internen Puffer von StreamWriter zu MemoryStream und lösen Ihr problem.
  • Ich habe gerade überprüft mit Einkommentieren Sie aber immer noch dasselbe Problem.
  • Also es gibt wohl noch ein problem ähnlich wie diese, obwohl ich es nicht sehen. Könnten Sie überprüfen, ob swObj.ToString() gibt alle Datensätze zurück? Dies sollte uns einen Hinweis geben, ob problem ist in ExportToCsv() oder JsonToCsv().
  • BTW können Sie konvertieren von string zu byte-array viel einfacher, mit System.Text.- Codierung.UTF8.GetBytes(JsonToCsv(jsonData, „,“)), ohne die Notwendigkeit für StreamWriter oder MemoryStream, und vermeiden damit problem mit StreamWriter Pufferung.
  • Ich überprüfte einige Stunden zurück auf swObj.ToString() . Es hat die richtige Anzahl der Datensätze
  • Das reduziert mögliche Quelle des Problems zu StreamWriter, MemoryStream und HttpResponseBase in ConvertToCsv () – Methode. Wo genau vermissen Sie Ihre Unterlagen, ist es im HttpResponse oder in MemoryStream zurück von ConvertToCsv Methode? Denn jetzt erkannte ich, dass MemoryStream zurück von ConvertToCsv () – Methode wird Entsorgt – obwohl das vielleicht kein problem, die Sie suchen, ist es zumindest seltsam, Rückkehr entsorgt Objekt als Ergebnis der Funktion.
  • Bitte haben Sie einen Blick auf das ans.

InformationsquelleAutor Kgn-web | 2016-12-12



One Reply
  1. 1

    Einer Reihe kleiner updates in meinem public Methode behoben mein Problem.

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

    }

    Hoffe, das hilft 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.