820 lines
37 KiB
C#
820 lines
37 KiB
C#
using ClosedXML.Excel;
|
||
using jiancaiburanxing.data;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Collections.ObjectModel;
|
||
using System.ComponentModel;
|
||
using System.Diagnostics;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Controls;
|
||
using System.Windows.Data;
|
||
using System.Windows.Documents;
|
||
using System.Windows.Input;
|
||
using System.Windows.Media;
|
||
using System.Windows.Media.Imaging;
|
||
using System.Windows.Shapes;
|
||
using 建材不燃性试验炉;
|
||
using Path = System.IO.Path;
|
||
|
||
namespace jiancaiburanxing
|
||
{
|
||
/// <summary>
|
||
/// TestReportWindow.xaml 的交互逻辑
|
||
/// </summary>
|
||
public partial class TestReportWindow : Window
|
||
{
|
||
|
||
private ObservableCollection<TestReportData> _testData;
|
||
private ICollectionView _testDataView;
|
||
#region 构造函数和初始化
|
||
public TestReportWindow()
|
||
{
|
||
InitializeComponent();
|
||
InitializeDataGrid();
|
||
LoadTestData();
|
||
}
|
||
#endregion
|
||
|
||
|
||
private void InitializeDataGrid()
|
||
{
|
||
_testData = new ObservableCollection<TestReportData>();
|
||
_testDataView = CollectionViewSource.GetDefaultView(_testData);
|
||
dgTestReport.ItemsSource = _testDataView;
|
||
|
||
// 设置按钮事件
|
||
btnClearData.Click += BtnClearData_Click;
|
||
btnExportReport.Click += BtnExportReport_Click;
|
||
btnReturn.Click += btnReturn_Click;
|
||
}
|
||
|
||
// 加载试验数据
|
||
private void LoadTestData()
|
||
{
|
||
try
|
||
{
|
||
LoadDataFromTempFile();
|
||
//LoadTempDataFromFile();
|
||
//AddSampleData();
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show($"加载数据失败: {ex.Message}", "错误",
|
||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||
}
|
||
}
|
||
|
||
|
||
// 在类中添加这些辅助方法
|
||
private double ParseDouble(string value)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(value))
|
||
return 0;
|
||
|
||
// 移除可能的中文单位字符
|
||
value = value.Replace("℃", "").Replace("°C", "").Replace("g", "").Replace("%", "").Trim();
|
||
|
||
if (double.TryParse(value, out double result))
|
||
return result;
|
||
|
||
return 0;
|
||
}
|
||
|
||
private int ParseInt(string value)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(value))
|
||
return 0;
|
||
|
||
// 移除非数字字符
|
||
value = new string(value.Where(char.IsDigit).ToArray());
|
||
|
||
if (int.TryParse(value, out int result))
|
||
return result;
|
||
|
||
return 0;
|
||
}
|
||
|
||
private List<TestReportData> LoadDataFromTempFile()
|
||
{
|
||
var reportDataList = new List<TestReportData>();
|
||
|
||
try
|
||
{
|
||
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TempReportData.txt");
|
||
|
||
if (!File.Exists(filePath))
|
||
{
|
||
return reportDataList;
|
||
}
|
||
|
||
var lines = File.ReadAllLines(filePath, Encoding.UTF8);
|
||
|
||
// 跳过表头(第一行)
|
||
for (int i = 1; i < lines.Length; i++)
|
||
{
|
||
if (string.IsNullOrWhiteSpace(lines[i]))
|
||
continue;
|
||
|
||
var fields = lines[i].Split('|');
|
||
|
||
if (fields.Length >= 19) // 确保有足够的字段
|
||
{
|
||
var data = new TestReportData
|
||
{
|
||
SampleCode = fields[0],
|
||
SampleName = fields[1],
|
||
SampleSpec = fields[2],
|
||
InitialTemp = ParseDouble(fields[3]),
|
||
MaxTemp = ParseDouble(fields[4]),
|
||
FinalTemp = ParseDouble(fields[5]),
|
||
TempRise = ParseDouble(fields[6]),
|
||
CenterMaxTemp = ParseDouble(fields[7]),
|
||
CenterFinalTemp = ParseDouble(fields[8]),
|
||
SurfaceMaxTemp = ParseDouble(fields[9]),
|
||
SurfaceFinalTemp = ParseDouble(fields[10]),
|
||
InitialWeight = ParseDouble(fields[11]),
|
||
FinalWeight = ParseDouble(fields[12]),
|
||
LossPercent = ParseDouble(fields[13]),
|
||
FlameDuration = ParseInt(fields[14]),
|
||
TestDate = fields[15],
|
||
TestDuration = fields[16],
|
||
BalanceStatus = fields[17],
|
||
Remarks = fields.Length > 18 ? fields[18] : ""
|
||
};
|
||
|
||
reportDataList.Add(data);
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Debug.WriteLine($"读取临时数据失败: {ex.Message}");
|
||
}
|
||
|
||
return reportDataList;
|
||
}
|
||
|
||
// 可选:从临时文件加载数据
|
||
//private void LoadTempDataFromFile()
|
||
//{
|
||
// try
|
||
// {
|
||
// string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TempReportData.txt");
|
||
// if (!File.Exists(filePath)) return;
|
||
|
||
// var lines = File.ReadAllLines(filePath, Encoding.UTF8);
|
||
// foreach (var line in lines)
|
||
// {
|
||
// var parts = line.Split('|');
|
||
// if (parts.Length >= 14)
|
||
// {
|
||
// var reportData = new TestReportData
|
||
// {
|
||
// SampleCode = parts[0],
|
||
// SampleName = parts[1],
|
||
// SampleSpec = parts[2],
|
||
// InitialTemp = double.Parse(parts[3]),
|
||
// MaxTemp = double.Parse(parts[4]),
|
||
// FinalTemp = double.Parse(parts[5]),
|
||
// TempRise = double.Parse(parts[6]),
|
||
// InitialWeight = double.Parse(parts[7]),
|
||
// FinalWeight = double.Parse(parts[8]),
|
||
// LossPercent = double.Parse(parts[9]),
|
||
// FlameDuration = int.Parse(parts[10]),
|
||
// TestDate = parts[11],
|
||
// TestDuration = parts[12],
|
||
// BalanceStatus = parts[13],
|
||
// Remarks = parts.Length > 14 ? parts[14] : ""
|
||
// };
|
||
|
||
// _testData.Add(reportData);
|
||
// }
|
||
// }
|
||
|
||
// Debug.WriteLine($"从临时文件加载了 {_testData.Count} 条数据");
|
||
// }
|
||
// catch (Exception ex)
|
||
// {
|
||
// Debug.WriteLine($"加载临时数据失败: {ex.Message}");
|
||
// }
|
||
//}
|
||
//// 添加示例数据
|
||
//private void AddSampleData()
|
||
//{
|
||
// _testData.Add(new TestReportData
|
||
// {
|
||
// SampleCode = "TEST001",
|
||
// SampleName = "岩棉板",
|
||
// SampleSpec = "50mm",
|
||
// InitialTemp = 750.0,
|
||
// MaxTemp = 877.8,
|
||
// FinalTemp = 802.3,
|
||
// TempRise = 75.5,
|
||
// CenterMaxTemp = 850.0,
|
||
// CenterFinalTemp = 800.0,
|
||
// SurfaceMaxTemp = 900.0,
|
||
// SurfaceFinalTemp = 820.0,
|
||
// InitialWeight = 45.32,
|
||
// FinalWeight = 44.78,
|
||
// LossPercent = 1.19,
|
||
// FlameDuration = 0,
|
||
// TestDate = DateTime.Now.ToString("yyyy-MM-dd"),
|
||
// TestDuration = "30:00",
|
||
// BalanceStatus = "达到平衡",
|
||
// Remarks = "符合标准GB/T 5464-2010"
|
||
// });
|
||
//}
|
||
|
||
// 导出报表
|
||
private void BtnExportReport_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
try
|
||
{
|
||
var saveDialog = new Microsoft.Win32.SaveFileDialog
|
||
{
|
||
Filter = "Excel文件 (*.xlsx)|*.xlsx|CSV文件 (*.csv)|*.csv|所有文件 (*.*)|*.*",
|
||
FileName = $"不燃性试验报告_{DateTime.Now:yyyyMMdd_HHmmss}",
|
||
DefaultExt = ".xlsx"
|
||
};
|
||
|
||
if (saveDialog.ShowDialog() == true)
|
||
{
|
||
ExportToExcel(saveDialog.FileName);
|
||
MessageBox.Show($"报表已导出到:\n{saveDialog.FileName}", "导出成功",
|
||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
MessageBox.Show($"导出失败: {ex.Message}", "错误",
|
||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
// 导出到Excel(简化版本)
|
||
//private void ExportToExcel(string filePath)
|
||
//{
|
||
// using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
|
||
// {
|
||
// // 写入标题
|
||
// writer.WriteLine("建材不燃性试验数据报表");
|
||
// writer.WriteLine($"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
|
||
// writer.WriteLine("符合标准: GB/T 5464-2010");
|
||
// writer.WriteLine();
|
||
|
||
// // 写入表头
|
||
// writer.WriteLine("试样编号,试样名称,试样规格,炉内初始温度(℃),炉内最高温度(℃),炉内最终温度(℃),温升(℃)," +
|
||
// "试样中心最高温度(℃),试样中心最终温度(℃),试样表面最高温度(℃),试样表面最终温度(℃)," +
|
||
// "试样初始质量(g),试样结束质量(g),质量损失(%),火焰持续时间(s),试验日期,试验持续时间,平衡状态,备注");
|
||
|
||
// // 写入数据
|
||
// foreach (var item in _testData)
|
||
// {
|
||
// writer.WriteLine($"{item.SampleCode},{item.SampleName},{item.SampleSpec}," +
|
||
// $"{item.InitialTemp:F1},{item.MaxTemp:F1},{item.FinalTemp:F1},{item.TempRise:F1}," +
|
||
// $"{item.CenterMaxTemp:F1},{item.CenterFinalTemp:F1},{item.SurfaceMaxTemp:F1},{item.SurfaceFinalTemp:F1}," +
|
||
// $"{item.InitialWeight:F2},{item.FinalWeight:F2},{item.LossPercent:F2}," +
|
||
// $"{item.FlameDuration},{item.TestDate},{item.TestDuration},{item.BalanceStatus},{item.Remarks}");
|
||
// }
|
||
// }
|
||
//}
|
||
|
||
|
||
|
||
|
||
// 添加新的试验数据(由主窗口调用)
|
||
|
||
//private void ExportToExcel(string filePath)
|
||
//{
|
||
// using (var workbook = new XLWorkbook())
|
||
// {
|
||
// // 创建一个工作表
|
||
// var worksheet = workbook.Worksheets.Add("不燃性试验报告");
|
||
|
||
// // 设置整体样式
|
||
// worksheet.Style.Font.FontName = "微软雅黑";
|
||
// worksheet.Style.Font.FontSize = 10;
|
||
|
||
// // 1. 标题行
|
||
// var titleRow1 = worksheet.Cell(1, 1);
|
||
// titleRow1.Value = "建材不燃性试验数据报表";
|
||
// titleRow1.Style.Font.FontSize = 16;
|
||
// titleRow1.Style.Font.Bold = true;
|
||
// titleRow1.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
||
// titleRow1.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
||
// worksheet.Range(1, 1, 1, 19).Merge(); // 合并单元格,19列(增加4个温度字段)
|
||
|
||
// var titleRow2 = worksheet.Cell(2, 1);
|
||
// titleRow2.Value = $"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}";
|
||
// titleRow2.Style.Font.FontSize = 11;
|
||
// titleRow2.Style.Font.Italic = true;
|
||
// worksheet.Range(2, 1, 2, 19).Merge();
|
||
|
||
// var titleRow3 = worksheet.Cell(3, 1);
|
||
// titleRow3.Value = "符合标准: GB/T 5464-2010";
|
||
// titleRow3.Style.Font.FontSize = 11;
|
||
// worksheet.Range(3, 1, 3, 19).Merge();
|
||
|
||
// // 空行
|
||
// worksheet.Row(4).Height = 10;
|
||
|
||
// // 2. 表头(共19列)
|
||
// var headers = new string[]
|
||
// {
|
||
// "试样编号", "试样名称", "试样规格",
|
||
// "炉内初始温度(℃)", "炉内最高温度(℃)", "炉内最终温度(℃)", "温升(℃)",
|
||
// "试样中心最高温(℃)", "试样中心最终温(℃)", // 新增字段
|
||
// "试样表面最高温(℃)", "试样表面最终温(℃)", // 新增字段
|
||
// "试样初始质量(g)", "试样结束质量(g)", "质量损失(%)",
|
||
// "火焰持续时间(s)", "试验日期", "试验持续时间", "平衡状态", "备注"
|
||
// };
|
||
|
||
// int rowIndex = 5;
|
||
// for (int i = 0; i < headers.Length; i++)
|
||
// {
|
||
// var cell = worksheet.Cell(rowIndex, i + 1);
|
||
// cell.Value = headers[i];
|
||
// cell.Style.Font.Bold = true;
|
||
// cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
||
// cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
||
// cell.Style.Fill.BackgroundColor = XLColor.LightGray;
|
||
// cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||
// cell.Style.Border.OutsideBorderColor = XLColor.Black;
|
||
|
||
// // 设置列宽(根据内容调整)
|
||
// switch (i)
|
||
// {
|
||
// case 0: worksheet.Column(i + 1).Width = 12; break; // 试样编号
|
||
// case 1: worksheet.Column(i + 1).Width = 15; break; // 试样名称
|
||
// case 2: worksheet.Column(i + 1).Width = 10; break; // 试样规格
|
||
// case 3: worksheet.Column(i + 1).Width = 15; break; // 炉内初始温度
|
||
// case 4: worksheet.Column(i + 1).Width = 15; break; // 炉内最高温度
|
||
// case 5: worksheet.Column(i + 1).Width = 15; break; // 炉内最终温度
|
||
// case 6: worksheet.Column(i + 1).Width = 12; break; // 温升
|
||
// case 7: worksheet.Column(i + 1).Width = 15; break; // 试样中心最高温度
|
||
// case 8: worksheet.Column(i + 1).Width = 15; break; // 试样中心最终温度
|
||
// case 9: worksheet.Column(i + 1).Width = 15; break; // 试样表面最高温度
|
||
// case 10: worksheet.Column(i + 1).Width = 15; break; // 试样表面最终温度
|
||
// case 11: worksheet.Column(i + 1).Width = 15; break; // 试样初始质量
|
||
// case 12: worksheet.Column(i + 1).Width = 15; break; // 试样结束质量
|
||
// case 13: worksheet.Column(i + 1).Width = 12; break; // 质量损失
|
||
// case 14: worksheet.Column(i + 1).Width = 15; break; // 火焰持续时间
|
||
// case 15: worksheet.Column(i + 1).Width = 12; break; // 试验日期
|
||
// case 16: worksheet.Column(i + 1).Width = 12; break; // 试验持续时间
|
||
// case 17: worksheet.Column(i + 1).Width = 12; break; // 平衡状态
|
||
// case 18: worksheet.Column(i + 1).Width = 20; break; // 备注
|
||
// }
|
||
// }
|
||
|
||
// // 3. 数据行
|
||
// rowIndex++;
|
||
// foreach (var item in _testData)
|
||
// {
|
||
// worksheet.Cell(rowIndex, 1).Value = item.SampleCode;
|
||
// worksheet.Cell(rowIndex, 2).Value = item.SampleName;
|
||
// worksheet.Cell(rowIndex, 3).Value = item.SampleSpec;
|
||
// worksheet.Cell(rowIndex, 4).Value = item.InitialTemp;
|
||
// worksheet.Cell(rowIndex, 5).Value = item.MaxTemp;
|
||
// worksheet.Cell(rowIndex, 6).Value = item.FinalTemp;
|
||
// worksheet.Cell(rowIndex, 7).Value = item.TempRise;
|
||
|
||
// // 新增的4个温度字段
|
||
// worksheet.Cell(rowIndex, 8).Value = item.CenterMaxTemp;
|
||
// worksheet.Cell(rowIndex, 9).Value = item.CenterFinalTemp;
|
||
// worksheet.Cell(rowIndex, 10).Value = item.SurfaceMaxTemp;
|
||
// worksheet.Cell(rowIndex, 11).Value = item.SurfaceFinalTemp;
|
||
|
||
// worksheet.Cell(rowIndex, 12).Value = item.InitialWeight;
|
||
// worksheet.Cell(rowIndex, 13).Value = item.FinalWeight;
|
||
// worksheet.Cell(rowIndex, 14).Value = item.LossPercent;
|
||
// worksheet.Cell(rowIndex, 15).Value = item.FlameDuration;
|
||
// worksheet.Cell(rowIndex, 16).Value = item.TestDate;
|
||
// worksheet.Cell(rowIndex, 17).Value = item.TestDuration;
|
||
// worksheet.Cell(rowIndex, 18).Value = item.BalanceStatus;
|
||
// worksheet.Cell(rowIndex, 19).Value = item.Remarks;
|
||
|
||
// // 设置数据行样式
|
||
// for (int col = 1; col <= 19; col++)
|
||
// {
|
||
// var cell = worksheet.Cell(rowIndex, col);
|
||
// cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
||
// cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
||
// cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||
// cell.Style.Border.OutsideBorderColor = XLColor.Gray;
|
||
|
||
// // 数值格式(温度和质量列保留一位小数)
|
||
// if ((col >= 4 && col <= 11) || col == 14) // 所有温度列 + 质量损失
|
||
// {
|
||
// cell.Style.NumberFormat.Format = "0.0";
|
||
// }
|
||
// else if (col == 12 || col == 13) // 质量列
|
||
// {
|
||
// cell.Style.NumberFormat.Format = "0.00";
|
||
// }
|
||
// }
|
||
|
||
// // 隔行变色
|
||
// if (rowIndex % 2 == 0)
|
||
// {
|
||
// worksheet.Range(rowIndex, 1, rowIndex, 19).Style
|
||
// .Fill.BackgroundColor = XLColor.White;
|
||
// }
|
||
// else
|
||
// {
|
||
// worksheet.Range(rowIndex, 1, rowIndex, 19).Style
|
||
// .Fill.BackgroundColor = XLColor.LightSkyBlue;
|
||
// }
|
||
|
||
// rowIndex++;
|
||
// }
|
||
|
||
// // 4. 自动调整行高
|
||
// worksheet.Rows(5, rowIndex - 1).AdjustToContents();
|
||
|
||
// // 5. 添加边框
|
||
// var dataRange = worksheet.Range(5, 1, rowIndex - 1, 19);
|
||
// dataRange.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
|
||
// dataRange.Style.Border.InsideBorderColor = XLColor.Gray;
|
||
// dataRange.Style.Border.OutsideBorder = XLBorderStyleValues.Medium;
|
||
// dataRange.Style.Border.OutsideBorderColor = XLColor.Black;
|
||
|
||
// // 6. 添加分组标识(可选)
|
||
// // 温度相关列设置不同背景色
|
||
// //var tempHeaderRange = worksheet.Range(5, 4, 5, 11);
|
||
// //tempHeaderRange.Style.Fill.BackgroundColor = XLColor.LightGreen;
|
||
|
||
// //var weightHeaderRange = worksheet.Range(5, 12, 5, 14);
|
||
// //weightHeaderRange.Style.Fill.BackgroundColor = XLColor.LightYellow;
|
||
|
||
// // 7. 添加页脚
|
||
// //var footerRow = worksheet.Cell(rowIndex + 2, 1);
|
||
// //footerRow.Value = "备注:本报表自动生成,数据仅供参考";
|
||
// //footerRow.Style.Font.FontSize = 9;
|
||
// //footerRow.Style.Font.FontColor = XLColor.Gray;
|
||
// //footerRow.Style.Font.Italic = true;
|
||
// //worksheet.Range(rowIndex + 2, 1, rowIndex + 2, 19).Merge();
|
||
|
||
// // 8. 保存文件
|
||
// workbook.SaveAs(filePath);
|
||
// }
|
||
//}
|
||
|
||
private void ExportToExcel(string filePath)
|
||
{
|
||
try
|
||
{
|
||
// 从临时文件加载数据
|
||
var dataList = LoadDataFromTempFile();
|
||
|
||
if (dataList.Count == 0)
|
||
{
|
||
MessageBox.Show("没有可导出的数据", "导出提示",
|
||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||
return;
|
||
}
|
||
|
||
using (var workbook = new XLWorkbook())
|
||
{
|
||
// 创建一个工作表
|
||
var worksheet = workbook.Worksheets.Add("不燃性试验报告");
|
||
|
||
// 设置整体样式
|
||
worksheet.Style.Font.FontName = "微软雅黑";
|
||
worksheet.Style.Font.FontSize = 10;
|
||
|
||
// 1. 标题行
|
||
var titleRow1 = worksheet.Cell(1, 1);
|
||
titleRow1.Value = "建材不燃性试验数据报表";
|
||
titleRow1.Style.Font.FontSize = 16;
|
||
titleRow1.Style.Font.Bold = true;
|
||
titleRow1.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
||
titleRow1.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
||
worksheet.Range(1, 1, 1, 19).Merge(); // 合并单元格,19列
|
||
|
||
var titleRow2 = worksheet.Cell(2, 1);
|
||
titleRow2.Value = $"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}";
|
||
titleRow2.Style.Font.FontSize = 11;
|
||
titleRow2.Style.Font.Italic = true;
|
||
worksheet.Range(2, 1, 2, 19).Merge();
|
||
|
||
var titleRow3 = worksheet.Cell(3, 1);
|
||
titleRow3.Value = "符合标准: GB/T 5464-2010";
|
||
titleRow3.Style.Font.FontSize = 11;
|
||
worksheet.Range(3, 1, 3, 19).Merge();
|
||
|
||
// 空行
|
||
worksheet.Row(4).Height = 10;
|
||
|
||
// 2. 表头(共19列)
|
||
var headers = new string[]
|
||
{
|
||
"试样编号", "试样名称", "试样规格",
|
||
"炉内初始温度(℃)", "炉内最高温度(℃)", "炉内最终温度(℃)", "温升(℃)",
|
||
"试样中心最高温度(℃)", "试样中心最终温度(℃)", // 新增字段
|
||
"试样表面最高温度(℃)", "试样表面最终温度(℃)", // 新增字段
|
||
"试样初始质量(g)", "试样结束质量(g)", "质量损失(%)",
|
||
"火焰持续时间(s)", "试验日期", "试验持续时间", "平衡状态", "备注"
|
||
};
|
||
|
||
int rowIndex = 5;
|
||
for (int i = 0; i < headers.Length; i++)
|
||
{
|
||
var cell = worksheet.Cell(rowIndex, i + 1);
|
||
cell.Value = headers[i];
|
||
cell.Style.Font.Bold = true;
|
||
cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
||
cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
||
cell.Style.Fill.BackgroundColor = XLColor.LightGray;
|
||
cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||
cell.Style.Border.OutsideBorderColor = XLColor.Black;
|
||
|
||
// 设置列宽(根据内容调整)
|
||
switch (i)
|
||
{
|
||
case 0: worksheet.Column(i + 1).Width = 12; break; // 试样编号
|
||
case 1: worksheet.Column(i + 1).Width = 15; break; // 试样名称
|
||
case 2: worksheet.Column(i + 1).Width = 10; break; // 试样规格
|
||
case 3: worksheet.Column(i + 1).Width = 15; break; // 炉内初始温度
|
||
case 4: worksheet.Column(i + 1).Width = 15; break; // 炉内最高温度
|
||
case 5: worksheet.Column(i + 1).Width = 15; break; // 炉内最终温度
|
||
case 6: worksheet.Column(i + 1).Width = 12; break; // 温升
|
||
case 7: worksheet.Column(i + 1).Width = 15; break; // 试样中心最高温度
|
||
case 8: worksheet.Column(i + 1).Width = 15; break; // 试样中心最终温度
|
||
case 9: worksheet.Column(i + 1).Width = 15; break; // 试样表面最高温度
|
||
case 10: worksheet.Column(i + 1).Width = 15; break; // 试样表面最终温度
|
||
case 11: worksheet.Column(i + 1).Width = 15; break; // 试样初始质量
|
||
case 12: worksheet.Column(i + 1).Width = 15; break; // 试样结束质量
|
||
case 13: worksheet.Column(i + 1).Width = 12; break; // 质量损失
|
||
case 14: worksheet.Column(i + 1).Width = 15; break; // 火焰持续时间
|
||
case 15: worksheet.Column(i + 1).Width = 12; break; // 试验日期
|
||
case 16: worksheet.Column(i + 1).Width = 12; break; // 试验持续时间
|
||
case 17: worksheet.Column(i + 1).Width = 12; break; // 平衡状态
|
||
case 18: worksheet.Column(i + 1).Width = 20; break; // 备注
|
||
}
|
||
}
|
||
|
||
// 3. 数据行
|
||
rowIndex++;
|
||
foreach (var item in dataList)
|
||
{
|
||
worksheet.Cell(rowIndex, 1).Value = item.SampleCode ?? "";
|
||
worksheet.Cell(rowIndex, 2).Value = item.SampleName ?? "";
|
||
worksheet.Cell(rowIndex, 3).Value = item.SampleSpec ?? "";
|
||
worksheet.Cell(rowIndex, 4).Value = item.InitialTemp;
|
||
worksheet.Cell(rowIndex, 5).Value = item.MaxTemp;
|
||
worksheet.Cell(rowIndex, 6).Value = item.FinalTemp;
|
||
worksheet.Cell(rowIndex, 7).Value = item.TempRise;
|
||
|
||
// 新增的4个温度字段
|
||
worksheet.Cell(rowIndex, 8).Value = item.CenterMaxTemp;
|
||
worksheet.Cell(rowIndex, 9).Value = item.CenterFinalTemp;
|
||
worksheet.Cell(rowIndex, 10).Value = item.SurfaceMaxTemp;
|
||
worksheet.Cell(rowIndex, 11).Value = item.SurfaceFinalTemp;
|
||
|
||
worksheet.Cell(rowIndex, 12).Value = item.InitialWeight;
|
||
worksheet.Cell(rowIndex, 13).Value = item.FinalWeight;
|
||
worksheet.Cell(rowIndex, 14).Value = item.LossPercent;
|
||
worksheet.Cell(rowIndex, 15).Value = item.FlameDuration;
|
||
worksheet.Cell(rowIndex, 16).Value = item.TestDate ?? "";
|
||
worksheet.Cell(rowIndex, 17).Value = item.TestDuration ?? "";
|
||
worksheet.Cell(rowIndex, 18).Value = item.BalanceStatus ?? "";
|
||
worksheet.Cell(rowIndex, 19).Value = item.Remarks ?? "";
|
||
|
||
// 设置数据行样式
|
||
for (int col = 1; col <= 19; col++)
|
||
{
|
||
var cell = worksheet.Cell(rowIndex, col);
|
||
cell.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
|
||
cell.Style.Alignment.Vertical = XLAlignmentVerticalValues.Center;
|
||
cell.Style.Border.OutsideBorder = XLBorderStyleValues.Thin;
|
||
cell.Style.Border.OutsideBorderColor = XLColor.Gray;
|
||
|
||
// 数值格式(温度和质量列保留一位小数)
|
||
if ((col >= 4 && col <= 11) || col == 14) // 所有温度列 + 质量损失
|
||
{
|
||
cell.Style.NumberFormat.Format = "0.0";
|
||
}
|
||
else if (col == 12 || col == 13) // 质量列
|
||
{
|
||
cell.Style.NumberFormat.Format = "0.00";
|
||
}
|
||
}
|
||
|
||
// 隔行变色
|
||
if (rowIndex % 2 == 0)
|
||
{
|
||
worksheet.Range(rowIndex, 1, rowIndex, 19).Style
|
||
.Fill.BackgroundColor = XLColor.White;
|
||
}
|
||
else
|
||
{
|
||
worksheet.Range(rowIndex, 1, rowIndex, 19).Style
|
||
.Fill.BackgroundColor = XLColor.FromArgb(240, 248, 255); // 淡蓝色
|
||
}
|
||
|
||
rowIndex++;
|
||
}
|
||
|
||
// 4. 自动调整行高
|
||
worksheet.Rows(5, rowIndex - 1).AdjustToContents();
|
||
|
||
// 5. 添加边框
|
||
var dataRange = worksheet.Range(5, 1, rowIndex - 1, 19);
|
||
dataRange.Style.Border.InsideBorder = XLBorderStyleValues.Thin;
|
||
dataRange.Style.Border.InsideBorderColor = XLColor.Gray;
|
||
dataRange.Style.Border.OutsideBorder = XLBorderStyleValues.Medium;
|
||
dataRange.Style.Border.OutsideBorderColor = XLColor.Black;
|
||
|
||
// 6. 添加分组标识(可选)
|
||
// 温度相关列设置不同背景色
|
||
var tempHeaderRange = worksheet.Range(5, 4, 5, 11);
|
||
tempHeaderRange.Style.Fill.BackgroundColor = XLColor.LightGreen;
|
||
|
||
var weightHeaderRange = worksheet.Range(5, 12, 5, 14);
|
||
weightHeaderRange.Style.Fill.BackgroundColor = XLColor.LightYellow;
|
||
|
||
var otherHeaderRange = worksheet.Range(5, 15, 5, 19);
|
||
otherHeaderRange.Style.Fill.BackgroundColor = XLColor.LightSteelBlue;
|
||
|
||
// 7. 添加统计行(可选)
|
||
//rowIndex += 2;
|
||
//var statRow = worksheet.Row(rowIndex);
|
||
|
||
//worksheet.Cell(rowIndex, 1).Value = "统计";
|
||
//worksheet.Cell(rowIndex, 1).Style.Font.Bold = true;
|
||
//worksheet.Cell(rowIndex, 1).Style.Fill.BackgroundColor = XLColor.LightGray;
|
||
//worksheet.Range(rowIndex, 1, rowIndex, 3).Merge();
|
||
|
||
//// 平均初始温度
|
||
//worksheet.Cell(rowIndex, 4).Value = dataList.Average(d => d.InitialTemp);
|
||
//worksheet.Cell(rowIndex, 4).Style.NumberFormat.Format = "0.0";
|
||
//worksheet.Cell(rowIndex, 4).Style.Fill.BackgroundColor = XLColor.LightGreen;
|
||
|
||
//// 平均最高温度
|
||
//worksheet.Cell(rowIndex, 5).Value = dataList.Average(d => d.MaxTemp);
|
||
//worksheet.Cell(rowIndex, 5).Style.NumberFormat.Format = "0.0";
|
||
//worksheet.Cell(rowIndex, 5).Style.Fill.BackgroundColor = XLColor.LightGreen;
|
||
|
||
//// 平均最终温度
|
||
//worksheet.Cell(rowIndex, 6).Value = dataList.Average(d => d.FinalTemp);
|
||
//worksheet.Cell(rowIndex, 6).Style.NumberFormat.Format = "0.0";
|
||
//worksheet.Cell(rowIndex, 6).Style.Fill.BackgroundColor = XLColor.LightGreen;
|
||
|
||
//// 平均温升
|
||
//worksheet.Cell(rowIndex, 7).Value = dataList.Average(d => d.TempRise);
|
||
//worksheet.Cell(rowIndex, 7).Style.NumberFormat.Format = "0.0";
|
||
//worksheet.Cell(rowIndex, 7).Style.Fill.BackgroundColor = XLColor.LightGreen;
|
||
|
||
//// 其他统计信息
|
||
//worksheet.Cell(rowIndex, 14).Value = dataList.Average(d => d.LossPercent);
|
||
//worksheet.Cell(rowIndex, 14).Style.NumberFormat.Format = "0.0";
|
||
//worksheet.Cell(rowIndex, 14).Style.Fill.BackgroundColor = XLColor.LightYellow;
|
||
|
||
//// 8. 添加页脚
|
||
//rowIndex += 2;
|
||
//var footerRow = worksheet.Cell(rowIndex, 1);
|
||
//footerRow.Value = "备注:本报表自动生成,数据仅供参考";
|
||
//footerRow.Style.Font.FontSize = 9;
|
||
//footerRow.Style.Font.FontColor = XLColor.Gray;
|
||
//footerRow.Style.Font.Italic = true;
|
||
//worksheet.Range(rowIndex, 1, rowIndex, 19).Merge();
|
||
|
||
//// 9. 添加筛选
|
||
//worksheet.Range(5, 1, 5, 19).SetAutoFilter();
|
||
|
||
//// 10. 冻结表头
|
||
//worksheet.SheetView.FreezeRows(5);
|
||
|
||
// 11. 保存文件
|
||
workbook.SaveAs(filePath);
|
||
|
||
Debug.WriteLine($"Excel文件已保存: {filePath}");
|
||
|
||
// 显示成功消息
|
||
Dispatcher.Invoke(() =>
|
||
{
|
||
MessageBox.Show($"数据已成功导出到:\n{filePath}\n\n共导出 {dataList.Count} 条记录",
|
||
"导出成功", MessageBoxButton.OK, MessageBoxImage.Information);
|
||
});
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
Debug.WriteLine($"导出Excel失败: {ex.Message}");
|
||
|
||
Dispatcher.Invoke(() =>
|
||
{
|
||
MessageBox.Show($"导出Excel文件失败:\n{ex.Message}",
|
||
"导出错误", MessageBoxButton.OK, MessageBoxImage.Error);
|
||
});
|
||
}
|
||
}
|
||
public void AddTestReportData(TestReportData data)
|
||
{
|
||
Dispatcher.Invoke(() =>
|
||
{
|
||
_testData.Insert(0, data); // 插入到开头
|
||
});
|
||
}
|
||
|
||
// 清空数据
|
||
private void BtnClearData_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
var result = MessageBox.Show("确定要清空所有报表数据吗?此操作不可恢复。",
|
||
"确认清空", MessageBoxButton.YesNo, MessageBoxImage.Warning);
|
||
|
||
if (result == MessageBoxResult.Yes)
|
||
{
|
||
_testData.Clear();
|
||
DeleteJsonDataFile();
|
||
MessageBox.Show("数据已清空", "提示",
|
||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||
}
|
||
}
|
||
// 删除JSON数据文件
|
||
private void DeleteJsonDataFile()
|
||
{
|
||
try
|
||
{
|
||
// 假设你的JSON文件路径(根据你的实际情况调整)
|
||
string jsonFilePath = Path.Combine(
|
||
AppDomain.CurrentDomain.BaseDirectory,
|
||
"TestReportData.json");
|
||
|
||
// 如果文件存在,就删除
|
||
if (File.Exists(jsonFilePath))
|
||
{
|
||
File.Delete(jsonFilePath);
|
||
Debug.WriteLine($"JSON数据文件已删除: {jsonFilePath}");
|
||
}
|
||
else
|
||
{
|
||
Debug.WriteLine($"JSON数据文件不存在: {jsonFilePath}");
|
||
}
|
||
|
||
|
||
string tempFilePath = Path.Combine(
|
||
AppDomain.CurrentDomain.BaseDirectory,
|
||
"TempReportData.txt");
|
||
|
||
if (File.Exists(tempFilePath))
|
||
{
|
||
File.Delete(tempFilePath);
|
||
Debug.WriteLine($"临时数据文件已删除: {tempFilePath}");
|
||
}
|
||
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
// 记录错误但不影响主流程
|
||
Debug.WriteLine($"删除JSON数据文件失败: {ex.Message}");
|
||
|
||
|
||
}
|
||
}
|
||
#region 切换主页相关
|
||
|
||
private MainWindow _mainWindow;
|
||
|
||
//返回
|
||
private void btnReturn_Click(object sender, RoutedEventArgs e)
|
||
{
|
||
SwitchWindow(ref _mainWindow, () => new MainWindow());
|
||
}
|
||
|
||
private void SwitchWindow<T>(ref T windowInstance, Func<T> createFunc) where T : Window, new()
|
||
{
|
||
|
||
|
||
if (windowInstance == null)
|
||
{
|
||
windowInstance = createFunc();
|
||
// 添加窗口关闭事件处理
|
||
windowInstance.Closed += (s, args) =>
|
||
{
|
||
this.Show();
|
||
this.Activate();
|
||
};
|
||
}
|
||
else
|
||
{
|
||
windowInstance.Activate();
|
||
return;
|
||
}
|
||
|
||
this.Hide();
|
||
windowInstance.Show();
|
||
}
|
||
|
||
#endregion
|
||
|
||
|
||
}
|
||
}
|