diff --git a/HJGL_DS/FineUIPro.Web/FineUIPro.Web.csproj.user b/HJGL_DS/FineUIPro.Web/FineUIPro.Web.csproj.user index e3436b8..6e29203 100644 --- a/HJGL_DS/FineUIPro.Web/FineUIPro.Web.csproj.user +++ b/HJGL_DS/FineUIPro.Web/FineUIPro.Web.csproj.user @@ -2,7 +2,7 @@ true - Release|Any CPU + Debug|Any CPU diff --git a/HJGL_DS/FineUIPro.Web/HJGL/DataIn/PipelineGrid.aspx.cs b/HJGL_DS/FineUIPro.Web/HJGL/DataIn/PipelineGrid.aspx.cs index e819ab4..faa7392 100644 --- a/HJGL_DS/FineUIPro.Web/HJGL/DataIn/PipelineGrid.aspx.cs +++ b/HJGL_DS/FineUIPro.Web/HJGL/DataIn/PipelineGrid.aspx.cs @@ -116,147 +116,84 @@ namespace FineUIPro.Web.HJGL.DataIn /// protected void InitGrid() { - - // 加载PDF文档 - PdfDocument pdf = new PdfDocument(); if (!File.Exists(fileUrl)) { return; } - pdf.LoadFromFile(fileUrl); - PdfTableExtractor extractor = new PdfTableExtractor(pdf); - // 遍历每一页 - int i = 0; - if (ckbSkipFirst == "1") + + int startPageIndex = ckbSkipFirst == "1" ? 1 : 0; + DataTable dtTemp = ExtractAllPdfTables(fileUrl, startPageIndex); + if (dtTemp.Rows.Count == 0 || dtTemp.Columns.Count <= 1) { - i = 1; + BindIsoGrid(); + return; } - var units = from x in Funs.DB.Base_Unit - join y in Funs.DB.Project_Unit on x.UnitId equals y.UnitId - where y.ProjectId == CurrUser.LoginProjectId - select x; - var installs = from x in Funs.DB.Project_Installation where x.ProjectId == this.CurrUser.LoginProjectId select x; + + ProcessMergedTable(dtTemp); + BindIsoGrid(); + } + + /// + /// 统一清洗、映射并转换全部PDF页面的数据。 + /// + private void ProcessMergedTable(DataTable dtTemp) + { var steels = from x in Funs.DB.HJGL_BS_Steel select x; var materialStandards = from x in Funs.DB.HJGL_BS_MaterialStandard select x; - - var rates = from x in Funs.DB.HJGL_BS_NDTRate select x; - var types = from x in Funs.DB.HJGL_BS_JointType select x; - var methods = from x in Funs.DB.HJGL_BS_WeldMethod select x; - var materials = from x in Funs.DB.HJGL_BS_WeldMaterial select x; var services = from x in Funs.DB.HJGL_BS_Service select x; - var slopeTypes = from x in Funs.DB.HJGL_BS_SlopeType select x; var isoClasss = from x in Funs.DB.HJGL_BS_IsoClass select x; - var components = from x in Funs.DB.HJGL_BS_Component select x; - var dns = from x in Funs.DB.HJGL_BS_SchTab select x; var execStandards = from x in Funs.DB.HJGL_BS_ExecStandard select x; - var dataInTemp = from x in Funs.DB.HJGL_Sys_DataInTemp - where x.ProjectId == this.CurrUser.LoginProjectId && x.UserId == this.CurrUser.UserId && x.Type == this.IsPDMS - select x; - var users = from x in Funs.DB.Sys_User select x; string serviceNames = string.Empty; - for (; i < pdf.Pages.Count; i++) + + // 所有页面的表格已经合并,只调用一次大模型清洗和表头映射。 + string csvContent = ConvertDataTableToCsv(dtTemp); + Console.WriteLine("生成的CSV内容:"); + Console.WriteLine(csvContent); + + // 3. 上传到服务器 + string uploadUrl = "http://localhost:8000/api/table/clean"; // 替换为实际上传地址 + string fileName = $"data_{DateTime.Now:yyyyMMddHHmmss}.csv"; + //"管线号", "公称直径", "管道等级", "管道材料", "主要介质", "起止点", "操作参数温度", "操作参数压力", "设计参数温度", "设计参数压力", "隔热工程代号", "隔热材料", "厚度", "介质", "压力", "比例", "方法", "合格等级", "PID尾号", "压力管道类别", "应力分析题号", "备注" + Region2.Items.Add(CreateTableGrid(dtTemp)); + set.Tables.Add(dtTemp); + string response = UploadCsvFile(csvContent, uploadUrl, fileName); + JObject dynamicObj = JObject.Parse(response); + + DataTable dtAfterProcess = new DataTable(); + foreach (JToken employeeToken in dynamicObj["headers"]) { - PdfPageBase page = pdf.Pages[i]; - // 提取页面中的表格 - PdfTable[] tables = extractor.ExtractTable(i); - // 输出找到的表格数量 - Console.WriteLine($"第 {i + 1} 页找到 {tables.Length} 个表格"); - // 遍历提取到的表格 - for (int j = 0; j < tables.Length; j++) + dtAfterProcess.Columns.Add(employeeToken.ToString()); + } + dtAfterProcess.Columns.Add("Id"); + + foreach (JToken rowData in dynamicObj["rows"]) + { + // int index = 0; + var row = dtAfterProcess.NewRow(); + var datas = rowData.ToList(); + row["Id"] = Guid.NewGuid().ToString(); + + foreach (DataRow row1 in dtTemp.Rows) { - PdfTable table = tables[j]; - DataTable dtTemp = new DataTable(); - for (int col = 0; col < table.GetColumnCount(); col++) + if (datas[0].ToString() == row1[0].ToString()) { - dtTemp.Columns.Add("col" + col); - } - // 遍历表格的行列 - for (int row = 0; row < table.GetRowCount(); row++) - { - DataRow rowData = dtTemp.NewRow(); - dtTemp.Rows.Add(rowData); - for (int col = 0; col < table.GetColumnCount(); col++) + for (int index = 0; index < dtTemp.Columns.Count; index++) { - string text = table.GetText(row, col); - rowData[col] = table.GetText(row, col); - Console.Write($"{text}\t"); + row[index] = row1[index]; } - Console.WriteLine(); // 换行 } + } + //foreach (var d in datas) + //{ + // row[index] = d.ToString(); index++; + //} + dtAfterProcess.Rows.Add(row); + } + Region1.Items.Add(CreateTableGrid(dtAfterProcess)); + setAfterProcess.Tables.Add(dtAfterProcess); - if (dtTemp.Rows.Count > 0 && dtTemp.Columns.Count > 1) - {// 2. 转换为CSV - string csvContent = ConvertDataTableToCsv(dtTemp); - Console.WriteLine("生成的CSV内容:"); - Console.WriteLine(csvContent); - - // 3. 上传到服务器 - string uploadUrl = "http://localhost:8000/api/table/clean"; // 替换为实际上传地址 - string fileName = $"data_{DateTime.Now:yyyyMMddHHmmss}.csv"; - //"管线号", "公称直径", "管道等级", "管道材料", "主要介质", "起止点", "操作参数温度", "操作参数压力", "设计参数温度", "设计参数压力", "隔热工程代号", "隔热材料", "厚度", "介质", "压力", "比例", "方法", "合格等级", "PID尾号", "压力管道类别", "应力分析题号", "备注" - - - try - { - Grid grid = new Grid(); - grid.ShowGridHeader = true; - grid.Title = dtTemp.TableName; - grid.AllowColumnLocking = true; - grid.DataKeyNames = new string[] { "Id" }; - foreach (DataColumn dc in dtTemp.Columns) - { - grid.Columns.Add(new BoundField() { DataField = dc.ColumnName, HeaderText = dc.ColumnName }); - } - grid.DataSource = dtTemp; - grid.DataBind(); - Region2.Items.Add(grid); - set.Tables.Add(dtTemp); - string response = UploadCsvFile(csvContent, uploadUrl, fileName); - Grid grid1 = new Grid(); - grid1.ShowGridHeader = true; - grid1.Title = dtTemp.TableName; - grid1.AllowColumnLocking = true; - grid1.DataKeyNames = new string[] { "Id" }; - JObject dynamicObj = JObject.Parse(response); - - DataTable dtAfterProcess = new DataTable(); - foreach (JToken employeeToken in dynamicObj["headers"]) - { - dtAfterProcess.Columns.Add(employeeToken.ToString()); - grid1.Columns.Add(new BoundField() { DataField = employeeToken.ToString(), HeaderText = employeeToken.ToString() }); - } - dtAfterProcess.Columns.Add("Id"); - - foreach (JToken rowData in dynamicObj["rows"]) - { - // int index = 0; - var row = dtAfterProcess.NewRow(); - var datas = rowData.ToList(); - row["Id"] = Guid.NewGuid().ToString(); - - foreach (DataRow row1 in dtTemp.Rows) - { - if (datas[0].ToString() == row1[0].ToString()) - { - for (int index = 0; index < dtTemp.Columns.Count; index++) - { - row[index] = row1[index]; - } - } - } - //foreach (var d in datas) - //{ - // row[index] = d.ToString(); index++; - //} - dtAfterProcess.Rows.Add(row); - } - grid1.DataSource = dtAfterProcess; - grid1.DataBind(); - Region1.Items.Add(grid1); - setAfterProcess.Tables.Add(dtAfterProcess); - - string urlHeaderCorrespondence = "http://localhost:8000/api/table/head"; - string data = @"{ + string urlHeaderCorrespondence = "http://localhost:8000/api/table/head"; + string data = @"{ ""source_headers"": " + dynamicObj["headers"].ToString() + @" , ""target_fields"": [ ""管线号"", @@ -284,198 +221,288 @@ namespace FineUIPro.Web.HJGL.DataIn ""extra_instructions"": ""管线号优先匹配管线代号,优先将含有 Main Fluid 的字段映射到 介质,优先匹配隔热工程代号到绝热类别,压力管道类别映射管道类别,有名称首先匹配名称,没有名称匹配代号,按匹配度从高低输出"" } "; - string resHeaderCorrespondence = HeaderCorrespondence(urlHeaderCorrespondence, data, "POST", "application/json;charset=utf-8"); + string resHeaderCorrespondence = HeaderCorrespondence(urlHeaderCorrespondence, data, "POST", "application/json;charset=utf-8"); - if (!string.IsNullOrEmpty(resHeaderCorrespondence)) + if (!string.IsNullOrEmpty(resHeaderCorrespondence)) + { + JObject dynamicHeaderCorrespondence = JObject.Parse(resHeaderCorrespondence); + Dictionary headerCorrespondenceDic = new Dictionary(); + foreach (JToken employeeToken in dynamicHeaderCorrespondence["mapping"]) + { + headerCorrespondenceDic.Add(employeeToken["source_header"].ToString(), employeeToken["target_field"].ToString()); + } + foreach (DataRow row in dtAfterProcess.Rows) + { + HJGL_PW_IsoInfo isoInfo = new HJGL_PW_IsoInfo(); + isoInfo.ISO_ID = Guid.NewGuid().ToString(); + isoInfo.ISO_CreateDate = DateTime.Now; + isoInfo.ISO_Creator = CurrUser.UserCode; + isoInfo.ProjectId = CurrUser.LoginProjectId; + isoInfo.BSU_ID = CurrUser.UnitId; + isoInfo.IsHot = "0"; + foreach (DataColumn dataColumn in dtAfterProcess.Columns) + { + + if (headerCorrespondenceDic.ContainsKey(dataColumn.ColumnName)) + switch (headerCorrespondenceDic[dataColumn.ColumnName]) { - JObject dynamicHeaderCorrespondence = JObject.Parse(resHeaderCorrespondence); - Dictionary headerCorrespondenceDic = new Dictionary(); - foreach (JToken employeeToken in dynamicHeaderCorrespondence["mapping"]) - { - headerCorrespondenceDic.Add(employeeToken["source_header"].ToString(), employeeToken["target_field"].ToString()); - } - foreach (DataRow row in dtAfterProcess.Rows) - { - HJGL_PW_IsoInfo isoInfo = new HJGL_PW_IsoInfo(); - isoInfo.ISO_ID = Guid.NewGuid().ToString(); - isoInfo.ISO_CreateDate = DateTime.Now; - isoInfo.ISO_Creator = CurrUser.UserCode; - isoInfo.ProjectId = CurrUser.LoginProjectId; - isoInfo.BSU_ID = CurrUser.UnitId; - isoInfo.IsHot = "0"; - foreach (DataColumn dataColumn in dtAfterProcess.Columns) + case "管线号": + isoInfo.ISO_IsoNo = row[dataColumn.ColumnName].ToString(); + break; + case "管道等级": + isoInfo.ISC_ID = isoClasss.Where(x => x.ISC_IsoName == row[dataColumn.ColumnName].ToString() || x.ISC_IsoCode == row[dataColumn.ColumnName].ToString()).Select(x => x.ISC_ID).FirstOrDefault(); + break; + case "执行标准": + if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) { + isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "SH/T3501-2021").Select(x => x.ExecStandardId).FirstOrDefault(); + } + else + { + isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "GB 50517-2010").Select(x => x.ExecStandardId).FirstOrDefault(); + } + break; + case "材质": - if (headerCorrespondenceDic.ContainsKey(dataColumn.ColumnName)) - switch (headerCorrespondenceDic[dataColumn.ColumnName]) - { - case "管线号": - isoInfo.ISO_IsoNo = row[dataColumn.ColumnName].ToString(); - break; - case "管道等级": - isoInfo.ISC_ID = isoClasss.Where(x => x.ISC_IsoName == row[dataColumn.ColumnName].ToString() || x.ISC_IsoCode == row[dataColumn.ColumnName].ToString()).Select(x => x.ISC_ID).FirstOrDefault(); - break; - case "执行标准": - if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) - { - isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "SH/T3501-2021").Select(x => x.ExecStandardId).FirstOrDefault(); - } - else - { - isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "GB 50517-2010").Select(x => x.ExecStandardId).FirstOrDefault(); - } - break; - case "材质": - - var steel = steels.FirstOrDefault(x => x.STE_Code == row[dataColumn.ColumnName].ToString()); - if (steel != null) - { - isoInfo.STE_ID = steel.STE_ID; - if (steel.STE_SteelType == "FeⅣ") - { - isoInfo.IsHotType = "1"; - - } - else if (steel.STE_SteelType == "FeⅠ" || steel.STE_SteelType == "FeⅡ" || steel.STE_SteelType == "FeⅢ") - { - isoInfo.IsHotType = "2"; - - } - } - break; - case "材质标准": - isoInfo.MaterialStandardId = materialStandards.Where(x => x.MaterialStandardName == row[dataColumn.ColumnName].ToString() || x.MaterialStandardCode == row[dataColumn.ColumnName].ToString()).Select(x => x.MaterialStandardId).FirstOrDefault(); - break; - case "介质": - var SER_ID = services.Where(x => x.SER_Name == row[dataColumn.ColumnName].ToString() || x.SER_Code == row[dataColumn.ColumnName].ToString()).Select(x => x.SER_ID).FirstOrDefault(); - if (!string.IsNullOrEmpty(SER_ID)) - { - isoInfo.SER_ID = SER_ID; - } - else - { - if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString()) && !serviceNames.Contains(row[dataColumn.ColumnName].ToString())) - { - Model.HJGL_BS_Service newBSService = new HJGL_BS_Service(); - newBSService.SER_ID = SQLHelper.GetNewID(); - newBSService.SER_Code = row[dataColumn.ColumnName].ToString(); - newBSService.SER_Name = row[dataColumn.ColumnName].ToString(); - Funs.DB.HJGL_BS_Service.InsertOnSubmit(newBSService); - Funs.DB.SubmitChanges(); - serviceNames += row[dataColumn.ColumnName].ToString(); - isoInfo.SER_ID = newBSService.SER_ID; - } - } - break; - case "管道类别": - isoInfo.PipeLineClass = row[dataColumn.ColumnName].ToString(); - if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) - { - isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "SH/T3501-2021").Select(x => x.ExecStandardId).FirstOrDefault(); - } - else - { - isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "GB 50517-2010").Select(x => x.ExecStandardId).FirstOrDefault(); - } - break; - case "涂漆类别": - isoInfo.ISO_Paint = row[dataColumn.ColumnName].ToString(); - break; - case "绝热类别": - if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) - { - isoInfo.ISO_Insulator = row[dataColumn.ColumnName].ToString(); - } - else - { - isoInfo.ISO_Insulator = "/"; - - } - break; - case "操作压力": - isoInfo.OperatingPressure = row[dataColumn.ColumnName].ToString(); - break; - case "操作温度": - isoInfo.OperatingTemperature = row[dataColumn.ColumnName].ToString(); - break; - case "泄露性试验": - if (isoInfo.ISO_DesignPress.HasValue) - { - isoInfo.LeakageTest = isoInfo.ISO_DesignPress.Value.ToString("##.##");// row[dataColumn.ColumnName].ToString(); - } - break; - case "设计压力": - isoInfo.ISO_DesignPress = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); - isoInfo.LeakageTest = row[dataColumn.ColumnName].ToString(); - break; - case "设计温度": - isoInfo.ISO_DesignTemperature = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); - break; - case "耐压试验": - if (isoInfo.ISO_DesignPress.HasValue) - { - isoInfo.ISO_TestPress = isoInfo.ISO_DesignPress.Value * 1.5m; - } - break; - case "外径": - isoInfo.ISO_Dia = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); - break; - case "壁厚": - isoInfo.ISO_Sch = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); - break; - case "管线长度": - isoInfo.PipeLineLength = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); - break; - case "检测类别序号": - isoInfo.TestCategoryNum = "/"; - break; - case "热处理类型": - { - if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) - { - //isoInfo.IsHotType = row[dataColumn.ColumnName].ToString(); - isoInfo.IsHot = "1"; - } - } - break; - case "备注": - isoInfo.ISO_Remark = row[dataColumn.ColumnName].ToString(); - break; - } - - if (row[dataColumn.ColumnName].ToString().Contains("漆")) + var steel = steels.FirstOrDefault(x => x.STE_Code == row[dataColumn.ColumnName].ToString()); + if (steel != null) + { + isoInfo.STE_ID = steel.STE_ID; + if (steel.STE_SteelType == "FeⅣ") { - isoInfo.ISO_Paint = row[dataColumn.ColumnName].ToString(); + isoInfo.IsHotType = "1"; + } - if (row[dataColumn.ColumnName].ToString().Contains("SH")) + else if (steel.STE_SteelType == "FeⅠ" || steel.STE_SteelType == "FeⅡ" || steel.STE_SteelType == "FeⅢ") { - isoInfo.ISC_ID = isoClasss.Where(x => x.ISC_IsoName == row[dataColumn.ColumnName].ToString() || x.ISC_IsoCode == row[dataColumn.ColumnName].ToString()).Select(x => x.ISC_ID).FirstOrDefault(); + isoInfo.IsHotType = "2"; + } - if (row[dataColumn.ColumnName].ToString().Contains("焊后热处理")) + } + break; + case "材质标准": + isoInfo.MaterialStandardId = materialStandards.Where(x => x.MaterialStandardName == row[dataColumn.ColumnName].ToString() || x.MaterialStandardCode == row[dataColumn.ColumnName].ToString()).Select(x => x.MaterialStandardId).FirstOrDefault(); + break; + case "介质": + var SER_ID = services.Where(x => x.SER_Name == row[dataColumn.ColumnName].ToString() || x.SER_Code == row[dataColumn.ColumnName].ToString()).Select(x => x.SER_ID).FirstOrDefault(); + if (!string.IsNullOrEmpty(SER_ID)) + { + isoInfo.SER_ID = SER_ID; + } + else + { + if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString()) && !serviceNames.Contains(row[dataColumn.ColumnName].ToString())) + { + Model.HJGL_BS_Service newBSService = new HJGL_BS_Service(); + newBSService.SER_ID = SQLHelper.GetNewID(); + newBSService.SER_Code = row[dataColumn.ColumnName].ToString(); + newBSService.SER_Name = row[dataColumn.ColumnName].ToString(); + Funs.DB.HJGL_BS_Service.InsertOnSubmit(newBSService); + Funs.DB.SubmitChanges(); + serviceNames += row[dataColumn.ColumnName].ToString(); + isoInfo.SER_ID = newBSService.SER_ID; + } + } + break; + case "管道类别": + isoInfo.PipeLineClass = row[dataColumn.ColumnName].ToString(); + if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) + { + isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "SH/T3501-2021").Select(x => x.ExecStandardId).FirstOrDefault(); + } + else + { + isoInfo.ISO_Executive = execStandards.Where(x => x.ExecStandardName == "GB 50517-2010").Select(x => x.ExecStandardId).FirstOrDefault(); + } + break; + case "涂漆类别": + isoInfo.ISO_Paint = row[dataColumn.ColumnName].ToString(); + break; + case "绝热类别": + if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) + { + isoInfo.ISO_Insulator = row[dataColumn.ColumnName].ToString(); + } + else + { + isoInfo.ISO_Insulator = "/"; + + } + break; + case "操作压力": + isoInfo.OperatingPressure = row[dataColumn.ColumnName].ToString(); + break; + case "操作温度": + isoInfo.OperatingTemperature = row[dataColumn.ColumnName].ToString(); + break; + case "泄露性试验": + if (isoInfo.ISO_DesignPress.HasValue) + { + isoInfo.LeakageTest = isoInfo.ISO_DesignPress.Value.ToString("0.00") ?? "";// row[dataColumn.ColumnName].ToString(); + } + break; + case "设计压力": + isoInfo.ISO_DesignPress = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); + isoInfo.LeakageTest = row[dataColumn.ColumnName].ToString(); + break; + case "设计温度": + isoInfo.ISO_DesignTemperature = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); + break; + case "耐压试验": + if (isoInfo.ISO_DesignPress.HasValue) + { + isoInfo.ISO_TestPress = isoInfo.ISO_DesignPress.Value * 1.5m; + } + break; + case "外径": + isoInfo.ISO_Dia = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); + break; + case "壁厚": + isoInfo.ISO_Sch = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); + break; + case "管线长度": + isoInfo.PipeLineLength = Funs.GetNewDecimal(row[dataColumn.ColumnName].ToString()); + break; + case "检测类别序号": + isoInfo.TestCategoryNum = "/"; + break; + case "热处理类型": + { + if (!string.IsNullOrEmpty(row[dataColumn.ColumnName].ToString())) { //isoInfo.IsHotType = row[dataColumn.ColumnName].ToString(); isoInfo.IsHot = "1"; } } - isoList.Add(isoInfo); - } + break; + case "备注": + isoInfo.ISO_Remark = row[dataColumn.ColumnName].ToString(); + break; } - } - catch (Exception e11) + if (row[dataColumn.ColumnName].ToString().Contains("漆")) { - + isoInfo.ISO_Paint = row[dataColumn.ColumnName].ToString(); + } + if (row[dataColumn.ColumnName].ToString().Contains("SH")) + { + var parts = row[dataColumn.ColumnName].ToString().Split(new[] { "SH" }, StringSplitOptions.None); + string PipeLineClass = parts[0]; // GC2 + string ISC_IsoName = "SH" + parts[1]; // SHB3 + isoInfo.ISC_ID = isoClasss.Where(x => x.ISC_IsoName == ISC_IsoName || x.ISC_IsoCode == ISC_IsoName).Select(x => x.ISC_ID).FirstOrDefault(); + if (!string.IsNullOrEmpty(PipeLineClass)) + { + isoInfo.PipeLineClass = PipeLineClass; + } + } + if (row[dataColumn.ColumnName].ToString().Contains("焊后热处理")) + { + //isoInfo.IsHotType = row[dataColumn.ColumnName].ToString(); + isoInfo.IsHot = "1"; } - } - Console.WriteLine($"\n--- 表格 {j + 1} ---"); + isoList.Add(isoInfo); } } + } + /// + /// 一次性读取PDF指定页范围内的全部表格,并按列位置合并为一个数据表。 + /// + private static DataTable ExtractAllPdfTables(string pdfFilePath, int startPageIndex) + { + DataTable result = new DataTable("PDF全部页"); + using (PdfDocument pdf = new PdfDocument()) + { + pdf.LoadFromFile(pdfFilePath); + PdfTableExtractor extractor = new PdfTableExtractor(pdf); + for (int pageIndex = startPageIndex; pageIndex < pdf.Pages.Count; pageIndex++) + { + PdfTable[] tables = extractor.ExtractTable(pageIndex); + foreach (PdfTable table in tables) + { + AppendPdfTable(result, table); + } + } + } + return result; + } - this.IsoGrid.DataSource = this.isoList; - this.IsoGrid.DataBind(); + /// + /// 将单个PDF表格追加到汇总表,页间列数不同时按最大列数补齐。 + /// + private static void AppendPdfTable(DataTable target, PdfTable source) + { + int firstColumnIndex = 0; + while (firstColumnIndex < source.GetColumnCount() && IsPdfColumnEmpty(source, firstColumnIndex)) + { + firstColumnIndex++; + } + + int lastColumnIndex = source.GetColumnCount() - 1; + while (lastColumnIndex >= firstColumnIndex && IsPdfColumnEmpty(source, lastColumnIndex)) + { + lastColumnIndex--; + } + + if (lastColumnIndex < firstColumnIndex) + { + return; + } + + // Spire可能在不同页面的表格首尾生成全空占位列,追加前先去掉这些列,避免整页错位。 + int contentColumnCount = lastColumnIndex - firstColumnIndex + 1; + while (target.Columns.Count < contentColumnCount) + { + target.Columns.Add("col" + target.Columns.Count); + } + + for (int rowIndex = 0; rowIndex < source.GetRowCount(); rowIndex++) + { + DataRow row = target.NewRow(); + for (int columnIndex = 0; columnIndex < contentColumnCount; columnIndex++) + { + row[columnIndex] = source.GetText(rowIndex, firstColumnIndex + columnIndex); + } + target.Rows.Add(row); + } + } + + private static bool IsPdfColumnEmpty(PdfTable table, int columnIndex) + { + for (int rowIndex = 0; rowIndex < table.GetRowCount(); rowIndex++) + { + if (!string.IsNullOrWhiteSpace(table.GetText(rowIndex, columnIndex))) + { + return false; + } + } + return true; + } + + private void BindIsoGrid() + { + IsoGrid.DataSource = isoList; + IsoGrid.DataBind(); + } + + private static Grid CreateTableGrid(DataTable table) + { + Grid grid = new Grid + { + ShowGridHeader = true, + Title = table.TableName, + AllowColumnLocking = true, + DataKeyNames = new string[] { "Id" } + }; + foreach (DataColumn column in table.Columns) + { + grid.Columns.Add(new BoundField { DataField = column.ColumnName, HeaderText = column.ColumnName }); + } + grid.DataSource = table; + grid.DataBind(); + return grid; } @@ -1171,4 +1198,4 @@ namespace FineUIPro.Web.HJGL.DataIn } #endregion } -} \ No newline at end of file +} diff --git a/HJGL_DS/WebAPI/WebAPI.csproj.user b/HJGL_DS/WebAPI/WebAPI.csproj.user index 8cd7f1f..ef14066 100644 --- a/HJGL_DS/WebAPI/WebAPI.csproj.user +++ b/HJGL_DS/WebAPI/WebAPI.csproj.user @@ -1,7 +1,7 @@ - Release|Any CPU + Debug|Any CPU FolderProfile true