59

私は次の方法を持っています:

public byte[] WriteCsvWithHeaderToMemory<T>(IEnumerable<T> records) where T : class
{
    using (var memoryStream = new MemoryStream())
    using (var streamWriter = new StreamWriter(memoryStream))
    using (var csvWriter = new CsvWriter(streamWriter))
    {
        csvWriter.WriteRecords<T>(records);

        return memoryStream.ToArray();
    }
}

これはオブジェクトのリストで呼び出されます-最終的にはデータベースからですが、何かが機能していないため、静的コレクションにデータを入力しているだけです。渡されるオブジェクトは次のとおりです。

using CsvHelper.Configuration;

namespace Application.Models.ViewModels
{
    public class Model
    {
        [CsvField(Name = "Field 1", Ignore = false)]
        public string Field1 { get; set; }

        [CsvField(Name = "Statistic 1", Ignore = false)]
        public int Stat1{ get; set; }

        [CsvField(Name = "Statistic 2", Ignore = false)]
        public int Stat2{ get; set; }

        [CsvField(Name = "Statistic 3", Ignore = false)]
        public int Stat3{ get; set; }

        [CsvField(Name = "Statistic 4", Ignore = false)]
        public int Stat4{ get; set; }
    }
}

私がやろうとしているのは、MVCアプリケーションにダウンロードするためにコレクションをcsvに書き込むことです。ただし、メソッドに書き込もうとするたびに、MemoryStreamは長さがゼロで戻ってきて、何も渡されません。私は以前にこれを使用しましたが、何らかの理由で機能していません-少し混乱しています。私がここで間違ったことを誰かが私に指摘できますか?

乾杯

4

5 に答える 5

42

csvWriter.Flush();ライター/ストリームをフラッシュするために戻る前に置きます。

編集:ジャックの応答ごと。csvWriter ではなく、フラッシュされるストリームである必要があります。streamWriter.Flush();. 元の解決策を残しますが、この修正を追加します。

編集 2:私の好みの答えは: https://stackoverflow.com/a/22997765/1795053

于 2012-11-30T16:30:14.717 に答える
27

メモリストリームの位置をリセットすることを含め、これらすべて(および修正のためのコメント)をまとめると、私にとっての最終的な解決策は次のとおりです。

        using (MemoryStream ms = new MemoryStream())
        {
            using (TextWriter tw = new StreamWriter(ms))
            using (CsvWriter csv = new CsvWriter(tw))
            {
                csv.WriteRecords(errors); // Converts error records to CSV

                tw.Flush(); // flush the buffered text to stream
                ms.Seek(0, SeekOrigin.Begin); // reset stream position

                Attachment a = new Attachment(ms, "errors.csv"); // Create attachment from the stream
                // I sent an email here with the csv attached.
            }
        }

他の誰かを助ける場合に備えて!

于 2016-10-26T06:41:14.830 に答える
9

csvWriter にはフラッシュはありません。フラッシュは streamWriter にあります。呼び出されたとき

csvWriter.Dispose();

ストリームをフラッシュします。別のアプローチは、設定することです

streamWriter.AutoFlush = true;

これにより、毎回ストリームが自動的にフラッシュされます。

于 2012-12-19T08:10:57.040 に答える