我有一个具有从服务器获取的各种字段的工作者。我正在使用csvhelper包将该类转换为excel工作表。
worker有如下字段:
class Worker
{
string name;
string phone;
string age;
Dictionary<string,object> customerField;
}
我可以把名字、电话、号码等映射出来。
class WorkerMap : CsvClassMap<Worker>
{
public WorkerMap()
{
Map(m => m.name);
Map(m => m.phone);
Map(m => m.age);
}
}
我通过以下方法生成地图:
csv.Configuration.RegisterClassMap<WorkerMap>();
填写工人名单:
csv.WriteRecords(workerList);
如何将CuuleFieldEngy映射到Excel表,使得键(string)是另一个列名,而值(object)是列的值。
csvhelper是否在运行时帮助我们这样做。我查阅了文件。找不到对我有用的东西。
最佳答案
我认为现在不支持写字典。首先,csvhelper很难知道要写什么头。幸运的是,手动使用csvwriter并不太复杂,一次编写一个字段。如果我们假设每个worker在customerField
中都有相同的键,那么您的代码可能看起来像这样。
var firstWorker = workerList.First();
var keys = firstWorker.customerField.Keys.ToList();
var headers = new []{ "name", "phone", "age"}.Concat(keys).ToList();
var csv = new CsvWriter( textWriter );
// Write the headers
foreach( var header in headers )
{
csv.WriteField(header);
}
csv.NextRecord();
// Write the rows
foreach( var item in workerList)
{
csv.WriteField(item.name);
csv.WriteField(item.phone);
csv.WriteField(item.age);
var dict = worker.customerField;
foreach (var key in keys)
{
csv.WriteField(dict[key]);
}
csv.NextRecord();
}
这段代码未经测试,但应该能让您非常接近所需的行为。如果
customerField
字典键在列表中不一致,那么代码会更复杂一些,但仍然可以解决。关于c# - 使用csvHelper动态创建列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42134421/