using OTSIncAReportApp.DataOperation.DataAccess; using OTSIncAReportApp.OTSSampleReportInfo; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using static OTSIncAReportApp.OTSReport_Export; namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration { /// /// 元素分析 /// class ElementalAnalysis { /// /// 元素分析表(表头、表数据、全数据) /// /// /// /// public List GetElementData(BasicData basicData, OTSReport_Export m_otsreport_export,bool lingge) { DataTable data = basicData.GetDBData(); //根据sql条件,查询获取颗粒信息数据 DataTable AllAnalysisDetails = new DataTable(); AllAnalysisDetails.TableName = "ElementValue"; AllAnalysisDetails.Columns.Add("Name"); AllAnalysisDetails.Columns.Add("TypeId"); AllAnalysisDetails.Columns.Add("Area", typeof(double)); AllAnalysisDetails.Columns.Add("Class"); for (int i = 0; i < data.Rows.Count; i++) { DataRow dr2 = AllAnalysisDetails.NewRow(); dr2["Name"] = data.Rows[i]["TypeName"].ToString(); dr2["Area"] = Convert.ToDouble(data.Rows[i]["ar"]); dr2["TypeId"] = data.Rows[i]["TypeId"].ToString(); dr2["Class"] = data.Rows[i]["Class"].ToString(); AllAnalysisDetails.Rows.Add(dr2); } //按照list列表进行物质类排序,物质类中的元素分类按照面积的大小进行排序 List ClassName = new List(); DataTable getClass_dt = basicData.GetAllClass(); bool bl = false; for (int i = 0; i < getClass_dt.Rows.Count; i++) { if (getClass_dt.Rows[i]["GroupName"].ToString() != "NOT_INCLUTION" && getClass_dt.Rows[i]["GroupName"].ToString() != "Invalid" && getClass_dt.Rows[i]["GroupName"].ToString() != "Not Identified") if (getClass_dt.Rows[i]["GroupName"].ToString() == "") { if (!bl) { ClassName.Add("Default"); bl = true; } } else { ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString()); } } //统计元素物质大类的元素信息和面积占比 DataTable dt_ElementalSubstance = ElementalSubstance(AllAnalysisDetails, ClassName, basicData.getParticleData()); DataTable dt_ElementSorting; //统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序 if (lingge) { //单个大类 dt_ElementSorting = ElementSortingSS(AllAnalysisDetails, ClassName, basicData.getParticleData()); } else { dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, basicData.getParticleData()); } //统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序 //DataTable dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, basicData.getParticleData()); ////生成最后导出时物质元素成分表 DataTable dt = MaterialElementComposition(dt_ElementalSubstance, 13, m_otsreport_export);//导出14个元素成分信息 dt.Columns.Add("TypeId"); //生成最后导出时物质元素细分表 DataTable dtname = new DataTable(); DataTable dtData = new DataTable(); SubdivisionOfMaterialElements(dt_ElementSorting, 13, ClassName, dt, out dtname, out dtData); List datas = new List(); datas.Add(dtname); datas.Add(dtData); datas.Add(dt_ElementSorting); return datas; } private bool SubdivisionOfMaterialElements(DataTable a_ElementalSubstance, int NumberOfColumns, List ClassName, DataTable data, out DataTable dt1, out DataTable dt2) { DataTable dt_ElementalSubstance = new DataTable(); dt_ElementalSubstance = data.Copy(); dt_ElementalSubstance.Clear(); dt_ElementalSubstance.TableName = "ElementSubdivision_Value"; dt_ElementalSubstance.Columns["Name"].ColumnName = "Class"; dt_ElementalSubstance.Columns.Add("Name"); //处理元素面积保留小数点后两位 for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++) { a_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"].ToString()), 2); } //循环元素物质大类 for (int i = 0; i < ClassName.Count; i++) { DataTable dt_1 = new DataTable(); dt_1 = data.Copy(); dt_1.Clear(); for (int a = 0; a < data.Rows.Count; a++) { if (data.Rows[a]["Name"].ToString() == ClassName[i].ToString()) { dt_1.Rows.Add(data.Rows[a].ItemArray); } } dt_1.Columns["Name"].ColumnName = "Class"; dt_1.Columns.Add("Name"); DataTable dt_2 = new DataTable(); dt_2 = dt_1.Copy(); dt_2.Clear(); dt_2.Rows.Add(); //循环整个表筛选出当前的物质 for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++) { if(ClassName.Count==1) { for (int b = 0; b < dt_1.Columns.Count; b++) { if (dt_2.Columns[b].ToString() != "Class") { if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString())) { if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "") { dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0; } else { dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()]; } } else { dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0; } } } dt_1.Rows.Add(dt_2.Rows[0].ItemArray); } else if (ClassName[i].ToString() == a_ElementalSubstance.Rows[a]["Class"].ToString()) { for (int b = 0; b < dt_1.Columns.Count; b++) { if (dt_2.Columns[b].ToString() != "Class") { if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString())) { if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "") { dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0; } else { dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()]; } } else { dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0; } } } dt_1.Rows.Add(dt_2.Rows[0].ItemArray); } } for (int a = 0; a < dt_1.Rows.Count; a++) { dt_ElementalSubstance.Rows.Add(dt_1.Rows[a].ItemArray); } } DataTable dataTable = new DataTable(); dataTable = dt_ElementalSubstance.Copy(); dataTable.Clear(); DataRow row = dataTable.NewRow(); dataTable.Rows.Add(row); dataTable.TableName = "ElementSubdivision_Name"; for (int i = 0; i < dataTable.Columns.Count; i++) { dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString(); } dt1 = dataTable.Copy(); dt2 = dt_ElementalSubstance.Copy(); return true; } private DataTable MaterialElementComposition(DataTable a_ElementalSubstance, int NumberOfColumns,OTSReport_Export m_otsreport_export) { DataTable dt_ElementalSubstance = new DataTable(); dt_ElementalSubstance.TableName = "ElementalSubstance_Value"; dt_ElementalSubstance.Columns.Add("Name"); dt_ElementalSubstance.Columns.Add("Area"); for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++) { dt_ElementalSubstance.Rows.Add(a_ElementalSubstance.Rows[i]["Name"]); dt_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"]), 2); } int cunt = 1; for (int i = 0; i < NumberOfColumns; i++) { if (i < m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys.Count()) { dt_ElementalSubstance.Columns.Add(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]); for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++) { if (a_ElementalSubstance.Columns.Contains(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i])) { if (a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]].ToString() == "") { dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0; } else { dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]]; } } else { dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0; } } } else { dt_ElementalSubstance.Columns.Add("Null" + cunt.ToString()); cunt = cunt + 1; for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++) { dt_ElementalSubstance.Rows[a][i + 2] = "-"; } } } DataTable dataTable = new DataTable(); dataTable = dt_ElementalSubstance.Copy(); dataTable.Clear(); DataRow row = dataTable.NewRow(); dataTable.Rows.Add(row); dataTable.TableName = "ElementalSubstance_Name"; for (int i = 0; i < dataTable.Columns.Count; i++) { dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString(); } //m_list_dt.Add(dataTable); //m_list_dt.Add(dt_ElementalSubstance); return dt_ElementalSubstance; } private DataTable ElementSorting(DataTable AllAnalysisDetails, List ClassName, ParticleData fielddata) { DataTable dte = fielddata.GetAllElement(); DataTable ElementSorting_dt = AllAnalysisDetails.Copy(); ElementSorting_dt.Clear(); for (int i = 0; i < ClassName.Count; i++) { DataTable dt = AllAnalysisDetails.Copy(); dt.Clear(); for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++) { if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString()) { dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray); } } //将颗粒大小排序(从大到小) DataView dv = dt.DefaultView; dv.Sort = "Area DESC"; DataTable dt_Element = dv.ToTable(); for (int a = 0; a < dt_Element.Rows.Count; a++) { ElementSorting_dt.Rows.Add(dt_Element.Rows[a].ItemArray); } } //循环创建元素列(类型定义为double,为以后计算做准备) for (int a = 0; a < dte.Rows.Count; a++) { ElementSorting_dt.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double)); } for (int a = 0; a < ElementSorting_dt.Rows.Count; a++) { DataTable ClassificationDetails = fielddata.GetAreaByIncA(ElementSorting_dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 //DataRow dr2 = ElementSorting_dt.NewRow(); foreach (DataRow dr in ClassificationDetails.Rows) { double doe = Convert.ToDouble(dr["pc"]); ElementSorting_dt.Rows[a][dr["Name"].ToString()] = Math.Round(doe / Convert.ToDouble(ElementSorting_dt.Rows[a]["Area"]), 2); } } return ElementSorting_dt; } private DataTable ElementSortingSS(DataTable AllAnalysisDetails, List ClassName, ParticleData fielddata) { DataTable dte = fielddata.GetAllElement(); DataTable ElementSorting_dt = AllAnalysisDetails.Copy(); ElementSorting_dt.Clear(); for (int i = 0; i < ClassName.Count; i++) { DataTable dt = AllAnalysisDetails.Copy(); //dt.Clear(); //for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++) //{ // if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString()) // { // dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray); // } //} //将颗粒大小排序(从大到小) //DataView dv = dt.DefaultView; //dv.Sort = "Area DESC"; //DataTable dt_Element = dv.ToTable(); DataTable dt_Element = dt.Copy(); for (int a = 0; a < dt_Element.Rows.Count; a++) { ElementSorting_dt.Rows.Add(dt_Element.Rows[a].ItemArray); } } //循环创建元素列(类型定义为double,为以后计算做准备) for (int a = 0; a < dte.Rows.Count; a++) { ElementSorting_dt.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double)); } for (int a = 0; a < ElementSorting_dt.Rows.Count; a++) { DataTable ClassificationDetails = fielddata.GetAreaByIncA(ElementSorting_dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 //DataRow dr2 = ElementSorting_dt.NewRow(); foreach (DataRow dr in ClassificationDetails.Rows) { double doe = Convert.ToDouble(dr["pc"]); ElementSorting_dt.Rows[a][dr["Name"].ToString()] = Math.Round(doe / Convert.ToDouble(ElementSorting_dt.Rows[a]["Area"]), 2); } } return ElementSorting_dt; } private DataTable ElementalSubstance(DataTable AllAnalysisDetails, List ClassName, ParticleData fielddata) { //当前元素物质类面积的总和 double ElementalSubstance = 0; DataTable dte = fielddata.GetAllElement(); DataTable dt_Class = new DataTable(); dt_Class.Columns.Add("Name"); dt_Class.Columns.Add("Area"); //循环创建元素列(类型定义为double,为以后计算做准备) for (int a = 0; a < dte.Rows.Count; a++) { dt_Class.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double)); } //循环大类物质列表 for (int i = 0; i < ClassName.Count; i++) { //保留当前循环中大类物质,去除其他物质 DataTable dt = AllAnalysisDetails.Copy(); dt.Clear(); for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++) { if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString()) { dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray); } } if (dt.Rows.Count == 0) continue; //计算出当前循环中大类物质的面积 ElementalSubstance = Convert.ToDouble(decimal.Parse(dt.Compute("sum(Area)", "").ToString())); DataTable ta = new DataTable(); ta = dt_Class.Copy(); ta.Clear(); for (int a = 0; a < dt.Rows.Count; a++) { DataTable ClassificationDetails = fielddata.GetAreaByIncA(dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 DataRow dr2 = ta.NewRow(); foreach (DataRow dr in ClassificationDetails.Rows) { double doe = Convert.ToDouble(dr["pc"]); dr2[dr["Name"].ToString()] = doe; } ta.Rows.Add(dr2); } DataTable dataTable = ta.Copy(); dataTable.Clear(); DataRow row = dataTable.NewRow(); dataTable.Rows.Add(row); for (int a = 0; a < ta.Columns.Count; a++) { if (ta.Columns[a].ToString() != "Name" && ta.Columns[a].ToString() != "Class") { bool bl = false; for (int b = 0; b < ta.Rows.Count; b++) { if (!ta.Rows[b].IsNull(ta.Columns[a].ToString())) { bl = true; } } if (bl) //datatSuncolumn(ta, ta.Columns[a].ToString()); dataTable.Rows[0][ta.Columns[a].ToString()] = Math.Round(datatSuncolumn(ta, ta.Columns[a].ToString()) / ElementalSubstance, 2); } } dataTable.Rows[0]["Name"] = ClassName[i].ToString(); dataTable.Rows[0]["Area"] = ElementalSubstance; dt_Class.Rows.Add(dataTable.Rows[0].ItemArray); } return dt_Class; } private double datatSuncolumn(DataTable dt, string str) { double sum = 0; for (int i = 0; i < dt.Rows.Count; i++) { if (dt.Rows[i][str].ToString() == "") { dt.Rows[i][str] = 0; } sum = sum + Convert.ToDouble(dt.Rows[i][str].ToString()); } return sum; } } }