SummaryRow

<adg:dataProvider>
	<mx:GroupingCollection id="KDBTCSAGroup" >
	  <mx:grouping>
	   <mx:Grouping compareFunction="csaGroupCompare">
		<mx:GroupingField name="Group">
	<mx:SummaryRow summaryPlacement="group">		
       <mx:fields>
			<mx:SummaryField dataField="Cash" operation="SUM"/>
			<mx:SummaryField dataField="Converts" operation="SUM"/>		
                      </mx:fields>
                      </mx:SummaryRow>
		</mx:GroupingField>
	  </mx:Grouping>
       </mx:grouping>      </mx:GroupingCollection>		
</adg:dataProvider>

<mx:GroupingCollection id="KDBTCSAGroup" >
	<mx:grouping>
		<mx:Grouping compareFunction="csaGroupCompare">
			<mx:GroupingField name="Group">
				<mx:SummaryRow summaryPlacement="first group last" summaryObjectFunction="{function():Object{return {Info: 'Total >>'};}}">
			    <mx:fields>
				<mx:SummaryField dataField="Cash" operation="SUM"/>
				<mx:SummaryField dataField="Converts" operation="SUM"/>
                            </mx:fields>	
		        </mx:SummaryRow>
			</mx:GroupingField>
		</mx:Grouping>
	</mx:grouping>
	<mx:summaries>
		<mx:SummaryRow id="sumRow">						
			<mx:fields>
				<mx:SummaryField dataField="Cash" operation="SUM"/>
				<mx:SummaryField dataField="Converts" operation="SUM"/>
			</mx:fields>	
		</mx:SummaryRow>
	</mx:summaries>
</mx:GroupingCollection>

summaryOperation SUM, MIN, MAX,AVG, COUNT

<mx:SummaryField label="EstTotal" dataField="Estimate"/><mx:AdvancedDataGridColumn dataField="EstTotal"/> 统计值在新的列显示 




