我有一个具有从服务器获取的各种字段的工作者。我正在使用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/

10-09 19:57