Converter.cs 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788
  1. using System;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Data;
  5. using NPOI.SS.Util;
  6. using System.Drawing;
  7. using System.Windows;
  8. using System.Reflection;
  9. using NPOI.SS.UserModel;
  10. using NPOI.XSSF.UserModel;
  11. using NPOI.HSSF.UserModel;
  12. using System.Globalization;
  13. using System.ComponentModel;
  14. using SHJX.Service.Model.Dao;
  15. using System.Drawing.Imaging;
  16. using System.Collections.Generic;
  17. using System.Windows.Media.Imaging;
  18. using Microsoft.Office.Interop.Word;
  19. using SHJX.Service.Common.Calculate;
  20. using DataTable = System.Data.DataTable;
  21. using Application = Microsoft.Office.Interop.Word.Application;
  22. using HorizontalAlignment = NPOI.SS.UserModel.HorizontalAlignment;
  23. using OfficeOpenXml;
  24. using OfficeOpenXml.Style;
  25. using LicenseContext = OfficeOpenXml.LicenseContext;
  26. namespace SHJX.Service.Common.Extend
  27. {
  28. public static class Converter
  29. {
  30. #region ExcelConvert
  31. /// <summary>
  32. /// DataTable -> Excel
  33. /// </summary>
  34. /// <param name="dt">DataTable数据</param>
  35. /// <param name="filePath">文件路径</param>
  36. /// <param name="headLineName">头部行 默认无</param>
  37. public static void ConvertToExcel(this DataTable dt, string filePath, string headLineName = null)
  38. {
  39. var fileExt = Path.GetExtension(filePath).ToLower();
  40. IWorkbook workbook = fileExt switch
  41. {
  42. ".xlsx" => new XSSFWorkbook(),
  43. ".xls" => new HSSFWorkbook(),
  44. _ => null
  45. };
  46. if (workbook is null) return;
  47. var sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName);
  48. var rowNumber = 0;
  49. if (headLineName is not null)
  50. {
  51. var rowHead = sheet?.CreateRow(rowNumber);
  52. rowNumber++;
  53. sheet?.AddMergedRegion(new CellRangeAddress(0, 0, 0, dt.Columns.Count - 1));
  54. var cellHead = rowHead?.CreateCell(0);
  55. //设置单元格内容
  56. cellHead?.SetCellValue(headLineName);
  57. var style = workbook.CreateCellStyle();
  58. //设置单元格的样式:水平对齐居中
  59. style.Alignment = HorizontalAlignment.Center;
  60. //新建一个字体样式对象
  61. var font = workbook.CreateFont();
  62. font.FontHeightInPoints = 20;
  63. //设置字体加粗样式
  64. //使用SetFont方法将字体样式添加到单元格样式中
  65. style.SetFont(font);
  66. //将新的样式赋给单元格
  67. if (cellHead is not null) cellHead.CellStyle = style;
  68. }
  69. //表头
  70. if (sheet is not null)
  71. {
  72. var row = sheet.CreateRow(rowNumber);
  73. for (var i = 0; i < dt.Columns.Count; i++)
  74. {
  75. var cell = row.CreateCell(i);
  76. cell.SetCellValue(dt.Columns[i].ColumnName);
  77. if (!rowNumber.Equals(0)) continue;
  78. var style = workbook.CreateCellStyle();
  79. //设置单元格的样式:水平对齐居中
  80. style.Alignment = HorizontalAlignment.Center;
  81. //新建一个字体样式对象
  82. var font = workbook.CreateFont();
  83. font.FontHeightInPoints = 12;
  84. font.Boldweight = (short)FontBoldWeight.Bold;
  85. style.SetFont(font);
  86. cell.CellStyle = style;
  87. }
  88. }
  89. //数据绑定
  90. for (var i = 0; i < dt.Rows.Count; i++)
  91. {
  92. if (sheet is null) continue;
  93. var row1 = sheet.CreateRow(i + rowNumber + 1);
  94. for (var j = 0; j < dt.Columns.Count; j++)
  95. {
  96. var cell = row1.CreateCell(j);
  97. if (dt.Rows[i][j].GetType().IsValueType)
  98. {
  99. cell.SetCellValue(Convert.ToDouble(dt.Rows[i][j]));
  100. }
  101. else
  102. {
  103. cell.SetCellValue(dt.Rows[i][j].ToString());
  104. }
  105. }
  106. }
  107. //转为字节数组
  108. var stream = new MemoryStream();
  109. workbook.Write(stream);
  110. var buf = stream.ToArray();
  111. //保存为Excel文件
  112. using var fs = new FileStream(filePath, FileMode.Create, FileAccess.Write);
  113. fs.Write(buf, 0, buf.Length);
  114. fs.Flush();
  115. }
  116. /// <summary>
  117. /// Excel->DataTable
  118. /// </summary>
  119. /// <param name="filePath">Excel文件路径</param>
  120. public static DataTable ReadExcel(this string filePath)
  121. {
  122. IWorkbook iwkX;
  123. using (var fs = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
  124. {
  125. iwkX = WorkbookFactory.Create(fs);
  126. fs.Close();
  127. }
  128. //sheet
  129. var dt = new DataTable();
  130. for (var h = 0; h < iwkX.NumberOfSheets; h++)
  131. {
  132. var sheet = iwkX.GetSheetAt(h);
  133. var rows = sheet.GetRowEnumerator();
  134. var isMove = rows.MoveNext();
  135. //循环sheet
  136. if (!isMove) continue;
  137. var cols = (IRow)rows.Current;
  138. dt.TableName = sheet.SheetName;
  139. for (var i = 0; i < cols?.LastCellNum; i++)
  140. {
  141. dt.Columns.Add(cols.GetCell(i).ToString());
  142. }
  143. while (rows.MoveNext())
  144. {
  145. var row = (IRow)rows.Current;
  146. var dr = dt.NewRow();
  147. for (var i = 0; i < row?.LastCellNum; i++)
  148. {
  149. var cell = row.GetCell(i);
  150. dr[i] = cell is null ? string.Empty : cell.ToString();
  151. }
  152. dt.Rows.Add(dr);
  153. }
  154. }
  155. return dt;
  156. }
  157. #endregion
  158. #region DataTable -> List<T>
  159. /// <summary>
  160. /// 将DataTable转换为List
  161. /// </summary>
  162. /// <param name="dt"></param>
  163. /// <returns></returns>
  164. public static List<T> ConvertToList<T>(this DataTable dt) where T : class, new()
  165. {
  166. List<T> lists = new List<T>(); // 定义集合
  167. foreach (DataRow dr in dt.Rows) //遍历DataTable中所有的数据行
  168. {
  169. T t = new();
  170. PropertyInfo[] propertys = typeof(T).GetProperties(); // 获得此模型的公共属性
  171. foreach (PropertyInfo item in propertys) //遍历该对象的所有属性
  172. {
  173. object[] attr = item.GetCustomAttributes(typeof(DescriptionAttribute), false);
  174. string description = attr.Length.Equals(0) ? item.Name : ((DescriptionAttribute)attr[0]).Description;
  175. //检查DataTable是否包含此列(列名等于对象的属性的Description属性)
  176. if (!dt.Columns.Contains(description)) continue;
  177. if (!item.CanWrite) continue; //该属性不可写,直接跳出
  178. object value = dr[description];//取值
  179. if (value.Equals(DBNull.Value)) continue;//如果非空,则赋给对象的属性
  180. value = item.PropertyType.FullName switch
  181. {
  182. "System.String" => value.ToString(),
  183. "System.Double" => Convert.ToDouble(value),
  184. "System.Boolean" => value.Equals("1"),
  185. "System.Int32" => Convert.ToInt32(value),
  186. _ => throw new ArgumentNullException(item.PropertyType.FullName),
  187. };
  188. item.SetValue(t, value, null);
  189. }
  190. lists.Add(t); //对象添加到泛型集合中
  191. }
  192. return lists;
  193. }
  194. #endregion
  195. #region List<EquipmentTask> -> Word
  196. public static bool ConvertToExcel(this List<EquipmentTask> tasks, object path)
  197. {
  198. DataTable dt = new("Result");
  199. dt.Columns.Add("类型", Type.GetType("System.String")!);
  200. dt.Columns.Add("样品编号", Type.GetType("System.String")!);
  201. dt.Columns.Add("取样体积", Type.GetType("System.String")!);
  202. dt.Columns.Add("取样倍数", Type.GetType("System.String")!);
  203. dt.Columns.Add("浓度", Type.GetType("System.String")!);
  204. dt.Columns.Add("滴定体积", Type.GetType("System.String")!);
  205. dt.Columns.Add("结果", Type.GetType("System.String")!);
  206. dt.Columns.Add("分析时间", Type.GetType("System.String")!);
  207. List<EquipmentTask> calibrationTasks = tasks.Where(item => item.TaskType.Equals("标定")).ToList();
  208. //if (calibrationTasks is null or { Count: 0 })
  209. //{
  210. // calibrationTasks = DataCentre._dataManager.GetLastOtherTaskByWaveKey(item, level);
  211. // tempCount = 0; GetLastOtherTaskByWaveKey("空白", task.SampleConcentration);// SearchOtherTask(TaskTypeName.CALIBRATION_ZH);
  212. //}
  213. if (calibrationTasks is not null)
  214. {
  215. InsertDataTable(calibrationTasks);
  216. }
  217. List<EquipmentTask> blankTasks = tasks.Where(item => item.TaskType.Equals("空白")).ToList();
  218. //if (blankTasks is null or { Count: 0 })
  219. //{
  220. // blankTasks = GeBlankTaskResult(TaskTypeName.BLANK_ZH);
  221. //}
  222. if (blankTasks is not null)
  223. {
  224. InsertDataTable(blankTasks);
  225. }
  226. List<EquipmentTask> sampleTasks = tasks.Where(item => item.TaskType.Equals("水样")).ToList();
  227. if (sampleTasks is not null)
  228. {
  229. InsertDataTable(sampleTasks);
  230. }
  231. dt.ExportResult(path.ToString(), tasks[0].WaveKey);
  232. void InsertDataTable(List<EquipmentTask> insertTasks)
  233. {
  234. insertTasks.ForEach(task =>
  235. {
  236. dt.Rows.Add(task.TaskType, task.TaskDetailName, task.GetSampleVolume.ToString("F2"),
  237. task.GetSampleMultiple.ToString("F2"), task.SampleConcentration.Equals("Low")?"低":"高",task.Amount.ToString("F2"),
  238. task.Result.ToString("F2"), task.CreateTime.ToString("yyyy-MM-dd"));
  239. });
  240. }
  241. return true;
  242. }
  243. public static void ExportResult(this DataTable dt, string filePath,string wavekay)
  244. {
  245. string savePath = $"{filePath}\\SampleResult_{wavekay}.xlsx";
  246. ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
  247. using ExcelPackage package = new();
  248. ExcelWorksheet sheet = package.Workbook.Worksheets.Add("SampleResult");
  249. for (int i = 0; i < dt.Columns.Count; i++)
  250. {
  251. sheet.Column(i + 1).Width = 15;
  252. }
  253. sheet.Row(1).Style.Font.Bold = true;
  254. sheet.Row(1).Style.Font.Size = 12;
  255. sheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
  256. sheet.Row(1).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
  257. //表头设置
  258. for (int i = 0; i < dt.Columns.Count; i++)
  259. {
  260. sheet.SetValue(1, i + 1, dt.Columns[i].ColumnName);
  261. }
  262. //数据绑定
  263. for (int i = 0; i < dt.Rows.Count; i++)
  264. {
  265. sheet.Row(i + 2).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
  266. sheet.Row(i + 2).Style.VerticalAlignment = ExcelVerticalAlignment.Center;
  267. for (int j = 0; j < dt.Columns.Count; j++)
  268. {
  269. sheet.SetValue(i + 2, j + 1, dt.Rows[i][j].GetType().IsValueType ? Convert.ToDouble(dt.Rows[i][j]) : dt.Rows[i][j].ToString());
  270. }
  271. }
  272. byte[] bytes = package.GetAsByteArray();
  273. File.WriteAllBytes(savePath, bytes);
  274. }
  275. public static bool ConvertToWord(this List<EquipmentTask> tasks, object path, double maxVloume)
  276. {
  277. var tableColumn = 11;
  278. try
  279. {
  280. Document wordDoc; //Word文档变量
  281. Application wordApp; //Word应用程序变量
  282. wordApp = new ApplicationClass
  283. {
  284. Visible = false //使文档可见
  285. };
  286. //由于使用的是COM库,因此有许多变量需要用Missing.Value代替
  287. object nothing = Missing.Value;
  288. wordDoc = wordApp.Documents.Add(ref nothing, ref nothing, ref nothing, ref nothing);
  289. #region 页面样式设置
  290. wordDoc.PageSetup.PaperSize = WdPaperSize.wdPaperA4; //设置纸张样式为A4纸
  291. wordDoc.PageSetup.Orientation = WdOrientation.wdOrientPortrait; //排列方式为垂直方向
  292. wordDoc.PageSetup.TopMargin = 57.0f;
  293. wordDoc.PageSetup.BottomMargin = 57.0f;
  294. wordDoc.PageSetup.LeftMargin = 57.0f;
  295. wordDoc.PageSetup.RightMargin = 57.0f;
  296. wordDoc.PageSetup.HeaderDistance = 30.0f; //页眉位置
  297. PageNumbers pns = wordApp.Selection.Sections[1].Headers[WdHeaderFooterIndex.wdHeaderFooterEvenPages].PageNumbers; //获取当前页的号码
  298. pns.NumberStyle = WdPageNumberStyle.wdPageNumberStyleNumberInDash; //设置页码的风格,是Dash形还是圆形的
  299. pns.HeadingLevelForChapter = 0;
  300. pns.IncludeChapterNumber = false;
  301. pns.RestartNumberingAtSection = false;
  302. pns.StartingNumber = 0; //开始页页码?
  303. object pagenmbetal = WdPageNumberAlignment.wdAlignPageNumberCenter; //将号码设置在中间
  304. object first = true;
  305. wordApp.Selection.Sections[1].Footers[WdHeaderFooterIndex.wdHeaderFooterEvenPages].PageNumbers
  306. .Add(ref pagenmbetal, ref first);
  307. object unite = WdUnits.wdStory;
  308. #endregion
  309. #region 添加表格、填充数据、设置表格行列宽高、合并单元格、添加表头斜线、给单元格添加图片
  310. //wordDoc.Content.InsertAfter("\n"); //插入换行
  311. wordApp.Selection.EndKey(ref unite, ref nothing); //将光标移动到文档末尾
  312. wordApp.Selection.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
  313. var kbLowTasks = tasks.Where(item => item.TaskType.Equals("空白") && item.SampleConcentration.Equals("Low")).ToList();
  314. var kbHighTasks = tasks.Where(item => item.TaskType.Equals("空白") && item.SampleConcentration.Equals("High")).ToList();
  315. var syTasks = tasks.Where(item => item.TaskType.Equals("水样")).ToList();
  316. // var syLowTasks = tasks.Where(item => item.TaskType.Equals("水样") && item.SampleConcentration.Equals("Low")).ToList();
  317. // var syHighTasks = tasks.Where(item => item.TaskType.Equals("水样") && item.SampleConcentration.Equals("High")).ToList();
  318. var bdLowTasks = tasks.Where(item => item.TaskType.Equals("标定") && item.SampleConcentration.Equals("Low")).ToList();
  319. var bdHighTasks = tasks.Where(item => item.TaskType.Equals("标定") && item.SampleConcentration.Equals("High")).ToList();
  320. SampleCalculate.tempCount = 0;
  321. kbLowTasks.GeBlankTaskResult(maxVloume, out var noneValueL);
  322. SampleCalculate.tempCount = 0;
  323. kbHighTasks.GeBlankTaskResult(maxVloume, out var noneValueH);
  324. bdLowTasks.GetBDTaskResult(maxVloume, "Low", out var bdValueL);
  325. bdHighTasks.GetBDTaskResult(maxVloume, "High", out var bdValueH);
  326. int tableRow = 5 + 5 + 3 + 3 + 2; //设置表格的行数
  327. tableRow += kbLowTasks.Count; //低浓度空白样
  328. tableRow += kbHighTasks.Count;
  329. tableRow += syTasks.Count;
  330. //tableRow += syLowTasks.Count; //
  331. //tableRow += syHighTasks.Count; //水样
  332. tableRow += bdLowTasks.Count; //低浓度标定样
  333. tableRow += bdHighTasks.Count;
  334. //定义一个Word中的表格对象
  335. var table = wordDoc.Tables.Add(wordApp.Selection.Range, tableRow, tableColumn, ref nothing,
  336. ref nothing);
  337. //默认创建的表格没有边框,这里修改其属性,使得创建的表格带有边框(这个值可以设置得很大,例如5、13等等)
  338. table.Borders.Enable = 1;
  339. #region 头部
  340. table.Cell(1, 1).Range.Text = "化学需氧量原始记录表";
  341. table.Cell(1, 1).Range.Font.Size = 12F;
  342. table.Cell(1, 1).Range.Bold = 1;
  343. table.Rows[1].Range.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphCenter; //表格文本居中
  344. table.Rows[1].Range.Cells.VerticalAlignment =
  345. WdCellVerticalAlignment.wdCellAlignVerticalCenter; //文本垂直居中
  346. table.Cell(2, 1).Range.Text = "方法依据";
  347. table.Cell(2, 2).Range.Text = "《水质化学需氧量的测定重铬酸钾法》HJ828-2017";
  348. table.Cell(2, 8).Range.Text = "检出限";
  349. table.Cell(2, 10).Range.Text = "4mg/l";
  350. table.Cell(3, 1).Range.Text = "重铬酸钾配置日期";
  351. table.Cell(3, 5).Range.Text = "重铬酸钾浓度";
  352. table.Cell(3, 8).Range.Text = "分析日期";
  353. table.Cell(4, 1).Range.Text = "样品编号或名称";
  354. table.Cell(4, 2).Range.Text = "氯离子浓度(mg/l)";
  355. table.Cell(4, 3).Range.Text = "硫酸汞加入量(ml)";
  356. table.Cell(4, 4).Range.Text = "取样体积(ml)";
  357. table.Cell(4, 5).Range.Text = "稀释倍数";
  358. table.Cell(4, 6).Range.Text = "稀释定容体积(ml)";
  359. table.Cell(4, 7).Range.Text = "硫酸亚铁铵标准溶液消耗量(ml)";
  360. table.Cell(4, 10).Range.Text = "浓度高低";
  361. table.Cell(4, 11).Range.Text = "计算结果(mg/l)或者ml";
  362. table.Cell(5, 7).Range.Text = "V 始";
  363. table.Cell(5, 8).Range.Text = "V 终";
  364. table.Cell(5, 9).Range.Text = "V终-V始";
  365. table.Cell(1, 1).Merge(table.Cell(1, 11));
  366. table.Rows[1].Height = 35; //设置新增加的这行表格的高度
  367. table.Cell(2, 10).Merge(table.Cell(2, 11));
  368. table.Cell(2, 8).Merge(table.Cell(2, 9));
  369. table.Cell(2, 2).Merge(table.Cell(2, 7));
  370. table.Cell(3, 10).Merge(table.Cell(3, 11));
  371. table.Cell(3, 8).Merge(table.Cell(3, 9));
  372. table.Cell(3, 5).Merge(table.Cell(3, 6));
  373. table.Cell(3, 3).Merge(table.Cell(3, 4));
  374. table.Cell(3, 1).Merge(table.Cell(3, 2));
  375. for (int i = 1; i < 7; i++)
  376. table.Cell(4, i).Merge(table.Cell(5, i));
  377. table.Cell(4, 11).Merge(table.Cell(5, 11));
  378. table.Cell(4, 10).Merge(table.Cell(5, 10));
  379. table.Cell(4, 7).Merge(table.Cell(4, 9));
  380. #endregion
  381. var startRow = 6;
  382. var endRows = 5;
  383. var startRow2 = 0;
  384. #region 空白样
  385. #region 低浓度
  386. if (kbLowTasks.Any())
  387. {
  388. foreach (var item in kbLowTasks)
  389. {
  390. endRows++;
  391. table.Cell(endRows, 1).Range.Text = item.TaskDetailName;
  392. table.Cell(endRows, 3).Range.Text = item.HgSO4Volume.ToString(CultureInfo.CurrentCulture);
  393. table.Cell(endRows, 4).Range.Text = item.GetSampleVolume.ToString(CultureInfo.CurrentCulture);
  394. table.Cell(endRows, 5).Range.Text = item.GetSampleMultiple.ToString(CultureInfo.CurrentCulture);
  395. table.Cell(endRows, 6).Range.Text = "10";
  396. table.Cell(endRows, 7).Range.Text = "0";
  397. table.Cell(endRows, 8).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  398. table.Cell(endRows, 9).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  399. table.Cell(endRows, 10).Range.Text = "低";
  400. }
  401. SampleCalculate.tempCount = 0;
  402. //kbLowTasks.GeBlankTaskResult(maxVloume, out var noneValue);
  403. table.Cell(startRow, 11).Range.Text = noneValueL.ToString(CultureInfo.CurrentCulture);
  404. table.Cell(startRow, 11).Merge(table.Cell(endRows, 11)); //合并
  405. }
  406. #endregion
  407. #region 高浓度
  408. startRow = endRows + 1;
  409. if (kbHighTasks.Any())
  410. {
  411. foreach (var item in kbHighTasks)
  412. { endRows++;
  413. table.Cell(endRows, 1).Range.Text = item.TaskDetailName;
  414. table.Cell(endRows, 3).Range.Text = item.HgSO4Volume.ToString(CultureInfo.CurrentCulture);
  415. table.Cell(endRows, 4).Range.Text = item.GetSampleVolume.ToString(CultureInfo.CurrentCulture);
  416. table.Cell(endRows, 5).Range.Text = item.GetSampleMultiple.ToString(CultureInfo.CurrentCulture);
  417. table.Cell(endRows, 6).Range.Text = "10";
  418. table.Cell(endRows, 7).Range.Text = "0";
  419. table.Cell(endRows, 8).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  420. table.Cell(endRows, 9).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  421. table.Cell(endRows, 10).Range.Text = "高";
  422. }
  423. SampleCalculate.tempCount = 0;
  424. //kbHighTasks.GeBlankTaskResult(maxVloume, out var noneValue);
  425. table.Cell(startRow, 11).Range.Text = noneValueH.ToString(CultureInfo.CurrentCulture);
  426. table.Cell(startRow, 11).Merge(table.Cell(endRows, 11)); //合并
  427. }
  428. #endregion
  429. #endregion
  430. #region 水样
  431. if (syTasks.Any())
  432. {
  433. syTasks.ForEach(item =>
  434. {
  435. endRows++;
  436. table.Cell(endRows, 1).Range.Text = item.TaskDetailName;
  437. table.Cell(endRows, 3).Range.Text = item.HgSO4Volume.ToString(CultureInfo.CurrentCulture);
  438. table.Cell(endRows, 4).Range.Text = item.GetSampleVolume.ToString(CultureInfo.CurrentCulture);
  439. table.Cell(endRows, 5).Range.Text = item.GetSampleMultiple.ToString(CultureInfo.CurrentCulture);
  440. table.Cell(endRows, 6).Range.Text = "10";
  441. table.Cell(endRows, 7).Range.Text = "0";
  442. table.Cell(endRows, 8).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  443. table.Cell(endRows, 9).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  444. table.Cell(endRows, 10).Range.Text = item.SampleConcentration == "Low" ? "低" : "高";
  445. table.Cell(endRows, 11).Range.Text = item.Result.ToString(CultureInfo.CurrentCulture);
  446. //table.Cell(endRows, 10).Merge(table.Cell(endRows, 11)); //合并
  447. });
  448. }
  449. #endregion
  450. //9-13
  451. #region 标定样
  452. startRow2 = endRows+1;
  453. #region 低浓度
  454. if (bdLowTasks.Any())
  455. {
  456. foreach (var item in bdLowTasks)
  457. {
  458. endRows++;
  459. table.Cell(endRows, 1).Range.Text = item.TaskDetailName;
  460. table.Cell(endRows, 3).Range.Text = item.HgSO4Volume.ToString(CultureInfo.CurrentCulture);
  461. table.Cell(endRows, 4).Range.Text = item.GetSampleVolume.ToString(CultureInfo.CurrentCulture);
  462. table.Cell(endRows, 5).Range.Text = item.GetSampleMultiple.ToString(CultureInfo.CurrentCulture);
  463. table.Cell(endRows, 6).Range.Text = "10";
  464. table.Cell(endRows, 7).Range.Text = "0";
  465. table.Cell(endRows, 8).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  466. table.Cell(endRows, 9).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  467. table.Cell(endRows, 10).Range.Text = "低";
  468. }
  469. //bdLowTasks.GetBDTaskResult(maxVloume, "Low",out var bdValue);
  470. table.Cell(startRow2, 11).Range.Text = bdValueL.ToString(CultureInfo.CurrentCulture);
  471. table.Cell(startRow2, 11).Merge(table.Cell(endRows, 11)); //合并
  472. }
  473. #endregion
  474. #region 高浓度
  475. startRow2 = endRows + 1;
  476. if (bdHighTasks.Any())
  477. {
  478. foreach (var item in bdHighTasks)
  479. {
  480. endRows++;
  481. table.Cell(endRows, 1).Range.Text = item.TaskDetailName;
  482. table.Cell(endRows, 3).Range.Text = item.HgSO4Volume.ToString(CultureInfo.CurrentCulture);
  483. table.Cell(endRows, 4).Range.Text = item.GetSampleVolume.ToString(CultureInfo.CurrentCulture);
  484. table.Cell(endRows, 5).Range.Text = item.GetSampleMultiple.ToString(CultureInfo.CurrentCulture);
  485. table.Cell(endRows, 6).Range.Text = "10";
  486. table.Cell(endRows, 7).Range.Text = "0";
  487. table.Cell(endRows, 8).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  488. table.Cell(endRows, 9).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture);
  489. table.Cell(endRows, 10).Range.Text = "高";
  490. }
  491. //bdHighTasks.GetBDTaskResult(maxVloume, "High",out var bdValue2);
  492. table.Cell(startRow2, 11).Range.Text = bdValueH.ToString(CultureInfo.CurrentCulture);
  493. table.Cell(startRow2, 11).Merge(table.Cell(endRows, 11)); //合并
  494. }
  495. #endregion
  496. #endregion
  497. #region 标定样
  498. //if (bdLowTasks.Any())
  499. //{
  500. // table.Cell(endRows + 1, 1).Range.Text = "硫酸亚铁铵标准溶液的标定";
  501. // table.Cell(endRows + 1, 3).Range.Text = "硫酸亚铁铵消耗体积(ml)";
  502. // table.Cell(endRows + 1, 6).Range.Text = "硫酸亚铁铵浓度(mol/l)";
  503. // table.Cell(endRows + 1, 7).Range.Text = "化学需氧量计算公式";
  504. // table.Cell(endRows + 2, 3).Range.Text = "V始";
  505. // table.Cell(endRows + 2, 4).Range.Text = "V终";
  506. // table.Cell(endRows + 2, 5).Range.Text = "V终-V始";
  507. // int bdRows = 2;
  508. // foreach (var item in bdLowTasks)
  509. // {
  510. // bdRows++;
  511. // table.Cell(endRows + bdRows, 3).Range.Text = "0";
  512. // table.Cell(endRows + bdRows, 4).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture); //V终
  513. // table.Cell(endRows + bdRows, 5).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture); //V终-V始
  514. // }
  515. // table.Cell(endRows + 1, 8).Merge(table.Cell(endRows + 5, 11));
  516. // table.Cell(endRows + 1, 7).Merge(table.Cell(endRows + 5, 7));
  517. // table.Cell(endRows + 1, 6).Merge(table.Cell(endRows + 2, 6)); //硫酸亚铁铵浓度(mol/l)
  518. // table.Cell(endRows + 3, 6).Merge(table.Cell(endRows + 5, 6));
  519. // table.Cell(endRows + 1, 3).Merge(table.Cell(endRows + 1, 5)); //硫酸亚铁铵消耗体积(ml)
  520. // table.Cell(endRows + 1, 1).Merge(table.Cell(endRows + 5, 2));
  521. //}
  522. //if (bdHighTasks.Any())
  523. //{
  524. // table.Cell(endRows + 1, 1).Range.Text = "硫酸亚铁铵标准溶液的标定";
  525. // table.Cell(endRows + 1, 3).Range.Text = "硫酸亚铁铵消耗体积(ml)";
  526. // table.Cell(endRows + 1, 6).Range.Text = "硫酸亚铁铵浓度(mol/l)";
  527. // table.Cell(endRows + 1, 7).Range.Text = "化学需氧量计算公式";
  528. // table.Cell(endRows + 2, 3).Range.Text = "V始";
  529. // table.Cell(endRows + 2, 4).Range.Text = "V终";
  530. // table.Cell(endRows + 2, 5).Range.Text = "V终-V始";
  531. // int bdRows = 2;
  532. // foreach (var item in bdHighTasks)
  533. // {
  534. // bdRows++;
  535. // table.Cell(endRows + bdRows, 3).Range.Text = "0";
  536. // table.Cell(endRows + bdRows, 4).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture); //V终
  537. // table.Cell(endRows + bdRows, 5).Range.Text = item.Amount.ToString(CultureInfo.CurrentCulture); //V终-V始
  538. // }
  539. // table.Cell(endRows + 1, 8).Merge(table.Cell(endRows + 5, 11));
  540. // table.Cell(endRows + 1, 7).Merge(table.Cell(endRows + 5, 7));
  541. // table.Cell(endRows + 1, 6).Merge(table.Cell(endRows + 2, 6)); //硫酸亚铁铵浓度(mol/l)
  542. // table.Cell(endRows + 3, 6).Merge(table.Cell(endRows + 5, 6));
  543. // table.Cell(endRows + 1, 3).Merge(table.Cell(endRows + 1, 5)); //硫酸亚铁铵消耗体积(ml)
  544. // table.Cell(endRows + 1, 1).Merge(table.Cell(endRows + 5, 2));
  545. //}
  546. #endregion
  547. endRows += 5;
  548. //14-16
  549. #region 准确度
  550. table.Cell(endRows + 1, 1).Range.Text = "准确度";
  551. table.Cell(endRows + 1, 2).Range.Text = "质控样品编号";
  552. table.Cell(endRows + 1, 4).Range.Text = "保证值(mg/l)";
  553. table.Cell(endRows + 1, 6).Range.Text = "测试含量(mg/l)";
  554. table.Cell(endRows + 1, 8).Range.Text = "质控样类型";
  555. table.Cell(endRows + 1, 10).Range.Text = "是否合格";
  556. table.Cell(endRows + 2, 8).Range.Text = "\u00A3密码";
  557. table.Cell(endRows + 2, 9).Range.Text = "\u00A3明码";
  558. table.Cell(endRows + 2, 10).Range.Text = "\u00A3合格";
  559. table.Cell(endRows + 2, 11).Range.Text = "\u00A3不合格";
  560. table.Cell(endRows + 3, 8).Range.Text = "\u00A3密码";
  561. table.Cell(endRows + 3, 9).Range.Text = "\u00A3明码" ;
  562. table.Cell(endRows + 3, 10).Range.Text = "\u00A3合格";
  563. table.Cell(endRows + 3, 11).Range.Text = "\u00A3不合格";
  564. for (int i = endRows + 2; i < endRows + 4; i++)
  565. for (int j = 8; j < 12; j++)
  566. table.Cell(i, j).Range.Font.Name = "Wingdings 2";
  567. table.Cell(endRows + 2, 6).Merge(table.Cell(endRows + 2, 7));
  568. table.Cell(endRows + 2, 4).Merge(table.Cell(endRows + 2, 5));
  569. table.Cell(endRows + 2, 2).Merge(table.Cell(endRows + 2, 3));
  570. table.Cell(endRows + 3, 6).Merge(table.Cell(endRows + 3, 7));
  571. table.Cell(endRows + 3, 4).Merge(table.Cell(endRows + 3, 5));
  572. table.Cell(endRows + 3, 2).Merge(table.Cell(endRows + 3, 3));
  573. table.Cell(endRows + 1, 1).Merge(table.Cell(endRows + 3, 1));
  574. #endregion
  575. endRows += 3;
  576. //17-19
  577. #region 精密度
  578. table.Cell(endRows + 1, 1).Range.Text = "精密度";
  579. table.Cell(endRows + 1, 2).Range.Text = "平行样品编号";
  580. table.Cell(endRows + 1, 7).Range.Text = "平行样编号";
  581. table.Cell(endRows + 2, 2).Range.Text = "测试含量(mg/l)";
  582. table.Cell(endRows + 2, 7).Range.Text = "平行样编号";
  583. table.Cell(endRows + 3, 2).Range.Text = "相对偏差(%)";
  584. table.Cell(endRows + 3, 7).Range.Text = "平行样编号";
  585. table.Cell(endRows + 1, 9).Merge(table.Cell(endRows + 1, 11));
  586. table.Cell(endRows + 1, 7).Merge(table.Cell(endRows + 1, 8));
  587. table.Cell(endRows + 1, 4).Merge(table.Cell(endRows + 1, 6));
  588. table.Cell(endRows + 1, 2).Merge(table.Cell(endRows + 1, 3));
  589. table.Cell(endRows + 2, 9).Merge(table.Cell(endRows + 2, 10));
  590. table.Cell(endRows + 2, 7).Merge(table.Cell(endRows + 2, 8));
  591. table.Cell(endRows + 2, 4).Merge(table.Cell(endRows + 2, 5));
  592. table.Cell(endRows + 2, 2).Merge(table.Cell(endRows + 2, 3));
  593. table.Cell(endRows + 3, 9).Merge(table.Cell(endRows + 3, 11));
  594. table.Cell(endRows + 3, 7).Merge(table.Cell(endRows + 3, 8));
  595. table.Cell(endRows + 3, 4).Merge(table.Cell(endRows + 3, 6));
  596. table.Cell(endRows + 3, 2).Merge(table.Cell(endRows + 3, 3));
  597. table.Cell(endRows + 1, 1).Merge(table.Cell(endRows + 3, 1));
  598. #endregion
  599. endRows += 3;
  600. //20-21
  601. #region 结尾
  602. table.Cell(endRows + 1, 1).Range.Text = "分析人:";
  603. table.Cell(endRows + 1, 4).Range.Text = "校准人:";
  604. table.Cell(endRows + 1, 8).Range.Text = "审核人:";
  605. table.Cell(endRows + 1, 8).Merge(table.Cell(endRows + 1, 11));
  606. table.Cell(endRows + 1, 4).Merge(table.Cell(endRows + 1, 7));
  607. table.Cell(endRows + 1, 1).Merge(table.Cell(endRows + 1, 3));
  608. table.Cell(endRows + 2, 1).Range.Text = "日期: 年 月 日";
  609. table.Cell(endRows + 2, 4).Range.Text = "日期: 年 月 日";
  610. table.Cell(endRows + 2, 8).Range.Text = "日期: 年 月 日";
  611. table.Cell(endRows + 2, 8).Merge(table.Cell(endRows + 2, 11));
  612. table.Cell(endRows + 2, 4).Merge(table.Cell(endRows + 2, 7));
  613. table.Cell(endRows + 2, 1).Merge(table.Cell(endRows + 2, 3));
  614. #endregion
  615. #endregion
  616. wordApp.Selection.EndKey(ref unite, ref nothing); //将光标移动到文档末尾
  617. wordDoc.Content.InsertAfter("\n");
  618. //WdSaveFormat为Word 2003文档的保存格式
  619. object format = WdSaveFormat.wdFormatDocument;
  620. //将wordDoc文档对象的内容保存为DOCX文档
  621. string cat = tasks[0].WaveKey;
  622. string cat2 = path.ToString();
  623. cat2 = cat2 + "\\SampleResult_" + cat + ".doc";
  624. path = (object)cat2;
  625. wordDoc.SaveAs(ref path, ref format, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing,
  626. ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing, ref nothing,
  627. ref nothing,
  628. ref nothing);
  629. wordDoc.Close(ref nothing, ref nothing, ref nothing); //关闭wordApp组件对象
  630. wordApp.Quit(ref nothing, ref nothing, ref nothing); //退出wordApp组件对象
  631. return true;
  632. }
  633. catch (Exception)
  634. {
  635. throw new Exception();
  636. }
  637. }
  638. #endregion
  639. #region 截图转换成Bitmap
  640. /// <summary>
  641. /// 截图转换成bitmap
  642. /// </summary>
  643. /// <param name="element"></param>
  644. /// <param name="width">默认控件宽度</param>
  645. /// <param name="height">默认控件高度</param>
  646. /// <param name="x">默认0</param>
  647. /// <param name="y">默认0</param>
  648. /// <returns></returns>
  649. public static Bitmap ScreenConvertToBitmap(this System.Windows.Media.Visual visual)
  650. {
  651. int width = 0, height = 0, x = 0, y = 0;
  652. Rect rc = SystemParameters.WorkArea; //获取工作区大小
  653. if (width == 0) width = (int)rc.Width;
  654. if (height == 0) height = (int)rc.Height;
  655. var rtb = new RenderTargetBitmap(width, height, x, y, System.Windows.Media.PixelFormats.Default);
  656. rtb.Render(visual);
  657. Bitmap bit = BitmapSourceToBitmap(rtb);
  658. return bit;
  659. }
  660. /// <summary>
  661. /// BitmapSource转Bitmap
  662. /// </summary>
  663. /// <param name="source"></param>
  664. /// <returns></returns>
  665. public static Bitmap BitmapSourceToBitmap(BitmapSource source)
  666. {
  667. return BitmapSourceToBitmap(source, source.PixelWidth, source.PixelHeight);
  668. }
  669. /// <summary>
  670. /// Convert BitmapSource to Bitmap
  671. /// </summary>
  672. /// <param name="source"></param>
  673. /// <returns></returns>
  674. public static Bitmap BitmapSourceToBitmap(BitmapSource source, int width, int height)
  675. {
  676. Bitmap bmp = null;
  677. try
  678. {
  679. PixelFormat format = PixelFormat.Format24bppRgb;
  680. /*set the translate type according to the in param(source)*/
  681. switch (source.Format.ToString())
  682. {
  683. case "Rgb24":
  684. case "Bgr24": format = PixelFormat.Format24bppRgb; break;
  685. case "Bgra32": format = PixelFormat.Format32bppPArgb; break;
  686. case "Bgr32": format = PixelFormat.Format32bppRgb; break;
  687. case "Pbgra32": format = PixelFormat.Format32bppArgb; break;
  688. }
  689. bmp = new Bitmap(width, height, format);
  690. BitmapData data = bmp.LockBits(new System.Drawing.Rectangle(System.Drawing.Point.Empty, bmp.Size),
  691. ImageLockMode.WriteOnly,
  692. format);
  693. source.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride);
  694. bmp.UnlockBits(data);
  695. }
  696. catch
  697. {
  698. if (bmp != null)
  699. {
  700. bmp.Dispose();
  701. bmp = null;
  702. }
  703. }
  704. return bmp;
  705. }
  706. #endregion
  707. }
  708. }