我正在使用 CsvHelper 库从
IEnumerable<Person>
生成 CSV 文件,其中 Person
是一个基本类。
public class Person
{
public string DisplayName { get; set; }
public int Age { get; set; }
}
我需要编写带引号的标题,即结果文件中的列应该是“显示名称”,而不是“显示名称”。
我该怎么做?
创建一个
ClassMap
。
void Main()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvWriter(writer))
{
var records = new List<Person>
{
new Test { DisplayName = "one", Age = 1},
new Test { DisplayName = "two", Age = 2 },
};
csv.Configuration.RegisterClassMap<PersonMap>();
csv.WriteRecords(records);
writer.Flush();
stream.Position = 0;
Console.WriteLine(reader.ReadToEnd());
}
}
public class Person
{
public string DisplayName { get; set; }
public int Age { get; set; }
}
public sealed class PersonMap : ClassMap<Person>
{
public PersonMap()
{
Map(m => m.DisplayName).Name("Display Name");
Map(m => m.Age);
}
}
输出:
Display Name,Age
one,1
two,2
我没有带有解决方法的标题,所以我做了这个快速解决方法:
foreach (var property in typeof(MyCsvClass).GetProperties())
{
csvWriter.WriteField(property.Name.Replace('_', ' '));
}
csvWriter.NextRecord();
csvWriter.WriteRecords(models);
这需要属性名称并将下划线替换为空格,因此我可以使用下划线而不是空格来命名属性,并且它映射正确。
但是,它要求您使用 CsvWriter 上的
HasHeaderRecord = false
选项。
使用 Attributes
配置标头名称以人为例:
public class Person
{
[Name("Display Name")]
public string DisplayName { get; set; }
[Name("Age")]
public int Age { get; set; }
}
另一个例子:
using CsvHelper.Configuration.Attributes;
public class CompanyExportData
{
[Name("Company Code")]
public string DisplayName { get; set; } = "Store";
[Name("Employee Number")]
public string EmployeeNumber { get; set; }
[Name("Primary Email Address")]
public string PrimaryEmailAddress { get; set; }
}