在C#中将包含ObservableCollection的类导出为csv

时间:2013-04-05 09:39:24

标签: csv export

我找到了许多将类导出为CSV的解决方案,但问题是:

我正在尝试导出的类具有一个可观察集合的属性。例如:

public class ShipmentForExport
    {
        public string WaybillNumber { get; set; }
        public DateTime WaybillDate { get; set; }
        public string CustomerName { get; set; }
        public string CustomerCode { get; set; }
        public string CollectingBranchName { get; set; }
        public string CollectingBranchCode { get; set; }
        public string RecipientName { get; set; }
        public string RecipientPhoneNumber { get; set; }
        public string RecipientCellphoneNumber { get; set; }
        public string RecipientCompany { get; set; }
        public string DestinationAddress1 { get; set; }
        public string DestinationAddress2 { get; set; }
        public string DestinationCity { get; set; }
        public string DestinationSuburb { get; set; }
        public string DestinationProvince { get; set; }
        public string DestinationCountry { get; set; }
        public string DestinationPostalCode { get; set; }

        ***public ObservableCollection<InHouseParcel> Parcels { get; set; }***

    }

当我尝试将货件列表导出到csv时,它可以正常工作,但显然包裹不会按我希望的方式导出。

我也尝试过使用Filehelpers Library和csvHelper。

非常感谢任何帮助!!

2 个答案:

答案 0 :(得分:0)

使用CsvHelper(我维护的库)......

编写时,您必须手动编写,因为不支持编写集合属性。

foreach( var record in records )
{
    csv.WriteField( record.WaybillNumber );
    ...
    foreach( var parcel in record.Parcels )
    {
        csv.WriteField( parcel );
    }
}

阅读更容易,因为您可以在映射中添加它。

Map( m => m.Parcels ).ConvertUsing( row =>
{
    var oc = new ObservableCollection<InHouseParcel>();
    var parcel = row.GetField<InHouseParcel>( 17 );
    oc.Add( parcel );
} );

您需要将字段值转换为InHouseParcel并循环遍历行中的其余字段。我会把这个任务留给你。

答案 1 :(得分:0)

Josh的答案现在已经过时了。您可以使用类似的转换器:

CsvHelper.TypeConversion.TypeConverterFactory.AddConverter<ObservableCollection<string>>(new CsvHelper.TypeConversion.StringListConverter());

using (var txt = new StreamReader(filename))
using (var reader = new CsvHelper.CsvReader(txt))
{ .... }



namespace CsvHelper.TypeConversion
{
public sealed class StringListConverter : DefaultTypeConverter
{
    public override object ConvertFromString(TypeConverterOptions options, string text)
    {
        var oc = new ObservableCollection<string>();
        if (text.IndexOf('|') >= 0)
        {
            var list = text.Split('|').ToList<string>();// base.ConvertFromString(options, text);
            oc = new ObservableCollection<string>(list);
        }
        return oc;
    }

    public override string ConvertToString(TypeConverterOptions options, object value)
    {
        var l = value as IEnumerable<string>;
        if ( l == null || l.Count() == 0)
        {
            return "";
        }

        return string.Join("|", l);
    }

    public override bool CanConvertFrom(Type type)
    {
        return type == typeof(string);
    }
}

}