From bfe86db6bfc007a20490a0b6bb2ed57dda864ae9 Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Wed, 31 Dec 2025 18:36:52 +0800 Subject: [PATCH] hx --- WindowsFormsApp6/MainForm.cs | 746 +++++++++++++++++++++++------------ 1 file changed, 483 insertions(+), 263 deletions(-) diff --git a/WindowsFormsApp6/MainForm.cs b/WindowsFormsApp6/MainForm.cs index 5e2bbc0..ae077ef 100644 --- a/WindowsFormsApp6/MainForm.cs +++ b/WindowsFormsApp6/MainForm.cs @@ -172,9 +172,9 @@ namespace WindowsFormsApp6 try { IWorkbook workbook = new XSSFWorkbook(); - CreateForm1Sheet(workbook); - CreateForm2Sheet(workbook); - CreateForm3Sheet(workbook); + + // 创建单个整合的工作表 + CreateIntegratedSheet(workbook); using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) { @@ -189,277 +189,62 @@ namespace WindowsFormsApp6 } } - private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + private void CreateIntegratedSheet(IWorkbook workbook) { - clockTimer?.Stop(); - clockTimer?.Dispose(); - Application.Exit(); - } - - private void CreateForm1Sheet(IWorkbook workbook) - { - ISheet sheet = workbook.CreateSheet("液体吸收时间"); + ISheet sheet = workbook.CreateSheet("吸收性测试报告"); var styles = CreateReportStyles(workbook); - // 获取 Form1 的数据 - var sampleCountField = form1Instance.GetType() + // 获取三个表单的数据 + var sampleCountField1 = form1Instance.GetType() .GetField("currentSampleCount", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - int sampleCount = sampleCountField != null ? (int)sampleCountField.GetValue(form1Instance) : 5; + int sampleCount = sampleCountField1 != null ? (int)sampleCountField1.GetValue(form1Instance) : 5; - var dataTableField = form1Instance.GetType() + var dataTableField1 = form1Instance.GetType() .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - DataTable dataTable = dataTableField?.GetValue(form1Instance) as DataTable; + DataTable dataTable1 = dataTableField1?.GetValue(form1Instance) as DataTable; - if (dataTable == null || dataTable.Rows.Count == 0) - { - // 创建空表格 - CreateEmptySheet(sheet, "液体吸收时间", sampleCount, styles); - return; - } + var dataTableField2 = form2Instance.GetType() + .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + DataTable dataTable2 = dataTableField2?.GetValue(form2Instance) as DataTable; + + var dataTableField3 = form3Instance.GetType() + .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + DataTable dataTable3 = dataTableField3?.GetValue(form3Instance) as DataTable; int currentRow = 0; - // 创建标题行 + // 1. 创建总标题 IRow titleRow = sheet.CreateRow(currentRow++); + titleRow.Height = 800; ICell titleCell = titleRow.CreateCell(0); - titleCell.SetCellValue("液体吸收时间"); + titleCell.SetCellValue("吸收性测试报告"); titleCell.CellStyle = styles.titleStyle; - sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, sampleCount)); - titleRow.Height = 600; + // 为合并区域的所有单元格设置样式(总标题不需要边框,但为了一致性也设置) + for (int i = 1; i <= sampleCount + 5; i++) + { + titleRow.CreateCell(i).CellStyle = styles.titleStyle; + } + sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, sampleCount + 5)); currentRow++; // 空行 - // 创建表头 - IRow headerRow = sheet.CreateRow(currentRow++); - headerRow.Height = 400; - ICell seqCell = headerRow.CreateCell(0); - seqCell.SetCellValue("序号"); - seqCell.CellStyle = styles.headerStyle; - - for (int i = 1; i <= sampleCount; i++) - { - ICell cell = headerRow.CreateCell(i); - cell.SetCellValue($"试样{i}"); - cell.CellStyle = styles.headerStyle; - } - - // 填充数据行 - foreach (DataRow dataRow in dataTable.Rows) - { - string rowName = dataRow["序号"]?.ToString() ?? ""; - if (string.IsNullOrEmpty(rowName)) continue; - - IRow row = sheet.CreateRow(currentRow++); - row.Height = 380; - - ICell nameCell = row.CreateCell(0); - nameCell.SetCellValue(rowName); - nameCell.CellStyle = styles.dataStyle; - - for (int i = 1; i <= sampleCount; i++) - { - ICell cell = row.CreateCell(i); - if (dataTable.Columns.Contains($"试样{i}") && dataRow[$"试样{i}"] != DBNull.Value) - { - if (double.TryParse(dataRow[$"试样{i}"].ToString(), out double value)) - { - cell.SetCellValue(value); - } - } - cell.CellStyle = styles.yellowStyle; - } - } - - // 设置列宽 - sheet.SetColumnWidth(0, 20 * 256); - for (int i = 1; i <= sampleCount; i++) - { - sheet.SetColumnWidth(i, 15 * 256); - } - } - - private void CreateForm2Sheet(IWorkbook workbook) - { - ISheet sheet = workbook.CreateSheet("液体吸收量"); - var styles = CreateReportStyles(workbook); - - // 获取 Form2 的数据 - var sampleCountField = form2Instance.GetType() - .GetField("currentSampleCount", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - int sampleCount = sampleCountField != null ? (int)sampleCountField.GetValue(form2Instance) : 5; - - var dataTableField = form2Instance.GetType() - .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - DataTable dataTable = dataTableField?.GetValue(form2Instance) as DataTable; - - if (dataTable == null || dataTable.Rows.Count == 0) - { - CreateEmptySheet(sheet, "液体吸收量", sampleCount, styles); - return; - } - - int currentRow = 0; - - // 创建标题行 - IRow titleRow = sheet.CreateRow(currentRow++); - ICell titleCell = titleRow.CreateCell(0); - titleCell.SetCellValue("液体吸收量"); - titleCell.CellStyle = styles.titleStyle; - sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, sampleCount)); - titleRow.Height = 600; + // 2. 创建信息输入区域 + CreateInfoSection(sheet, ref currentRow, sampleCount, styles); currentRow++; // 空行 - // 创建表头 - IRow headerRow = sheet.CreateRow(currentRow++); - headerRow.Height = 400; - ICell seqCell = headerRow.CreateCell(0); - seqCell.SetCellValue("序号"); - seqCell.CellStyle = styles.headerStyle; - - for (int i = 1; i <= sampleCount; i++) - { - ICell cell = headerRow.CreateCell(i); - cell.SetCellValue($"试样{i}"); - cell.CellStyle = styles.headerStyle; - } - - // 填充数据行 - foreach (DataRow dataRow in dataTable.Rows) - { - string rowName = dataRow["序号"]?.ToString() ?? ""; - if (string.IsNullOrEmpty(rowName)) continue; - - IRow row = sheet.CreateRow(currentRow++); - row.Height = 380; - - ICell nameCell = row.CreateCell(0); - nameCell.SetCellValue(rowName); - nameCell.CellStyle = styles.dataStyle; - - for (int i = 1; i <= sampleCount; i++) - { - ICell cell = row.CreateCell(i); - if (dataTable.Columns.Contains($"试样{i}") && dataRow[$"试样{i}"] != DBNull.Value) - { - object value = dataRow[$"试样{i}"]; - if (value != null && double.TryParse(value.ToString(), out double numValue)) - { - cell.SetCellValue(numValue); - } - } - cell.CellStyle = styles.yellowStyle; - } - } - - // 设置列宽 - sheet.SetColumnWidth(0, 25 * 256); - for (int i = 1; i <= sampleCount; i++) - { - sheet.SetColumnWidth(i, 18 * 256); - } - } - - private void CreateForm3Sheet(IWorkbook workbook) - { - ISheet sheet = workbook.CreateSheet("液体芯吸速率"); - var styles = CreateReportStyles(workbook); - - // 获取 Form3 的数据 - var sampleCountField = form3Instance.GetType() - .GetField("currentSampleCount", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - int sampleCount = sampleCountField != null ? (int)sampleCountField.GetValue(form3Instance) : 5; - - var dataTableField = form3Instance.GetType() - .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - DataTable dataTable = dataTableField?.GetValue(form3Instance) as DataTable; - - if (dataTable == null || dataTable.Rows.Count == 0) - { - CreateEmptySheet(sheet, "液体芯吸速率", sampleCount, styles); - return; - } - - int currentRow = 0; - - // 创建标题行 - IRow titleRow = sheet.CreateRow(currentRow++); - ICell titleCell = titleRow.CreateCell(0); - titleCell.SetCellValue("液体芯吸速率"); - titleCell.CellStyle = styles.titleStyle; - sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, sampleCount * 3)); - titleRow.Height = 600; + // 3. 创建液体吸收时间部分 + CreateForm1Section(sheet, ref currentRow, sampleCount, dataTable1, styles); currentRow++; // 空行 - // 创建第一级表头(试样1-N) - IRow headerRow1 = sheet.CreateRow(currentRow++); - headerRow1.Height = 400; - - ICell cell0 = headerRow1.CreateCell(0); - cell0.SetCellValue("序号"); - cell0.CellStyle = styles.headerStyle; - sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow, 0, 0)); + // 4. 创建液体吸收量部分 + CreateForm2Section(sheet, ref currentRow, sampleCount, dataTable2, styles); - int colIndex = 1; - for (int i = 1; i <= sampleCount; i++) - { - ICell cell = headerRow1.CreateCell(colIndex); - cell.SetCellValue($"试样{i}"); - cell.CellStyle = styles.headerStyle; - sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, colIndex, colIndex + 2)); - colIndex += 3; - } + currentRow++; // 空行 - // 创建第二级表头(1、2、3) - IRow headerRow2 = sheet.CreateRow(currentRow++); - headerRow2.Height = 400; - - colIndex = 1; - for (int i = 1; i <= sampleCount; i++) - { - for (int j = 1; j <= 3; j++) - { - ICell cell = headerRow2.CreateCell(colIndex++); - cell.SetCellValue(j.ToString()); - cell.CellStyle = styles.headerStyle; - } - } - - // 填充数据行 - foreach (DataRow dataRow in dataTable.Rows) - { - string rowName = dataRow["序号"]?.ToString() ?? ""; - if (string.IsNullOrEmpty(rowName)) continue; - - IRow row = sheet.CreateRow(currentRow++); - row.Height = 380; - - ICell nameCell = row.CreateCell(0); - nameCell.SetCellValue(rowName); - nameCell.CellStyle = styles.dataStyle; - - colIndex = 1; - for (int i = 1; i <= sampleCount; i++) - { - for (int j = 1; j <= 3; j++) - { - ICell cell = row.CreateCell(colIndex++); - string columnName = $"试样{i}_{j}"; - if (dataTable.Columns.Contains(columnName) && dataRow[columnName] != DBNull.Value) - { - if (double.TryParse(dataRow[columnName].ToString(), out double value)) - { - if (Math.Abs(value) >= 0.001) - { - cell.SetCellValue(value); - } - } - } - cell.CellStyle = styles.yellowStyle; - } - } - } + // 5. 创建液体芯吸速率部分 + CreateForm3Section(sheet, ref currentRow, sampleCount, dataTable3, styles); // 设置列宽 sheet.SetColumnWidth(0, 20 * 256); @@ -469,19 +254,120 @@ namespace WindowsFormsApp6 } } - private void CreateEmptySheet(ISheet sheet, string title, int sampleCount, + private void CreateInfoSection(ISheet sheet, ref int currentRow, int sampleCount, (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle) styles) { - // 创建标题行 - IRow titleRow = sheet.CreateRow(0); - ICell titleCell = titleRow.CreateCell(0); - titleCell.SetCellValue(title); - titleCell.CellStyle = styles.titleStyle; - sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, sampleCount)); - titleRow.Height = 600; + // 第一行信息 + IRow infoRow1 = sheet.CreateRow(currentRow++); + infoRow1.Height = 400; - // 创建表头 - IRow headerRow = sheet.CreateRow(2); + // 样品名称 + ICell cell1 = infoRow1.CreateCell(0); + cell1.SetCellValue("样品名称:"); + cell1.CellStyle = styles.dataStyle; + + ICell cell2 = infoRow1.CreateCell(1); + cell2.SetCellValue("手动录入"); + cell2.CellStyle = styles.yellowStyle; + // 为合并区域的所有单元格设置样式 + infoRow1.CreateCell(2).CellStyle = styles.yellowStyle; + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 1, 2)); + + // 物料编码 + ICell cell3 = infoRow1.CreateCell(3); + cell3.SetCellValue("物料编码:"); + cell3.CellStyle = styles.dataStyle; + + ICell cell4 = infoRow1.CreateCell(4); + cell4.SetCellValue("手动录入"); + cell4.CellStyle = styles.yellowStyle; + // 为合并区域的所有单元格设置样式 + infoRow1.CreateCell(5).CellStyle = styles.yellowStyle; + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 4, 5)); + + // 批号 + ICell cell5 = infoRow1.CreateCell(6); + cell5.SetCellValue("批号:"); + cell5.CellStyle = styles.dataStyle; + + ICell cell6 = infoRow1.CreateCell(7); + cell6.SetCellValue("手动录入"); + cell6.CellStyle = styles.yellowStyle; + + // 操作人员 + ICell cell7 = infoRow1.CreateCell(8); + cell7.SetCellValue("操作人员:"); + cell7.CellStyle = styles.dataStyle; + + ICell cell8 = infoRow1.CreateCell(9); + cell8.SetCellValue("手动录入"); + cell8.CellStyle = styles.yellowStyle; + + // 第二行信息 + IRow infoRow2 = sheet.CreateRow(currentRow++); + infoRow2.Height = 400; + + // 测试时间 + ICell cell21 = infoRow2.CreateCell(0); + cell21.SetCellValue("测试时间:"); + cell21.CellStyle = styles.dataStyle; + + ICell cell22 = infoRow2.CreateCell(1); + cell22.SetCellValue("系统检测时间"); + cell22.CellStyle = styles.yellowStyle; + // 为合并区域的所有单元格设置样式 + infoRow2.CreateCell(2).CellStyle = styles.yellowStyle; + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 1, 2)); + + // 仪器 + ICell cell23 = infoRow2.CreateCell(3); + cell23.SetCellValue("仪器:"); + cell23.CellStyle = styles.dataStyle; + + ICell cell24 = infoRow2.CreateCell(4); + cell24.SetCellValue("厂家仪器名称"); + cell24.CellStyle = styles.yellowStyle; + // 为合并区域的所有单元格设置样式 + infoRow2.CreateCell(5).CellStyle = styles.yellowStyle; + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 4, 5)); + + // 设备编号 + ICell cell25 = infoRow2.CreateCell(6); + cell25.SetCellValue("设备编号:"); + cell25.CellStyle = styles.dataStyle; + + ICell cell26 = infoRow2.CreateCell(7); + cell26.SetCellValue("手动录入"); + cell26.CellStyle = styles.yellowStyle; + + // 数据文件 + ICell cell27 = infoRow2.CreateCell(8); + cell27.SetCellValue("数据文件:"); + cell27.CellStyle = styles.dataStyle; + + ICell cell28 = infoRow2.CreateCell(9); + cell28.SetCellValue("(报告保存路径)"); + cell28.CellStyle = styles.yellowStyle; + } + + private void CreateForm1Section(ISheet sheet, ref int currentRow, int sampleCount, DataTable dataTable, + (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle) styles) + { + // 子标题 + IRow subtitleRow = sheet.CreateRow(currentRow++); + subtitleRow.Height = 500; + ICell subtitleCell = subtitleRow.CreateCell(0); + subtitleCell.SetCellValue("液体吸收时间"); + subtitleCell.CellStyle = styles.headerStyle; + // 为合并区域的所有单元格设置样式 + for (int i = 1; i <= sampleCount; i++) + { + subtitleRow.CreateCell(i).CellStyle = styles.headerStyle; + } + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 0, sampleCount)); + + // 表头 + IRow headerRow = sheet.CreateRow(currentRow++); headerRow.Height = 400; ICell seqCell = headerRow.CreateCell(0); seqCell.SetCellValue("序号"); @@ -494,12 +380,346 @@ namespace WindowsFormsApp6 cell.CellStyle = styles.headerStyle; } - // 设置列宽 - sheet.SetColumnWidth(0, 20 * 256); + ICell noteCell = headerRow.CreateCell(sampleCount + 1); + noteCell.SetCellValue("根据样品个数进行选填"); + noteCell.CellStyle = styles.headerStyle; + + // 数据行 + if (dataTable != null && dataTable.Rows.Count > 0) + { + foreach (DataRow dataRow in dataTable.Rows) + { + string rowName = dataRow["序号"]?.ToString() ?? ""; + if (string.IsNullOrEmpty(rowName)) continue; + + IRow row = sheet.CreateRow(currentRow++); + row.Height = 380; + + ICell nameCell = row.CreateCell(0); + nameCell.SetCellValue(rowName); + nameCell.CellStyle = styles.dataStyle; + + for (int i = 1; i <= sampleCount; i++) + { + ICell cell = row.CreateCell(i); + if (dataTable.Columns.Contains($"试样{i}") && dataRow[$"试样{i}"] != DBNull.Value) + { + if (double.TryParse(dataRow[$"试样{i}"].ToString(), out double value)) + { + cell.SetCellValue(value); + } + else + { + cell.SetCellValue("系统读数"); + } + } + else + { + cell.SetCellValue("系统读数"); + } + cell.CellStyle = styles.yellowStyle; + } + + // 如果是平均时间行,添加"系统计算" + if (rowName.Contains("平均")) + { + ICell calcCell = row.CreateCell(sampleCount + 1); + calcCell.SetCellValue("系统计算"); + calcCell.CellStyle = styles.yellowStyle; + } + } + } + } + + private void CreateForm2Section(ISheet sheet, ref int currentRow, int sampleCount, DataTable dataTable, + (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle) styles) + { + // 子标题 + IRow subtitleRow = sheet.CreateRow(currentRow++); + subtitleRow.Height = 500; + ICell subtitleCell = subtitleRow.CreateCell(0); + subtitleCell.SetCellValue("液体吸收量"); + subtitleCell.CellStyle = styles.headerStyle; + // 为合并区域的所有单元格设置样式 + for (int i = 1; i <= sampleCount + 3; i++) + { + subtitleRow.CreateCell(i).CellStyle = styles.headerStyle; + } + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 0, sampleCount + 3)); + + // 第一行表头(浸润时间、系统读数等) + IRow headerRow1 = sheet.CreateRow(currentRow); + headerRow1.Height = 400; + ICell seqCell1 = headerRow1.CreateCell(0); + seqCell1.SetCellValue("序号"); + seqCell1.CellStyle = styles.headerStyle; + + ICell timeCell = headerRow1.CreateCell(1); + timeCell.SetCellValue("浸润时间"); + timeCell.CellStyle = styles.headerStyle; + + ICell readCell = headerRow1.CreateCell(2); + readCell.SetCellValue("系统读数"); + readCell.CellStyle = styles.headerStyle; + + ICell hangCell = headerRow1.CreateCell(3); + hangCell.SetCellValue("悬挂时间"); + hangCell.CellStyle = styles.headerStyle; + + ICell readCell2 = headerRow1.CreateCell(4); + readCell2.SetCellValue("系统读数"); + readCell2.CellStyle = styles.headerStyle; + + ICell speedCell = headerRow1.CreateCell(5); + speedCell.SetCellValue("运行速度"); + speedCell.CellStyle = styles.headerStyle; + + ICell readCell3 = headerRow1.CreateCell(6); + readCell3.SetCellValue("系统读数"); + readCell3.CellStyle = styles.headerStyle; + + ICell noteCell1 = headerRow1.CreateCell(sampleCount + 1); + noteCell1.SetCellValue("根据样品个数进行选填"); + noteCell1.CellStyle = styles.headerStyle; + + currentRow++; + + // 第二行表头(试样1-5) + IRow headerRow2 = sheet.CreateRow(currentRow++); + headerRow2.Height = 400; + + // 序号列在第二行也需要创建并设置样式(用于合并) + headerRow2.CreateCell(0).CellStyle = styles.headerStyle; + for (int i = 1; i <= sampleCount; i++) { - sheet.SetColumnWidth(i, 15 * 256); + ICell cell = headerRow2.CreateCell(i); + cell.SetCellValue($"试样{i}"); + cell.CellStyle = styles.headerStyle; } + + // 合并序号列(跨两行) + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 2, currentRow - 1, 0, 0)); + + // 数据行 + if (dataTable != null && dataTable.Rows.Count > 0) + { + foreach (DataRow dataRow in dataTable.Rows) + { + string rowName = dataRow["序号"]?.ToString() ?? ""; + if (string.IsNullOrEmpty(rowName)) continue; + + IRow row = sheet.CreateRow(currentRow++); + row.Height = 380; + + ICell nameCell = row.CreateCell(0); + nameCell.SetCellValue(rowName); + nameCell.CellStyle = styles.dataStyle; + + for (int i = 1; i <= sampleCount; i++) + { + ICell cell = row.CreateCell(i); + if (dataTable.Columns.Contains($"试样{i}") && dataRow[$"试样{i}"] != DBNull.Value) + { + object value = dataRow[$"试样{i}"]; + if (value != null && double.TryParse(value.ToString(), out double numValue)) + { + cell.SetCellValue(numValue); + } + else + { + cell.SetCellValue("系统读数"); + } + } + else + { + cell.SetCellValue("系统读数"); + } + cell.CellStyle = styles.yellowStyle; + } + } + } + + // 添加平均值和最大值行的说明 + if (dataTable != null && dataTable.Rows.Count > 0) + { + // 查找平均值行 + for (int i = 0; i < dataTable.Rows.Count; i++) + { + string rowName = dataTable.Rows[i]["序号"]?.ToString() ?? ""; + if (rowName.Contains("平均")) + { + int avgRowIndex = currentRow - (dataTable.Rows.Count - i); + IRow avgExcelRow = sheet.GetRow(avgRowIndex); + if (avgExcelRow != null) + { + ICell calcCell = avgExcelRow.CreateCell(sampleCount + 1); + calcCell.SetCellValue("系统根据多少组试样,计算多少组的标准偏差"); + calcCell.CellStyle = styles.yellowStyle; + // 为合并区域的所有单元格设置样式 + avgExcelRow.CreateCell(sampleCount + 2).CellStyle = styles.yellowStyle; + avgExcelRow.CreateCell(sampleCount + 3).CellStyle = styles.yellowStyle; + sheet.AddMergedRegion(new CellRangeAddress(avgRowIndex, avgRowIndex, sampleCount + 1, sampleCount + 3)); + } + break; + } + } + + // 查找最大值行 + for (int i = 0; i < dataTable.Rows.Count; i++) + { + string rowName = dataTable.Rows[i]["序号"]?.ToString() ?? ""; + if (rowName.Contains("最大")) + { + int maxRowIndex = currentRow - (dataTable.Rows.Count - i); + IRow maxExcelRow = sheet.GetRow(maxRowIndex); + if (maxExcelRow != null) + { + ICell calcCell = maxExcelRow.CreateCell(sampleCount + 1); + calcCell.SetCellValue("系统计算"); + calcCell.CellStyle = styles.yellowStyle; + } + break; + } + } + } + } + + private void CreateForm3Section(ISheet sheet, ref int currentRow, int sampleCount, DataTable dataTable, + (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle) styles) + { + // 子标题 + IRow subtitleRow = sheet.CreateRow(currentRow++); + subtitleRow.Height = 500; + ICell subtitleCell = subtitleRow.CreateCell(0); + subtitleCell.SetCellValue("液体芯吸速率"); + subtitleCell.CellStyle = styles.headerStyle; + // 为合并区域的所有单元格设置样式 + for (int i = 1; i <= sampleCount * 3; i++) + { + subtitleRow.CreateCell(i).CellStyle = styles.headerStyle; + } + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow - 1, 0, sampleCount * 3)); + + // 第一行表头(纵向/横向) + IRow headerRow1 = sheet.CreateRow(currentRow); + headerRow1.Height = 400; + ICell seqCell1 = headerRow1.CreateCell(0); + seqCell1.SetCellValue("序号"); + seqCell1.CellStyle = styles.headerStyle; + + ICell dirCell = headerRow1.CreateCell(1); + dirCell.SetCellValue("纵向/横向(选择按钮)"); + dirCell.CellStyle = styles.headerStyle; + // 为合并区域的所有单元格设置样式 + for (int i = 2; i <= sampleCount * 3; i++) + { + headerRow1.CreateCell(i).CellStyle = styles.headerStyle; + } + sheet.AddMergedRegion(new CellRangeAddress(currentRow, currentRow, 1, sampleCount * 3)); + + currentRow++; + + // 第二行表头(试样1-N,每个3列) + IRow headerRow2 = sheet.CreateRow(currentRow); + headerRow2.Height = 400; + + // 序号列在第二行也需要创建并设置样式(用于合并) + headerRow2.CreateCell(0).CellStyle = styles.headerStyle; + + int colIndex = 1; + for (int i = 1; i <= sampleCount; i++) + { + ICell cell = headerRow2.CreateCell(colIndex); + cell.SetCellValue($"试样{i}"); + cell.CellStyle = styles.headerStyle; + // 为合并区域的所有单元格设置样式 + headerRow2.CreateCell(colIndex + 1).CellStyle = styles.headerStyle; + headerRow2.CreateCell(colIndex + 2).CellStyle = styles.headerStyle; + sheet.AddMergedRegion(new CellRangeAddress(currentRow, currentRow, colIndex, colIndex + 2)); + colIndex += 3; + } + + // 合并序号列(跨两行) + sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow, 0, 0)); + + currentRow++; + + // 第三行表头(1、2、3) + IRow headerRow3 = sheet.CreateRow(currentRow++); + headerRow3.Height = 400; + + colIndex = 1; + for (int i = 1; i <= sampleCount; i++) + { + for (int j = 1; j <= 3; j++) + { + ICell cell = headerRow3.CreateCell(colIndex++); + cell.SetCellValue(j.ToString()); + cell.CellStyle = styles.headerStyle; + } + } + + // 数据行 + if (dataTable != null && dataTable.Rows.Count > 0) + { + foreach (DataRow dataRow in dataTable.Rows) + { + string rowName = dataRow["序号"]?.ToString() ?? ""; + if (string.IsNullOrEmpty(rowName)) continue; + + IRow row = sheet.CreateRow(currentRow++); + row.Height = 380; + + ICell nameCell = row.CreateCell(0); + nameCell.SetCellValue(rowName); + nameCell.CellStyle = styles.dataStyle; + + colIndex = 1; + for (int i = 1; i <= sampleCount; i++) + { + for (int j = 1; j <= 3; j++) + { + ICell cell = row.CreateCell(colIndex++); + string columnName = $"试样{i}_{j}"; + + if (dataTable.Columns.Contains(columnName) && dataRow[columnName] != DBNull.Value) + { + if (double.TryParse(dataRow[columnName].ToString(), out double value)) + { + if (Math.Abs(value) >= 0.001) + { + cell.SetCellValue(value); + } + else + { + // 所有空数据都显示为空白 + cell.SetCellValue(""); + } + } + else + { + // 所有空数据都显示为空白 + cell.SetCellValue(""); + } + } + else + { + // 所有空数据都显示为空白 + cell.SetCellValue(""); + } + cell.CellStyle = styles.yellowStyle; + } + } + } + } + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + clockTimer?.Stop(); + clockTimer?.Dispose(); + Application.Exit(); } private (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle)