From b1338a3f03ae5de0e4ade8b271b5654c0392c8b8 Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Mon, 5 Jan 2026 17:17:58 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WindowsFormsApp6/Form1.cs | 283 ++++++++++++++++++++++++++++++-------- WindowsFormsApp6/Form2.cs | 255 +++++++++++++++++++++++++++------- 2 files changed, 428 insertions(+), 110 deletions(-) diff --git a/WindowsFormsApp6/Form1.cs b/WindowsFormsApp6/Form1.cs index 90f7efc..4f12493 100644 --- a/WindowsFormsApp6/Form1.cs +++ b/WindowsFormsApp6/Form1.cs @@ -321,8 +321,14 @@ namespace WindowsFormsApp6 /// private void RemoveAverageRows() { - var avgRows = sampleDataTable.Select($"序号 = '{AVG_ROW_LABEL}'"); - foreach (var row in avgRows) + var avgRows1 = sampleDataTable.Select($"序号 = '平均时间(s)试样1-5'"); + var avgRows2 = sampleDataTable.Select($"序号 = '平均时间(s)试样6-10'"); + + foreach (var row in avgRows1) + { + sampleDataTable.Rows.Remove(row); + } + foreach (var row in avgRows2) { sampleDataTable.Rows.Remove(row); } @@ -415,38 +421,96 @@ namespace WindowsFormsApp6 /// private void UpdateAverageRow(double[] averages) { - var avgRows = sampleDataTable.Select($"序号 = '{AVG_ROW_LABEL}'"); + // 移除所有平均值行 + var avgRows1 = sampleDataTable.Select($"序号 = '平均时间(s)试样1-5'"); + var avgRows2 = sampleDataTable.Select($"序号 = '平均时间(s)试样6-10'"); - // 计算总平均值 - double overallAvg = CalculateOverallAverage(); - - if (avgRows.Length == 0) + foreach (var row in avgRows1) { - // 添加新的平均值行 - DataRow avgRow = sampleDataTable.NewRow(); - avgRow["序号"] = AVG_ROW_LABEL; - - // 只在第一列显示总平均值 - avgRow["试样1"] = overallAvg; - - // 其他列设置为空 - for (int i = 2; i <= currentSampleCount; i++) - { - avgRow[$"试样{i}"] = DBNull.Value; - } - - sampleDataTable.Rows.Add(avgRow); + sampleDataTable.Rows.Remove(row); } - else + foreach (var row in avgRows2) { - // 更新现有平均值行 - avgRows[0]["试样1"] = overallAvg; + sampleDataTable.Rows.Remove(row); + } + + // 获取所有时间行数据 + var timeRows = sampleDataTable.AsEnumerable() + .Where(r => r.Field("序号") == TIME_ROW_LABEL); + + if (!timeRows.Any()) + return; + + // 计算试样1-5的平均值 + int group1Count = Math.Min(5, currentSampleCount); + if (group1Count > 0) + { + double sum1 = 0; + int count1 = 0; + + foreach (var row in timeRows) + { + for (int i = 1; i <= group1Count; i++) + { + sum1 += row.Field($"试样{i}"); + count1++; + } + } + + double avg1 = count1 > 0 ? sum1 / count1 : 0; + + // 添加试样1-5平均值行 + DataRow avgRow1 = sampleDataTable.NewRow(); + avgRow1["序号"] = "平均时间(s)试样1-5"; + avgRow1["试样1"] = avg1; // 其他列设置为空 for (int i = 2; i <= currentSampleCount; i++) { - avgRows[0][$"试样{i}"] = DBNull.Value; + avgRow1[$"试样{i}"] = DBNull.Value; } + + sampleDataTable.Rows.Add(avgRow1); + } + + // 计算试样6-10的平均值(仅当试样数量>5时) + if (currentSampleCount > 5) + { + int group2Count = Math.Min(5, currentSampleCount - 5); + double sum2 = 0; + int count2 = 0; + + foreach (var row in timeRows) + { + for (int i = 6; i <= 5 + group2Count; i++) + { + sum2 += row.Field($"试样{i}"); + count2++; + } + } + + double avg2 = count2 > 0 ? sum2 / count2 : 0; + + // 添加试样6-10平均值行 + DataRow avgRow2 = sampleDataTable.NewRow(); + avgRow2["序号"] = "平均时间(s)试样6-10"; + + // 前5列为空 + for (int i = 1; i <= 5; i++) + { + avgRow2[$"试样{i}"] = DBNull.Value; + } + + // 第6列显示平均值 + avgRow2["试样6"] = avg2; + + // 其他列为空 + for (int i = 7; i <= currentSampleCount; i++) + { + avgRow2[$"试样{i}"] = DBNull.Value; + } + + sampleDataTable.Rows.Add(avgRow2); } } @@ -596,31 +660,82 @@ namespace WindowsFormsApp6 private void AddAverageRow(ISheet sheet, ICellStyle avgStyle) { var dataRows = sampleDataTable.AsEnumerable() - .Where(r => r.Field("序号") != AVG_ROW_LABEL); + .Where(r => r.Field("序号") != "平均时间(s)试样1-5" && + r.Field("序号") != "平均时间(s)试样6-10"); if (!dataRows.Any()) return; int rowIndex = sheet.LastRowNum + 1; - IRow avgRow = sheet.CreateRow(rowIndex); - // 序号列 - ICell labelCell = avgRow.CreateCell(0); - labelCell.SetCellValue(AVG_ROW_LABEL); - labelCell.CellStyle = avgStyle; - - // 计算总平均值 - double overallAvg = CalculateOverallAverage(); - - // 在第一个试样列显示总平均值 - ICell avgCell = avgRow.CreateCell(1); - avgCell.SetCellValue(overallAvg); - avgCell.CellStyle = avgStyle; - - // 合并所有试样列 - if (currentSampleCount > 1) + // 计算试样1-5的平均值 + int group1Count = Math.Min(5, currentSampleCount); + if (group1Count > 0) { - sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 1, currentSampleCount)); + double sum1 = 0; + int count1 = 0; + + foreach (var row in dataRows) + { + for (int i = 1; i <= group1Count; i++) + { + sum1 += row.Field($"试样{i}"); + count1++; + } + } + + double avg1 = count1 > 0 ? sum1 / count1 : 0; + + // 添加试样1-5平均值行 + IRow avgRow1 = sheet.CreateRow(rowIndex++); + ICell labelCell1 = avgRow1.CreateCell(0); + labelCell1.SetCellValue("平均时间(s)试样1-5"); + labelCell1.CellStyle = avgStyle; + + ICell avgCell1 = avgRow1.CreateCell(1); + avgCell1.SetCellValue(avg1); + avgCell1.CellStyle = avgStyle; + + // 合并试样1-5列 + if (group1Count > 1) + { + sheet.AddMergedRegion(new CellRangeAddress(rowIndex - 1, rowIndex - 1, 1, group1Count)); + } + } + + // 计算试样6-10的平均值(仅当试样数量>5时) + if (currentSampleCount > 5) + { + int group2Count = Math.Min(5, currentSampleCount - 5); + double sum2 = 0; + int count2 = 0; + + foreach (var row in dataRows) + { + for (int i = 6; i <= 5 + group2Count; i++) + { + sum2 += row.Field($"试样{i}"); + count2++; + } + } + + double avg2 = count2 > 0 ? sum2 / count2 : 0; + + // 添加试样6-10平均值行 + IRow avgRow2 = sheet.CreateRow(rowIndex); + ICell labelCell2 = avgRow2.CreateCell(0); + labelCell2.SetCellValue("平均时间(s)试样6-10"); + labelCell2.CellStyle = avgStyle; + + ICell avgCell2 = avgRow2.CreateCell(6); + avgCell2.SetCellValue(avg2); + avgCell2.CellStyle = avgStyle; + + // 合并试样6-10列 + if (group2Count > 1) + { + sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 6, 5 + group2Count)); + } } } @@ -795,22 +910,74 @@ namespace WindowsFormsApp6 } } - // 平均时间行 - IRow avgRow = sheet.CreateRow(rowIndex); - ICell avgLabelCell = avgRow.CreateCell(0); - avgLabelCell.SetCellValue(AVG_ROW_LABEL); - avgLabelCell.CellStyle = dataStyle; - - // 计算并显示总平均值 - double overallAvg = CalculateOverallAverage(); - ICell avgCell = avgRow.CreateCell(1); - avgCell.SetCellValue(overallAvg); - avgCell.CellStyle = yellowStyle; - - // 合并所有试样列 - if (currentSampleCount > 1) + // 计算试样1-5的平均值 + int group1Count = Math.Min(5, currentSampleCount); + if (group1Count > 0 && timeRows.Any()) { - sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 1, currentSampleCount)); + double sum1 = 0; + int count1 = 0; + + foreach (var row in timeRows) + { + for (int i = 1; i <= group1Count; i++) + { + sum1 += row.Field($"试样{i}"); + count1++; + } + } + + double avg1 = count1 > 0 ? sum1 / count1 : 0; + + // 添加试样1-5平均值行 + IRow avgRow1 = sheet.CreateRow(rowIndex++); + ICell avgLabelCell1 = avgRow1.CreateCell(0); + avgLabelCell1.SetCellValue("平均时间(s)试样1-5"); + avgLabelCell1.CellStyle = dataStyle; + + ICell avgCell1 = avgRow1.CreateCell(1); + avgCell1.SetCellValue(avg1); + avgCell1.CellStyle = yellowStyle; + + // 合并试样1-5列 + if (group1Count > 1) + { + sheet.AddMergedRegion(new CellRangeAddress(rowIndex - 1, rowIndex - 1, 1, group1Count)); + } + } + + // 计算试样6-10的平均值(仅当试样数量>5时) + if (currentSampleCount > 5 && timeRows.Any()) + { + int group2Count = Math.Min(5, currentSampleCount - 5); + double sum2 = 0; + int count2 = 0; + + foreach (var row in timeRows) + { + for (int i = 6; i <= 5 + group2Count; i++) + { + sum2 += row.Field($"试样{i}"); + count2++; + } + } + + double avg2 = count2 > 0 ? sum2 / count2 : 0; + + // 添加试样6-10平均值行 + IRow avgRow2 = sheet.CreateRow(rowIndex); + ICell avgLabelCell2 = avgRow2.CreateCell(0); + avgLabelCell2.SetCellValue("平均时间(s)试样6-10"); + avgLabelCell2.CellStyle = dataStyle; + + ICell avgCell2 = avgRow2.CreateCell(6); + avgCell2.SetCellValue(avg2); + avgCell2.CellStyle = yellowStyle; + + // 合并试样6-10列 + if (group2Count > 1) + { + sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 6, 5 + group2Count)); + } } } diff --git a/WindowsFormsApp6/Form2.cs b/WindowsFormsApp6/Form2.cs index 06c8aa4..085aad7 100644 --- a/WindowsFormsApp6/Form2.cs +++ b/WindowsFormsApp6/Form2.cs @@ -306,7 +306,13 @@ namespace WindowsFormsApp6 r.Field("序号") == ROW_RUN_SPEED || r.Field("序号") == ROW_AVG_ABSORPTION || r.Field("序号") == ROW_MAX_ABSORPTION || - r.Field("序号") == ROW_STD_DEVIATION) + r.Field("序号") == ROW_STD_DEVIATION || + r.Field("序号") == "液体吸收量平均值(%)试样1-5" || + r.Field("序号") == "液体吸收量平均值(%)试样6-10" || + r.Field("序号") == "液体吸收量最大值(%)试样1-5" || + r.Field("序号") == "液体吸收量最大值(%)试样6-10" || + r.Field("序号") == "标准偏差试样1-5" || + r.Field("序号") == "标准偏差试样6-10") .ToList(); foreach (var row in rowsToRemove) @@ -447,54 +453,138 @@ namespace WindowsFormsApp6 } sampleDataTable.Rows.Add(runSpeedRow); - // 7. 液体吸收量平均值行 - DataRow avgRow = sampleDataTable.NewRow(); - avgRow["序号"] = ROW_AVG_ABSORPTION; + // 7. 液体吸收量平均值行(试样1-5) + DataRow avgRow1 = sampleDataTable.NewRow(); + avgRow1["序号"] = "液体吸收量平均值(%)试样1-5"; - // 根据实际试样数量计算平均值 - double avgAbsorption = count > 0 ? absorptions.Take(count).Average() : 0; - - // 第1列显示平均值 - avgRow["试样1"] = avgAbsorption; + // 计算试样1-5的平均值 + int group1Count = Math.Min(5, count); + if (group1Count > 0) + { + double avgAbsorption1 = absorptions.Take(group1Count).Average(); + avgRow1["试样1"] = avgAbsorption1; + } // 其他列为空 for (int i = 2; i <= count; i++) { - avgRow[$"试样{i}"] = DBNull.Value; + avgRow1[$"试样{i}"] = DBNull.Value; } - sampleDataTable.Rows.Add(avgRow); + sampleDataTable.Rows.Add(avgRow1); - // 8. 液体吸收量最大值行 - DataRow maxRow = sampleDataTable.NewRow(); - maxRow["序号"] = ROW_MAX_ABSORPTION; - double maxAbsorption = absorptions.Max(); - - // 第1列显示最大值 - maxRow["试样1"] = maxAbsorption; - - // 其他列为空 - for (int i = 2; i <= count; i++) + // 8. 液体吸收量平均值行(试样6-10)- 仅当试样数量>5时添加 + if (count > 5) { - maxRow[$"试样{i}"] = DBNull.Value; + DataRow avgRow2 = sampleDataTable.NewRow(); + avgRow2["序号"] = "液体吸收量平均值(%)试样6-10"; + + // 计算试样6-10的平均值 + int group2Count = Math.Min(5, count - 5); + if (group2Count > 0) + { + double avgAbsorption2 = absorptions.Skip(5).Take(group2Count).Average(); + avgRow2["试样6"] = avgAbsorption2; + } + + // 其他列为空 + for (int i = 1; i <= 5; i++) + { + avgRow2[$"试样{i}"] = DBNull.Value; + } + for (int i = 7; i <= count; i++) + { + avgRow2[$"试样{i}"] = DBNull.Value; + } + sampleDataTable.Rows.Add(avgRow2); } - sampleDataTable.Rows.Add(maxRow); - // 9. 标准偏差行(最后一行) - DataRow stdDevRow = sampleDataTable.NewRow(); - stdDevRow["序号"] = ROW_STD_DEVIATION; + // 9. 液体吸收量最大值行(试样1-5) + DataRow maxRow1 = sampleDataTable.NewRow(); + maxRow1["序号"] = "液体吸收量最大值(%)试样1-5"; - // 根据实际试样数量计算标准偏差 - double stdDev = count > 1 ? CalculateStandardDeviation(absorptions.Take(count).ToArray()) : 0; - - // 第1列显示标准偏差 - stdDevRow["试样1"] = stdDev; + // 计算试样1-5的最大值 + if (group1Count > 0) + { + double maxAbsorption1 = absorptions.Take(group1Count).Max(); + maxRow1["试样1"] = maxAbsorption1; + } // 其他列为空 for (int i = 2; i <= count; i++) { - stdDevRow[$"试样{i}"] = DBNull.Value; + maxRow1[$"试样{i}"] = DBNull.Value; + } + sampleDataTable.Rows.Add(maxRow1); + + // 10. 液体吸收量最大值行(试样6-10)- 仅当试样数量>5时添加 + if (count > 5) + { + DataRow maxRow2 = sampleDataTable.NewRow(); + maxRow2["序号"] = "液体吸收量最大值(%)试样6-10"; + + // 计算试样6-10的最大值 + int group2Count = Math.Min(5, count - 5); + if (group2Count > 0) + { + double maxAbsorption2 = absorptions.Skip(5).Take(group2Count).Max(); + maxRow2["试样6"] = maxAbsorption2; + } + + // 其他列为空 + for (int i = 1; i <= 5; i++) + { + maxRow2[$"试样{i}"] = DBNull.Value; + } + for (int i = 7; i <= count; i++) + { + maxRow2[$"试样{i}"] = DBNull.Value; + } + sampleDataTable.Rows.Add(maxRow2); + } + + // 11. 标准偏差行(试样1-5) + DataRow stdDevRow1 = sampleDataTable.NewRow(); + stdDevRow1["序号"] = "标准偏差试样1-5"; + + // 计算试样1-5的标准偏差 + if (group1Count > 1) + { + double stdDev1 = CalculateStandardDeviation(absorptions.Take(group1Count).ToArray()); + stdDevRow1["试样1"] = stdDev1; + } + + // 其他列为空 + for (int i = 2; i <= count; i++) + { + stdDevRow1[$"试样{i}"] = DBNull.Value; + } + sampleDataTable.Rows.Add(stdDevRow1); + + // 12. 标准偏差行(试样6-10)- 仅当试样数量>5时添加 + if (count > 5) + { + DataRow stdDevRow2 = sampleDataTable.NewRow(); + stdDevRow2["序号"] = "标准偏差试样6-10"; + + // 计算试样6-10的标准偏差 + int group2Count = Math.Min(5, count - 5); + if (group2Count > 1) + { + double stdDev2 = CalculateStandardDeviation(absorptions.Skip(5).Take(group2Count).ToArray()); + stdDevRow2["试样6"] = stdDev2; + } + + // 其他列为空 + for (int i = 1; i <= 5; i++) + { + stdDevRow2[$"试样{i}"] = DBNull.Value; + } + for (int i = 7; i <= count; i++) + { + stdDevRow2[$"试样{i}"] = DBNull.Value; + } + sampleDataTable.Rows.Add(stdDevRow2); } - sampleDataTable.Rows.Add(stdDevRow); // 刷新界面 RefreshDataGridView(); @@ -668,33 +758,94 @@ namespace WindowsFormsApp6 foreach (DataRow dataRow in sampleDataTable.Rows) { - IRow row = sheet.CreateRow(rowIndex++); string rowName = dataRow["序号"].ToString(); - - // 序号列 - ICell nameCell = row.CreateCell(0); - nameCell.SetCellValue(rowName); - nameCell.CellStyle = dataStyle; - - // 数据列 - for (int i = 1; i <= currentSampleCount; i++) + + // 处理试样1-5分组行的合并单元格 + if (rowName == "液体吸收量平均值(%)试样1-5" || + rowName == "液体吸收量最大值(%)试样1-5" || + rowName == "标准偏差试样1-5") { - ICell cell = row.CreateCell(i); - var value = dataRow[$"试样{i}"]; - + IRow row = sheet.CreateRow(rowIndex++); + + // 序号列 + ICell nameCell = row.CreateCell(0); + nameCell.SetCellValue(rowName); + nameCell.CellStyle = dataStyle; + + // 获取试样1的值 + var value = dataRow["试样1"]; if (value != null && value != DBNull.Value) { - if (double.TryParse(value.ToString(), out double numValue)) + ICell cell = row.CreateCell(1); + cell.SetCellValue(Convert.ToDouble(value)); + cell.CellStyle = yellowStyle; + + // 合并试样1-5列 + int group1Count = Math.Min(5, currentSampleCount); + if (group1Count > 1) { - cell.SetCellValue(numValue); - } - else - { - cell.SetCellValue(value.ToString()); + sheet.AddMergedRegion(new CellRangeAddress(rowIndex - 1, rowIndex - 1, 1, group1Count)); } } + } + // 处理试样6-10分组行的合并单元格 + else if (rowName == "液体吸收量平均值(%)试样6-10" || + rowName == "液体吸收量最大值(%)试样6-10" || + rowName == "标准偏差试样6-10") + { + IRow row = sheet.CreateRow(rowIndex++); + + // 序号列 + ICell nameCell = row.CreateCell(0); + nameCell.SetCellValue(rowName); + nameCell.CellStyle = dataStyle; + + // 获取试样6的值 + var value = dataRow["试样6"]; + if (value != null && value != DBNull.Value) + { + ICell cell = row.CreateCell(6); + cell.SetCellValue(Convert.ToDouble(value)); + cell.CellStyle = yellowStyle; + + // 合并试样6-10列 + int group2Count = Math.Min(5, currentSampleCount - 5); + if (group2Count > 1) + { + sheet.AddMergedRegion(new CellRangeAddress(rowIndex - 1, rowIndex - 1, 6, 5 + group2Count)); + } + } + } + else + { + // 普通行处理 + IRow row = sheet.CreateRow(rowIndex++); - cell.CellStyle = yellowStyle; + // 序号列 + ICell nameCell = row.CreateCell(0); + nameCell.SetCellValue(rowName); + nameCell.CellStyle = dataStyle; + + // 数据列 + for (int i = 1; i <= currentSampleCount; i++) + { + ICell cell = row.CreateCell(i); + var value = dataRow[$"试样{i}"]; + + if (value != null && value != DBNull.Value) + { + if (double.TryParse(value.ToString(), out double numValue)) + { + cell.SetCellValue(numValue); + } + else + { + cell.SetCellValue(value.ToString()); + } + } + + cell.CellStyle = yellowStyle; + } } } }