@ -29,11 +29,15 @@ using FontFamily = System.Drawing.FontFamily;
using FontStyle = System . Drawing . FontStyle ;
using NPOI.SS.Formula.Functions ;
using System.Windows.Media ;
using HandyControl.Tools.Extension ;
using NPOI.SS.Util ;
using Brush = System . Drawing . Brush ;
using Brushes = System . Drawing . Brushes ;
using SparkClient.Model.Attributes ;
using SparkClient.Model.Common ;
using PaperSize = System . Drawing . Printing . PaperSize ;
using SharpDX.Direct2D1.Effects ;
namespace SparkClient.ViewModel.Grading ;
/// <summary>
@ -284,7 +288,10 @@ public class GradingResultVM : BaseViewModel
using ( var writer = new StreamWriter ( filePath , true ) )
{
Measurements info = algorithmResult . measurements ;
string line = $"{FormatDouble_A(info.M1)}(mm)," +
string line =
$"{DiamondCode}," +
$"{Wight}(ct)," +
$"{FormatDouble_A(info.M1)}(mm)," +
$"{FormatDouble_A(info.M2)}(mm)," +
$"{FormatDouble_A(info.M3)}(mm)," +
$"{FormatDouble_P(info.TABLE)}%," +
@ -302,6 +309,35 @@ public class GradingResultVM : BaseViewModel
writer . WriteLine ( line ) ;
}
}
else
{
File . Create ( filePath ) . Close ( ) ;
string header = "Diamond Code,Wight,Measurement1, Measurement2, Measurement3, Table, Crown Height,Pavilion Depth, Total Depth,Crown Angle, Pavilion Angle,Culet Size, Girdle Percent,Girdle Name, POL or Pol/ Sym,SYM,CUT - PROP" ;
Measurements info = algorithmResult . measurements ;
string line =
$"{DiamondCode}," +
$"{Wight}(ct)," +
$"{FormatDouble_A(info.M1)}(mm)," +
$"{FormatDouble_A(info.M2)}(mm)," +
$"{FormatDouble_A(info.M3)}(mm)," +
$"{FormatDouble_P(info.TABLE)}%," +
$"{FormatDouble_P(info.CROWN_HEIGHT)}%," +
$"{FormatDouble_P(info.PAV_DEPTH)}%," +
$"{FormatDouble_P(info.TOTAL_DEPTH)}%," +
$"{FormatDouble_A(info.CROWN_ANGLE)}°," +
$"{FormatDouble_A(info.PAV_ANGLE)}°," +
$"{FormatDouble_A(info.CULET_SIZE)}(mm)," +
$"{FormatDouble_P(info.GIRDLE)}%," +
$"{calGirdleName(info)}," +
$"," +
$"," +
$"{GetGradeEnName(GetGradeOrder(CutLevelTotal))}" ;
using ( var writer = new StreamWriter ( filePath , true ) )
{
writer . WriteLine ( header ) ;
writer . WriteLine ( line ) ;
}
}
}
private void saveTempDS ( string selValue )
@ -1586,7 +1622,7 @@ public class GradingResultVM : BaseViewModel
[Log]
public void ChangeSym ( object norm )
{
decimal? order = this . DtResults . Select ( x = > x . SymLevel ) . Max ( ) ;
decimal? order = this . DtResults . Where ( x = > x . TestItemId ! = "TWIST" ) . Select ( x = > x . SymLevel ) . Max ( ) ;
if ( order . HasValue )
{
totalSymGrade = order . Value ;
@ -1940,89 +1976,138 @@ public class GradingResultVM : BaseViewModel
[Log]
private void ExecuteThermalPrint ( object parameter )
{
try
{
// 创建打印文档
PrintDocument printDocument = new PrintDocument ( ) ;
//printDocument.PrintPage += PrintPageHandler;
// 订阅 PrintPage 事件
printDocument . PrintPage + = PreparePrintData ;
// 创建自定义打印预览窗体
CustomPrintPreviewForm customPreviewForm = new CustomPrintPreviewForm ( printDocument ) ;
// 显示自定义打印预览窗体
MessageBox messageBox = new MessageBox ( ) ;
MessageBoxResult boxResult = messageBox . ShowAsk ( MultilingualHelper . getString ( "YesOrNo" ) ) ;
if ( boxResult = = MessageBoxResult . OK )
if ( boxResult ! = MessageBoxResult . OK )
{
// 打开串口
// if (!_serialPort.IsOpen)
// {
// _serialPort.Open();
// }
// 将绘制内容转换为字节数组
// MemoryStream memoryStream = new MemoryStream();
// using (Bitmap bitmap = new Bitmap((int)printDocument.DefaultPageSettings.PrintableArea.Width, (int)printDocument.DefaultPageSettings.PrintableArea.Height))
// {
// using (var graphics = Graphics.FromImage(bitmap))
// {
// // 计算可打印区域的 Rectangle
// var margins = new Margins(0, 0, 0, 0);
// var printableArea = new System.Drawing.Rectangle(margins.Left, margins.Top,
// (int)printDocument.DefaultPageSettings.PrintableArea.Width - margins.Left - margins.Right,
// (int)printDocument.DefaultPageSettings.PrintableArea.Height - margins.Top - margins.Bottom);
/ /
// // 调用 PreparePrintData 方法绘制内容到 Graphics 对象
// // 注意这里的第三个参数应该是 Rectangle 类型
// PreparePrintData(printDocument, new PrintPageEventArgs(graphics, printableArea, printableArea, new PageSettings()));
// }
// // 将 Bitmap 保存到 MemoryStream 中
// bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
// }
// byte[] dataToSend = memoryStream.ToArray();
string? printName = ConfigurationManager . AppSettings [ "PrintName" ] ;
string? printWidth = ConfigurationManager . AppSettings [ "PrintWidth" ] ;
string? printHeight = ConfigurationManager . AppSettings [ "PrintHeight" ] ;
return ;
}
int pageWidth = 4 0 0 ;
int pageHeight = 3 0 0 ;
if ( string . IsNullOrWhiteSpace ( printName ) | | string . IsNullOrWhiteSpace ( printWidth ) | |
string . IsNullOrWhiteSpace ( printHeight ) )
string tempFilePath = string . Empty ;
Microsoft . Office . Interop . Excel . Application excelApp = null ;
try
{
Logger . Info ( "缺少打印配置。" ) ;
throw new Exception ( "The printer parameter is invalid" ) ;
}
int . TryParse ( printWidth , out pageWidth ) ;
int . TryParse ( printHeight , out pageHeight ) ;
// 步骤2:加载模板并填充数据
tempFilePath = GenerateTempExcelFile ( ) ;
printDocument . PrinterSettings . PrinterName = printName ;
printDocument . DefaultPageSettings . PaperSize = new PaperSize ( "mm" , pageWidth , pageHeight ) ;
printDocument . PrintController = new System . Drawing . Printing . StandardPrintController ( ) ;
// 步骤3:使用Excel Interop静默打印
excelApp = new Microsoft . Office . Interop . Excel . Application ( ) ;
excelApp . Visible = false ; // 不显示Excel窗口
excelApp . DisplayAlerts = false ; // 禁用警告提示
// DialogResult result = customPreviewForm.ShowDialog();
printDocument . Print ( ) ;
// 发送数据到串口
//_serialPort.Write(dataToSend, 0, dataToSend.Length);
Microsoft . Office . Interop . Excel . Workbook workbook = excelApp . Workbooks . Open ( tempFilePath ) ;
Logger . Info ( "数据已发送到热敏打印机。" ) ;
}
// 打印配置
workbook . PrintOut (
Copies : 1 ,
Preview : false // 禁用打印预览
) ;
// 关闭工作簿(不保存修改)
workbook . Close ( SaveChanges : false ) ;
}
catch ( Exception ex )
{
Logger . Error ( $"热敏打印发生错误: {ex.Message}" ) ;
Growl . Error ( MultilingualHelper . getString ( "DiamodResultPrintError" ) ) ;
new MessageBox ( ) . Show ( $"打印失败: {ex.Message}" ) ;
}
finally
{
// 关闭串口
// if (_serialPort.IsOpen)
// 步骤4:清理资源
if ( excelApp ! = null )
{
excelApp . Quit ( ) ;
System . Runtime . InteropServices . Marshal . ReleaseComObject ( excelApp ) ;
}
// 删除临时文件
if ( File . Exists ( tempFilePath ) )
{
File . Delete ( tempFilePath ) ;
}
}
// try
// {
// // 创建打印文档
// PrintDocument printDocument = new PrintDocument();
// //printDocument.PrintPage += PrintPageHandler;
// // 订阅 PrintPage 事件
// printDocument.PrintPage += PreparePrintData;
/ /
// // 创建自定义打印预览窗体
// CustomPrintPreviewForm customPreviewForm = new CustomPrintPreviewForm(printDocument);
/ /
// // 显示自定义打印预览窗体
//
// MessageBox messageBox = new MessageBox();
// MessageBoxResult boxResult = messageBox.ShowAsk(MultilingualHelper.getString("YesOrNo"));
// if (boxResult == MessageBoxResult.OK)
// {
// _serialPort.Close();
// // 打开串口
// // if (!_serialPort.IsOpen)
// // {
// // _serialPort.Open();
// // }
/ /
// // 将绘制内容转换为字节数组
// // MemoryStream memoryStream = new MemoryStream();
// // using (Bitmap bitmap = new Bitmap((int)printDocument.DefaultPageSettings.PrintableArea.Width, (int)printDocument.DefaultPageSettings.PrintableArea.Height))
// // {
// // using (var graphics = Graphics.FromImage(bitmap))
// // {
// // // 计算可打印区域的 Rectangle
// // var margins = new Margins(0, 0, 0, 0);
// // var printableArea = new System.Drawing.Rectangle(margins.Left, margins.Top,
// // (int)printDocument.DefaultPageSettings.PrintableArea.Width - margins.Left - margins.Right,
// // (int)printDocument.DefaultPageSettings.PrintableArea.Height - margins.Top - margins.Bottom);
// //
// // // 调用 PreparePrintData 方法绘制内容到 Graphics 对象
// // // 注意这里的第三个参数应该是 Rectangle 类型
// // PreparePrintData(printDocument, new PrintPageEventArgs(graphics, printableArea, printableArea, new PageSettings()));
// // }
// // // 将 Bitmap 保存到 MemoryStream 中
// // bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Png);
// // }
// // byte[] dataToSend = memoryStream.ToArray();
// string? printName = ConfigurationManager.AppSettings["PrintName"];
// string? printWidth = ConfigurationManager.AppSettings["PrintWidth"];
// string? printHeight = ConfigurationManager.AppSettings["PrintHeight"];
/ /
// int pageWidth = 400;
// int pageHeight = 300;
// if (string.IsNullOrWhiteSpace(printName) || string.IsNullOrWhiteSpace(printWidth) ||
// string.IsNullOrWhiteSpace(printHeight) )
// {
// Logger.Info("缺少打印配置。");
// throw new Exception("The printer parameter is invalid");
// }
// int.TryParse(printWidth, out pageWidth);
// int.TryParse(printHeight, out pageHeight);
/ /
// printDocument.PrinterSettings.PrinterName = printName;
// printDocument.DefaultPageSettings.PaperSize = new PaperSize("mm", pageWidth, pageHeight);
// printDocument.PrintController = new System.Drawing.Printing.StandardPrintController();
//
// // DialogResult result = customPreviewForm.ShowDialog();
// printDocument.Print();
// // 发送数据到串口
// //_serialPort.Write(dataToSend, 0, dataToSend.Length);
/ /
// Logger.Info("数据已发送到热敏打印机。");
// }
// }
// catch (Exception ex)
// {
// Logger.Error($"热敏打印发生错误: {ex.Message}");
// Growl.Error(MultilingualHelper.getString("DiamodResultPrintError"));
// }
// finally
// {
// // 关闭串口
// // if (_serialPort.IsOpen)
// // {
// // _serialPort.Close();
// // }
// }
}
}
// 自定义打印预览窗体类
@ -2238,6 +2323,99 @@ public class GradingResultVM : BaseViewModel
}
private string GenerateTempExcelFile ( )
{
string TemplatePath = @"Resource\ResultReport.xlsx" ;
using ( FileStream templateStream = new FileStream ( TemplatePath , FileMode . Open , FileAccess . Read ) )
{
IWorkbook workbook = new XSSFWorkbook ( templateStream ) ;
ISheet sheet = workbook . GetSheetAt ( 0 ) ;
//Row 1
SetCellValue ( sheet , "A1" , $"{MultilingualHelper.getString(" Organization ")}:{Standard}" ) ;
SetCellValue ( sheet , "B1" , $"{MultilingualHelper.getString(" DiamondResultShape ")}:{Shape}" ) ;
SetCellValue ( sheet , "C1" , $"{MultilingualHelper.getString(" Code ")}:{DiamondCode}" ) ;
SetCellValue ( sheet , "E1" , $"{MultilingualHelper.getString(" Wight ")}:{Wight}ct." ) ;
//Row 2
SetCellValue ( sheet , "A2" , $"{MultilingualHelper.getString(" Parameters ")}" ) ;
SetCellValue ( sheet , "B2" , $"{MultilingualHelper.getString(" DiamondResultGridAvgValue ")}" ) ;
SetCellValue ( sheet , "C2" , $"{MultilingualHelper.getString(" Interval ")}(Min~Max)" ) ;
SetCellValue ( sheet , "D2" , $"{MultilingualHelper.getString(" DiamondResultGridCutLevel ")}" ) ;
SetCellValue ( sheet , "E2" , $"{MultilingualHelper.getString(" DiamondResultSymmetryGrade ")}" ) ;
//Row 3
var row3 = getSelectData ( "DIAMETER" ) ;
SetCellValue ( sheet , "A3" , $"{GetName(" DIAMETER ")}(mm)" ) ;
SetCellValue ( sheet , "B3" , $"{row3.Avg}" ) ;
SetCellValue ( sheet , "C3" , $"({row3.Min}~{row3.Max})" ) ;
SetCellValue ( sheet , "D3" , "--" ) ;
SetCellValue ( sheet , "E3" , $"{row3.SymLevel}" ) ;
//Row 4
var row4 = getSelectData ( "TOTAL_DEPTH" ) ;
SetCellValue ( sheet , "A4" , $"{GetName(" TOTAL_DEPTH ")}(%)" ) ;
SetCellValue ( sheet , "B4" , $"{row4.Avg}" ) ;
SetCellValue ( sheet , "C4" , "--" ) ;
SetCellValue ( sheet , "D4" , $"{row4.CutLevel}" ) ;
SetCellValue ( sheet , "E4" , "--" ) ;
// Row 5
var row5 = getSelectData ( "TABLE" ) ;
SetCellValue ( sheet , "A5" , $"{GetName(" TABLE ")}(%)" ) ;
SetCellValue ( sheet , "B5" , $"{row5.Avg}" ) ;
SetCellValue ( sheet , "C5" , $"({row5.Min}~{row5.Max})" ) ;
SetCellValue ( sheet , "D5" , $"{row5.CutLevel}" ) ;
SetCellValue ( sheet , "E5" , "--" ) ;
var row6 = getSelectData ( "CROWN_ANGLE" ) ;
SetCellValue ( sheet , "A6" , $"{GetName(" CROWN_ANGLE ")}(°)" ) ;
SetCellValue ( sheet , "B6" , $"{row6.Avg}" ) ;
SetCellValue ( sheet , "C6" , $"({row6.Min}~{row6.Max})" ) ;
SetCellValue ( sheet , "D6" , $"{row6.CutLevel}" ) ;
SetCellValue ( sheet , "E6" , $"{row6.SymLevel}" ) ;
var row7 = getSelectData ( "CROWN_HEIGHT" ) ;
SetCellValue ( sheet , "A7" , $"{GetName(" CROWN_HEIGHT ")}(%)" ) ;
SetCellValue ( sheet , "B7" , $"{row7.Avg}" ) ;
SetCellValue ( sheet , "C7" , $"({row7.Min}~{row7.Max})" ) ;
SetCellValue ( sheet , "D7" , $"{row7.CutLevel}" ) ;
SetCellValue ( sheet , "E7" , $"{row7.SymLevel}" ) ;
var row8 = getSelectData ( "GIRDLE" ) ;
SetCellValue ( sheet , "A8" , $"{GetName(" GIRDLE ")}(%)" ) ;
SetCellValue ( sheet , "B8" , $"{row8.Avg}" ) ;
SetCellValue ( sheet , "C8" , $"({row8.Min}~{row8.Max})" ) ;
SetCellValue ( sheet , "D8" , $"{row8.CutLevel}" ) ;
SetCellValue ( sheet , "E8" , $"{row8.SymLevel}" ) ;
var row9 = getSelectData ( "PAV_DEPTH" ) ;
SetCellValue ( sheet , "A9" , $"{GetName(" PAV_DEPTH ")}(%)" ) ;
SetCellValue ( sheet , "B9" , $"{row9.Avg}" ) ;
SetCellValue ( sheet , "C9" , $"({row9.Min}~{row9.Max})" ) ;
SetCellValue ( sheet , "D9" , $"{row9.CutLevel}" ) ;
SetCellValue ( sheet , "E9" , $"{row9.SymLevel}" ) ;
//row 10
//Row 11
SetCellValue ( sheet , "A11" , $"{MultilingualHelper.getString(" CuttingGrade ")}" ) ;
SetCellValue ( sheet , "B11" , $"{CutLevelTotal}" ) ;
//Row 12
SetCellValue ( sheet , "A12" , $"{MultilingualHelper.getString(" SymmetryLevel ")}" ) ;
SetCellValue ( sheet , "B12" , $"{SymLevelTotal}" ) ;
SetCellValue ( sheet , "C12" , $"{MultilingualHelper.getString(" DateOfIssue ")}: {DateTime.Now:yyyy/M/d}" ) ;
// 生成临时文件路径
string tempFile = Path . Combine (
Path . GetTempPath ( ) ,
$"DiamondReport_{DateTime.Now:yyyyMMddHHmmss}.xlsx" ) ;
using ( FileStream fs = new FileStream ( tempFile , FileMode . Create ) )
{
workbook . Write ( fs ) ;
}
return tempFile ;
}
}
[Log]
private void SetCellValue ( ISheet sheet , string cellAddress , object value )
{
var cellRef = new CellReference ( cellAddress ) ;
IRow row = sheet . GetRow ( cellRef . Row ) ? ? sheet . CreateRow ( cellRef . Row ) ;
ICell cell = row . GetCell ( cellRef . Col ) ? ? row . CreateCell ( cellRef . Col ) ;
cell . SetCellValue ( value ? . ToString ( ) ? ? "" ) ;
}
[Log]
private void PrintPageHandler ( object sender , PrintPageEventArgs e )
{