using System.Data; using System.Globalization; using ClosedXML.Excel; using Microsoft.Extensions.Logging; using Seyounth.Hyosung.Data.Models; namespace Seyounth.Hyosung.Data.Services; public class ReportExportService( IYarnService yarnService, IVarietyService varietyService, ITrayService trayService, ILogger logger) : IReportExportService { const string TempPath = "./temp.xlsx"; public async Task ExportAsync(string trayCode) { try { 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); // 保存工作簿到新文件 workbook.SaveAs(filePath); } public async Task ExportNoExportAsync() { var codes = await trayService.GetNoExportCodesAsync(); codes.ForEach(async void (code) => { try { await ExportAsync(code); } catch (Exception e) { logger.LogError(e, $"export report [{code}] error"); } }); } public async Task GetDirectoryAsync(DateTime? date = null) { var root = "D:\\码垛报告"; if (date is null) date = DateTime.Now; // 构建文件夹路径,格式为 年/月/日 string directoryPath = Path.Combine(root, date.Value.Year.ToString(), date.Value.Month.ToString(), date.Value.Day.ToString()); // 检查文件夹是否存在 if (!Directory.Exists(directoryPath)) { // 如果不存在,则创建文件夹 await Task.Run(() => Directory.CreateDirectory(directoryPath)); } return directoryPath; } }