将自定义类映射并写入csv

时间:2018-08-14 14:09:54

标签: c# csv export-to-csv csvhelper

我正在尝试使用CsvHelper将一些数据输出到CSV文件。下面的CSVExport的每个实例一行。由于Stores上的长度可能不同,所以每一行的列数可能会有所不同。映射适用于前三个属性(CurrencyCode,StoreCode,OutletTradingName),但是我在List<Stores> Stores上遇到了问题。

我目前收到以下带有以下代码的错误消息:

{"Converting IEnumerable types is not supported for a single field. If you want to do this, create your own ITypeConverter and register it in the TypeConverterFactory by calling AddConverter."}

关于如何解决此问题的任何建议?

要写入CSV文件的C#代码:

var memoryStream = new System.IO.MemoryStream();
var streamWriter = new System.IO.StreamWriter(memoryStream);
using (var csvWriter = new CsvWriter(streamWriter))
{
    csvWriter.Configuration.RegisterClassMap<CSVExportMap>();
    csvWriter.WriteRecords(csvExport);
    streamWriter.Flush();
}

映射:

public sealed class CSVExportMap : CsvClassMap<CSVExport>
{
    public CSVExportMap()
    {
        Map(m => m.CurrencyCode).Name("Outlet Currency").Default("Not available.");
        Map(m => m.StoreCode).Name("Store No.").Default("Not available.");
        Map(m => m.OutletTradingName).Name("Outlet Trading  Name").Default("Not available.");

        // if I comment this line out, I get no error but no list of stores
        Map(m => m.Stores).ConvertUsing( row => new List<Stores> { row.GetRecord<Stores>() } );
    }
}

我正尝试输出到CSV文件的类:

public class CSVExport
{
    public string StoreCode { get; set; }
    public string OutletTradingName { get; set; }
    public string CurrencyCode { get; set; }
    public List<Stores> Stores { get; set; }
}

public class Stores
{
    public string Name { get; set; }
    public string StoreCode { get; set; }
    public string ID { get; set; }
}

1 个答案:

答案 0 :(得分:1)

确保您拥有CsvHelper的最新版本。 (当前为v7.1.1)我尝试了您的代码并替换了以下行:

Map(m => m.Stores).ConvertUsing( row => new List<Stores> { row.GetRecord<Stores>() } );

与此:

Map(m => m.Stores).ConvertUsing(row =>
{
    var list = new List<Store>();
    list.Add(row.GetField<Store>(2));
    return list;
});

或更短(单线):

Map(m => m.Stores).ConvertUsing(row => new List<Store> {row.GetField<Store>(2)});

,程序运行正常。 GetField<Store>(2)中的索引从零开始,您的Store类具有3个成员。我只是将您的Stores类重命名为Store(仅用于命名约定!这与Stores list属性混淆!对不起)

我使用了这个技巧: Writing a collection that contains collections