示例#1
0
        /// <summary>
        /// 設定されているカラム情報を使って、結果オブジェクトを作成。
        /// </summary>
        /// <param name="headers"></param>
        /// <param name="lines"></param>
        /// <returns></returns>
        IEnumerable <T> CreateObjects(IEnumerable <string> headers, IList <IEnumerable <string> > lines)
        {
            headers = headers ?? this.CreateHeaders();
            var result = new List <T>();

            foreach (var values in lines)
            {
                var item = new T();
                for (var i = 0; i < headers.Count(); i++)
                {
                    var header = headers.ElementAt(i);
                    var column = this._columns.Where(x => x.ColumnName == header).SingleOrDefault();
                    if (column == null)
                    {
                        continue;
                    }

                    var value = column.IsConstantValue ? column.ConstantValue : values.ElementAt(i);
                    if (string.IsNullOrEmpty(value))
                    {
                        continue;
                    }

                    object current       = item;
                    var    propertyChain = ExpressionUtil.GetPropertyChain(column.Property).Reverse();
                    for (var j = 0; j < propertyChain.Count() - 1; j++)
                    {
                        var chainItem = propertyChain.ElementAt(j);
                        var cValue    = chainItem.Value.GetValue(current) ?? Activator.CreateInstance(chainItem.Value.PropertyType);
                        chainItem.Value.SetValue(current, cValue);
                        current = cValue;
                    }

                    var lastItem = propertyChain.Last();
                    if (column.Converter != null)
                    {
                        lastItem.Value.SetValue(current, column.Converter.CsvToObject(value));
                    }
                    else
                    {
                        lastItem.Value.SetValue(current, lastItem.Value.Converter.ConvertFrom(value));
                    }
                }

                result.Add(item);
            }

            return(result);
        }
示例#2
0
        /// <summary>
        /// CSVファイルにエクスポート。
        /// </summary>
        /// <param name="source">エクスポートを行うオブジェクトのリスト</param>
        /// <param name="filePath">ファイルパス</param>
        /// <param name="encoding">ファイルのエンコード(既定はUTF-8)</param>
        public void Export(IEnumerable <T> source, string filePath, Encoding encoding = null)
        {
            var result    = new List <string>();
            var delimiter = string.IsNullOrEmpty(this.Delimiter) ? DEFAULT_DELIMITER : this.Delimiter;

            if (this.IsContainHeader)
            {
                result.Add(this.CreateHeader(delimiter));
            }

            foreach (var item in source)
            {
                var values = new List <string>();

                foreach (var column in this._columns)
                {
                    if (column.IsConstantValue)
                    {
                        values.Add(column.ConstantValue);
                    }
                    else
                    {
                        var    propertyChain = ExpressionUtil.GetPropertyChain(column.Property);
                        object value         = item;
                        foreach (var chainItem in propertyChain.Reverse())
                        {
                            value = chainItem.Value.GetValue(value);
                        }

                        if (column.Converter != null)
                        {
                            values.Add(column.Converter.ObjectToCsv(value));
                        }
                        else
                        {
                            values.Add(value != null ? value.ToString() : string.Empty);
                        }
                    }
                }

                result.Add(string.Join(delimiter, values));
            }

            encoding = encoding ?? Encoding.UTF8;
            File.WriteAllLines(filePath, result, encoding);
        }