123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq.Expressions;
- using System.Reflection;
- using System.Text;
- namespace InABox.Core
- {
- [UserTracking(false)]
- public class ExportColumn : Entity, ILicense<CoreLicense>
- {
- public string Property { get; set; }
- public string Name { get; set; }
- public string Format { get; set; }
- }
- public abstract class AbstractExporter
- {
- protected static PropertyInfo GetProperty<T>(Expression<Func<T, object>> expression)
- {
- var member = expression.Body as MemberExpression;
- if (member == null)
- {
- var unary = expression.Body as UnaryExpression;
- member = (MemberExpression)unary.Operand;
- }
- return (PropertyInfo)member.Member;
- }
- public abstract void Export<T>(Stream stream, IEnumerable<T> items, Dictionary<string, Expression<Func<T, object>>> expressions);
- public abstract void Export(Stream stream, IEnumerable items, Dictionary<string, string> properties);
- public abstract void Export(Stream stream, IEnumerable items, IEnumerable<ExportColumn> columns);
- public abstract void Export(Stream stream, CoreTable table);
- public void Export<T>(Stream stream, IEnumerable<T> items)
- {
- var expressions = new Dictionary<string, Expression<Func<T, object>>>();
- var properties = typeof(T).GetTypeInfo().GetProperties();
- foreach (var propInfo in properties)
- {
- var parameter = Expression.Parameter(typeof(T));
- var property = Expression.Property(parameter, propInfo);
- var conversion = Expression.Convert(property, typeof(object));
- var lambda = Expression.Lambda<Func<T, object>>(conversion, parameter);
- expressions[propInfo.Name] = lambda;
- }
- Export(stream, items, expressions);
- }
- }
- public abstract class DelimitedExporter : AbstractExporter
- {
- protected char Delimiter = char.MinValue;
- public override void Export<T>(Stream stream, IEnumerable<T> items, Dictionary<string, Expression<Func<T, object>>> expressions)
- {
- using (var sw = new StreamWriter(stream, Encoding.Unicode))
- {
- var row = new List<string>();
- foreach (var column in expressions.Keys)
- row.Add(column);
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- foreach (var item in items)
- {
- row.Clear();
- foreach (var column in expressions.Keys)
- {
- var expression = expressions[column];
- if (expression != null)
- {
- var f = expression.Compile();
- var o = f.Invoke(item);
- row.Add(o != null ? o.ToString() : "");
- }
- else
- {
- row.Add("");
- }
- }
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- }
- }
- }
- public override void Export(Stream stream, IEnumerable items, Dictionary<string, string> properties)
- {
- using (var sw = new StreamWriter(stream, Encoding.Unicode))
- {
- var row = new List<string>();
- foreach (var column in properties.Keys)
- row.Add(column);
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- foreach (var item in items)
- {
- row.Clear();
- foreach (var column in properties.Keys)
- {
- var property = properties[column];
- if (!string.IsNullOrEmpty(property))
- {
- var o = CoreUtils.GetPropertyValue(item, property);
- row.Add(o != null ? o.ToString() : "");
- }
- else
- {
- row.Add("");
- }
- }
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- }
- }
- }
- public override void Export(Stream stream, IEnumerable items, IEnumerable<ExportColumn> columns)
- {
- using (var sw = new StreamWriter(stream, Encoding.Unicode))
- {
- var row = new List<string>();
- foreach (var column in columns)
- row.Add(column.Name);
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- if (items != null)
- foreach (var item in items)
- {
- row.Clear();
- foreach (var column in columns)
- {
- var property = column.Property;
- if (!string.IsNullOrEmpty(property))
- {
- var o = CoreUtils.GetPropertyValue(item, property);
- var fmt = "{0" + (string.IsNullOrWhiteSpace(column.Format) ? "" : ":" + column.Format) + "}";
- row.Add(o != null ? string.Format(fmt, o) : "");
- }
- else
- {
- row.Add("");
- }
- }
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- }
- }
- }
- public override void Export(Stream stream, CoreTable table)
- {
- using (var sw = new StreamWriter(stream, Encoding.Unicode))
- {
- var row = new List<string>();
- foreach (var column in table.Columns)
- row.Add(column.ColumnName);
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- foreach (var datarow in table.Rows)
- {
- row.Clear();
- foreach (var column in table.Columns)
- {
- var o = datarow[column.ColumnName];
- row.Add(o != null ? o.ToString() : "");
- }
- sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
- }
- }
- ;
- }
- }
- public class CSVExporter : DelimitedExporter
- {
- public CSVExporter()
- {
- Delimiter = ',';
- }
- }
- public class TabExporter : DelimitedExporter
- {
- public TabExporter()
- {
- Delimiter = '\t';
- }
- }
- }
|