This commit is contained in:
wxt
2026-02-02 21:05:37 +08:00
parent 7a6c759ac3
commit 3e59d460f0
4 changed files with 271 additions and 105 deletions

View File

@@ -103,9 +103,9 @@ namespace 建材不燃性试验炉
_testTimer.Tick += TestTimer_Tick; _testTimer.Tick += TestTimer_Tick;
//初始化平衡判断定时器 //初始化平衡判断定时器
_balanceTimer = new DispatcherTimer(); //_balanceTimer = new DispatcherTimer();
_balanceTimer.Interval = TimeSpan.FromSeconds(1); //_balanceTimer.Interval = TimeSpan.FromSeconds(1);
_balanceTimer.Tick += BalanceTimer_Tick; //_balanceTimer.Tick += BalanceTimer_Tick;
} }
private void InitializeControls() private void InitializeControls()
@@ -203,63 +203,63 @@ namespace 建材不燃性试验炉
} }
} }
private void BalanceTimer_Tick(object sender, EventArgs e) //private void BalanceTimer_Tick(object sender, EventArgs e)
{ //{
try // try
{ // {
// 1. 计时递增 // // 1. 计时递增
_balanceElapsedSeconds++; // _balanceElapsedSeconds++;
txtBalanceTimeElapsed.Text = $"{_balanceElapsedSeconds}秒"; // txtBalanceTimeElapsed.Text = $"{_balanceElapsedSeconds}秒";
// 2. 采集当前炉壁温度 // // 2. 采集当前炉壁温度
double currentTemp = GetCurrentFurnaceTemp(); // double currentTemp = GetCurrentFurnaceTemp();
_tempDataList.Add(currentTemp); // _tempDataList.Add(currentTemp);
// 4. 计算最大值、最小值、平均值 // // 4. 计算最大值、最小值、平均值
_maxTemp = double.MinValue; // _maxTemp = double.MinValue;
_minTemp = double.MaxValue; // _minTemp = double.MaxValue;
double sumTemp = 0; // double sumTemp = 0;
foreach (var temp in _tempDataList) // foreach (var temp in _tempDataList)
{ // {
if (temp > _maxTemp) _maxTemp = temp; // if (temp > _maxTemp) _maxTemp = temp;
if (temp < _minTemp) _minTemp = temp; // if (temp < _minTemp) _minTemp = temp;
sumTemp += temp; // sumTemp += temp;
} // }
_avgTemp = sumTemp / _tempDataList.Count; // _avgTemp = sumTemp / _tempDataList.Count;
double currentMaxDiff = _maxTemp - _avgTemp; // 最大值与平均值的温差 // double currentMaxDiff = _maxTemp - _avgTemp; // 最大值与平均值的温差
double tempRange = _maxTemp - _minTemp; // 温度波动范围 // double tempRange = _maxTemp - _minTemp; // 温度波动范围
txtBalanceCondition.Text = $"平衡条件: 最大温差≤{_maxTempDiffThreshold}°C 且 温度波动≤±{_tempRangeThreshold}°C (当前: {tempRange:F1}°C)"; // txtBalanceCondition.Text = $"平衡条件: 最大温差≤{_maxTempDiffThreshold}°C 且 温度波动≤±{_tempRangeThreshold}°C (当前: {tempRange:F1}°C)";
// 6. 判断是否达到平衡条件(计时结束后) // // 6. 判断是否达到平衡条件(计时结束后)
if (_balanceElapsedSeconds >= _balanceTotalSeconds) // if (_balanceElapsedSeconds >= _balanceTotalSeconds)
{ // {
_balanceTimer.Stop(); // 停止定时器 // _balanceTimer.Stop(); // 停止定时器
_isBalanceChecking = false; // _isBalanceChecking = false;
bool isBalanced = currentMaxDiff <= _maxTempDiffThreshold && tempRange <= _tempRangeThreshold * 2; // bool isBalanced = currentMaxDiff <= _maxTempDiffThreshold && tempRange <= _tempRangeThreshold * 2;
// 更新平衡状态显示 // // 更新平衡状态显示
if (isBalanced) // if (isBalanced)
{ // {
balanceStatusBorder.Background = new SolidColorBrush(Colors.Green); // balanceStatusBorder.Background = new SolidColorBrush(Colors.Green);
txtBalanceResult.Text = "已平衡"; // txtBalanceResult.Text = "已平衡";
txtBalanceStatus.Text = $"温度平衡状态: 达到平衡(最大温差{currentMaxDiff:F1}°C温度波动{tempRange:F1}°C"; // txtBalanceStatus.Text = $"温度平衡状态: 达到平衡(最大温差{currentMaxDiff:F1}°C温度波动{tempRange:F1}°C";
UpdateStatusBar("温度平衡判断完成:炉温已稳定"); // UpdateStatusBar("温度平衡判断完成:炉温已稳定");
} // }
} // }
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
MessageBox.Show($"温度平衡判断出错:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error); // MessageBox.Show($"温度平衡判断出错:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
_balanceTimer.Stop(); // _balanceTimer.Stop();
_isBalanceChecking = false; // _isBalanceChecking = false;
} // }
} //}
// 获取当前炉壁温度 // 获取当前炉壁温度
private double GetCurrentFurnaceTemp() private double GetCurrentFurnaceTemp()
@@ -635,17 +635,6 @@ namespace 建材不燃性试验炉
#endregion #endregion
#region #region
//private void UpdateSimulatedTemperatures()
//{
// // 试验中的温度模拟
// double furnaceWallTemp = 750 + (_random.NextDouble() * 10 - 5); // 750±5°C
// double sampleCenterTemp = 500 + (_random.NextDouble() * 50 - 25); // 500±25°C
// double sampleSurfaceTemp = 600 + (_random.NextDouble() * 40 - 20); // 600±20°C
// UpdateTemperatureDisplay(furnaceWallTemp, sampleCenterTemp, sampleSurfaceTemp);
//}
private void UpdateSimulatedTemperatures() private void UpdateSimulatedTemperatures()
{ {
@@ -1492,16 +1481,16 @@ namespace 建材不燃性试验炉
txtBalanceResult.Text = "判断中"; txtBalanceResult.Text = "判断中";
// 更新目标温度显示(如果存在) // 更新目标温度显示(如果存在)
if (txtTestTemp != null) //if (txtTestTemp != null)
{ //{
txtTestTemp.Text = "750"; // 标准目标温度 // txtTestTemp.Text = "750"; // 标准目标温度
} //}
} }
private void StartBalanceCheck() private void StartBalanceCheck()
{ {
// 停止现有定时器 // 停止现有定时器
_balanceTimer?.Stop(); //_balanceTimer?.Stop();
// 创建新的平衡判断定时器(每秒检查一次) // 创建新的平衡判断定时器(每秒检查一次)
_balanceTimer = new DispatcherTimer(); _balanceTimer = new DispatcherTimer();

View File

@@ -87,22 +87,22 @@
<DataGridTextColumn Header="试样编号" Binding="{Binding SampleCode}" Width="80"/> <DataGridTextColumn Header="试样编号" Binding="{Binding SampleCode}" Width="80"/>
<DataGridTextColumn Header="试样名称" Binding="{Binding SampleName}" Width="100"/> <DataGridTextColumn Header="试样名称" Binding="{Binding SampleName}" Width="100"/>
<DataGridTextColumn Header="试样规格" Binding="{Binding SampleSpec}" Width="80"/> <DataGridTextColumn Header="试样规格" Binding="{Binding SampleSpec}" Width="80"/>
<DataGridTextColumn Header="初始温(℃)" Binding="{Binding InitialTemp, StringFormat=\{0:F1\}}" Width="90"/> <DataGridTextColumn Header="炉内初始温(℃)" Binding="{Binding InitialTemp, StringFormat=\{0:F1\}}" Width="115"/>
<DataGridTextColumn Header="最高温(℃)" Binding="{Binding MaxTemp, StringFormat=\{0:F1\}}" Width="90"/> <DataGridTextColumn Header="炉内最高温(℃)" Binding="{Binding MaxTemp, StringFormat=\{0:F1\}}" Width="115"/>
<DataGridTextColumn Header="最终温(℃)" Binding="{Binding FinalTemp, StringFormat=\{0:F1\}}" Width="90"/> <DataGridTextColumn Header="炉内最终温(℃)" Binding="{Binding FinalTemp, StringFormat=\{0:F1\}}" Width="115"/>
<DataGridTextColumn Header="温升(℃)" Binding="{Binding TempRise, StringFormat=\{0:F1\}}" Width="80"/> <DataGridTextColumn Header="温升(℃)" Binding="{Binding TempRise, StringFormat=\{0:F1\}}" Width="72"/>
<DataGridTextColumn Header="中心最高温(℃)" Binding="{Binding CenterMaxTemp, StringFormat=\{0:F1\}}" Width="100"/> <DataGridTextColumn Header="试样中心最高温(℃)" Binding="{Binding CenterMaxTemp, StringFormat=\{0:F1\}}" Width="142"/>
<DataGridTextColumn Header="中心最终温(℃)" Binding="{Binding CenterFinalTemp, StringFormat=\{0:F1\}}" Width="100"/> <DataGridTextColumn Header="试样中心最终温(℃)" Binding="{Binding CenterFinalTemp, StringFormat=\{0:F1\}}" Width="142"/>
<DataGridTextColumn Header="表面最高温(℃)" Binding="{Binding SurfaceMaxTemp, StringFormat=\{0:F1\}}" Width="100"/> <DataGridTextColumn Header="试样表面最高温(℃)" Binding="{Binding SurfaceMaxTemp, StringFormat=\{0:F1\}}" Width="142"/>
<DataGridTextColumn Header="表面最终温(℃)" Binding="{Binding SurfaceFinalTemp, StringFormat=\{0:F1\}}" Width="100"/> <DataGridTextColumn Header="试样表面最终温(℃)" Binding="{Binding SurfaceFinalTemp, StringFormat=\{0:F1\}}" Width="142"/>
<DataGridTextColumn Header="初始质量(g)" Binding="{Binding InitialWeight, StringFormat=\{0:F2\}}" Width="90"/> <DataGridTextColumn Header="初始质量(g)" Binding="{Binding InitialWeight, StringFormat=\{0:F2\}}" Width="100"/>
<DataGridTextColumn Header="结束质量(g)" Binding="{Binding FinalWeight, StringFormat=\{0:F2\}}" Width="90"/> <DataGridTextColumn Header="结束质量(g)" Binding="{Binding FinalWeight, StringFormat=\{0:F2\}}" Width="100"/>
<DataGridTextColumn Header="质量损失(%)" Binding="{Binding LossPercent, StringFormat=\{0:F2\}}" Width="90"/> <DataGridTextColumn Header="质量损失(%)" Binding="{Binding LossPercent, StringFormat=\{0:F2\}}" Width="100"/>
<DataGridTextColumn Header="火焰时间(s)" Binding="{Binding FlameDuration}" Width="90"/> <DataGridTextColumn Header="火焰时间(s)" Binding="{Binding FlameDuration}" Width="100"/>
<DataGridTextColumn Header="试验日期" Binding="{Binding TestDate}" Width="100"/> <DataGridTextColumn Header="试验日期" Binding="{Binding TestDate}" Width="100"/>
<DataGridTextColumn Header="持续时间" Binding="{Binding TestDuration}" Width="80"/> <DataGridTextColumn Header="持续时间" Binding="{Binding TestDuration}" Width="80"/>
<DataGridTextColumn Header="平衡状态" Binding="{Binding BalanceStatus}" Width="80"/> <DataGridTextColumn Header="平衡状态" Binding="{Binding BalanceStatus}" Width="100"/>
<DataGridTextColumn Header="备注" Binding="{Binding Remarks}" Width="150"/> <DataGridTextColumn Header="备注" Binding="{Binding Remarks}" Width="130"/>
</DataGrid.Columns> </DataGrid.Columns>
<DataGrid.CellStyle> <DataGrid.CellStyle>

View File

@@ -1,4 +1,5 @@
using jiancaiburanxing.data; using ClosedXML.Excel;
using jiancaiburanxing.data;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
@@ -165,37 +166,212 @@ namespace jiancaiburanxing
// 导出到Excel简化版本 // 导出到Excel简化版本
private void ExportToExcel(string filePath) //private void ExportToExcel(string filePath)
{ //{
using (var writer = new StreamWriter(filePath, false, Encoding.UTF8)) // using (var writer = new StreamWriter(filePath, false, Encoding.UTF8))
{ // {
// 写入标题 // // 写入标题
writer.WriteLine("建材不燃性试验数据报表"); // writer.WriteLine("建材不燃性试验数据报表");
writer.WriteLine($"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); // writer.WriteLine($"生成时间: {DateTime.Now:yyyy-MM-dd HH:mm:ss}");
writer.WriteLine("符合标准: GB/T 5464-2010"); // writer.WriteLine("符合标准: GB/T 5464-2010");
writer.WriteLine(); // writer.WriteLine();
// 写入表头 // // 写入表头
writer.WriteLine("试样编号,试样名称,试样规格,炉内初始温度(℃),炉内最高温度(℃),炉内最终温度(℃),温升(℃)," + // writer.WriteLine("试样编号,试样名称,试样规格,炉内初始温度(℃),炉内最高温度(℃),炉内最终温度(℃),温升(℃)," +
"试样中心最高温度(℃),试样中心最终温度(℃),试样表面最高温度(℃),试样表面最终温度(℃)," + // "试样中心最高温度(℃),试样中心最终温度(℃),试样表面最高温度(℃),试样表面最终温度(℃)," +
"试样初始质量(g),试样结束质量(g),质量损失(%),火焰持续时间(s),试验日期,试验持续时间,平衡状态,备注"); // "试样初始质量(g),试样结束质量(g),质量损失(%),火焰持续时间(s),试验日期,试验持续时间,平衡状态,备注");
// 写入数据 // // 写入数据
foreach (var item in _testData) // foreach (var item in _testData)
{ // {
writer.WriteLine($"{item.SampleCode},{item.SampleName},{item.SampleSpec}," + // writer.WriteLine($"{item.SampleCode},{item.SampleName},{item.SampleSpec}," +
$"{item.InitialTemp:F1},{item.MaxTemp:F1},{item.FinalTemp:F1},{item.TempRise:F1}," + // $"{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.CenterMaxTemp:F1},{item.CenterFinalTemp:F1},{item.SurfaceMaxTemp:F1},{item.SurfaceFinalTemp:F1}," +
$"{item.InitialWeight:F2},{item.FinalWeight:F2},{item.LossPercent:F2}," + // $"{item.InitialWeight:F2},{item.FinalWeight:F2},{item.LossPercent:F2}," +
$"{item.FlameDuration},{item.TestDate},{item.TestDuration},{item.BalanceStatus},{item.Remarks}"); // $"{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);
}
}
public void AddTestReportData(TestReportData data) public void AddTestReportData(TestReportData data)
{ {
Dispatcher.Invoke(() => Dispatcher.Invoke(() =>

View File

@@ -9,6 +9,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="ClosedXML" Version="0.105.0" />
<PackageReference Include="DevExpress.Wpf.Core" Version="22.2.*-*" /> <PackageReference Include="DevExpress.Wpf.Core" Version="22.2.*-*" />
<PackageReference Include="devexpress.wpf.layoutcontrol" Version="22.2.3" /> <PackageReference Include="devexpress.wpf.layoutcontrol" Version="22.2.3" />
<PackageReference Include="DevExpress.Wpf.Themes.All" Version="22.2.*-*" /> <PackageReference Include="DevExpress.Wpf.Themes.All" Version="22.2.*-*" />