DataTableExtensions.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. using System.Data;
  2. using System.Linq;
  3. using KYFramework;
  4. using MongoDB.Bson;
  5. using NPOI.HSSF.UserModel;
  6. using NPOI.SS.Util;
  7. using NPOIHelper;
  8. namespace SimulationServer.Utils;
  9. public static class DataTableExtensions
  10. {
  11. public static T ToEntity<T>(this DataTable table) where T : new()
  12. {
  13. T entity = new T();
  14. for (int i = 0; i < table.Rows.Count; i++)
  15. {
  16. var properties = entity.GetType().GetProperties();
  17. for (int j = 0; j < properties.Length; j++)
  18. {
  19. Type newType = properties[j].PropertyType;
  20. //判断type类型是否为泛型,因为nullable是泛型类,
  21. if (newType.IsGenericType
  22. && newType.GetGenericTypeDefinition() == typeof(Nullable<>)) //判断convertsionType是否为nullable泛型类
  23. {
  24. //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
  25. System.ComponentModel.NullableConverter nullableConverter =
  26. new System.ComponentModel.NullableConverter(newType);
  27. //将type转换为nullable对的基础基元类型
  28. newType = nullableConverter.UnderlyingType;
  29. }
  30. properties[j].SetValue(entity, Convert.ChangeType(table.Rows[i][j], newType), null);
  31. }
  32. }
  33. return entity;
  34. }
  35. public static List<T> ToEntities<T>(this DataTable table) where T : new()
  36. {
  37. List<T> entities = new List<T>();
  38. if (table == null)
  39. return null;
  40. for (int i = 0; i < table.Rows.Count; i++)
  41. {
  42. T entity = new T();
  43. var properties = entity.GetType().GetProperties();
  44. for (int j = 0; j < properties.Length; j++)
  45. {
  46. Type newType = properties[j].PropertyType;
  47. //判断type类型是否为泛型,因为nullable是泛型类,
  48. if (newType.IsGenericType
  49. && newType.GetGenericTypeDefinition() == typeof(Nullable<>)) //判断convertsionType是否为nullable泛型类
  50. {
  51. //如果type为nullable类,声明一个NullableConverter类,该类提供从Nullable类到基础基元类型的转换
  52. System.ComponentModel.NullableConverter nullableConverter =
  53. new System.ComponentModel.NullableConverter(newType);
  54. //将type转换为nullable对的基础基元类型
  55. newType = nullableConverter.UnderlyingType;
  56. }
  57. properties[j].SetValue(entity, Convert.ChangeType(table.Rows[i][j], newType), null);
  58. }
  59. entities.Add(entity);
  60. }
  61. return entities;
  62. }
  63. public static void SaveToExcel(string path, Dictionary<string, Dictionary<string, List<string>>> report, bool withA = false, bool zt = false, string s = "")
  64. {
  65. if (!File.Exists(path)) File.Create(path).Close();
  66. // 创建一个新的Excel文件
  67. var workbook = new HSSFWorkbook();
  68. foreach (KeyValuePair<string, Dictionary<string, List<string>>> kv in report)
  69. {
  70. // 创建一个新的工作表
  71. var sheet = workbook.CreateSheet(kv.Key);
  72. // 创建标题行
  73. var headerRow = sheet.CreateRow(0);
  74. var headerCell = headerRow.CreateCell(0);
  75. headerCell.SetCellValue("指标名");
  76. // 遍历字典,将数据写入Excel
  77. int rowIndex = 1;
  78. foreach (KeyValuePair<string, List<string>> kv1 in kv.Value)
  79. {
  80. var row = sheet.CreateRow(rowIndex);
  81. row.CreateCell(0).SetCellValue(kv1.Key);
  82. bool t = false;
  83. if (kv1.Key == "医疗任务设备" || kv1.Key == "医疗药品" || kv1.Key == "单机机场使用情况")
  84. {
  85. //row.GetCell(0).CellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.Center;
  86. CellUtil.SetCellStyleProperties(row.GetCell(0), new Dictionary<string, object> { { "verticalAlignment", NPOI.SS.UserModel.VerticalAlignment.Center } });
  87. t = true;
  88. }
  89. if (withA)
  90. {
  91. for (int i = 0; i < kv1.Value.Count - 1; i++)
  92. {
  93. var headerCell1 = headerRow.CreateCell(i + 1);
  94. headerCell1.SetCellValue($"仿真轮次{i + 1}");
  95. row.CreateCell(i + 1).SetCellValue(kv1.Value[i]);
  96. if (t)
  97. {
  98. //row.GetCell(i + 1).CellStyle.WrapText = true;
  99. CellUtil.SetCellStyleProperties(row.GetCell(i + 1), new Dictionary<string, object> { { "wrapText", true } });
  100. CellUtil.SetCellStyleProperties(row.GetCell(i + 1), new Dictionary<string, object> { { "verticalAlignment", NPOI.SS.UserModel.VerticalAlignment.Center } });
  101. }
  102. }
  103. var headerCell1End = headerRow.CreateCell(kv1.Value.Count);
  104. headerCell1End.SetCellValue($"平均值");
  105. row.CreateCell(kv1.Value.Count).SetCellValue(kv1.Value[kv1.Value.Count - 1]);
  106. }
  107. else
  108. {
  109. for (int i = 0; i < kv1.Value.Count; i++)
  110. {
  111. var headerCell1 = headerRow.CreateCell(i + 1);
  112. headerCell1.SetCellValue($"仿真轮次{i + 1}");
  113. row.CreateCell(i + 1).SetCellValue(kv1.Value[i]);
  114. }
  115. }
  116. rowIndex++;
  117. }
  118. }
  119. if (zt)
  120. {
  121. var sheet = workbook.CreateSheet("任务成功率");
  122. var Row0 = sheet.CreateRow(0);
  123. var Row0Cell0 = Row0.CreateCell(0);
  124. Row0Cell0.SetCellValue("指标名");
  125. var Row0Cell1 = Row0.CreateCell(1);
  126. Row0Cell1.SetCellValue("数值");
  127. var Row1 = sheet.CreateRow(1);
  128. var Row1Cell0 = Row1.CreateCell(0);
  129. Row1Cell0.SetCellValue("任务成功率");
  130. var Row1Cell1 = Row1.CreateCell(1);
  131. Row1Cell1.SetCellValue(s);
  132. }
  133. // 保存Excel文件
  134. using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
  135. {
  136. workbook.Write(fs);
  137. }
  138. }
  139. public static void SaveToExcel(string path, Dictionary<string, Dictionary<string, string>> report)
  140. {
  141. // 创建一个新的Excel文件
  142. var workbook = new HSSFWorkbook();
  143. foreach (KeyValuePair<string, Dictionary<string, string>> kv in report)
  144. {
  145. // 创建一个新的工作表
  146. var sheet = workbook.CreateSheet(kv.Key);
  147. // 创建标题行
  148. var headerRow = sheet.CreateRow(0);
  149. var headerCell = headerRow.CreateCell(0);
  150. var headerRow1 = sheet.CreateRow(1);
  151. var headerCell1 = headerRow1.CreateCell(1);
  152. headerCell.SetCellValue("指标名");
  153. headerCell1.SetCellValue("仿真轮次");
  154. // 遍历字典,将数据写入Excel
  155. int rowIndex = 1;
  156. foreach (KeyValuePair<string, string> kv1 in kv.Value)
  157. {
  158. var row = sheet.CreateRow(rowIndex);
  159. row.CreateCell(0).SetCellValue(kv1.Key);
  160. row.CreateCell(1).SetCellValue(kv1.Value);
  161. rowIndex++;
  162. }
  163. }
  164. // 保存Excel文件
  165. using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
  166. {
  167. workbook.Write(fs);
  168. }
  169. }
  170. }