using Devart.Data; using MaiMuAOI.SysCtrl; using MaiMuAOI.SysUI.ProductAndStep; using MaiMuControl.SysStatusMgr.UserMgr; using Microsoft.Office.Interop.Excel; using Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using OpenCvSharp.Flann; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.Common; using System.Drawing; using System.Dynamic; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices.ComTypes; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Web.Routing; using System.Web.UI.WebControls; using System.Windows.Forms; using static MaiMuControl.Form1; using DataTable = System.Data.DataTable; using Point = System.Drawing.Point; using Excel = Microsoft.Office.Interop.Excel; namespace MaiMuAOI.SysUI.DefectPicShow { public partial class DataQueryFrm : Form { Service.OrderService OrderService = new Service.OrderService(); List QueryOrders = new List(); List QueryAllOrders = new List(); public DataQueryFrm() { InitializeComponent(); UIStyle.SetUIStyle(this); this.uiTitel1.FatherForm = this; } private void DataQueryFrm_Load(object sender, EventArgs e) { LoadPdtList(SysMgr.Instance.ProductCodeList); //激活OnPageChanged事件 pageCtrl1.OnPageChanged += new EventHandler(pagerControl1_OnPageChanged); } #region 切页 /// /// 页数变化时调用绑定数据方法 /// /// /// private void pagerControl1_OnPageChanged(object sender, EventArgs e) { QueryData(); } #endregion #region 加载料号 private string[] pdtlistData; private void LoadPdtList(List list) { this.cbProductCode.Items.Clear(); this.pdtlistData = list.ToArray(); cbProductCode.Items.AddRange(pdtlistData);//比使用DataSource速度要快一些 cbProductCode.TextUpdate += cobList_TextUpdate;//重新绑定事件 cbProductCode.KeyDown += CobList_KeyDown; this.cbProductCode.Text = ""; cbProductCode.Focus(); cbProductCode.SelectAll(); } private void CobList_KeyDown(object sender, KeyEventArgs e) { ComboBox ctrl = sender as ComboBox; if (e.KeyCode == Keys.Enter) { if (ctrl.Items.Count == 1) ctrl.Text = ctrl.Items[0].ToString(); } } private void cobList_TextUpdate(object sender, EventArgs e) { ComboBox ctrl = sender as ComboBox; if (ctrl.Text != null) { string str = ctrl.Text; //获取cb_material控件输入内 //清空combobox ctrl.DataSource = null; ctrl.Items.Clear(); string[] workOrderFiltered; workOrderFiltered = pdtlistData.Where(x => x.IndexOf(str, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();//忽略大小写 ctrl.Items.AddRange(workOrderFiltered);//比使用DataSource速度要快一些 // 不存在符合条件时 //设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列 ctrl.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置 if (workOrderFiltered.Length > 0) { if (!ctrl.DroppedDown) ctrl.DroppedDown = true; // 自动弹出下拉框 } ctrl.SelectionStart = str.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列 } } #endregion #region 查询数据 #region 数据库查询 private class domainItem { public string FieldName { get; set; } public string FieldValue { get; set; } public int ConditionalType { get; set; } } private class QueryOrderData { public string model { get; set; } public string fields { get; set; } public List domain { get; set; } public string order { get; set; } public int pageNum { get; set; } public int pageSize { get; set; } } private List getTableList(JObject req, out int TotalCnt) { try { string model, fields = "", domain = "", order = ""; int pageNum = 0, pageSize = 0, totalCount = 0; model = req.Value("model"); if (req.ContainsKey("fields")) fields = req.Value("fields"); if (req.ContainsKey("domain")) domain = req.Value("domain").ToString(); if (req.ContainsKey("order")) order = req.Value("order"); if (req.ContainsKey("pageNum")) pageNum = req.Value("pageNum"); if (req.ContainsKey("pageSize")) pageSize = req.Value("pageSize"); //创建表达式 var exp1 = Expressionable.Create() //.AndIF((int)cobProductList.SelectedValue > 0, it => it.ProductId == (int)cobProductList.SelectedValue) //.AndIF((int)cobStepList.SelectedValue > 0, it => it.StepId == (int)cobStepList.SelectedValue) //.AndIF(dateTimePicker1.Checked, it => it.CreateTime >= dateTimePicker1.Value) //.AndIF(dateTimePicker2.Checked, it => it.CreateTime < dateTimePicker2.Value) .ToExpression();//注意 这一句 不能少 var list = OrderService.GetListEx(fields, domain, order, pageNum, pageSize, ref totalCount); TotalCnt = totalCount; //var list = svcOrder.GetListNav(pageNum, pageSize, ref totalCount, exp1); return list; } catch (Exception ex) { ; } TotalCnt = 0; return null; } #endregion #region 新老流程数据分析 private void ShowDataTableEx(List list) { dataGridView1.Columns.Clear(); //记录数据类型列数 Dictionary dataCnt = new Dictionary(); DataTable dt = new DataTable(); //建立个数据表 //通用列 DataGridViewCheckBoxColumn chk = new DataGridViewCheckBoxColumn(); chk.Name = "Select"; chk.HeaderText = "选择"; dataGridView1.Columns.Add(chk); dt.Columns.Add(new DataColumn("检验日期", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("检测单号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("产品名称", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("料号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("网版编码", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("批次", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("合格", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("异常情况", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复人员", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("比对", typeof(string)));//在表中添加string类型的列 foreach(var item in list) { //老流程 if(item.StepInfo == null ||item.StepInfo.ProcessType != "快速流程") { //加入数据表 if(item.SizeDefectInfoList == null) item.SizeDefectInfoList = new List(); #region 张力 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension5, }); #endregion #region 厚度 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height5, }); #endregion #region YPT item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT6, }); #endregion #region 线宽 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth6, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth7, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth8, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth9, }); #endregion if (!dataCnt.ContainsKey("张力")) dataCnt.Add("张力", 5); else if (dataCnt["张力"] < 5) dataCnt["张力"] = 5; if (!dataCnt.ContainsKey("厚度")) dataCnt.Add("厚度", 5); else if (dataCnt["厚度"] < 5) dataCnt["厚度"] = 5; if (!dataCnt.ContainsKey("Y轴方向PT值检测")) dataCnt.Add("Y轴方向PT值检测", 5); else if (dataCnt["Y轴方向PT值检测"] < 5) dataCnt["Y轴方向PT值检测"] = 5; if (!dataCnt.ContainsKey("线宽正面")) dataCnt.Add("线宽正面", 9); else if (dataCnt["线宽正面"] < 9) dataCnt["线宽正面"] = 9; } else { //按照步骤流程分类 string[] pointType = item.SizeDefectInfoList.Select(t => t.StepName).Distinct().ToList().ToArray(); for (int i = 0; i < pointType.Length; i++) { List t = item.SizeDefectInfoList.Where(q => q.StepName == pointType[i] && !q.isAverage).ToList(); if (t.Count > 0) { //当前测试项数据个数 if (!dataCnt.ContainsKey(pointType[i])) dataCnt.Add(pointType[i], t.Count); else if (dataCnt[pointType[i]] < t.Count) dataCnt[pointType[i]] = t.Count; } } } } //插入列 foreach (var item in dataCnt) { //按步骤名称插入列 for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"{item.Key}-{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn($"{item.Key}均值", typeof(string))); } foreach(var item in ConfMgr.Instance.DefectItemParamsList) if(item.Show == 1) dt.Columns.Add(new DataColumn(item.Name + "数量", typeof(int)));//在表中添加int类型的列 //插入按钮 dataGridView1.DataSource = dt; //在datagridview中添加button按钮 //DataGridViewButtonColumn btn = new DataGridViewButtonColumn(); //btn.Name = "Modify"; //btn.HeaderText = "操作"; //btn.DefaultCellStyle.NullValue = "修改"; //dataGridView1.Columns.Add(btn); //DataGridViewButtonColumn btn2 = new DataGridViewButtonColumn(); //btn2.Name = "HistoryView"; //btn2.HeaderText = "查看"; //btn2.DefaultCellStyle.NullValue = "历史"; //dataGridView1.Columns.Add(btn2); DataGridViewButtonColumn btn3 = new DataGridViewButtonColumn(); btn3.Name = "Distribution"; btn3.HeaderText = "缺陷分布"; btn3.DefaultCellStyle.NullValue = "分布"; dataGridView1.Columns.Add(btn3); DataTable dts = (DataTable)dataGridView1.DataSource; dts.Clear(); List FailPoint = new List(); int row_index = 0; int col_index = 9; foreach (var item in list) { //新增 DataRow dr;//行 dr = dts.NewRow(); //dr["选择"] = false; dr["检验日期"] = item.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"); dr["检测单号"] = item.DetectOrder; dr["产品名称"] = item.ProductInfo.Name; dr["料号"] = item.ProductInfo.Code; dr["网版编码"] = item.SN; dr["批次"] = item.BatchId; dr["合格"] = item.Qualified ? "合格": "不合格"; dr["修复"] = item.State == 10 ? "异常" : item.State == 5 ? "修复" : "待修复"; dr["异常情况"] = item.Abnormalities; dr["修复人员"] = item.RepairCode; dr["比对"] = item.CompareResult == 2 ? "不通过" : item.CompareResult == 1 ? "通过" : "未比对"; //根据不同步骤名称插入数据 List tempd = new List(); foreach (var tdata in dataCnt) { tempd = item.SizeDefectInfoList.Where(q => q.StepName == tdata.Key).ToList(); List dataList = new List(); int data_index = 0; for (int i = 0; i < tempd.Count; i++) { if (tempd[i].isAverage == false) { dataList.Add(tempd[i].Data); dr[$"{tdata.Key}-{data_index + 1}"] = tempd[i].Data.ToString("0.0000"); data_index++; } //不合格数据添加队列 if(i + 1 == tempd.Count) col_index = this.dataGridView1.Columns[$"{tdata.Key}均值"].Index; else col_index = this.dataGridView1.Columns[$"{tdata.Key}-{data_index}"].Index; if (tempd[i].result == 2) FailPoint.Add(new Point(row_index, col_index)); } if (dataList.Count > 0) dr[$"{tdata.Key}均值"] = dataList.Average().ToString("0.0000"); else dr[$"{tdata.Key}均值"] = "0"; } foreach (var defItem in ConfMgr.Instance.DefectItemParamsList) { if (defItem.Show == 1) { if (item.DefectCntInfoList != null) { var fd = item.DefectCntInfoList.Find(x => x.Name == defItem.Name); if (fd != null) dr[defItem.Name + "数量"] = fd.DefectCnt; else dr[defItem.Name + "数量"] = 0; } else dr[defItem.Name + "数量"] = 0; } } dts.Rows.Add(dr);//在表的对象的行里添加此行 row_index++; } //dts.DefaultView.Sort = "时间戳 desc"; //dts = dts.DefaultView.ToTable(); dataGridView1.DataSource = dts; this.dataGridView1.Columns[0].Width = 50; this.dataGridView1.Columns[1].Width = 120; for (int i = 0; i < 12; i++) //去除3列 { this.dataGridView1.Columns[i].Frozen = true; } for (int i = 0; i < FailPoint.Count; i++) { DataGridViewCell aa = dataGridView1.Rows[FailPoint[i].X].Cells[FailPoint[i].Y]; aa.Style.ForeColor = Color.Red; //aa.Style.BackColor = Color.LightGreen; } return; } #endregion private void QueryData() { QueryOrderData queryOrderData = new QueryOrderData(); queryOrderData.model = "order"; queryOrderData.fields = "*"; queryOrderData.order = "id desc"; queryOrderData.pageNum = this.pageCtrl1.PageIndex; queryOrderData.pageSize = this.pageCtrl1.PageSize; queryOrderData.domain = new List(); domainItem startTime = new domainItem(); startTime.FieldName = "CreateTime"; startTime.FieldValue = dateTimePicker1.Value.ToString("yyyy-M-d"); startTime.ConditionalType = 3; queryOrderData.domain.Add(startTime); domainItem endTime = new domainItem(); endTime.FieldName = "CreateTime"; endTime.FieldValue = dateTimePicker2.Value.ToString("yyyy-M-d") + " 23:59:59"; endTime.ConditionalType = 5; queryOrderData.domain.Add(endTime); //OrderService.GetList //产品条件 if (!string.IsNullOrEmpty(cbProductCode.Text)) { domainItem ProductCode = new domainItem(); ProductCode.FieldName = "ProductId"; ProductCode.FieldValue = SysMgr.Instance.ProductIdList[cbProductCode.SelectedIndex].ToString(); ProductCode.ConditionalType = 6; queryOrderData.domain.Add(ProductCode); } //合格条件 if (!string.IsNullOrEmpty(comboBox2.Text)) { domainItem CompareResult = new domainItem(); CompareResult.FieldName = "Qualified"; CompareResult.FieldValue = comboBox2.Text == "合格"? "1":"0"; CompareResult.ConditionalType = 0; queryOrderData.domain.Add(CompareResult); } //比对条件 if (!string.IsNullOrEmpty(comboBox1.Text)) { domainItem CompareResultOptions = new domainItem(); CompareResultOptions.FieldName = "CompareResult"; CompareResultOptions.FieldValue = comboBox1.Text == "通过" ? "1" : comboBox1.Text == "未通过" ? "2" : "0"; CompareResultOptions.ConditionalType = 0; queryOrderData.domain.Add(CompareResultOptions); } //异常条件 if (!string.IsNullOrEmpty(comboBox3.Text)) { domainItem State = new domainItem(); State.FieldName = "State"; State.FieldValue = comboBox3.Text == "修复" ? "5" : comboBox3.Text == "未修复" ? "0" : "10"; State.ConditionalType = 0; queryOrderData.domain.Add(State); } int totalcnt = 0; JObject str = JObject.Parse(JsonConvert.SerializeObject(queryOrderData)); var list = getTableList(str, out totalcnt); this.pageCtrl1.DrawControl(totalcnt); QueryOrders = list; //自动生成表格 ShowDataTableEx(list); //总数居 queryOrderData.pageNum = 0; queryOrderData.pageSize = 0; JObject str2 = JObject.Parse(JsonConvert.SerializeObject(queryOrderData)); var list2 = getTableList(str2, out totalcnt); QueryAllOrders = list2; } private void skinButton2_Click(object sender, EventArgs e) { pageCtrl1.PageIndex = 1; QueryData(); } #endregion #region 表格单击 #region 更新数据 #endregion private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { int Index = this.dataGridView1.CurrentRow.Index;//获取当前选中行的索引 if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "操作") { //修改数据 AmendantRecordFrm recordFrm = new AmendantRecordFrm(QueryOrders[Index]); recordFrm.ShowDialog(); //重新显示 QueryData(); } else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "查看") { //查看历史 HistoryViewFrm Frm = new HistoryViewFrm(QueryOrders[Index]); Frm.ShowDialog(); } else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "缺陷分布") { //缺陷分布 DistributionFrm Frm = new DistributionFrm(QueryOrders[Index]); Frm.WindowState = FormWindowState.Maximized; Frm.ShowDialog(); } else if (Index < this.dataGridView1.Rows.Count && this.dataGridView1.Columns[this.dataGridView1.CurrentCell.ColumnIndex].HeaderText.ToString() == "选择") { DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[Index].Cells[0]; Boolean flag = Convert.ToBoolean(checkCell.Value); if (flag == true) //查找被选择的数据行 { checkCell.Value = false; } else checkCell.Value = true; } } #endregion #region 界面调整 private void DataQueryFrm_SizeChanged(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Maximized) { this.WindowState = FormWindowState.Normal; this.Top = 0; this.Left = 0; this.Width = SystemInformation.WorkingArea.Width; this.Height = SystemInformation.WorkingArea.Height; } } #endregion #region 删除 private int delTableList(JObject req) { JObject res = new JObject(); try { string model = req.Value("model"); string domain = req.Value("domain").ToString(); //var idArr = req.Value("idList"); //List ids = new List(); //foreach (int id in idArr) ids.Add(id); int result = OrderService.DeleteList(model, domain); return 1; } catch (Exception ex) { } return 0; } private void skinButton3_Click(object sender, EventArgs e) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1.Rows[i].Cells[0]; Boolean flag = Convert.ToBoolean(checkCell.Value); if(flag == true) { QueryOrderData delOrderData = new QueryOrderData(); delOrderData.model = "order"; delOrderData.domain = new List(); domainItem doitem = new domainItem(); doitem.FieldName = "Id"; doitem.FieldValue = QueryOrders[i].Id.ToString(); doitem.ConditionalType = 6; delOrderData.domain.Add(doitem); JObject str = JObject.Parse(JsonConvert.SerializeObject(delOrderData)); int ret = delTableList(str); if (ret == 1) { //删除历史 QueryOrderData HistoryOrderData = new QueryOrderData(); HistoryOrderData.model = "OrderHistory"; HistoryOrderData.domain = new List(); domainItem doitem2 = new domainItem(); doitem2.FieldName = "Pid"; doitem2.FieldValue = QueryOrders[i].Id.ToString(); doitem2.ConditionalType = 6; HistoryOrderData.domain.Add(doitem2); JObject str2 = JObject.Parse(JsonConvert.SerializeObject(HistoryOrderData)); delTableList(str2); } } } //重新显示 QueryData(); } #endregion #region Excel 文本导出 private DataTable GetExcelTabel(out List points) { points = new List(); //记录数据类型列数 Dictionary dataCnt = new Dictionary(); DataTable dt = new DataTable(); //建立个数据表 //通用列 dt.Columns.Add(new DataColumn("检验日期", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("检测单号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("产品名称", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("料号", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("网版编码", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("批次", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("合格", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("异常情况", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("修复人员", typeof(string)));//在表中添加string类型的列 dt.Columns.Add(new DataColumn("比对", typeof(string)));//在表中添加string类型的列 foreach (var item in QueryAllOrders) { //老流程 if (item.StepInfo == null || item.StepInfo.ProcessType != "快速流程") { //加入数据表 if (item.SizeDefectInfoList == null) item.SizeDefectInfoList = new List(); #region 张力 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Tension", StepName = "张力", Data = item.Tension5, }); #endregion #region 厚度 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Height", StepName = "厚度", Data = item.Height5, }); #endregion #region YPT item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "Y轴方向PT值检测", StepName = "Y轴方向PT值", Data = item.PT6, }); #endregion #region 线宽 item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth1, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth2, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth3, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth4, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth5, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth6, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth7, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth8, }); item.SizeDefectInfoList.Add(new SizeDefectInfo() { PointCode = "线宽正面", StepName = "线宽", Data = item.LineWidth9, }); #endregion if (!dataCnt.ContainsKey("张力")) dataCnt.Add("张力", 5); else if (dataCnt["张力"] < 5) dataCnt["张力"] = 5; if (!dataCnt.ContainsKey("厚度")) dataCnt.Add("厚度", 5); else if (dataCnt["厚度"] < 5) dataCnt["厚度"] = 5; if (!dataCnt.ContainsKey("Y轴方向PT值检测")) dataCnt.Add("Y轴方向PT值检测", 5); else if (dataCnt["Y轴方向PT值检测"] < 5) dataCnt["Y轴方向PT值检测"] = 5; if (!dataCnt.ContainsKey("线宽正面")) dataCnt.Add("线宽正面", 9); else if (dataCnt["线宽正面"] < 9) dataCnt["线宽正面"] = 9; } else { //按照步骤流程分类 string[] pointType = item.SizeDefectInfoList.Select(t => t.StepName).Distinct().ToList().ToArray(); for (int i = 0; i < pointType.Length; i++) { List t = item.SizeDefectInfoList.Where(q => q.StepName == pointType[i] && !q.isAverage).ToList(); if (t.Count > 0) { //当前测试项数据个数 if (!dataCnt.ContainsKey(pointType[i])) dataCnt.Add(pointType[i], t.Count); else if (dataCnt[pointType[i]] < t.Count) dataCnt[pointType[i]] = t.Count; } } } } //插入列 foreach (var item in dataCnt) { //按步骤名称插入列 for (int i = 0; i < item.Value; i++) dt.Columns.Add(new DataColumn($"{item.Key}-{i + 1}", typeof(string))); dt.Columns.Add(new DataColumn($"{item.Key}均值", typeof(string))); } foreach (var item in ConfMgr.Instance.DefectItemParamsList) if(item.Show == 1) dt.Columns.Add(new DataColumn(item.Name + "数量", typeof(int)));//在表中添加int类型的列 int row_index = 0; foreach (var item in QueryAllOrders) { //新增 DataRow dr;//行 dr = dt.NewRow(); //dr["选择"] = false; dr["检验日期"] = item.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"); dr["检测单号"] = item.DetectOrder; dr["产品名称"] = item.ProductInfo.Name; dr["料号"] = item.ProductInfo.Code; dr["网版编码"] = item.SN; dr["批次"] = item.BatchId; dr["合格"] = item.Qualified ? "合格" : "不合格"; dr["修复"] = item.State == 10 ? "异常" : item.State == 5 ? "修复" : "待修复"; dr["异常情况"] = item.Abnormalities; dr["修复人员"] = item.RepairCode; dr["比对"] = item.CompareResult == 2 ? "不通过" : item.CompareResult == 1 ? "通过" : "未比对"; List tempd = new List(); foreach (var tdata in dataCnt) { tempd = item.SizeDefectInfoList.Where(q => q.StepName == tdata.Key ).ToList(); List dataList = new List(); //for (int i = 0; i < tempd.Count; i++) // dr[$"{tdata.Key}-{i + 1}"] = tempd[i].Data.ToString("0.0000"); //dr[$"{tdata.Key}均值"] = item.TensionValue.ToString("0.0000"); int data_index = 0; for (int i = 0; i < tempd.Count; i++) { int col_index = 0; if (!tempd[i].isAverage) { dataList.Add(tempd[i].Data); dr[$"{tdata.Key}-{data_index + 1}"] = tempd[i].Data.ToString("0.0000"); col_index = dr.Table.Columns.IndexOf($"{tdata.Key}-{data_index + 1}"); data_index++; } else col_index = dr.Table.Columns.IndexOf($"{tdata.Key}均值"); if (tempd[i].result == 2) points.Add(new Point(row_index, col_index)); } if (dataList.Count > 0) dr[$"{tdata.Key}均值"] = dataList.Average().ToString("0.0000"); else dr[$"{tdata.Key}均值"] = "0"; } foreach (var defItem in ConfMgr.Instance.DefectItemParamsList) { if (defItem.Show == 1) { if (item.DefectCntInfoList != null) { var fd = item.DefectCntInfoList.Find(x => x.Name == defItem.Name); if (fd != null) dr[defItem.Name + "数量"] = fd.DefectCnt; else dr[defItem.Name + "数量"] = 0; } else dr[defItem.Name + "数量"] = 0; } } dt.Rows.Add(dr);//在表的对象的行里添加此行 row_index++; } return dt; } private void ShowAllDataTableEx(string filePath, DataTable dt) { try { // 创建一个新的CSV文件并写入数据 using (StreamWriter writer = new StreamWriter(filePath, false, UnicodeEncoding.GetEncoding("GB2312"))) { // 写入CSV文件的标题行 for (int i = 0; i < dt.Columns.Count; i++) { writer.Write(dt.Columns[i].ColumnName + ","); } writer.Write("\r\n"); for (int i = 0; i < dt.Rows.Count; i++) { // 写入数据行 for (int j = 0; j < dt.Columns.Count; j++) { writer.Write(dt.Rows[i][j] + ","); } writer.Write("\r\n"); //Console.WriteLine("CSV文件写入成功!"); } } } catch (Exception ex) { MessageBox.Show("数据导出失败!error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } return; } private void skinButton1_Click(object sender, EventArgs e) { DataTable dt = (DataTable)dataGridView1.DataSource; if (dt.Rows.Count > 0) { SaveFileDialog fileDialog = new SaveFileDialog(); fileDialog.Filter = "数据文件(*.csv)|*.csv"; //fileDialog.Filter = "数据文件(*.xlsx)|*.xlsx"; fileDialog.Title = "保存数据"; //保存对话框是否记忆上次打开的目录 fileDialog.RestoreDirectory = true; if (fileDialog.ShowDialog() == DialogResult.OK) { try { string filePath = fileDialog.FileName; // CSV文件路径 List pt; DataTable tdt = GetExcelTabel(out pt); //tdt.Columns.RemoveAt(0); //tdt.Columns.RemoveAt(tdt.Columns.Count -1); //OutputAsExcelFile(tdt, filePath, pt); ShowAllDataTableEx(filePath, tdt); MessageBox.Show("数据导出成功!" , "完成", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { MessageBox.Show("数据导出失败!error:" + ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } #endregion private void btnClear_Click(object sender, EventArgs e) { cbProductCode.Text = ""; } #region excel导出 public Excel.Application m_xlApp = null; public void OutputAsExcelFile(DataTable dtTable, String filePath, List points) { //string filePath = ""; //SaveFileDialog s = new SaveFileDialog(); //s.Title = "保存Excel文件"; //s.Filter = "Excel文件(*.xls)|*.xls"; //s.FilterIndex = 1; //if (s.ShowDialog() == DialogResult.OK) // filePath = s.FileName; //else // return; //导出dataTable到Excel long rowNum = dtTable.Rows.Count;//行数 int columnNum = dtTable.Columns.Count;//列数 Excel.Application m_xlApp = new Excel.Application(); m_xlApp.DisplayAlerts = false;//不显示更改提示 m_xlApp.Visible = false; Excel.Workbooks workbooks = m_xlApp.Workbooks; Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1 try { string[,] datas = new string[rowNum + 1, columnNum]; for (int i = 0; i < columnNum; i++) //写入字段 datas[0, i] = dtTable.Columns[i].Caption; //写入列标 //Excel.Range range = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]); Excel.Range range = m_xlApp.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnNum]]; range.Interior.ColorIndex = 15;//15代表灰色 range.Font.Bold = true; range.Font.Size = 10; int r = 0; for (r = 0; r < rowNum; r++) { for (int i = 0; i < columnNum; i++) { object obj; obj = dtTable.Rows[r][dtTable.Columns[i].ToString()]; datas[r + 1, i] = obj == null ? "" : "'" + obj.ToString().Trim();//在obj.ToString()前加单引号是为了防止自动转化格式 //Console.WriteLine(datas[r + 1, i]); } System.Windows.Forms.Application.DoEvents(); //添加进度条 } //Excel.Range fchR = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]); Excel.Range fchR = m_xlApp.Range[worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]]; fchR.Value2 = datas; worksheet.Columns.EntireColumn.AutoFit();//列宽自适应。 //worksheet.Name = "dd"; //m_xlApp.WindowState = Excel.XlWindowState.xlMaximized; m_xlApp.Visible = false; // = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]); range = m_xlApp.Range[worksheet.Cells[1, 1], worksheet.Cells[rowNum + 1, columnNum]]; for (int i = 0; i < points.Count; i++) { 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]]; Errrange.Font.ColorIndex = 3;//3红色 } //range.Interior.ColorIndex = 15;//15代表灰色 range.Font.Size = 9; range.RowHeight = 14.25; range.Borders.LineStyle = 1; range.HorizontalAlignment = 1; workbook.Saved = true; workbook.SaveCopyAs(filePath); } catch (Exception ex) { MessageBox.Show("导出异常:" + ex.Message, "导出异常", MessageBoxButtons.OK, MessageBoxIcon.Warning); } finally { EndReport(); } m_xlApp.Workbooks.Close(); m_xlApp.Workbooks.Application.Quit(); m_xlApp.Application.Quit(); m_xlApp.Quit(); //MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void EndReport() { object missing = System.Reflection.Missing.Value; try { } catch { } finally { try { //System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Workbooks); //System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp.Application); //System.Runtime.InteropServices.Marshal.ReleaseComObject(m_xlApp); //m_xlApp = null; } catch { } try { //清理垃圾进程 this.killProcessThread(); } catch { } GC.Collect(); } } private void killProcessThread() { ArrayList myProcess = new ArrayList(); for (int i = 0; i < myProcess.Count; i++) { try { System.Diagnostics.Process.GetProcessById(int.Parse((string)myProcess[i])).Kill(); } catch { } } } #endregion } }