Export.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq.Expressions;
  6. using System.Reflection;
  7. using System.Text;
  8. namespace InABox.Core
  9. {
  10. [UserTracking(false)]
  11. public class ExportColumn : Entity, ILicense<CoreLicense>
  12. {
  13. public string Property { get; set; }
  14. public string Name { get; set; }
  15. public string Format { get; set; }
  16. }
  17. public abstract class AbstractExporter
  18. {
  19. protected static PropertyInfo GetProperty<T>(Expression<Func<T, object>> expression)
  20. {
  21. var member = expression.Body as MemberExpression;
  22. if (member == null)
  23. {
  24. var unary = expression.Body as UnaryExpression;
  25. member = (MemberExpression)unary.Operand;
  26. }
  27. return (PropertyInfo)member.Member;
  28. }
  29. public abstract void Export<T>(Stream stream, IEnumerable<T> items, Dictionary<string, Expression<Func<T, object>>> expressions);
  30. public abstract void Export(Stream stream, IEnumerable items, Dictionary<string, string> properties);
  31. public abstract void Export(Stream stream, IEnumerable items, IEnumerable<ExportColumn> columns);
  32. public abstract void Export(Stream stream, CoreTable table);
  33. public void Export<T>(Stream stream, IEnumerable<T> items)
  34. {
  35. var expressions = new Dictionary<string, Expression<Func<T, object>>>();
  36. var properties = typeof(T).GetTypeInfo().GetProperties();
  37. foreach (var propInfo in properties)
  38. {
  39. var parameter = Expression.Parameter(typeof(T));
  40. var property = Expression.Property(parameter, propInfo);
  41. var conversion = Expression.Convert(property, typeof(object));
  42. var lambda = Expression.Lambda<Func<T, object>>(conversion, parameter);
  43. expressions[propInfo.Name] = lambda;
  44. }
  45. Export(stream, items, expressions);
  46. }
  47. }
  48. public abstract class DelimitedExporter : AbstractExporter
  49. {
  50. protected char Delimiter = char.MinValue;
  51. public override void Export<T>(Stream stream, IEnumerable<T> items, Dictionary<string, Expression<Func<T, object>>> expressions)
  52. {
  53. using (var sw = new StreamWriter(stream, Encoding.Unicode))
  54. {
  55. var row = new List<string>();
  56. foreach (var column in expressions.Keys)
  57. row.Add(column);
  58. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  59. foreach (var item in items)
  60. {
  61. row.Clear();
  62. foreach (var column in expressions.Keys)
  63. {
  64. var expression = expressions[column];
  65. if (expression != null)
  66. {
  67. var f = expression.Compile();
  68. var o = f.Invoke(item);
  69. row.Add(o != null ? o.ToString() : "");
  70. }
  71. else
  72. {
  73. row.Add("");
  74. }
  75. }
  76. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  77. }
  78. }
  79. }
  80. public override void Export(Stream stream, IEnumerable items, Dictionary<string, string> properties)
  81. {
  82. using (var sw = new StreamWriter(stream, Encoding.Unicode))
  83. {
  84. var row = new List<string>();
  85. foreach (var column in properties.Keys)
  86. row.Add(column);
  87. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  88. foreach (var item in items)
  89. {
  90. row.Clear();
  91. foreach (var column in properties.Keys)
  92. {
  93. var property = properties[column];
  94. if (!string.IsNullOrEmpty(property))
  95. {
  96. var o = CoreUtils.GetPropertyValue(item, property);
  97. row.Add(o != null ? o.ToString() : "");
  98. }
  99. else
  100. {
  101. row.Add("");
  102. }
  103. }
  104. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  105. }
  106. }
  107. }
  108. public override void Export(Stream stream, IEnumerable items, IEnumerable<ExportColumn> columns)
  109. {
  110. using (var sw = new StreamWriter(stream, Encoding.Unicode))
  111. {
  112. var row = new List<string>();
  113. foreach (var column in columns)
  114. row.Add(column.Name);
  115. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  116. if (items != null)
  117. foreach (var item in items)
  118. {
  119. row.Clear();
  120. foreach (var column in columns)
  121. {
  122. var property = column.Property;
  123. if (!string.IsNullOrEmpty(property))
  124. {
  125. var o = CoreUtils.GetPropertyValue(item, property);
  126. var fmt = "{0" + (string.IsNullOrWhiteSpace(column.Format) ? "" : ":" + column.Format) + "}";
  127. row.Add(o != null ? string.Format(fmt, o) : "");
  128. }
  129. else
  130. {
  131. row.Add("");
  132. }
  133. }
  134. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  135. }
  136. }
  137. }
  138. public override void Export(Stream stream, CoreTable table)
  139. {
  140. using (var sw = new StreamWriter(stream, Encoding.Unicode))
  141. {
  142. var row = new List<string>();
  143. foreach (var column in table.Columns)
  144. row.Add(column.ColumnName);
  145. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  146. foreach (var datarow in table.Rows)
  147. {
  148. row.Clear();
  149. foreach (var column in table.Columns)
  150. {
  151. var o = datarow[column.ColumnName];
  152. row.Add(o != null ? o.ToString() : "");
  153. }
  154. sw.WriteLine(string.Join(Convert.ToString(Delimiter), row));
  155. }
  156. }
  157. ;
  158. }
  159. }
  160. public class CSVExporter : DelimitedExporter
  161. {
  162. public CSVExporter()
  163. {
  164. Delimiter = ',';
  165. }
  166. }
  167. public class TabExporter : DelimitedExporter
  168. {
  169. public TabExporter()
  170. {
  171. Delimiter = '\t';
  172. }
  173. }
  174. }