This commit is contained in:
xyy
2026-04-11 08:51:47 +08:00
parent 7c0e057cf4
commit 9da91d4ca5
3 changed files with 151 additions and 17 deletions

View File

@@ -1,8 +1,9 @@
using System;
using MembranePoreTester.Communication;
using Microsoft.Extensions.Configuration;
using OfficeOpenXml;
using System;
using System.IO;
using System.Windows;
using MembranePoreTester.Communication;
using Microsoft.Extensions.Configuration;
namespace MembranePoreTester
{
@@ -13,6 +14,9 @@ namespace MembranePoreTester
protected async override void OnStartup(StartupEventArgs e)
{
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
base.OnStartup(e);
using var db = new AppDbContext();

View File

@@ -122,7 +122,7 @@
<!-- 历史记录列表(带边框) -->
<Border Grid.Row="1" Background="White" CornerRadius="6" BorderBrush="#E9ECF0" BorderThickness="1" Padding="5">
<DataGrid x:Name="dgHistory" AutoGenerateColumns="False"
IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow"
IsReadOnly="True" SelectionMode="Extended" SelectionUnit="FullRow"
BorderThickness="0" HorizontalGridLinesBrush="#E9ECF0">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}" Width="50"/>

View File

@@ -1,5 +1,6 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Win32;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -74,49 +75,178 @@ namespace MembranePoreTester.Views
dgHistory.ItemsSource = query.OrderByDescending(x => ((dynamic)x).TestDate).ToList();
}
//private void ExportSelected_Click(object sender, RoutedEventArgs e)
//{
// if (dgHistory.SelectedItem == null)
// {
// MessageBox.Show("请先选中一条记录");
// return;
// }
// dynamic selected = dgHistory.SelectedItem;
// int id = selected.Id;
// string type = selected.Type;
// var saveFileDialog = new SaveFileDialog
// {
// Filter = "Excel文件|*.xlsx",
// FileName = $"{type}_{id}.xlsx"
// };
// if (saveFileDialog.ShowDialog() == true)
// {
// if (type == "泡点法")
// {
// using var db = new AppDbContext();
// var entity = db.BubblePointRecords.Find(id);
// if (entity != null)
// {
// ExportHelper.ExportBubblePoint(entity, saveFileDialog.FileName);
// }
// }
// else
// {
// using var db = new AppDbContext();
// var entity = db.PoreDistributionRecords
// .Include(p => p.DataPoints)
// .FirstOrDefault(p => p.Id == id);
// if (entity != null)
// {
// ExportHelper.ExportPoreDistribution(entity, saveFileDialog.FileName);
// }
// }
// }
//}
private void ExportSelected_Click(object sender, RoutedEventArgs e)
{
if (dgHistory.SelectedItem == null)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
if (dgHistory.SelectedItems.Count == 0)
{
MessageBox.Show("请选中一条记录");
MessageBox.Show("请至少选中一条记录", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
return;
}
dynamic selected = dgHistory.SelectedItem;
int id = selected.Id;
string type = selected.Type;
var saveFileDialog = new SaveFileDialog
{
Filter = "Excel文件|*.xlsx",
FileName = $"{type}_{id}.xlsx"
FileName = $"历史记录_{DateTime.Now:yyyyMMddHHmmss}.xlsx"
};
if (saveFileDialog.ShowDialog() == true)
if (saveFileDialog.ShowDialog() != true) return;
using var package = new OfficeOpenXml.ExcelPackage();
int sheetIndex = 1;
foreach (dynamic selected in dgHistory.SelectedItems)
{
int id = selected.Id;
string type = selected.Type;
string sheetName = $"{type}_{id}";
// Excel 工作表名称长度限制 31 字符,且不能包含特殊字符
sheetName = new string(sheetName.Take(31).ToArray()).Replace('/', '_').Replace('\\', '_').Replace('?', '_').Replace('*', '_').Replace('[', '_').Replace(']', '_');
using var db = new AppDbContext();
if (type == "泡点法")
{
using var db = new AppDbContext();
var entity = db.BubblePointRecords.Find(id);
if (entity != null)
{
ExportHelper.ExportBubblePoint(entity, saveFileDialog.FileName);
var sheet = package.Workbook.Worksheets.Add(sheetName);
// 使用辅助方法填充数据到工作表
FillBubblePointSheet(sheet, entity);
}
}
else
else if (type == "孔分布")
{
using var db = new AppDbContext();
var entity = db.PoreDistributionRecords
.Include(p => p.DataPoints)
.FirstOrDefault(p => p.Id == id);
if (entity != null)
{
ExportHelper.ExportPoreDistribution(entity, saveFileDialog.FileName);
var sheet = package.Workbook.Worksheets.Add(sheetName);
FillPoreDistributionSheet(sheet, entity);
}
}
sheetIndex++;
}
package.SaveAs(saveFileDialog.FileName);
MessageBox.Show($"成功导出 {dgHistory.SelectedItems.Count} 条记录到文件", "导出完成", MessageBoxButton.OK, MessageBoxImage.Information);
}
private void FillBubblePointSheet(OfficeOpenXml.ExcelWorksheet sheet, BubblePointEntity entity)
{
sheet.Cells["A1"].Value = "工位";
sheet.Cells["B1"].Value = entity.StationId;
sheet.Cells["A2"].Value = "测试日期";
sheet.Cells["B2"].Value = entity.TestDate.ToString("yyyy-MM-dd HH:mm:ss");
sheet.Cells["A3"].Value = "测试者";
sheet.Cells["B3"].Value = entity.Tester;
sheet.Cells["A4"].Value = "样品类型";
sheet.Cells["B4"].Value = entity.SampleType;
sheet.Cells["A5"].Value = "规格";
sheet.Cells["B5"].Value = entity.SampleSpec;
sheet.Cells["A6"].Value = "室温(°C)";
sheet.Cells["B6"].Value = entity.RoomTemperature;
sheet.Cells["A7"].Value = "浸润时间(h)";
sheet.Cells["B7"].Value = entity.SoakingTime;
sheet.Cells["A8"].Value = "测试液体";
sheet.Cells["B8"].Value = entity.LiquidName;
sheet.Cells["A9"].Value = "液体生产厂家";
sheet.Cells["B9"].Value = entity.LiquidManufacturer;
sheet.Cells["A10"].Value = "泡点压力";
sheet.Cells["B10"].Value = $"{entity.BubblePointPressure} {entity.PressureUnit}";
sheet.Cells["A11"].Value = "最大孔径(μm)";
sheet.Cells["B11"].Value = entity.MaxPoreSize;
sheet.Cells.AutoFitColumns();
}
private void FillPoreDistributionSheet(OfficeOpenXml.ExcelWorksheet sheet, PoreDistributionEntity entity)
{
sheet.Cells["A1"].Value = "工位";
sheet.Cells["B1"].Value = entity.StationId;
sheet.Cells["A2"].Value = "测试日期";
sheet.Cells["B2"].Value = entity.TestDate.ToString("yyyy-MM-dd HH:mm:ss");
sheet.Cells["A3"].Value = "测试者";
sheet.Cells["B3"].Value = entity.Tester;
sheet.Cells["A4"].Value = "样品类型";
sheet.Cells["B4"].Value = entity.SampleType;
sheet.Cells["A5"].Value = "规格";
sheet.Cells["B5"].Value = entity.SampleSpec;
sheet.Cells["A6"].Value = "室温(°C)";
sheet.Cells["B6"].Value = entity.RoomTemperature;
sheet.Cells["A7"].Value = "浸润时间(h)";
sheet.Cells["B7"].Value = entity.SoakingTime;
sheet.Cells["A8"].Value = "测试液体";
sheet.Cells["B8"].Value = entity.LiquidName;
sheet.Cells["A9"].Value = "液体生产厂家";
sheet.Cells["B9"].Value = entity.LiquidManufacturer;
sheet.Cells["A10"].Value = "泡点压力";
sheet.Cells["B10"].Value = $"{entity.BubblePointPressure} {entity.PressureUnit}";
sheet.Cells["A11"].Value = "平均孔径(μm)";
sheet.Cells["B11"].Value = entity.AveragePoreSize;
// 数据点表格
sheet.Cells["A13"].Value = "压力(kPa)";
sheet.Cells["B13"].Value = "湿膜流量(L/min)";
sheet.Cells["C13"].Value = "干膜流量(L/min)";
int row = 14;
foreach (var dp in entity.DataPoints)
{
sheet.Cells[$"A{row}"].Value = dp.Pressure;
sheet.Cells[$"B{row}"].Value = dp.WetFlow;
sheet.Cells[$"C{row}"].Value = dp.DryFlow;
row++;
}
sheet.Cells.AutoFitColumns();
}
private void LoadToCurrentStation_Click(object sender, RoutedEventArgs e)
{
if (dgHistory.SelectedItem == null) return;