版博士V2.0程序
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

1261 строка
55 KiB

  1. using Devart.Data;
  2. using MaiMuAOI.SysCtrl;
  3. using MaiMuAOI.SysUI.ProductAndStep;
  4. using MaiMuControl.SysStatusMgr.UserMgr;
  5. using Microsoft.Office.Interop.Excel;
  6. using Models;
  7. using Newtonsoft.Json;
  8. using Newtonsoft.Json.Linq;
  9. using OpenCvSharp.Flann;
  10. using SqlSugar;
  11. using System;
  12. using System.Collections;
  13. using System.Collections.Generic;
  14. using System.ComponentModel;
  15. using System.Data;
  16. using System.Data.Common;
  17. using System.Drawing;
  18. using System.Dynamic;
  19. using System.IO;
  20. using System.Linq;
  21. using System.Reflection;
  22. using System.Runtime.InteropServices.ComTypes;
  23. using System.Runtime.Serialization;
  24. using System.Text;
  25. using System.Threading.Tasks;
  26. using System.Web.Routing;
  27. using System.Web.UI.WebControls;
  28. using System.Windows.Forms;
  29. using static MaiMuControl.Form1;
  30. using DataTable = System.Data.DataTable;
  31. using Point = System.Drawing.Point;
  32. using Excel = Microsoft.Office.Interop.Excel;
  33. namespace MaiMuAOI.SysUI.DefectPicShow
  34. {
  35. public partial class DataQueryFrm : Form
  36. {
  37. Service.OrderService OrderService = new Service.OrderService();
  38. List<Order> QueryOrders = new List<Order>();
  39. List<Order> QueryAllOrders = new List<Order>();
  40. public DataQueryFrm()
  41. {
  42. InitializeComponent();
  43. UIStyle.SetUIStyle(this);
  44. this.uiTitel1.FatherForm = this;
  45. }
  46. private void DataQueryFrm_Load(object sender, EventArgs e)
  47. {
  48. LoadPdtList(SysMgr.Instance.ProductCodeList);
  49. //激活OnPageChanged事件
  50. pageCtrl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged);
  51. }
  52. #region 切页
  53. /// <summary>
  54. /// 页数变化时调用绑定数据方法
  55. /// </summary>
  56. /// <param name="sender"></param>
  57. /// <param name="e"></param>
  58. private void pagerControl1_OnPageChanged(object sender, EventArgs e)
  59. {
  60. QueryData();
  61. }
  62. #endregion
  63. #region 加载料号
  64. private string[] pdtlistData;
  65. private void LoadPdtList(List<string> list)
  66. {
  67. this.cbProductCode.Items.Clear();
  68. this.pdtlistData = list.ToArray();
  69. cbProductCode.Items.AddRange(pdtlistData);//比使用DataSource速度要快一些
  70. cbProductCode.TextUpdate += cobList_TextUpdate;//重新绑定事件
  71. cbProductCode.KeyDown += CobList_KeyDown;
  72. this.cbProductCode.Text = "";
  73. cbProductCode.Focus();
  74. cbProductCode.SelectAll();
  75. }
  76. private void CobList_KeyDown(object sender, KeyEventArgs e)
  77. {
  78. ComboBox ctrl = sender as ComboBox;
  79. if (e.KeyCode == Keys.Enter)
  80. {
  81. if (ctrl.Items.Count == 1)
  82. ctrl.Text = ctrl.Items[0].ToString();
  83. }
  84. }
  85. private void cobList_TextUpdate(object sender, EventArgs e)
  86. {
  87. ComboBox ctrl = sender as ComboBox;
  88. if (ctrl.Text != null)
  89. {
  90. string str = ctrl.Text; //获取cb_material控件输入内
  91. //清空combobox
  92. ctrl.DataSource = null;
  93. ctrl.Items.Clear();
  94. string[] workOrderFiltered;
  95. workOrderFiltered = pdtlistData.Where(x => x.IndexOf(str, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();//忽略大小写
  96. ctrl.Items.AddRange(workOrderFiltered);//比使用DataSource速度要快一些
  97. // 不存在符合条件时
  98. //设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  99. ctrl.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置
  100. if (workOrderFiltered.Length > 0)
  101. {
  102. if (!ctrl.DroppedDown)
  103. ctrl.DroppedDown = true; // 自动弹出下拉框
  104. }
  105. ctrl.SelectionStart = str.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
  106. }
  107. }
  108. #endregion
  109. #region 查询数据
  110. #region 数据库查询
  111. private class domainItem
  112. {
  113. public string FieldName { get; set; }
  114. public string FieldValue { get; set; }
  115. public int ConditionalType { get; set; }
  116. }
  117. private class QueryOrderData
  118. {
  119. public string model { get; set; }
  120. public string fields { get; set; }
  121. public List<domainItem> domain { get; set; }
  122. public string order { get; set; }
  123. public int pageNum { get; set; }
  124. public int pageSize { get; set; }
  125. }
  126. private List<Order> getTableList(JObject req, out int TotalCnt)
  127. {
  128. try
  129. {
  130. string model, fields = "", domain = "", order = "";
  131. int pageNum = 0, pageSize = 0, totalCount = 0;
  132. model = req.Value<string>("model");
  133. if (req.ContainsKey("fields")) fields = req.Value<string>("fields");
  134. if (req.ContainsKey("domain")) domain = req.Value<JArray>("domain").ToString();
  135. if (req.ContainsKey("order")) order = req.Value<string>("order");
  136. if (req.ContainsKey("pageNum")) pageNum = req.Value<int>("pageNum");
  137. if (req.ContainsKey("pageSize")) pageSize = req.Value<int>("pageSize");
  138. //创建表达式
  139. var exp1 = Expressionable.Create<Order>()
  140. //.AndIF((int)cobProductList.SelectedValue > 0, it => it.ProductId == (int)cobProductList.SelectedValue)
  141. //.AndIF((int)cobStepList.SelectedValue > 0, it => it.StepId == (int)cobStepList.SelectedValue)
  142. //.AndIF(dateTimePicker1.Checked, it => it.CreateTime >= dateTimePicker1.Value)
  143. //.AndIF(dateTimePicker2.Checked, it => it.CreateTime < dateTimePicker2.Value)
  144. .ToExpression();//注意 这一句 不能少
  145. var list = OrderService.GetListEx(fields, domain, order, pageNum, pageSize, ref totalCount);
  146. TotalCnt = totalCount;
  147. //var list = svcOrder.GetListNav(pageNum, pageSize, ref totalCount, exp1);
  148. return list;
  149. }
  150. catch (Exception ex)
  151. {
  152. ;
  153. }
  154. TotalCnt = 0;
  155. return null;
  156. }
  157. #endregion
  158. #region 新老流程数据分析
  159. private void ShowDataTableEx(List<Order> list)
  160. {
  161. dataGridView1.Columns.Clear();
  162. //记录数据类型列数
  163. Dictionary<string, int> dataCnt = new Dictionary<string, int>();
  164. DataTable dt = new DataTable(); //建立个数据表
  165. //通用列
  166. DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn();
  167. chk.Name = "Select";
  168. chk.HeaderText = "选择";
  169. dataGridView1.Columns.Add(chk);
  170. dt.Columns.Add(new DataColumn("检验日期", typeof(string)));//在表中添加string类型的列
  171. dt.Columns.Add(new DataColumn("检测单号", typeof(string)));//在表中添加string类型的列
  172. dt.Columns.Add(new DataColumn("产品名称", typeof(string)));//在表中添加string类型的列
  173. dt.Columns.Add(new DataColumn("料号", typeof(string)));//在表中添加string类型的列
  174. dt.Columns.Add(new DataColumn("网版编码", typeof(string)));//在表中添加string类型的列
  175. dt.Columns.Add(new DataColumn("批次", typeof(string)));//在表中添加string类型的列
  176. dt.Columns.Add(new DataColumn("合格", typeof(string)));//在表中添加string类型的列
  177. dt.Columns.Add(new DataColumn("修复", typeof(string)));//在表中添加string类型的列
  178. dt.Columns.Add(new DataColumn("异常情况", typeof(string)));//在表中添加string类型的列
  179. dt.Columns.Add(new DataColumn("修复人员", typeof(string)));//在表中添加string类型的列
  180. dt.Columns.Add(new DataColumn("比对", typeof(string)));//在表中添加string类型的列
  181. foreach(var item in list)
  182. {
  183. //老流程
  184. if(item.StepInfo == null ||item.StepInfo.ProcessType != "快速流程")
  185. {
  186. //加入数据表
  187. if(item.SizeDefectInfoList == null)
  188. item.SizeDefectInfoList = new List<SizeDefectInfo>();
  189. #region 张力
  190. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  191. {
  192. PointCode = "Tension",
  193. StepName = "张力",
  194. Data = item.Tension1,
  195. });
  196. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  197. {
  198. PointCode = "Tension",
  199. StepName = "张力",
  200. Data = item.Tension2,
  201. });
  202. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  203. {
  204. PointCode = "Tension",
  205. StepName = "张力",
  206. Data = item.Tension3,
  207. });
  208. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  209. {
  210. PointCode = "Tension",
  211. StepName = "张力",
  212. Data = item.Tension4,
  213. });
  214. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  215. {
  216. PointCode = "Tension",
  217. StepName = "张力",
  218. Data = item.Tension5,
  219. });
  220. #endregion
  221. #region 厚度
  222. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  223. {
  224. PointCode = "Height",
  225. StepName = "厚度",
  226. Data = item.Height1,
  227. });
  228. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  229. {
  230. PointCode = "Height",
  231. StepName = "厚度",
  232. Data = item.Height2,
  233. });
  234. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  235. {
  236. PointCode = "Height",
  237. StepName = "厚度",
  238. Data = item.Height3,
  239. });
  240. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  241. {
  242. PointCode = "Height",
  243. StepName = "厚度",
  244. Data = item.Height4,
  245. });
  246. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  247. {
  248. PointCode = "Height",
  249. StepName = "厚度",
  250. Data = item.Height5,
  251. });
  252. #endregion
  253. #region YPT
  254. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  255. {
  256. PointCode = "Y轴方向PT值检测",
  257. StepName = "Y轴方向PT值",
  258. Data = item.PT1,
  259. });
  260. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  261. {
  262. PointCode = "Y轴方向PT值检测",
  263. StepName = "Y轴方向PT值",
  264. Data = item.PT2,
  265. });
  266. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  267. {
  268. PointCode = "Y轴方向PT值检测",
  269. StepName = "Y轴方向PT值",
  270. Data = item.PT3,
  271. });
  272. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  273. {
  274. PointCode = "Y轴方向PT值检测",
  275. StepName = "Y轴方向PT值",
  276. Data = item.PT5,
  277. });
  278. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  279. {
  280. PointCode = "Y轴方向PT值检测",
  281. StepName = "Y轴方向PT值",
  282. Data = item.PT6,
  283. });
  284. #endregion
  285. #region 线宽
  286. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  287. {
  288. PointCode = "线宽正面",
  289. StepName = "线宽",
  290. Data = item.LineWidth1,
  291. });
  292. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  293. {
  294. PointCode = "线宽正面",
  295. StepName = "线宽",
  296. Data = item.LineWidth2,
  297. });
  298. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  299. {
  300. PointCode = "线宽正面",
  301. StepName = "线宽",
  302. Data = item.LineWidth3,
  303. });
  304. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  305. {
  306. PointCode = "线宽正面",
  307. StepName = "线宽",
  308. Data = item.LineWidth4,
  309. });
  310. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  311. {
  312. PointCode = "线宽正面",
  313. StepName = "线宽",
  314. Data = item.LineWidth5,
  315. });
  316. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  317. {
  318. PointCode = "线宽正面",
  319. StepName = "线宽",
  320. Data = item.LineWidth6,
  321. });
  322. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  323. {
  324. PointCode = "线宽正面",
  325. StepName = "线宽",
  326. Data = item.LineWidth7,
  327. });
  328. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  329. {
  330. PointCode = "线宽正面",
  331. StepName = "线宽",
  332. Data = item.LineWidth8,
  333. });
  334. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  335. {
  336. PointCode = "线宽正面",
  337. StepName = "线宽",
  338. Data = item.LineWidth9,
  339. });
  340. #endregion
  341. if (!dataCnt.ContainsKey("张力"))
  342. dataCnt.Add("张力", 5);
  343. else
  344. if (dataCnt["张力"] < 5)
  345. dataCnt["张力"] = 5;
  346. if (!dataCnt.ContainsKey("厚度"))
  347. dataCnt.Add("厚度", 5);
  348. else
  349. if (dataCnt["厚度"] < 5)
  350. dataCnt["厚度"] = 5;
  351. if (!dataCnt.ContainsKey("Y轴方向PT值检测"))
  352. dataCnt.Add("Y轴方向PT值检测", 5);
  353. else
  354. if (dataCnt["Y轴方向PT值检测"] < 5)
  355. dataCnt["Y轴方向PT值检测"] = 5;
  356. if (!dataCnt.ContainsKey("线宽正面"))
  357. dataCnt.Add("线宽正面", 9);
  358. else
  359. if (dataCnt["线宽正面"] < 9)
  360. dataCnt["线宽正面"] = 9;
  361. }
  362. else
  363. {
  364. //按照步骤流程分类
  365. string[] pointType = item.SizeDefectInfoList.Select(t => t.StepName).Distinct().ToList().ToArray();
  366. for (int i = 0; i < pointType.Length; i++)
  367. {
  368. List<SizeDefectInfo> t = item.SizeDefectInfoList.Where(q => q.StepName == pointType[i] && !q.isAverage).ToList();
  369. if (t.Count > 0)
  370. {
  371. //当前测试项数据个数
  372. if (!dataCnt.ContainsKey(pointType[i]))
  373. dataCnt.Add(pointType[i], t.Count);
  374. else
  375. if (dataCnt[pointType[i]] < t.Count)
  376. dataCnt[pointType[i]] = t.Count;
  377. }
  378. }
  379. }
  380. }
  381. //插入列
  382. foreach (var item in dataCnt)
  383. {
  384. //按步骤名称插入列
  385. for (int i = 0; i < item.Value; i++)
  386. dt.Columns.Add(new DataColumn($"{item.Key}-{i + 1}", typeof(string)));
  387. dt.Columns.Add(new DataColumn($"{item.Key}均值", typeof(string)));
  388. }
  389. foreach(var item in ConfMgr.Instance.DefectItemParamsList)
  390. if(item.Show == 1)
  391. dt.Columns.Add(new DataColumn(item.Name + "数量", typeof(int)));//在表中添加int类型的列
  392. //插入按钮
  393. dataGridView1.DataSource = dt;
  394. //在datagridview中添加button按钮
  395. //DataGridViewButtonColumn btn = new DataGridViewButtonColumn();
  396. //btn.Name = "Modify";
  397. //btn.HeaderText = "操作";
  398. //btn.DefaultCellStyle.NullValue = "修改";
  399. //dataGridView1.Columns.Add(btn);
  400. //DataGridViewButtonColumn btn2 = new DataGridViewButtonColumn();
  401. //btn2.Name = "HistoryView";
  402. //btn2.HeaderText = "查看";
  403. //btn2.DefaultCellStyle.NullValue = "历史";
  404. //dataGridView1.Columns.Add(btn2);
  405. DataGridViewButtonColumn btn3 = new DataGridViewButtonColumn();
  406. btn3.Name = "Distribution";
  407. btn3.HeaderText = "缺陷分布";
  408. btn3.DefaultCellStyle.NullValue = "分布";
  409. dataGridView1.Columns.Add(btn3);
  410. DataTable dts = (DataTable)dataGridView1.DataSource;
  411. dts.Clear();
  412. List<Point> FailPoint = new List<Point>();
  413. int row_index = 0;
  414. int col_index = 9;
  415. foreach (var item in list)
  416. {
  417. //新增
  418. DataRow dr;//行
  419. dr = dts.NewRow();
  420. //dr["选择"] = false;
  421. dr["检验日期"] = item.CreateTime.ToString("yyyy-MM-dd HH:mm:ss");
  422. dr["检测单号"] = item.DetectOrder;
  423. dr["产品名称"] = item.ProductInfo.Name;
  424. dr["料号"] = item.ProductInfo.Code;
  425. dr["网版编码"] = item.SN;
  426. dr["批次"] = item.BatchId;
  427. dr["合格"] = item.Qualified ? "合格": "不合格";
  428. dr["修复"] = item.State == 10 ? "异常" : item.State == 5 ? "修复" : "待修复";
  429. dr["异常情况"] = item.Abnormalities;
  430. dr["修复人员"] = item.RepairCode;
  431. dr["比对"] = item.CompareResult == 2 ? "不通过" : item.CompareResult == 1 ? "通过" : "未比对";
  432. //根据不同步骤名称插入数据
  433. List<SizeDefectInfo> tempd = new List<SizeDefectInfo>();
  434. foreach (var tdata in dataCnt)
  435. {
  436. tempd = item.SizeDefectInfoList.Where(q => q.StepName == tdata.Key).ToList();
  437. List<double> dataList = new List<double>();
  438. int data_index = 0;
  439. for (int i = 0; i < tempd.Count; i++)
  440. {
  441. if (tempd[i].isAverage == false)
  442. {
  443. dataList.Add(tempd[i].Data);
  444. dr[$"{tdata.Key}-{data_index + 1}"] = tempd[i].Data.ToString("0.0000");
  445. data_index++;
  446. }
  447. //不合格数据添加队列
  448. if(i + 1 == tempd.Count)
  449. col_index = this.dataGridView1.Columns[$"{tdata.Key}均值"].Index;
  450. else
  451. col_index = this.dataGridView1.Columns[$"{tdata.Key}-{data_index}"].Index;
  452. if (tempd[i].result == 2)
  453. FailPoint.Add(new Point(row_index, col_index));
  454. }
  455. if (dataList.Count > 0)
  456. dr[$"{tdata.Key}均值"] = dataList.Average().ToString("0.0000");
  457. else
  458. dr[$"{tdata.Key}均值"] = "0";
  459. }
  460. foreach (var defItem in ConfMgr.Instance.DefectItemParamsList)
  461. {
  462. if (defItem.Show == 1)
  463. {
  464. if (item.DefectCntInfoList != null)
  465. {
  466. var fd = item.DefectCntInfoList.Find(x => x.Name == defItem.Name);
  467. if (fd != null)
  468. dr[defItem.Name + "数量"] = fd.DefectCnt;
  469. else
  470. dr[defItem.Name + "数量"] = 0;
  471. }
  472. else
  473. dr[defItem.Name + "数量"] = 0;
  474. }
  475. }
  476. dts.Rows.Add(dr);//在表的对象的行里添加此行
  477. row_index++;
  478. }
  479. //dts.DefaultView.Sort = "时间戳 desc";
  480. //dts = dts.DefaultView.ToTable();
  481. dataGridView1.DataSource = dts;
  482. this.dataGridView1.Columns[0].Width = 50;
  483. this.dataGridView1.Columns[1].Width = 120;
  484. for (int i = 0; i < 12; i++) //去除3列
  485. {
  486. this.dataGridView1.Columns[i].Frozen = true;
  487. }
  488. for (int i = 0; i < FailPoint.Count; i++)
  489. {
  490. DataGridViewCell aa = dataGridView1.Rows[FailPoint[i].X].Cells[FailPoint[i].Y];
  491. aa.Style.ForeColor = Color.Red;
  492. //aa.Style.BackColor = Color.LightGreen;
  493. }
  494. return;
  495. }
  496. #endregion
  497. private void QueryData()
  498. {
  499. QueryOrderData queryOrderData = new QueryOrderData();
  500. queryOrderData.model = "order";
  501. queryOrderData.fields = "*";
  502. queryOrderData.order = "id desc";
  503. queryOrderData.pageNum = this.pageCtrl1.PageIndex;
  504. queryOrderData.pageSize = this.pageCtrl1.PageSize;
  505. queryOrderData.domain = new List<domainItem>();
  506. domainItem startTime = new domainItem();
  507. startTime.FieldName = "CreateTime";
  508. startTime.FieldValue = dateTimePicker1.Value.ToString("yyyy-M-d");
  509. startTime.ConditionalType = 3;
  510. queryOrderData.domain.Add(startTime);
  511. domainItem endTime = new domainItem();
  512. endTime.FieldName = "CreateTime";
  513. endTime.FieldValue = dateTimePicker2.Value.ToString("yyyy-M-d") + " 23:59:59";
  514. endTime.ConditionalType = 5;
  515. queryOrderData.domain.Add(endTime);
  516. //OrderService.GetList
  517. //产品条件
  518. if (!string.IsNullOrEmpty(cbProductCode.Text))
  519. {
  520. domainItem ProductCode = new domainItem();
  521. ProductCode.FieldName = "ProductId";
  522. ProductCode.FieldValue = SysMgr.Instance.ProductIdList[cbProductCode.SelectedIndex].ToString();
  523. ProductCode.ConditionalType = 6;
  524. queryOrderData.domain.Add(ProductCode);
  525. }
  526. //合格条件
  527. if (!string.IsNullOrEmpty(comboBox2.Text))
  528. {
  529. domainItem CompareResult = new domainItem();
  530. CompareResult.FieldName = "Qualified";
  531. CompareResult.FieldValue = comboBox2.Text == "合格"? "1":"0";
  532. CompareResult.ConditionalType = 0;
  533. queryOrderData.domain.Add(CompareResult);
  534. }
  535. //比对条件
  536. if (!string.IsNullOrEmpty(comboBox1.Text))
  537. {
  538. domainItem CompareResultOptions = new domainItem();
  539. CompareResultOptions.FieldName = "CompareResult";
  540. CompareResultOptions.FieldValue = comboBox1.Text == "通过" ? "1" : comboBox1.Text == "未通过" ? "2" : "0";
  541. CompareResultOptions.ConditionalType = 0;
  542. queryOrderData.domain.Add(CompareResultOptions);
  543. }
  544. //异常条件
  545. if (!string.IsNullOrEmpty(comboBox3.Text))
  546. {
  547. domainItem State = new domainItem();
  548. State.FieldName = "State";
  549. State.FieldValue = comboBox3.Text == "修复" ? "5" : comboBox3.Text == "未修复" ? "0" : "10";
  550. State.ConditionalType = 0;
  551. queryOrderData.domain.Add(State);
  552. }
  553. int totalcnt = 0;
  554. JObject str = JObject.Parse(JsonConvert.SerializeObject(queryOrderData));
  555. var list = getTableList(str, out totalcnt);
  556. this.pageCtrl1.DrawControl(totalcnt);
  557. QueryOrders = list;
  558. //自动生成表格
  559. ShowDataTableEx(list);
  560. //总数居
  561. queryOrderData.pageNum = 0;
  562. queryOrderData.pageSize = 0;
  563. JObject str2 = JObject.Parse(JsonConvert.SerializeObject(queryOrderData));
  564. var list2 = getTableList(str2, out totalcnt);
  565. QueryAllOrders = list2;
  566. }
  567. private void skinButton2_Click(object sender, EventArgs e)
  568. {
  569. pageCtrl1.PageIndex = 1;
  570. QueryData();
  571. }
  572. #endregion
  573. #region 表格单击
  574. #region 更新数据
  575. #endregion
  576. private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
  577. {
  578. int Index = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引
  579. if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "操作")
  580. {
  581. //修改数据
  582. AmendantRecordFrm recordFrm = new AmendantRecordFrm(QueryOrders[Index]);
  583. recordFrm.ShowDialog();
  584. //重新显示
  585. QueryData();
  586. }
  587. else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "查看")
  588. {
  589. //查看历史
  590. HistoryViewFrm Frm = new HistoryViewFrm(QueryOrders[Index]);
  591. Frm.ShowDialog();
  592. }
  593. else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "缺陷分布")
  594. {
  595. //缺陷分布
  596. DistributionFrm Frm = new DistributionFrm(QueryOrders[Index]);
  597. Frm.WindowState = FormWindowState.Maximized;
  598. Frm.ShowDialog();
  599. }
  600. else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "选择")
  601. {
  602. DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[Index].Cells[0];
  603. Boolean flag = Convert.ToBoolean(checkCell.Value);
  604. if (flag == true) //查找被选择的数据行
  605. {
  606. checkCell.Value = false;
  607. }
  608. else
  609. checkCell.Value = true;
  610. }
  611. }
  612. #endregion
  613. #region 界面调整
  614. private void DataQueryFrm_SizeChanged(object sender, EventArgs e)
  615. {
  616. if (this.WindowState == FormWindowState.Maximized)
  617. {
  618. this.WindowState = FormWindowState.Normal;
  619. this.Top = 0;
  620. this.Left = 0;
  621. this.Width = SystemInformation.WorkingArea.Width;
  622. this.Height = SystemInformation.WorkingArea.Height;
  623. }
  624. }
  625. #endregion
  626. #region 删除
  627. private int delTableList(JObject req)
  628. {
  629. JObject res = new JObject();
  630. try
  631. {
  632. string model = req.Value<string>("model");
  633. string domain = req.Value<JArray>("domain").ToString();
  634. //var idArr = req.Value<JArray>("idList");
  635. //List<int> ids = new List<int>();
  636. //foreach (int id in idArr) ids.Add(id);
  637. int result = OrderService.DeleteList(model, domain);
  638. return 1;
  639. }
  640. catch (Exception ex)
  641. {
  642. }
  643. return 0;
  644. }
  645. private void skinButton3_Click(object sender, EventArgs e)
  646. {
  647. for (int i = 0; i < dataGridView1.Rows.Count; i++)
  648. {
  649. DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[i].Cells[0];
  650. Boolean flag = Convert.ToBoolean(checkCell.Value);
  651. if(flag == true)
  652. {
  653. QueryOrderData delOrderData = new QueryOrderData();
  654. delOrderData.model = "order";
  655. delOrderData.domain = new List<domainItem>();
  656. domainItem doitem = new domainItem();
  657. doitem.FieldName = "Id";
  658. doitem.FieldValue = QueryOrders[i].Id.ToString();
  659. doitem.ConditionalType = 6;
  660. delOrderData.domain.Add(doitem);
  661. JObject str = JObject.Parse(JsonConvert.SerializeObject(delOrderData));
  662. int ret = delTableList(str);
  663. if (ret == 1)
  664. {
  665. //删除历史
  666. QueryOrderData HistoryOrderData = new QueryOrderData();
  667. HistoryOrderData.model = "OrderHistory";
  668. HistoryOrderData.domain = new List<domainItem>();
  669. domainItem doitem2 = new domainItem();
  670. doitem2.FieldName = "Pid";
  671. doitem2.FieldValue = QueryOrders[i].Id.ToString();
  672. doitem2.ConditionalType = 6;
  673. HistoryOrderData.domain.Add(doitem2);
  674. JObject str2 = JObject.Parse(JsonConvert.SerializeObject(HistoryOrderData));
  675. delTableList(str2);
  676. }
  677. }
  678. }
  679. //重新显示
  680. QueryData();
  681. }
  682. #endregion
  683. #region Excel 文本导出
  684. private DataTable GetExcelTabel(out List<Point> points)
  685. {
  686. points = new List<Point>();
  687. //记录数据类型列数
  688. Dictionary<string, int> dataCnt = new Dictionary<string, int>();
  689. DataTable dt = new DataTable(); //建立个数据表
  690. //通用列
  691. dt.Columns.Add(new DataColumn("检验日期", typeof(string)));//在表中添加string类型的列
  692. dt.Columns.Add(new DataColumn("检测单号", typeof(string)));//在表中添加string类型的列
  693. dt.Columns.Add(new DataColumn("产品名称", typeof(string)));//在表中添加string类型的列
  694. dt.Columns.Add(new DataColumn("料号", typeof(string)));//在表中添加string类型的列
  695. dt.Columns.Add(new DataColumn("网版编码", typeof(string)));//在表中添加string类型的列
  696. dt.Columns.Add(new DataColumn("批次", typeof(string)));//在表中添加string类型的列
  697. dt.Columns.Add(new DataColumn("合格", typeof(string)));//在表中添加string类型的列
  698. dt.Columns.Add(new DataColumn("修复", typeof(string)));//在表中添加string类型的列
  699. dt.Columns.Add(new DataColumn("异常情况", typeof(string)));//在表中添加string类型的列
  700. dt.Columns.Add(new DataColumn("修复人员", typeof(string)));//在表中添加string类型的列
  701. dt.Columns.Add(new DataColumn("比对", typeof(string)));//在表中添加string类型的列
  702. foreach (var item in QueryAllOrders)
  703. {
  704. //老流程
  705. if (item.StepInfo == null || item.StepInfo.ProcessType != "快速流程")
  706. {
  707. //加入数据表
  708. if (item.SizeDefectInfoList == null)
  709. item.SizeDefectInfoList = new List<SizeDefectInfo>();
  710. #region 张力
  711. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  712. {
  713. PointCode = "Tension",
  714. StepName = "张力",
  715. Data = item.Tension1,
  716. });
  717. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  718. {
  719. PointCode = "Tension",
  720. StepName = "张力",
  721. Data = item.Tension2,
  722. });
  723. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  724. {
  725. PointCode = "Tension",
  726. StepName = "张力",
  727. Data = item.Tension3,
  728. });
  729. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  730. {
  731. PointCode = "Tension",
  732. StepName = "张力",
  733. Data = item.Tension4,
  734. });
  735. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  736. {
  737. PointCode = "Tension",
  738. StepName = "张力",
  739. Data = item.Tension5,
  740. });
  741. #endregion
  742. #region 厚度
  743. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  744. {
  745. PointCode = "Height",
  746. StepName = "厚度",
  747. Data = item.Height1,
  748. });
  749. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  750. {
  751. PointCode = "Height",
  752. StepName = "厚度",
  753. Data = item.Height2,
  754. });
  755. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  756. {
  757. PointCode = "Height",
  758. StepName = "厚度",
  759. Data = item.Height3,
  760. });
  761. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  762. {
  763. PointCode = "Height",
  764. StepName = "厚度",
  765. Data = item.Height4,
  766. });
  767. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  768. {
  769. PointCode = "Height",
  770. StepName = "厚度",
  771. Data = item.Height5,
  772. });
  773. #endregion
  774. #region YPT
  775. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  776. {
  777. PointCode = "Y轴方向PT值检测",
  778. StepName = "Y轴方向PT值",
  779. Data = item.PT1,
  780. });
  781. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  782. {
  783. PointCode = "Y轴方向PT值检测",
  784. StepName = "Y轴方向PT值",
  785. Data = item.PT2,
  786. });
  787. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  788. {
  789. PointCode = "Y轴方向PT值检测",
  790. StepName = "Y轴方向PT值",
  791. Data = item.PT3,
  792. });
  793. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  794. {
  795. PointCode = "Y轴方向PT值检测",
  796. StepName = "Y轴方向PT值",
  797. Data = item.PT5,
  798. });
  799. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  800. {
  801. PointCode = "Y轴方向PT值检测",
  802. StepName = "Y轴方向PT值",
  803. Data = item.PT6,
  804. });
  805. #endregion
  806. #region 线宽
  807. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  808. {
  809. PointCode = "线宽正面",
  810. StepName = "线宽",
  811. Data = item.LineWidth1,
  812. });
  813. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  814. {
  815. PointCode = "线宽正面",
  816. StepName = "线宽",
  817. Data = item.LineWidth2,
  818. });
  819. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  820. {
  821. PointCode = "线宽正面",
  822. StepName = "线宽",
  823. Data = item.LineWidth3,
  824. });
  825. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  826. {
  827. PointCode = "线宽正面",
  828. StepName = "线宽",
  829. Data = item.LineWidth4,
  830. });
  831. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  832. {
  833. PointCode = "线宽正面",
  834. StepName = "线宽",
  835. Data = item.LineWidth5,
  836. });
  837. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  838. {
  839. PointCode = "线宽正面",
  840. StepName = "线宽",
  841. Data = item.LineWidth6,
  842. });
  843. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  844. {
  845. PointCode = "线宽正面",
  846. StepName = "线宽",
  847. Data = item.LineWidth7,
  848. });
  849. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  850. {
  851. PointCode = "线宽正面",
  852. StepName = "线宽",
  853. Data = item.LineWidth8,
  854. });
  855. item.SizeDefectInfoList.Add(new SizeDefectInfo()
  856. {
  857. PointCode = "线宽正面",
  858. StepName = "线宽",
  859. Data = item.LineWidth9,
  860. });
  861. #endregion
  862. if (!dataCnt.ContainsKey("张力"))
  863. dataCnt.Add("张力", 5);
  864. else
  865. if (dataCnt["张力"] < 5)
  866. dataCnt["张力"] = 5;
  867. if (!dataCnt.ContainsKey("厚度"))
  868. dataCnt.Add("厚度", 5);
  869. else
  870. if (dataCnt["厚度"] < 5)
  871. dataCnt["厚度"] = 5;
  872. if (!dataCnt.ContainsKey("Y轴方向PT值检测"))
  873. dataCnt.Add("Y轴方向PT值检测", 5);
  874. else
  875. if (dataCnt["Y轴方向PT值检测"] < 5)
  876. dataCnt["Y轴方向PT值检测"] = 5;
  877. if (!dataCnt.ContainsKey("线宽正面"))
  878. dataCnt.Add("线宽正面", 9);
  879. else
  880. if (dataCnt["线宽正面"] < 9)
  881. dataCnt["线宽正面"] = 9;
  882. }
  883. else
  884. {
  885. //按照步骤流程分类
  886. string[] pointType = item.SizeDefectInfoList.Select(t => t.StepName).Distinct().ToList().ToArray();
  887. for (int i = 0; i < pointType.Length; i++)
  888. {
  889. List<SizeDefectInfo> t = item.SizeDefectInfoList.Where(q => q.StepName == pointType[i] && !q.isAverage).ToList();
  890. if (t.Count > 0)
  891. {
  892. //当前测试项数据个数
  893. if (!dataCnt.ContainsKey(pointType[i]))
  894. dataCnt.Add(pointType[i], t.Count);
  895. else
  896. if (dataCnt[pointType[i]] < t.Count)
  897. dataCnt[pointType[i]] = t.Count;
  898. }
  899. }
  900. }
  901. }
  902. //插入列
  903. foreach (var item in dataCnt)
  904. {
  905. //按步骤名称插入列
  906. for (int i = 0; i < item.Value; i++)
  907. dt.Columns.Add(new DataColumn($"{item.Key}-{i + 1}", typeof(string)));
  908. dt.Columns.Add(new DataColumn($"{item.Key}均值", typeof(string)));
  909. }
  910. foreach (var item in ConfMgr.Instance.DefectItemParamsList)
  911. if(item.Show == 1)
  912. dt.Columns.Add(new DataColumn(item.Name + "数量", typeof(int)));//在表中添加int类型的列
  913. int row_index = 0;
  914. foreach (var item in QueryAllOrders)
  915. {
  916. //新增
  917. DataRow dr;//行
  918. dr = dt.NewRow();
  919. //dr["选择"] = false;
  920. dr["检验日期"] = item.CreateTime.ToString("yyyy-MM-dd HH:mm:ss");
  921. dr["检测单号"] = item.DetectOrder;
  922. dr["产品名称"] = item.ProductInfo.Name;
  923. dr["料号"] = item.ProductInfo.Code;
  924. dr["网版编码"] = item.SN;
  925. dr["批次"] = item.BatchId;
  926. dr["合格"] = item.Qualified ? "合格" : "不合格";
  927. dr["修复"] = item.State == 10 ? "异常" : item.State == 5 ? "修复" : "待修复";
  928. dr["异常情况"] = item.Abnormalities;
  929. dr["修复人员"] = item.RepairCode;
  930. dr["比对"] = item.CompareResult == 2 ? "不通过" : item.CompareResult == 1 ? "通过" : "未比对";
  931. List<SizeDefectInfo> tempd = new List<SizeDefectInfo>();
  932. foreach (var tdata in dataCnt)
  933. {
  934. tempd = item.SizeDefectInfoList.Where(q => q.StepName == tdata.Key ).ToList();
  935. List<double> dataList = new List<double>();
  936. //for (int i = 0; i < tempd.Count; i++)
  937. // dr[$"{tdata.Key}-{i + 1}"] = tempd[i].Data.ToString("0.0000");
  938. //dr[$"{tdata.Key}均值"] = item.TensionValue.ToString("0.0000");
  939. int data_index = 0;
  940. for (int i = 0; i < tempd.Count; i++)
  941. {
  942. int col_index = 0;
  943. if (!tempd[i].isAverage)
  944. {
  945. dataList.Add(tempd[i].Data);
  946. dr[$"{tdata.Key}-{data_index + 1}"] = tempd[i].Data.ToString("0.0000");
  947. col_index = dr.Table.Columns.IndexOf($"{tdata.Key}-{data_index + 1}");
  948. data_index++;
  949. }
  950. else
  951. col_index = dr.Table.Columns.IndexOf($"{tdata.Key}均值");
  952. if (tempd[i].result == 2)
  953. points.Add(new Point(row_index, col_index));
  954. }
  955. if (dataList.Count > 0)
  956. dr[$"{tdata.Key}均值"] = dataList.Average().ToString("0.0000");
  957. else
  958. dr[$"{tdata.Key}均值"] = "0";
  959. }
  960. foreach (var defItem in ConfMgr.Instance.DefectItemParamsList)
  961. {
  962. if (defItem.Show == 1)
  963. {
  964. if (item.DefectCntInfoList != null)
  965. {
  966. var fd = item.DefectCntInfoList.Find(x => x.Name == defItem.Name);
  967. if (fd != null)
  968. dr[defItem.Name + "数量"] = fd.DefectCnt;
  969. else
  970. dr[defItem.Name + "数量"] = 0;
  971. }
  972. else
  973. dr[defItem.Name + "数量"] = 0;
  974. }
  975. }
  976. dt.Rows.Add(dr);//在表的对象的行里添加此行
  977. row_index++;
  978. }
  979. return dt;
  980. }
  981. private void ShowAllDataTableEx(string filePath, DataTable dt)
  982. {
  983. try
  984. {
  985. // 创建一个新的CSV文件并写入数据
  986. using (StreamWriter writer = new StreamWriter(filePath, false, UnicodeEncoding.GetEncoding("GB2312")))
  987. {
  988. // 写入CSV文件的标题行
  989. for (int i = 0; i < dt.Columns.Count; i++)
  990. {
  991. writer.Write(dt.Columns[i].ColumnName + ",");
  992. }
  993. writer.Write("\r\n");
  994. for (int i = 0; i < dt.Rows.Count; i++)
  995. {
  996. // 写入数据行
  997. for (int j = 0; j < dt.Columns.Count; j++)
  998. {
  999. writer.Write(dt.Rows[i][j] + ",");
  1000. }
  1001. writer.Write("\r\n");
  1002. //Console.WriteLine("CSV文件写入成功!");
  1003. }
  1004. }
  1005. }
  1006. catch (Exception ex)
  1007. {
  1008. MessageBox.Show("数据导出失败!error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  1009. }
  1010. return;
  1011. }
  1012. private void skinButton1_Click(object sender, EventArgs e)
  1013. {
  1014. DataTable dt = (DataTable)dataGridView1.DataSource;
  1015. if (dt.Rows.Count > 0)
  1016. {
  1017. SaveFileDialog fileDialog = new SaveFileDialog();
  1018. fileDialog.Filter = "数据文件(*.csv)|*.csv";
  1019. //fileDialog.Filter = "数据文件(*.xlsx)|*.xlsx";
  1020. fileDialog.Title = "保存数据";
  1021. //保存对话框是否记忆上次打开的目录
  1022. fileDialog.RestoreDirectory = true;
  1023. if (fileDialog.ShowDialog() == DialogResult.OK)
  1024. {
  1025. try
  1026. {
  1027. string filePath = fileDialog.FileName; // CSV文件路径
  1028. List<Point> pt;
  1029. DataTable tdt = GetExcelTabel(out pt);
  1030. //tdt.Columns.RemoveAt(0);
  1031. //tdt.Columns.RemoveAt(tdt.Columns.Count -1);
  1032. //OutputAsExcelFile(tdt, filePath, pt);
  1033. ShowAllDataTableEx(filePath, tdt);
  1034. MessageBox.Show("数据导出成功!" , "完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
  1035. }
  1036. catch (Exception ex)
  1037. {
  1038. MessageBox.Show("数据导出失败!error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
  1039. }
  1040. }
  1041. }
  1042. }
  1043. #endregion
  1044. private void btnClear_Click(object sender, EventArgs e)
  1045. {
  1046. cbProductCode.Text = "";
  1047. }
  1048. #region excel导出
  1049. public Excel.Application m_xlApp = null;
  1050. public void OutputAsExcelFile(DataTable dtTable, String filePath, List<Point> points)
  1051. {
  1052. //string filePath = "";
  1053. //SaveFileDialog s = new SaveFileDialog();
  1054. //s.Title = "保存Excel文件";
  1055. //s.Filter = "Excel文件(*.xls)|*.xls";
  1056. //s.FilterIndex = 1;
  1057. //if (s.ShowDialog() == DialogResult.OK)
  1058. // filePath = s.FileName;
  1059. //else
  1060. // return;
  1061. //导出dataTable到Excel
  1062. long rowNum = dtTable.Rows.Count;//行数
  1063. int columnNum = dtTable.Columns.Count;//列数
  1064. Excel.Application m_xlApp = new Excel.Application();
  1065. m_xlApp.DisplayAlerts = false;//不显示更改提示
  1066. m_xlApp.Visible = false;
  1067. Excel.Workbooks workbooks = m_xlApp.Workbooks;
  1068. Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
  1069. Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
  1070. try
  1071. {
  1072. string[,] datas = new string[rowNum + 1, columnNum];
  1073. for (int i = 0; i < columnNum; i++) //写入字段
  1074. datas[0, i] = dtTable.Columns[i].Caption; //写入列标
  1075. //Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]);
  1076. Excel.Range range = m_xlApp.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]];
  1077. range.Interior.ColorIndex = 15;//15代表灰色
  1078. range.Font.Bold = true;
  1079. range.Font.Size = 10;
  1080. int r = 0;
  1081. for (r = 0; r < rowNum; r++)
  1082. {
  1083. for (int i = 0; i < columnNum; i++)
  1084. {
  1085. object obj;
  1086. obj = dtTable.Rows[r][dtTable.Columns[i].ToString()];
  1087. datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式
  1088. //Console.WriteLine(datas[r + 1, i]);
  1089. }
  1090. System.Windows.Forms.Application.DoEvents();
  1091. //添加进度条
  1092. }
  1093. //Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]);
  1094. Excel.Range fchR = m_xlApp.Range[worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]];
  1095. fchR.Value2 = datas;
  1096. worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。
  1097. //worksheet.Name = "dd";
  1098. //m_xlApp.WindowState = Excel.XlWindowState.xlMaximized;
  1099. m_xlApp.Visible = false;
  1100. // = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]);
  1101. range = m_xlApp.Range[worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]];
  1102. for (int i = 0; i < points.Count; i++)
  1103. {
  1104. Excel.Range Errrange = m_xlApp.Range[worksheet.Cells[points[i].X + 2, points[i].Y + 1], worksheet.Cells[points[i].X + 2, points[i].Y + 1]];
  1105. Errrange.Font.ColorIndex = 3;//3红色
  1106. }
  1107. //range.Interior.ColorIndex = 15;//15代表灰色
  1108. range.Font.Size = 9;
  1109. range.RowHeight = 14.25;
  1110. range.Borders.LineStyle = 1;
  1111. range.HorizontalAlignment = 1;
  1112. workbook.Saved = true;
  1113. workbook.SaveCopyAs(filePath);
  1114. }
  1115. catch (Exception ex)
  1116. {
  1117. MessageBox.Show("导出异常:" + ex.Message, "导出异常", MessageBoxButtons.OK, MessageBoxIcon.Warning);
  1118. }
  1119. finally
  1120. {
  1121. EndReport();
  1122. }
  1123. m_xlApp.Workbooks.Close();
  1124. m_xlApp.Workbooks.Application.Quit();
  1125. m_xlApp.Application.Quit();
  1126. m_xlApp.Quit();
  1127. //MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  1128. }
  1129. private void EndReport()
  1130. {
  1131. object missing = System.Reflection.Missing.Value;
  1132. try
  1133. { }
  1134. catch { }
  1135. finally
  1136. {
  1137. try
  1138. {
  1139. //System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Workbooks);
  1140. //System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Application);
  1141. //System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp);
  1142. //m_xlApp = null;
  1143. }
  1144. catch { }
  1145. try
  1146. {
  1147. //清理垃圾进程
  1148. this.killProcessThread();
  1149. }
  1150. catch { }
  1151. GC.Collect();
  1152. }
  1153. }
  1154. private void killProcessThread()
  1155. {
  1156. ArrayList myProcess = new ArrayList();
  1157. for (int i = 0; i < myProcess.Count; i++)
  1158. {
  1159. try
  1160. {
  1161. System.Diagnostics.Process.GetProcessById(int.Parse((string)myProcess[i])).Kill();
  1162. }
  1163. catch { }
  1164. }
  1165. }
  1166. #endregion
  1167. }
  1168. }