在上述代码的基础上增添以下模块:Sub CreateSummarySheet() On Error GoTo ErrorHandler Application.ScreenUpdating = False ' 检查统计表和汇总分析表是否存在 Dim statSheet As Worksheet, analysisSheet As Worksheet Dim summarySheet As Worksheet Dim sheetExists As Boolean: sheetExists = True On Error Resume Next Set statSheet = ThisWorkbook.Sheets("卫星节目故障统计表") Set analysisSheet = ThisWorkbook.Sheets("卫星节目汇总分析表") On Error GoTo 0 If statSheet Is Nothing Or analysisSheet Is Nothing Then MsgBox "未找到统计表和汇总分析表,请先运行生成报告程序", vbExclamation Exit Sub End If ' 删除旧的数据统计汇总表(如果存在) Application.DisplayAlerts = False On Error Resume Next ThisWorkbook.Sheets("数据统计汇总表").Delete On Error GoTo 0 Application.DisplayAlerts = True ' 创建新的数据统计汇总表 Set summarySheet = ThisWorkbook.Sheets.Add(After:=analysisSheet) summarySheet.Name = "数据统计汇总表" ' ==== 步骤0:设置表头 ==== With summarySheet.Range("A1:E1") .Merge .Value = statSheet.Range("A1").Value ' 复制统计表第一行内容 .Font.Bold = True .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With ' ==== 步骤1:创建标题行 ==== summarySheet.Range("A2:E2") = Array("序号", "影响卫星", "对应节目", "节目数量", "节目数量合计") summarySheet.Rows(2).Font.Bold = True summarySheet.Range("A2:E2").HorizontalAlignment = xlCenter ' ==== 步骤2-3:收集卫星和节目数据 ==== Dim lastStatRow As Long lastStatRow = statSheet.Cells(statSheet.Rows.Count, "A").End(xlUp).Row ' 使用字典存储卫星和对应的节目集合 Dim satelliteDict As Object Set satelliteDict = CreateObject("Scripting.Dictionary") Dim r As Long For r = 3 To lastStatRow Dim satellite As String, program As String satellite = statSheet.Cells(r, 1).Value ' A列: 影响卫星 program = statSheet.Cells(r, 2).Value ' B列: 影响节目 ' 添加卫星到字典 If Not satelliteDict.Exists(satellite) Then satelliteDict.Add satellite, CreateObject("Scripting.Dictionary") End If ' 添加节目到卫星对应的字典(自动去重) satelliteDict(satellite)(program) = True Next r ' ==== 步骤4-6:填充数据 ==== Dim summaryRow As Long: summaryRow = 3 Dim satellites() As Variant satellites = satelliteDict.Keys ' 步骤5:填充序号 For i = 0 To UBound(satellites) summarySheet.Cells(summaryRow, 1) = i + 1 ' 序号 summaryRow = summaryRow + 1 Next i ' 填充卫星、节目和节目数量 summaryRow = 3 Dim totalPrograms As Long: totalPrograms = 0 For Each satellite In satellites ' 步骤3:填充影响卫星 summarySheet.Cells(summaryRow, 2) = satellite ' 步骤3:合并节目名称 Dim programs() As Variant programs = satelliteDict(satellite).Keys Dim programStr As String programStr = Join(programs, "、") summarySheet.Cells(summaryRow, 3) = programStr ' 步骤4:计算节目数量 Dim programCount As Long programCount = satelliteDict(satellite).Count summarySheet.Cells(summaryRow, 4) = programCount totalPrograms = totalPrograms + programCount summaryRow = summaryRow + 1 Next satellite ' 步骤6:添加节目数量合计 Dim lastSummaryRow As Long lastSummaryRow = summarySheet.Cells(summarySheet.Rows.Count, "A").End(xlUp).Row With summarySheet.Range("E3:E" & lastSummaryRow) .Merge .Value = totalPrograms .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With ' ==== 步骤7:设置格式 ==== summarySheet.Columns("A:E").AutoFit summarySheet.Cells.HorizontalAlignment = xlCenter summarySheet.Cells.VerticalAlignment = xlCenter ' 设置边框 With summarySheet.Range("A2:E" & lastSummaryRow).Borders .LineStyle = xlContinuous .Weight = xlThin End With ' 冻结标题行 summarySheet.Activate summarySheet.Range("A3").Select ActiveWindow.FreezePanes = True Application.ScreenUpdating = True MsgBox "数据统计汇总表创建完成!", vbInformation Exit Sub ErrorHandler: MsgBox "错误 " & Err.Number & ": " & Err.Description, vbCritical, "创建汇总表时出错" Application.ScreenUpdating = True End Sub
07-10
function 合并表格并查找重复数据() { const workbook = Application.ActiveWorkbook; const mergedSheetName = "合并数据"; const duplicateSheetName = "双重重复数据"; // 删除可能存在的旧表 try { workbook.Sheets(mergedSheetName).Delete(); } catch(e) {} try { workbook.Sheets(duplicateSheetName).Delete(); } catch(e) {} try { workbook.Sheets("日期重复").Delete(); } catch(e) {} // 创建合并数据表 const mergedSheet = workbook.Sheets.Add(); mergedSheet.Name = mergedSheetName; // 设置表头(3行) const headerRange = mergedSheet.Range("A1"); headerRange.Value2 = "合并数据"; mergedSheet.Range("A1:J2").Merge(); headerRange.HorizontalAlignment = 3; // xlCenter headerRange.Font.Bold = true; headerRange.Font.Size = 14; // 初始化数据位置 let outputRow = 4; const colC = 3; // 第三列索引 const colD = 4; // 第四列索引 // 遍历所有工作表 for (let sheetIndex = 1; sheetIndex <= workbook.Sheets.Count; sheetIndex++) { const sheet = workbook.Sheets(sheetIndex); if (sheet.Name === mergedSheetName || sheet.Name === duplicateSheetName) continue; const usedRange = sheet.UsedRange; const totalRows = usedRange.Rows.Count; const totalCols = usedRange.Columns.Count; // 跳过行数不足的工作表 if (totalRows <= 6) continue; // 获取有效数据范围(跳过前三行和最后三行) const dataStartRow = 4; const dataEndRow = totalRows - 3; const dataRange = sheet.Range( sheet.Cells(dataStartRow, 1), sheet.Cells(dataEndRow, totalCols) ); const data = dataRange.Value2; const dataRows = data.length; // 添加数据到合并表 for (let i = 0; i < dataRows; i++) { // 添加源表名列 mergedSheet.Cells(outputRow, totalCols + 1).Value2 = sheet.Name; // 复制数据 for (let j = 0; j < totalCols; j++) { mergedSheet.Cells(outputRow, j + 1).Value2 = data[i][j]; } outputRow++; } } // 设置合并表格式 const mergedDataRange = mergedSheet.UsedRange; mergedDataRange.Borders.LineStyle = 1; mergedSheet.Columns.AutoFit(); // 添加列标题(最后一列为源表名) const lastCol = mergedDataRange.Columns.Count; mergedSheet.Cells(3, lastCol).Value2 = "源表"; mergedSheet.Range(mergedSheet.Cells(3, 1), mergedSheet.Cells(3, lastCol)).Font.Bold = true; // 提取双重重复数据 extractDoubleDuplicates(mergedSheet, duplicateSheetName, colC, colD); return "处理完成!合并数据表: " + mergedSheetName + ", 双重重复数据表: " + duplicateSheetName; } function extractDoubleDuplicates(mergedSheet, duplicateSheetName, col1, col2) { const dupSheet = Worksheets.Add(); dupSheet.Name = duplicateSheetName; // 复制表头(前3行) mergedSheet.Range("1:3").Copy(dupSheet.Range("A1")); const mergedRange = mergedSheet.UsedRange; const allData = mergedRange.Value2; const totalRows = allData.length; const totalCols = allData[0].length; // 创建复合键映射 const keyMap = new Map(); const duplicateRows = []; // 生成安全键值 function createSafeKey(value) { if (value === null || value === undefined) return "∅"; if (value instanceof Date) return value.getTime().toString(); return String(value).trim().toLowerCase(); } // 第一遍:创建复合键并统计 for (let i = 4; i < totalRows; i++) { const key1 = createSafeKey(allData[i][col1 - 1]); const key2 = createSafeKey(allData[i][col2 - 1]); const compoundKey = `${key1}||${key2}`; if (!keyMap.has(compoundKey)) { keyMap.set(compoundKey, []); } keyMap.get(compoundKey).push(i); } // 第二遍:收集双重重复行 for (const [key, rows] of keyMap) { if (rows.length > 1) { for (const row of rows) { duplicateRows.push(allData[row]); } } } // 写入重复数据 if (duplicateRows.length > 0) { const outputRange = dupSheet.Range("A4").Resize( duplicateRows.length, totalCols ); outputRange.Value2 = duplicateRows; } // 设置格式 const dupRange = dupSheet.UsedRange; dupRange.Borders.LineStyle = 1; dupSheet.Columns.AutoFit(); // 添加统计信息 const uniquePairs = new Set(); for (const row of duplicateRows) { uniquePairs.add(`${row[col1 - 1]}|${row[col2 - 1]}`); } dupSheet.Cells(duplicateRows.length + 6, 1).Value2 = "双重重复统计"; dupSheet.Cells(duplicateRows.length + 6, 1).Font.Bold = true; dupSheet.Cells(duplicateRows.length + 7, 1).Value2 = "重复组合数量: " + uniquePairs.size; return duplicateRows.length; } function 查找日期重复数据() { try { const workbook = ThisWorkbook; // 检查并删除已存在的"日期重复"工作表 try { const oldSheet = workbook.Sheets.Item("日期重复"); Application.DisplayAlerts = false; // 禁用删除确认提示 oldSheet.Delete(); Application.DisplayAlerts = true; console.log("已删除旧表'日期重复'"); } catch (e) { // 表不存在,无需处理 } // 获取源数据表 const sourceSheet = workbook.Sheets.Item("合并数据"); if (!sourceSheet) throw new Error("找不到名为'合并数据'的工作表"); // 获取数据区域(跳过前三行表头) const dataRange = sourceSheet.UsedRange; const totalRows = dataRange.Rows.Count; const totalCols = dataRange.Columns.Count; // 验证数据行数 if (totalRows <= 3) { console.log("数据行不足,无法处理"); return; } // 获取数据(从第4行开始) const dataValues = sourceSheet.Range( `A4:${String.fromCharCode(64 + totalCols)}${totalRows}` ).Value2; // 获取表头(第三行作为新表头) const headerRow = sourceSheet.Range("A3").Resize(1, totalCols).Value2[0]; // 统计重复数据 const { duplicateRows, dateStats } = findDuplicateRows(dataValues, 2); // 第三列索引为2 // 创建新工作表 const dupSheet = workbook.Sheets.Add(null, workbook.Sheets(workbook.Sheets.Count)); dupSheet.Name = "日期重复"; // 写入重复数据 if (duplicateRows.length > 0) { // 写入表头 dupSheet.Range("A1").Resize(1, headerRow.length).Value2 = headerRow; // 写入重复数据行 dupSheet.Range("A2").Resize(duplicateRows.length, headerRow.length).Value2 = duplicateRows; // 设置表头样式 const headerRange = dupSheet.Range("A1").Resize(1, headerRow.length); headerRange.Font.Bold = true; headerRange.Interior.Color = RGB(200, 200, 200); } else { dupSheet.Range("A1").Value2 = "无重复日期数据"; } // 添加统计信息 if (duplicateRows.length > 0) { addStatistics(dupSheet, duplicateRows.length, dateStats); } return "处理完成!"; } catch (error) { console.error("处理出错: " + error.message); return "处理失败!"; } } // 查找重复行并统计 function findDuplicateRows(data, colIndex) { const duplicateRows = []; const dateStats = new Map(); const seen = new Map(); // 遍历所有数据行 for (let i = 0; i < data.length; i++) { const dateValue = data[i][colIndex]; // 初始化统计信息 if (!dateStats.has(dateValue)) { dateStats.set(dateValue, { count: 0, firstRow: i + 4, // 实际行号(表头占3行) rows: [] }); } // 更新统计信息 const stat = dateStats.get(dateValue); stat.count++; stat.rows.push(i + 4); // 记录实际行号 // 收集重复行(重复次数>1) if (seen.has(dateValue)) { // 如果是首次发现重复,添加之前出现的行 if (seen.get(dateValue) !== -1) { duplicateRows.push(data[seen.get(dateValue)]); seen.set(dateValue, -1); // 标记为已处理 } duplicateRows.push(data[i]); } else { seen.set(dateValue, i); } } return { duplicateRows, dateStats }; } // 添加统计信息到工作表 function addStatistics(sheet, duplicateCount, dateStats) { const startRow = duplicateCount + 3; // 数据行数 + 表头行 + 2行空白 // 添加统计标题 sheet.Range(`C${startRow}`).Value2 = "日期重复统计"; sheet.Range(`C${startRow}`).Font.Bold = true; sheet.Range(`C${startRow}`).Font.Size = 14; // 添加表头 const statHeaders = ["日期值", "出现次数", "首次出现行", "所有行号"]; const headerRange = sheet.Range(`C${startRow + 1}`).Resize(1, statHeaders.length); headerRange.Value2 = statHeaders; headerRange.Font.Bold = true; headerRange.Interior.Color = RGB(220, 220, 220); // 添加统计数据 let rowIndex = startRow + 2; let totalDuplicates = 0; let duplicateDates = 0; for (const [dateValue, stat] of dateStats) { if (stat.count > 1) { sheet.Range(`C${rowIndex}`).Value2 = dateValue; sheet.Range(`D${rowIndex}`).Value2 = stat.count; sheet.Range(`E${rowIndex}`).Value2 = stat.firstRow; // 合并行号显示(避免过多列) const rowNumbers = stat.rows.join(", "); sheet.Range(`F${rowIndex}`).Value2 = rowNumbers; // 高亮重复次数多的行 if (stat.count > 2) { sheet.Range(`C${rowIndex}:F${rowIndex}`).Interior.Color = RGB(255, 200, 200); } rowIndex++; totalDuplicates += stat.count; duplicateDates++; } } // 添加汇总信息 const summaryRow = rowIndex + 1; sheet.Range(`A${summaryRow}`).Value2 = "汇总统计"; sheet.Range(`A${summaryRow}`).Font.Bold = true; sheet.Range(`A${summaryRow}`).Font.Size = 12; sheet.Range(`A${summaryRow + 1}`).Value2 = "重复日期总数"; sheet.Range(`B${summaryRow + 1}`).Value2 = duplicateDates; sheet.Range(`A${summaryRow + 2}`).Value2 = "总重复行数"; sheet.Range(`B${summaryRow + 2}`).Value2 = totalDuplicates; // 自动调整列宽 sheet.UsedRange.Columns.AutoFit(); } 将该段代码中占3行的表头改为占4行,将跳过最后三行数据改为只跳过最后一行合并所有表格,且将原本查找重复的第三列,第四列列转换成第二列与第三列
最新发布
07-16
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Colors; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; public class CADUtilities { // 常量定义 private const double OverlapThreshold = 10.0; // 毫米 private const double ConcreteDensity = 25.0; // 混凝土容重(kN/m³) // ================== 梁信息类 ================== private class BeamInfo { public ObjectId Id { get; set; } public Extents3d Extents { get; set; } public Vector3d Direction { get; set; } public Point3d Center { get; set; } public bool IsHorizontal { get; set; } } // ================== 梁尺寸信息类 ================== private class BeamSizeInfo { public string Size { get; set; } public int Count { get; set; } public double Width { get; set; } public double Height { get; set; } public double Area { get; set; } public double LineLoad { get; set; } } // ================== CLN - 清理无用实体命令(增强版) ================== [CommandMethod("CLN")] public void CleanUpDrawing() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; Database db = doc.Database; Editor ed = doc.Editor; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject( db.CurrentSpaceId, OpenMode.ForWrite); int deletedCount = 0; var idsToDelete = new List<ObjectId>(); foreach (ObjectId id in btr) { Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity; if (ent == null) continue; // 处理文本实体 if (ent is DBText text) { string textStr = text.TextString; // 保留所有重要文本(轴号、标高、梁编号、尺寸标注) if (IsAxisNumber(textStr) || textStr.Contains("标高") || IsBeamLabel(textStr) || IsBeamDimension(textStr)) { continue; // 保留这些文本 } // 删除空文本和非重要文本 if (string.IsNullOrWhiteSpace(textStr) || textStr.Length < 2 || // 删除过短文本 textStr == " " || // 删除空格文本 textStr == ".") { idsToDelete.Add(id); continue; } } // 处理多行文本 else if (ent is MText mtext) { string textStr = mtext.Text; if (string.IsNullOrWhiteSpace(textStr) || textStr.Length < 2) { idsToDelete.Add(id); continue; } } // 删除零长度线 else if (ent is Line line && line.Length < 0.001) { idsToDelete.Add(id); } // 删除零长度多段线 else if (ent is Polyline pline && pline.Length < 0.001) { idsToDelete.Add(id); } // 删除孤立点 else if (ent is DBPoint point) { idsToDelete.Add(id); } } // 执行删除操作 foreach (ObjectId id in idsToDelete) { Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite); ent.Erase(true); // 使用Erase(true)确保立即删除 deletedCount++; } tr.Commit(); ed.WriteMessage($"\n清理完成,删除 {deletedCount} 个无用实体"); } } // ================== DEL - 图层删除命令 ================== [CommandMethod("DEL")] public void DeleteByLayer() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; Database db = doc.Database; Editor ed = doc.Editor; // 用户选择参考对象 PromptEntityOptions opt = new PromptEntityOptions("\n选择图层参考对象:"); PromptEntityResult res = ed.GetEntity(opt); if (res.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { try { // 获取目标图层 Entity refEnt = tr.GetObject(res.ObjectId, OpenMode.ForRead) as Entity; if (refEnt == null) return; string targetLayer = refEnt.Layer; // 收集当前空间所有实体 BlockTableRecord btr = (BlockTableRecord)tr.GetObject( db.CurrentSpaceId, OpenMode.ForWrite); List<ObjectId> toDelete = new List<ObjectId>(); foreach (ObjectId id in btr) { Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity; if (ent != null && ent.Layer == targetLayer) { toDelete.Add(id); } } // 执行删除 if (toDelete.Count > 0) { foreach (ObjectId id in toDelete) { Entity ent = (Entity)tr.GetObject(id, OpenMode.ForWrite); ent.Erase(); } tr.Commit(); ed.WriteMessage($"\n已删除图层 '{targetLayer}' 中的 {toDelete.Count} 个对象"); } else { ed.WriteMessage($"\n图层 '{targetLayer}' 中未找到可删除对象"); } } catch (System.Exception ex) { ed.WriteMessage($"\n错误: {ex.Message}"); tr.Abort(); } } } // ================== BST - 梁截面统计命令(增强版) ================== [CommandMethod("BST")] public void BeamStatisticsSortedByLoad() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; Database db = doc.Database; Editor ed = doc.Editor; // 提示用户框选范围 PromptSelectionOptions pso = new PromptSelectionOptions(); pso.MessageForAdding = "\n框选要统计的梁实体和标注文本: "; PromptSelectionResult psr = ed.GetSelection(pso); if (psr.Status != PromptStatus.OK) return; // 增强的梁尺寸正则表达式 - 支持多种格式 Regex sizeRegex = new Regex(@"(\d{2,4})\s*[xX×]\s*(\d{2,4})", RegexOptions.Compiled); // 存储原始尺寸统计结果 Dictionary<string, int> sizeCounts = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase); using (Transaction tr = db.TransactionManager.StartTransaction()) { try { // 处理选中的实体 foreach (ObjectId id in psr.Value.GetObjectIds()) { Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity; if (ent == null) continue; // 处理文本实体 if (ent is DBText text) { string textStr = text.TextString; // 尝试提取尺寸 - 支持多种格式 Match match = sizeRegex.Match(textStr); if (match.Success) { string size = $"{match.Groups[1].Value}x{match.Groups[2].Value}"; AddSizeToDictionary(sizeCounts, size); } // 尝试提取梁编号中的尺寸 else if (IsBeamLabel(textStr)) { Match sizeMatch = ExtractSizeFromBeamLabel(textStr); if (sizeMatch.Success) { string size = $"{sizeMatch.Groups[1].Value}x{sizeMatch.Groups[2].Value}"; AddSizeToDictionary(sizeCounts, size); } } } // 处理多行文本 else if (ent is MText mtext) { string textStr = mtext.Text; MatchCollection matches = sizeRegex.Matches(textStr); foreach (Match match in matches) { string size = $"{match.Groups[1].Value}x{match.Groups[2].Value}"; AddSizeToDictionary(sizeCounts, size); } } } // 如果没有找到尺寸信息 if (sizeCounts.Count == 0) { ed.WriteMessage("\n未找到有效的梁尺寸信息!"); tr.Abort(); return; } // 提示用户输入表格插入点 PromptPointOptions ppo = new PromptPointOptions("\n指定统计表插入点: "); PromptPointResult ppr = ed.GetPoint(ppo); if (ppr.Status != PromptStatus.OK) return; Point3d insertPoint = ppr.Value; // 创建并排序梁尺寸信息列表 List<BeamSizeInfo> sortedBeamInfo = CreateSortedBeamInfo(sizeCounts); // 创建统计表格 CreateBeamStatisticsTable(tr, db, insertPoint, sortedBeamInfo); tr.Commit(); ed.WriteMessage($"\n已创建包含 {sizeCounts.Count} 种梁尺寸的统计表,按线荷载值降序排列"); } catch (System.Exception ex) { ed.WriteMessage($"\n创建表格时出错: {ex.Message}\n{ex.StackTrace}"); tr.Abort(); } } } // ================== 创建统计表(修复版) ================== private void CreateBeamStatisticsTable( Transaction tr, Database db, Point3d insertPoint, List<BeamSizeInfo> beamInfoList) { try { BlockTableRecord btr = (BlockTableRecord)tr.GetObject( db.CurrentSpaceId, OpenMode.ForWrite); // 创建表格对象 Table table = new Table(); table.Position = insertPoint; // 设置表格尺寸(行数 = 标题行 + 表头行 + 数据行 + 汇总行 + 备注行) int dataRows = beamInfoList.Count; int totalRows = 4 + dataRows; // 标题行(0) + 表头行(1) + 数据行(2..n) + 汇总行(n+1) + 备注行(n+2) int columns = 5; table.SetSize(totalRows, columns); table.SetRowHeight(8); // 行高 table.SetColumnWidth(15); // 列宽 // 确保表格样式存在 if (db.Tablestyle == ObjectId.Null) { // 创建默认表格样式 table.TableStyle = CreateDefaultTableStyle(db, tr); } else { table.TableStyle = db.Tablestyle; } table.Layer = "统计表"; table.ColorIndex = 0; // ByLayer // === 设置标题行 === table.Cells[0, 0].Value = "梁截面尺寸统计表(按线荷载排序)"; table.Cells[0, 0].Alignment = CellAlignment.MiddleCenter; table.MergeCells(CellRange.Create(table, 0, 0, 0, columns - 1)); // 合并标题行 table.Rows[0].Height = 15; // 标题行高度 // === 设置表头行 === string[] headers = { "序号", "梁截面尺寸(mm)", "出现数量", "截面面积(㎡)", "梁线荷载(kN/m)" }; for (int col = 0; col < columns; col++) { table.Cells[1, col].Value = headers[col]; table.Cells[1, col].Alignment = CellAlignment.MiddleCenter; table.Cells[1, col].BackgroundColor = Color.FromColorIndex(ColorMethod.ByAci, 5); // 蓝色背景 table.Cells[1, col].TextHeight = 3.5; // 设置文字高度 } // === 填充数据行 === int rowIndex = 2; int sequence = 1; double totalArea = 0; double totalLoad = 0; foreach (BeamSizeInfo info in beamInfoList) { // 确保行索引有效 if (rowIndex >= totalRows) break; // 填充表格数据 table.Cells[rowIndex, 0].Value = sequence.ToString(); // 序号 table.Cells[rowIndex, 1].Value = info.Size; // 尺寸 table.Cells[rowIndex, 2].Value = info.Count.ToString(); // 数量 table.Cells[rowIndex, 3].Value = info.Area.ToString("F4"); // 面积 table.Cells[rowIndex, 4].Value = info.LineLoad.ToString("F2"); // 荷载 // 设置荷载列文本颜色 if (info.LineLoad > 10) // 高荷载用红色 table.Cells[rowIndex, 4].ContentColor = Color.FromColorIndex(ColorMethod.ByAci, 1); else if (info.LineLoad > 5) // 中等荷载用黄色 table.Cells[rowIndex, 4].ContentColor = Color.FromColorIndex(ColorMethod.ByAci, 2); else // 低荷载用绿色 table.Cells[rowIndex, 4].ContentColor = Color.FromColorIndex(ColorMethod.ByAci, 3); // 累计汇总值 totalArea += info.Area * info.Count; totalLoad += info.LineLoad * info.Count; sequence++; rowIndex++; } // === 添加汇总行 === int summaryRow = rowIndex; if (summaryRow < totalRows) { table.Cells[summaryRow, 0].Value = "汇总"; table.Cells[summaryRow, 0].Alignment = CellAlignment.MiddleCenter; table.MergeCells(CellRange.Create(table, summaryRow, 0, summaryRow, 1)); // 合并前两列 table.Cells[summaryRow, 2].Value = beamInfoList.Sum(b => b.Count).ToString(); table.Cells[summaryRow, 3].Value = totalArea.ToString("F4"); table.Cells[summaryRow, 4].Value = totalLoad.ToString("F2"); // 设置汇总行文本颜色 for (int col = 0; col < columns; col++) { table.Cells[summaryRow, col].ContentColor = Color.FromColorIndex(ColorMethod.ByAci, 1); // 红色 } } // === 添加备注行 === int remarkRow = summaryRow + 1; if (remarkRow < totalRows) { table.Cells[remarkRow, 0].Value = "备注:表中线荷载值仅做参考值"; table.Cells[remarkRow, 0].Alignment = CellAlignment.MiddleLeft; table.MergeCells(CellRange.Create(table, remarkRow, 0, remarkRow, columns - 1)); // 合并整行 table.Cells[remarkRow, 0].TextHeight = 6; // 设置较小的字体大小 table.Cells[remarkRow, 0].ContentColor = Color.FromColorIndex(ColorMethod.ByAci, 2); // 绿色 // 设置备注行高度(略低于其他行) table.Rows[remarkRow].Height = 6; } // 添加表格到图形 btr.AppendEntity(table); tr.AddNewlyCreatedDBObject(table, true); } catch (System.Exception ex) { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage($"\n创建表格时出错: {ex.Message}\n{ex.StackTrace}"); } } // ================== 创建默认表格样式 ================== private ObjectId CreateDefaultTableStyle(Database db, Transaction tr) { try { // 获取表格样式字典 DBDictionary styleDict = (DBDictionary)tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForWrite); // 创建新的表格样式 TableStyle tableStyle = new TableStyle(); tableStyle.Name = "Standard"; // 设置标题样式 tableStyle.TitleCellStyle.TextHeight = 5; tableStyle.TitleCellStyle.Alignment = CellAlignment.MiddleCenter; tableStyle.TitleCellStyle.BackgroundColor = Color.FromColorIndex(ColorMethod.ByAci, 1); // 设置表头样式 tableStyle.HeaderCellStyle.TextHeight = 4; tableStyle.HeaderCellStyle.Alignment = CellAlignment.MiddleCenter; tableStyle.HeaderCellStyle.BackgroundColor = Color.FromColorIndex(ColorMethod.ByAci, 5); // 设置数据单元样式 tableStyle.DataCellStyle.TextHeight = 3.5; tableStyle.DataCellStyle.Alignment = CellAlignment.MiddleCenter; // 添加到字典 styleDict.SetAt("Standard", tableStyle); tr.AddNewlyCreatedDBObject(tableStyle, true); return tableStyle.ObjectId; } catch { // 如果创建失败,返回默认样式 return db.Tablestyle; } } // ================== 辅助方法 ================== // 增强轴号识别 private bool IsAxisNumber(string text) { if (string.IsNullOrWhiteSpace(text)) return false; // 支持字母开头的轴号(如"A1", "B2") if (Regex.IsMatch(text, @"^[A-Za-z]\d+$")) return true; // 支持纯数字轴号 if (Regex.IsMatch(text, @"^\d+$")) return true; // 支持带连字符的轴号(如"A-1", "1-A") if (Regex.IsMatch(text, @"^[A-Za-z]-\d+$") || Regex.IsMatch(text, @"^\d+-[A-Za-z]$")) return true; // 支持包含"轴"字的文本(如"1轴", "A轴") if (Regex.IsMatch(text, @"\d+轴") || Regex.IsMatch(text, @"[A-Za-z]轴")) return true; // 支持分数格式轴号(如"1/2") if (Regex.IsMatch(text, @"^\d+/\d+$")) return true; return false; } // 增强梁标签识别 private bool IsBeamLabel(string text) { if (string.IsNullOrWhiteSpace(text)) return false; // 支持常见梁标签格式(如"KL1", "L2", "B3"等) if (Regex.IsMatch(text, @"^[Kk]?[LlBb]\d+")) return true; // 支持带括号的梁标签(如"Lg30(1)") if (Regex.IsMatch(text, @"[Ll][Gg]?\d+$\d+$")) return true; // 支持集中标注格式(如"4-Lg30(1)"") if (Regex.IsMatch(text, @"\d+-[Ll][Gg]?\d+$\d+$")) return true; // 支持梁编号前缀(如"梁L1", "KL-2") if (Regex.IsMatch(text, @"[梁梁][-]?[Ll]\d+") || Regex.IsMatch(text, @"[Kk][Ll][-]?\d+")) return true; return false; } // 增强尺寸提取 private Match ExtractSizeFromBeamLabel(string label) { // 增强匹配模式:支持空格、不同分隔符 Regex sizePattern = new Regex(@"(\d{3,4})\s*[xX×]\s*(\d{3,4})"); return sizePattern.Match(label); } private bool IsBeamDimension(string text) { return !string.IsNullOrWhiteSpace(text) && Regex.IsMatch(text, @"\d{2,4}\s*[×xX]\s*\d{2,4}"); } private bool IsPureBeamDimension(string text) { return !string.IsNullOrWhiteSpace(text) && Regex.IsMatch(text, @"^\d{2,4}\s*[×xX]\s*\d{2,4}$"); } private bool IsBeamEntity(Entity ent) { return ent is Line || ent is Polyline; } private void AddSizeToDictionary(Dictionary<string, int> dict, string size) { if (dict.ContainsKey(size)) { dict[size]++; } else { dict[size] = 1; } } private List<BeamSizeInfo> CreateSortedBeamInfo(Dictionary<string, int> sizeCounts) { List<BeamSizeInfo> beamInfoList = new List<BeamSizeInfo>(); foreach (var kvp in sizeCounts) { string size = kvp.Key; int count = kvp.Value; // 解析尺寸 string[] dimensions = size.Split('x'); if (dimensions.Length != 2) continue; if (!double.TryParse(dimensions[0], out double width)) continue; if (!double.TryParse(dimensions[1], out double height)) continue; // 计算截面面积 (mm² → m²) double area = (width * height) / 1_000_000.0; // 计算线荷载 double lineLoad = area * ConcreteDensity; beamInfoList.Add(new BeamSizeInfo { Size = size, Count = count, Width = width, Height = height, Area = area, LineLoad = lineLoad }); } // 按线荷载值降序排序(最大值排在最前) return beamInfoList.OrderByDescending(b => b.LineLoad).ToList(); } } CS1061“TableStyle”未包含”TitleCellStyle”的定义,并且找不到可接受第一个“TableStyle”类型参数的可访问扩展方法“TitleCellStyle”(是否缺少using 指令或程序集引用?) CS1061“TableStyle”未包含”TitleCellStyle”的定义,并且找不到可接受第一个“TableStyle”类型参数的可访问扩展方法“TitleCellStyle”(是否缺少using 指令或程序集引用?) CS1061“TableStyle"未包含"TitleCellStyle”的定义,并且找不到可接受第一个“TableStyle"类型参数的可访问扩展方法"TitleCellStyle”(是否缺少using 指令或程序集引用?) CS1061“TableStyle"未包含”HeaderCellStyle”的定义,并且找不到可接受第一个“TableStyle"类型参数的可访问扩展方法”HeaderCellStyle"(是否缺少using 指令或程序集引用?) CS1061“TableStyle”未包含“HeaderCellStyle”的定义,并且找不到可接受第一个"TableStyle"类型参数的可访问扩展方法”HeaderCellStyle"(是否缺少using 指令或程序集引用?) CS1061“TableStyle"未包含“HeaderCellStyle”的定义,并且找不到可接受第一个“TableStyle"类型参数的可访问扩展方法”HeaderCellStyle"(是否缺少using 指令或程序集引用?) CS1061“TableStyle"未包含"DataCellStyle”的定义,并且找不到可接受第一个“TableStyle”类型参数的可访问扩展方法“DataCellStyle”(是否缺少using 指令或程序集引用?) CS1061“TableStyle”未包含”DataCellStyle”的定义,并且找不到可接受第一个“TableStyle"类型参数的可访问扩展方法“DataCellStyle”(是否缺少using 指令或程序集引用?)
07-06
修改VBA代码,不要将@Backing(type="int") 误识别为方法Sub ProcessAidlFiles() Dim fso As Object Dim objFolder As Object Dim objFile As Object Dim wb As Workbook Dim ws As Worksheet, summaryWs As Worksheet Dim filePath As String, fileContent As String Dim newWs As Worksheet Dim targetSheetName As String Dim methodStart As Long, methodEnd As Long, endSearch As Long Dim methodName As String, methodLine As String Dim contentStart As Long Dim packagePos As Long Dim summaryRow As Long Set wb = ThisWorkbook Set summaryWs = wb.Sheets("Sheet1") If summaryWs Is Nothing Then Set summaryWs = wb.Sheets.Add summaryWs.Name = "Sheet1" End If filePath = wb.Path If Right(filePath, 1) <> "\" Then filePath = filePath & "\" Set fso = CreateObject("Scripting.FileSystemObject") If Not fso.FolderExists(filePath) Then MsgBox "路径不存在: " & filePath, vbCritical Exit Sub End If Set objFolder = fso.GetFolder(filePath) summaryRow = 5 ' 从D5开始记录方法 ' 清空之前的汇总结果(保留标题) If summaryRow < summaryWs.Rows.Count Then summaryWs.Range("C" & summaryRow & ":D" & summaryWs.Rows.Count).ClearContents End If ' 处理每个aidl文件 For Each objFile In objFolder.Files If LCase(fso.GetExtensionName(objFile.Name)) = "aidl" And _ UCase(Left(objFile.Name, 1)) = "I" Then ' 打开文件读取内容 Set objStream = fso.OpenTextFile(objFile.Path, 1) fileContent = objStream.ReadAll objStream.Close ' 创建新工作表(文件名作为表名) On Error Resume Next targetSheetName = Left(fso.GetBaseName(objFile.Name), 31) & "." & fso.GetExtensionName(objFile.Name) If Not WorksheetExists(targetSheetName) Then Set newWs = wb.Sheets.Add(After:=wb.Sheets(wb.Sheets.Count)) newWs.Name = targetSheetName Else Set newWs = wb.Sheets(targetSheetName) newWs.Cells.Clear End If On Error GoTo 0 ' 处理package行前内容 packagePos = InStr(1, fileContent, "package") If packagePos > 0 Then contentStart = InStr(packagePos, fileContent, vbCrLf) If contentStart = 0 Then contentStart = InStr(packagePos, fileContent, vbLf) If contentStart > 0 Then fileContent = Mid(fileContent, contentStart + 1) Else fileContent = Mid(fileContent, packagePos) End If End If ' 写入处理后的内容到A1 newWs.Range("A1").Value = fileContent ' 提取方法名并记录到Sheet1 methodStart = 1 endSearch = Len(fileContent) Do While methodStart < endSearch ' 查找方法开始位置 methodStart = InStr(methodStart, fileContent, "(") If methodStart = 0 Then Exit Do ' 回溯查找方法名 Dim charPos As Long charPos = methodStart - 1 Do While charPos > 0 Dim currentChar As String currentChar = Mid(fileContent, charPos, 1) If currentChar = " " Or currentChar = vbCr Or currentChar = vbLf Then Exit Do End If charPos = charPos - 1 Loop If charPos > 0 Then methodName = Trim(Mid(fileContent, charPos + 1, methodStart - charPos - 1)) ' 检查方法名有效性 If methodName <> "" And InStr(methodName, " ") = 0 Then ' 查找方法结束位置 methodEnd = InStr(methodStart, fileContent, ";") If methodEnd > 0 Then ' 写入汇总表 summaryWs.Cells(summaryRow, "C").Value = newWs.Name summaryWs.Cells(summaryRow, "D").Value = methodName summaryRow = summaryRow + 1 End If End If End If methodStart = methodStart + 1 Loop End If Next objFile MsgBox "处理完成! 共找到 " & summaryRow - 5 & " 个方法", vbInformation End Sub ' 检查工作表是否存在 Function WorksheetExists(sheetName As String) As Boolean On Error Resume Next WorksheetExists = (Not Sheets(sheetName) Is Nothing) End Function
06-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值