我使用CsvHelper将dapper对象转换为CsvFiles。我使用类映射来映射索引和名称映射的属性。问题是,在编写记录之前,我需要一个带有表标题的行,如下所述:

我的旧代码没有标题:
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:

我目前围绕代码所做的工作:
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)如果有,怎么做?
发布于 2019-05-21 14:12:20
您可以手工编写字段和行。
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发布于 2019-05-21 13:02:13
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的任何其他文本
发布于 2020-02-06 11:13:45
对于CSVHelper版本15.0.0及以上版本,请使用:
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, CultureInfo.CurrentCulture))
{
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);
}
}https://stackoverflow.com/questions/56238544
复制相似问题