CsvHelper: добавление заголовка с помощью CsvHelper - PullRequest
0 голосов
/ 21 мая 2019

Я использую CsvHelper для преобразования более привлекательных объектов в CsvFiles. Я использую классы для отображения свойств для индексов и сопоставления имен. Проблема в том, что мне нужно строка с заголовком таблицы , прежде чем записи будут записаны, как указано ниже:

enter image description here

Мой старый код без заголовка:

  using (var writer = new StreamWriter(@"C:\Users\NPandian\Desktop\test.csv", false, System.Text.Encoding.UTF8))

        using (var csvWriter = new CsvWriter(writer))
        {
            var ReportName = "Test Class";
            csvWriter.Configuration.RegisterClassMap(classMap);
            csvWriter.WriteRecords(records);
            writer.Close();
        }

Старый CSV:

enter image description here

Моя текущая работа вокруг кода:

            using (var writer = new StringWriter())
            using (var csvWriter = new CsvWriter(writer))
            {
                var ReportName = "Test Class";
                csvWriter.Configuration.RegisterClassMap(classMap);
                csvWriter.WriteRecords(records);
                writer.Close();
                return $"ReportName:, {ReportName},\n{csvWriter.Context.Writer.ToString()}";
            }

Мои вопросы: 1) Возможно ли это с CsvHelper? 2) Если да, то как?

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Вы можете писать поля и строки вручную.

void Main()
{
    var records = new List<Foo>
    {
        new Foo { Id = 1, Name = "one" },
        new Foo { Id = 2, Name = "two" },
    };
    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer))
    {
        csv.Configuration.RegisterClassMap<FooMap>();

        csv.WriteField("Title:");
        csv.WriteField("Title");
        csv.NextRecord();

        csv.WriteRecords(records);
        writer.ToString().Dump();
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id).Index(0).Name("S.No.");
        Map(m => m.Name).Index(1);
    }
}

Выход:

Title:,Title
S.No.,Name
1,one
2,two
1 голос
/ 21 мая 2019

CSV-файлы не имеют заголовков. Вопрос описывает простой текстовый отчет, а не файл CSV. CsvHelper, как следует из названия, является вспомогательной библиотекой, которая пишет CSV, а не полнофункциональным генератором отчетов.

Библиотека позволяет другому коду писать произвольный текст до или после его завершения, поскольку она работает поверх абстрактного TextWriter вместо потока или файла. Можно даже написать дополнительный текст между записями, если требуется.

Вы можете использовать writer, вам уже нужно написать, что вы хотите, до или после вызова на csvWriter.WriteRecords(records);, например:

using (var writer = new StreamWriter(@"C:\Users\NPandian\Desktop\test.csv", false, System.Text.Encoding.UTF8))
using (var csvWriter = new CsvWriter(writer))
{
    var ReportName = "Test Class";
    csvWriter.Configuration.RegisterClassMap(classMap);

    //Doesn't matter where this is called as long as it is before `WriteRecords`
    writer.WriteLine($"ReportName:, {ReportName}");

    csvWriter.WriteRecords(records);

    //No need to explicitly close, that's what `using` is for
}

CsvWriter принимает любой TextWriter объект и просто записывает свои данные этому автору. Он не пытается изменить его каким-либо другим способом. Это не повлияет на любой другой текст, уже написанный для этого TextWriter

...