From e6aed9d06ab8381777d65a39ddbe446c2387871b Mon Sep 17 00:00:00 2001 From: anerx <512464164@qq.com> Date: Sun, 23 Mar 2025 18:29:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BE=9B=E6=8A=A5=E8=A1=A8=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/ReportExportService.cs | 86 +++++++++++------- .../Seyounth.Hyosung.Data.csproj | 6 ++ Seyounth.Hyosung.Data/exportTemp.xlsx | Bin 0 -> 13497 bytes 3 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 Seyounth.Hyosung.Data/exportTemp.xlsx diff --git a/Seyounth.Hyosung.Data/Services/ReportExportService.cs b/Seyounth.Hyosung.Data/Services/ReportExportService.cs index 78ba304..5f7d88c 100644 --- a/Seyounth.Hyosung.Data/Services/ReportExportService.cs +++ b/Seyounth.Hyosung.Data/Services/ReportExportService.cs @@ -1,6 +1,8 @@ using System.Data; +using System.Globalization; using ClosedXML.Excel; using Microsoft.Extensions.Logging; +using Seyounth.Hyosung.Data.Models; namespace Seyounth.Hyosung.Data.Services; @@ -11,46 +13,67 @@ public class ReportExportService( ILogger logger) : IReportExportService { + const string TempPath = "./temp.xlsx"; + public async Task ExportAsync(string trayCode) { - var tray = await trayService.GetByCode(trayCode); - var variety = await varietyService.GetById(tray.VarietyId); - var yarns = await yarnService.GetYarnsByTrayIdAsync(tray.Id); - DataTable dt = new DataTable(); - dt.Columns.Add("托盘号", typeof(string)); - dt.Columns.Add("品类编号", typeof(string)); - dt.Columns.Add("品类", typeof(string)); - dt.Columns.Add("Lot", typeof(string)); - dt.Columns.Add("纱二维码", typeof(string)); - dt.Columns.Add("DEN_FILA", typeof(string)); - dt.Columns.Add("DTEX_FILA", typeof(string)); - dt.Columns.Add("码垛时间", typeof(string)); - dt.Columns.Add("控制号", typeof(string)); - foreach (var yarn in yarns) + try { - dt.Rows.Add( - tray.TrayCode, - variety.Id.ToString(), - variety.Code, - yarn.Lot.ToString(), - yarn.QrCode.Replace("\r\n", " "), - yarn.DenFila, - yarn.DtexFila, - yarn.StackTime?.ToString("yyyy-MM-dd HH:mm:ss"), - tray.ControlNo.ToString() - ); + var tray = await trayService.GetByCode(trayCode); + var variety = await varietyService.GetById(tray.VarietyId); + var yarns = await yarnService.GetYarnsByTrayIdAsync(tray.Id); + await Create(tray, variety, yarns); + await trayService.ExportedAsync(tray.TrayCode); + } + catch (Exception e) + { + logger.LogError(e, $"export report [{trayCode}] error"); + } + } + + private async Task Create(Tray tray, Variety variety, List yarns) + { + using var workbook = new XLWorkbook(TempPath); + var worksheet = workbook.Worksheet(1); // 假设使用第一个工作表 + + worksheet.Cell("D2").Value = tray.Barcode; // 填充 TrayCode 到第一列 + worksheet.Cell("D3").Value = variety.Code; // 填充 VarietyName 到第二列 + worksheet.Cell("D4").Value = tray.DenFila; + worksheet.Cell("I3").Value = tray.FinishTime?.ToString("yyyy-MM-dd HH:mm:ss"); + worksheet.Cell("I4").Value = tray.DtexFila; + worksheet.Cell("L3").Value = tray.Grade; + worksheet.Cell("M3").Value = variety.StackingLayers; + worksheet.Cell("N3").Value = tray.Unit?.ToString(); + worksheet.Cell("O3").Value = yarns.Count.ToString(); + worksheet.Cell("P3").Value = tray.ControlNo?.ToString(); + worksheet.Cell("Q3").Value = tray.GrossWeight.ToString(CultureInfo.InvariantCulture); + worksheet.Cell("R3").Value = tray.NetWeight.ToString(CultureInfo.InvariantCulture); + + int row = 8; // 假设数据从第二行开始填充 + for (int i = 1; i <= yarns.Count; i++) + { + worksheet.Cell(row, "B").Value = i; // 填充 YarnId 到第一列 + worksheet.Cell(row, "C").Value = yarns[i - 1].Lot; // 填充 YarnName 到第二列 + worksheet.Cell(row, "D").Value = variety.Code; // 填充 YarnName 到第二列 + worksheet.Cell(row, "F").Value = yarns[i - 1].WorkShift; + worksheet.Cell(row, "H").Value = yarns[i - 1].QrCode; + worksheet.Cell(row, "p").Value = yarns[i - 1].StackTime?.ToString("yyyy-MM-dd HH:mm:ss"); + row++; } + // 自动调整列宽 + // worksheet.Columns().AdjustToContents(); + // 获取数据区域 + var dataRange = worksheet.Range(8, 2, row, 18); + // 设置外边框样式 + dataRange.Style.Border.OutsideBorder = XLBorderStyleValues.Thick; + dataRange.Style.Border.OutsideBorderColor = XLColor.Black; var path = await GetDirectoryAsync(tray.FinishTime); var fileName = $"{variety.Id}-{variety.Code}-{tray.TrayCode}-{tray.FinishTime?.ToString("yyyyMMddHHmmss")}.xlsx"; var filePath = Path.Combine(path, fileName); - using var workbook = new XLWorkbook(); - var worksheet = workbook.Worksheets.Add(dt, "纱信息"); - worksheet.Columns().AdjustToContents(); + // 保存工作簿到新文件 workbook.SaveAs(filePath); - await trayService.ExportedAsync(tray.TrayCode); - logger.LogInformation($"export report [{tray.TrayCode}]:{filePath}"); } public async Task ExportNoExportAsync() @@ -71,10 +94,11 @@ public class ReportExportService( public async Task GetDirectoryAsync(DateTime? date = null) { + var root = "D:\\码垛报告"; if (date is null) date = DateTime.Now; // 构建文件夹路径,格式为 年/月/日 - string directoryPath = Path.Combine(date.Value.Year.ToString(), date.Value.Month.ToString(), + string directoryPath = Path.Combine(root, date.Value.Year.ToString(), date.Value.Month.ToString(), date.Value.Day.ToString()); // 检查文件夹是否存在 diff --git a/Seyounth.Hyosung.Data/Seyounth.Hyosung.Data.csproj b/Seyounth.Hyosung.Data/Seyounth.Hyosung.Data.csproj index a4c365b..028439a 100644 --- a/Seyounth.Hyosung.Data/Seyounth.Hyosung.Data.csproj +++ b/Seyounth.Hyosung.Data/Seyounth.Hyosung.Data.csproj @@ -20,4 +20,10 @@ + + + PreserveNewest + + + diff --git a/Seyounth.Hyosung.Data/exportTemp.xlsx b/Seyounth.Hyosung.Data/exportTemp.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..862f08ba242750340c905723a981b2331cb80b7a GIT binary patch literal 13497 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 literal 0 HcmV?d00001