From 149ae2cec6e9b736c097c45d35d529d01450ec1f Mon Sep 17 00:00:00 2001 From: tdx Date: Tue, 2 Dec 2025 09:22:54 +0000 Subject: [PATCH] SVN r1065 SVN-Revision: r1065 --- 插件库/Lskj.AutoCreatWord/CreateWordUtil.cs | 106 ++++++++++++++++++-- 1 file changed, 100 insertions(+), 6 deletions(-) diff --git a/插件库/Lskj.AutoCreatWord/CreateWordUtil.cs b/插件库/Lskj.AutoCreatWord/CreateWordUtil.cs index fdd8acf..ca522f4 100644 --- a/插件库/Lskj.AutoCreatWord/CreateWordUtil.cs +++ b/插件库/Lskj.AutoCreatWord/CreateWordUtil.cs @@ -129,11 +129,15 @@ namespace Lskj.AutoCreatWord DataTable dataTable = dataSet.Tables[1]; if (dataTable.Columns.Contains("crm_lco_xmbg") && dataTable.Columns.Contains("crm_lco_order")) { - foreach (DataRow item in dataTable.Rows) + var selectRows = dataTable.Rows.Cast().Where(n => (n["crm_lco_xmbg"] + "").Equals(ModelStr[i]) && (n["crm_lco_order"] + "").Equals(order + "")); + if (selectRows != null) { - if ((item["crm_lco_xmbg"] + "").Equals(ModelStr[i]) && (item["crm_lco_order"] + "").Equals(order + "")) + foreach (DataRow item in selectRows) { - item["crm_lco_xmbg"] = $"XMBG_{order}_{index}"; + if ((item["crm_lco_xmbg"] + "").Equals(ModelStr[i]) && (item["crm_lco_order"] + "").Equals(order + "")) + { + item["crm_lco_xmbg"] = $"XMBG_{order}_{index}"; + } } } } @@ -939,6 +943,7 @@ namespace Lskj.AutoCreatWord DataTable detailTab = dataSet.Tables[1]; // word表格集合 Dictionary> disMergeDic = new Dictionary>(); + Dictionary> mergeDic = new Dictionary>(); List targetTables = new List(); string pattern = @"^(?!L)\{#\w+.(?!img_)\w+}$"; // 正则表达式匹配 {#xxx.xxxxx} string pattern1 = @"^(?!L)\{!#\w+.(?!img_)\w+}$"; // 正则表达式匹配 {!#xxx.xxxxx} @@ -992,6 +997,19 @@ namespace Lskj.AutoCreatWord } tableCell.Paragraphs[0].Text = tableCell.Paragraphs[0].Text.Replace("!#", "#"); } + string npattern1 = @"\{#\w+\.(\w+)\}";//匹配合并的列 + Match nmatch1 = Regex.Match(tableCell.Paragraphs[0].Text, npattern1, RegexOptions.IgnoreCase); + if (nmatch1.Success) + { + if (mergeDic.ContainsKey(table)) + { + mergeDic[table].Add($"{{{nmatch1.Groups[1].Value}}}"); + } + else + { + mergeDic.Add(table, new List() { $"{{{nmatch1.Groups[1].Value}}}" }); + } + } if (!isBreak) { GridTarGet gridTarGet = new GridTarGet(); @@ -1018,6 +1036,10 @@ namespace Lskj.AutoCreatWord DataTable dataTable = detailTab.Clone(); detailTab.Rows.Cast().Where(n => (n["crm_lco_xmbg"] + "").Equals(gridTar.number)).CopyToDataTable(dataTable, LoadOption.OverwriteChanges);//当前表需要用到的数据源 Table table = gridTar.targetTable; + if (!disMergeDic.ContainsKey(table) && mergeDic.ContainsKey(table) && mergeDic[table].Count == table.Rows[gridTar.rowIndex].Cells.Count) + { + GetGroupData(mergeDic, table, ref dataTable); + } // 从表格的第一行获取列名 List columnNames = new List(); foreach (TableCell cell in table.Rows[gridTar.rowIndex].Cells) @@ -1047,8 +1069,9 @@ namespace Lskj.AutoCreatWord for (int j = 0; j < columnNames.Count; j++) { string columnName = columnNames[j]; - Paragraph cloneParagraph = (Paragraph)table.Rows[gridTar.rowIndex].Cells[j].Paragraphs[0].Clone(); - CharacterFormat characterFormat = (cloneParagraph.ChildObjects[0] as TextRange).CharacterFormat; + Paragraph sourceParagraph = table.Rows[gridTar.rowIndex].Cells[j].Paragraphs[0]; + Paragraph cloneParagraph = (Paragraph)sourceParagraph.Clone(); + CharacterFormat characterFormat = (sourceParagraph.ChildObjects[0] as TextRange).CharacterFormat; ParagraphFormat paragraphFormat = newRow.Cells[j].Paragraphs[0].Format; newRow.Cells[j].Paragraphs.Clear(); newRow.Cells[j].Paragraphs.Add(cloneParagraph); @@ -1706,4 +1729,75 @@ namespace Lskj.AutoCreatWord { Paragraph paragraph = textRange.OwnerParagraph; CharacterFormat characterFormat = textRange.CharacterFormat; - \ No newline at end of file + paragraph.Text = ""; + for (int k = 0; k < result.Length; k++) + { + string resultText = result[k]; + if (k > 0) + { + Break lineBreak = new Break(document, BreakType.LineBreak); + paragraph.ChildObjects.Add(lineBreak); + } + TextRange range = paragraph.AppendText(resultText); + range.ApplyCharacterFormat(characterFormat); + } + } + } + } + } + /// + /// 获取分组后数据 + /// + private static void GetGroupData(Dictionary> mergeDic, Table table, ref DataTable dataTable) + { + try + { + bool groupSuccess = true; + DataTable selectTable = new DataTable(); + foreach (string item in mergeDic[table]) + { + string columnName = item.Trim('{', '}'); + if (dataTable.Columns.Contains(columnName)) + { + selectTable.Columns.Add(dataTable.Columns[columnName].ColumnName, dataTable.Columns[columnName].DataType); + } + else + { + groupSuccess = false; + break; + } + } + if (groupSuccess) + { + foreach (DataRow sourceRow in dataTable.Rows) + { + DataRow dataRow = selectTable.NewRow(); + foreach (DataColumn dataColumn in dataRow.Table.Columns) + { + dataRow[dataColumn] = sourceRow[dataColumn.ColumnName]; + } + selectTable.Rows.Add(dataRow); + } + List columns = new List(); + foreach (DataColumn item in selectTable.Columns) + { + columns.Add(item.ColumnName); + } + // 动态定义要分组的列 + string[] groupByColumns = columns.ToArray(); + string separator = Guid.NewGuid().ToString().ToLower().Replace("-", ""); + // 使用 LINQ 按动态列进行分组 + var groupedData = selectTable.AsEnumerable() + .GroupBy(row => new + { + // 动态选择分组键 + Key = string.Join(separator, groupByColumns.Select(col => row.Field(col))) + }) + .Select(g => new + { + Key = g.Key + }); + + // 创建新的 DataTable 用于存储分组结果 + DataTable groupedTable = selectTable.Clone(); + \ No newline at end of file