This commit is contained in:
GukSang.Jin
2025-12-31 18:36:52 +08:00
parent c8d381955b
commit bfe86db6bf

View File

@@ -172,9 +172,9 @@ namespace WindowsFormsApp6
try try
{ {
IWorkbook workbook = new XSSFWorkbook(); IWorkbook workbook = new XSSFWorkbook();
CreateForm1Sheet(workbook);
CreateForm2Sheet(workbook); // 创建单个整合的工作表
CreateForm3Sheet(workbook); CreateIntegratedSheet(workbook);
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)) 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(); ISheet sheet = workbook.CreateSheet("吸收性测试报告");
clockTimer?.Dispose();
Application.Exit();
}
private void CreateForm1Sheet(IWorkbook workbook)
{
ISheet sheet = workbook.CreateSheet("液体吸收时间");
var styles = CreateReportStyles(workbook); var styles = CreateReportStyles(workbook);
// 获取 Form1 的数据 // 获取三个表单的数据
var sampleCountField = form1Instance.GetType() var sampleCountField1 = form1Instance.GetType()
.GetField("currentSampleCount", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); .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); .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) var dataTableField2 = form2Instance.GetType()
{ .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
// 创建空表格 DataTable dataTable2 = dataTableField2?.GetValue(form2Instance) as DataTable;
CreateEmptySheet(sheet, "液体吸收时间", sampleCount, styles);
return; var dataTableField3 = form3Instance.GetType()
} .GetField("sampleDataTable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
DataTable dataTable3 = dataTableField3?.GetValue(form3Instance) as DataTable;
int currentRow = 0; int currentRow = 0;
// 创建标题 // 1. 创建标题
IRow titleRow = sheet.CreateRow(currentRow++); IRow titleRow = sheet.CreateRow(currentRow++);
titleRow.Height = 800;
ICell titleCell = titleRow.CreateCell(0); ICell titleCell = titleRow.CreateCell(0);
titleCell.SetCellValue("液体吸收时间"); titleCell.SetCellValue("吸收性测试报告");
titleCell.CellStyle = styles.titleStyle; 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++; // 空行 currentRow++; // 空行
// 创建表头 // 2. 创建信息输入区域
IRow headerRow = sheet.CreateRow(currentRow++); CreateInfoSection(sheet, ref currentRow, sampleCount, styles);
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;
currentRow++; // 空行 currentRow++; // 空行
// 创建表头 // 3. 创建液体吸收时间部分
IRow headerRow = sheet.CreateRow(currentRow++); CreateForm1Section(sheet, ref currentRow, sampleCount, dataTable1, styles);
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;
currentRow++; // 空行 currentRow++; // 空行
// 创建第一级表头试样1-N // 4. 创建液体吸收量部分
IRow headerRow1 = sheet.CreateRow(currentRow++); CreateForm2Section(sheet, ref currentRow, sampleCount, dataTable2, styles);
headerRow1.Height = 400;
ICell cell0 = headerRow1.CreateCell(0);
cell0.SetCellValue("序号");
cell0.CellStyle = styles.headerStyle;
sheet.AddMergedRegion(new CellRangeAddress(currentRow - 1, currentRow, 0, 0));
int colIndex = 1; currentRow++; // 空行
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;
}
// 创建第二级表头1、2、3 // 5. 创建液体芯吸速率部分
IRow headerRow2 = sheet.CreateRow(currentRow++); CreateForm3Section(sheet, ref currentRow, sampleCount, dataTable3, styles);
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;
}
}
}
// 设置列宽 // 设置列宽
sheet.SetColumnWidth(0, 20 * 256); 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) (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle) styles)
{ {
// 创建标题行 // 第一行信息
IRow titleRow = sheet.CreateRow(0); IRow infoRow1 = sheet.CreateRow(currentRow++);
ICell titleCell = titleRow.CreateCell(0); infoRow1.Height = 400;
titleCell.SetCellValue(title);
titleCell.CellStyle = styles.titleStyle;
sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, sampleCount));
titleRow.Height = 600;
// 创建表头 // 样品名称
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; headerRow.Height = 400;
ICell seqCell = headerRow.CreateCell(0); ICell seqCell = headerRow.CreateCell(0);
seqCell.SetCellValue("序号"); seqCell.SetCellValue("序号");
@@ -494,12 +380,346 @@ namespace WindowsFormsApp6
cell.CellStyle = styles.headerStyle; cell.CellStyle = styles.headerStyle;
} }
// 设置列宽 ICell noteCell = headerRow.CreateCell(sampleCount + 1);
sheet.SetColumnWidth(0, 20 * 256); 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++) 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) private (ICellStyle titleStyle, ICellStyle headerStyle, ICellStyle dataStyle, ICellStyle yellowStyle)