Valeo_Line_MES_backend/RIZO.Service/MES/product/ProPlanAchievementrateService.cs
2026-01-12 14:57:56 +08:00

575 lines
30 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using SqlSugar;
using Infrastructure.Attribute;
using Infrastructure.Extensions;
using RIZO.Model;
using RIZO.Model.Dto;
using RIZO.Model.MES.product;
using RIZO.Model.MES.product.Dto;
using RIZO.Repository;
using RIZO.Service.MES.product.IService;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Infrastructure;
using static System.Runtime.InteropServices.JavaScript.JSType;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Globalization;
using NPOI.HSSF.Record;
using JinianNet.JNTemplate;
namespace RIZO.Service.MES.product
{
/// <summary>
/// 日计划达成率Service业务层处理
/// </summary>
[AppService(ServiceType = typeof(IProPlanAchievementrateService), ServiceLifetime = LifeTime.Transient)]
public class ProPlanAchievementrateService : BaseService<ProPlanAchievementrate>, IProPlanAchievementrateService
{
/// <summary>
/// 查询日计划达成率列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<ProPlanAchievementrateDto> GetList(ProPlanAchievementrateQueryDto parm)
{
var predicate = Expressionable.Create<ProPlanAchievementrate>()
.AndIF(!string.IsNullOrEmpty(parm.Project), it => it.Project.Contains(parm.Project))
.AndIF(parm.RecordDate > DateTime.MinValue, it => it.RecordDate == parm.RecordDate)
;
var response = Queryable()
.Where(predicate.ToExpression())
.ToPage<ProPlanAchievementrate, ProPlanAchievementrateDto>(parm);
return response;
}
/// <summary>
/// 生成每日的计划达成率
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public bool DayofplanAchievementRate([FromBody] ProPlanAchievementrateQueryDto3 parm)
{
int result = 0;
List<ProPlanAchievementrate> AproPlanAchievementrates = Context.Queryable<ProWorkorder>()
.LeftJoin<ProReportwork>((w, r) => w.Workorder == r.FkWorkorder)
.Where((w, r) => w.WorkorderDate == parm.GenarateDate && w.AorBgroup == "A")
.GroupBy((w, r) => new { w.Project, w.AorBgroup })
.Select((w, r) => new ProPlanAchievementrate()
{
Project = w.Project,
AgroupProductNum = SqlFunc.AggregateSum(r.FinishedNum),
AgroupMonitor = SqlFunc.AggregateMax(w.Groupleader),
AgroupPlanNum = SqlFunc.AggregateSum(w.DeliveryNum),
AgroupCompletionRate = SqlFunc.Round<decimal>((decimal)(SqlFunc.AggregateSum(r.FinishedNum) / SqlFunc.AggregateSum(w.DeliveryNum)), 2) * 100,
//BgroupProductNum = SqlFunc.AggregateSum(r.FinishedNum),
//BgroupPlanNum = SqlFunc.AggregateSum(w.DeliveryNum),
//BgroupCompletionRate = SqlFunc.Round<decimal>((decimal)(SqlFunc.AggregateSum(r.FinishedNum) / SqlFunc.AggregateSum(w.DeliveryNum)), 2) * 100,
SummaryActualNum = SqlFunc.AggregateSum(r.FinishedNum),
SummaryPlanNum = SqlFunc.AggregateSum(w.DeliveryNum),
SummaryPlanAchievementRate = SqlFunc.Round<decimal>((decimal)(SqlFunc.AggregateSum(r.FinishedNum) / SqlFunc.AggregateSum(w.DeliveryNum)), 2) * 100,
RecordDate = parm.GenarateDate
}).ToList();
List<ProPlanAchievementrate> BproPlanAchievementrates = Context.Queryable<ProWorkorder>()
.LeftJoin<ProReportwork>((w, r) => w.Workorder == r.FkWorkorder)
.Where((w, r) => w.WorkorderDate == parm.GenarateDate && w.AorBgroup == "B")
.GroupBy((w, r) => new { w.Project, w.AorBgroup, w.Groupleader })
.Select((w, r) => new ProPlanAchievementrate()
{
Project = w.Project,
//AgroupProductNum = SqlFunc.AggregateSum(r.FinishedNum),
//AgroupPlanNum = SqlFunc.AggregateSum(w.DeliveryNum),
//AgroupCompletionRate = SqlFunc.Round<decimal>((decimal)(SqlFunc.AggregateSum(r.FinishedNum) / SqlFunc.AggregateSum(w.DeliveryNum)), 2) * 100,
BgroupProductNum = SqlFunc.AggregateSum(r.FinishedNum),
BgroupPlanNum = SqlFunc.AggregateSum(w.DeliveryNum),
BgroupMonitor = SqlFunc.AggregateMax(w.Groupleader),
BgroupCompletionRate = SqlFunc.Round<decimal>((decimal)(SqlFunc.AggregateSum(r.FinishedNum) / SqlFunc.AggregateSum(w.DeliveryNum)), 2) * 100,
SummaryActualNum = SqlFunc.AggregateSum(r.FinishedNum),
SummaryPlanNum = SqlFunc.AggregateSum(w.DeliveryNum),
SummaryPlanAchievementRate = SqlFunc.Round<decimal>((decimal)(SqlFunc.AggregateSum(r.FinishedNum) / SqlFunc.AggregateSum(w.DeliveryNum)), 2) * 100,
RecordDate = parm.GenarateDate
}).ToList();
if (AproPlanAchievementrates.Count > 0 && BproPlanAchievementrates.Count > 0)
{
var merged = AproPlanAchievementrates
.Join(
BproPlanAchievementrates,
a => a.Project, // A 的 key用于 Join
b => b.Project, // B 的 key用于 Join
(a, b) => new ProPlanAchievementrate
{
Project = a.Project,
// A 组数据
AgroupProductNum = a.AgroupProductNum,
AgroupPlanNum = a.AgroupPlanNum,
AgroupCompletionRate = a.AgroupCompletionRate,
AgroupMonitor = a.AgroupMonitor,
// B 组数据
BgroupProductNum = b.BgroupProductNum,
BgroupPlanNum = b.BgroupPlanNum,
BgroupCompletionRate = b.BgroupCompletionRate,
BgroupMonitor = b.BgroupMonitor,
// 汇总数据
SummaryActualNum = (a.SummaryActualNum ?? 0) + (b.SummaryActualNum ?? 0),
SummaryPlanNum = (a.SummaryPlanNum ?? 0) + (b.SummaryPlanNum ?? 0),
SummaryPlanAchievementRate = SqlFunc.Round<decimal>(
(decimal)((a.SummaryActualNum ?? 0) + (b.SummaryActualNum ?? 0)) /
(decimal)((a.SummaryPlanNum ?? 0) + (b.SummaryPlanNum ?? 0)), 2) * 100,
RecordDate = a.RecordDate,
CreatedTime = DateTime.Now,
UpdatedTime = DateTime.Now,
}
);
List<ProPlanAchievementrate> finalList = merged.ToList();
UseTran2(() =>
{
Context.Deleteable<ProPlanAchievementrate>().Where(it => it.RecordDate == parm.GenarateDate);
result = Context.Insertable(finalList).ExecuteCommand();
});
}
return result > 0;
}
/// <summary>
/// 查询月计划达成率列表
/// </summary>
/// <param name="parm"></param>
/// <returns></returns>
public PagedInfo<ProPlanAchievementrateDto> GetListByMonth(ProPlanAchievementrateQueryDto2 parm)
{
(DateTime FirstDay, DateTime LastDay) Handlemonth = GetFirstAndLastDayOfMonth(parm.SearchYearMonth);
var predicate = Expressionable.Create<ProPlanAchievementrate>()
.AndIF(!string.IsNullOrEmpty(parm.Project), it => it.Project.Contains(parm.Project))
.And(it => it.RecordDate >= Handlemonth.FirstDay && it.RecordDate <= Handlemonth.LastDay)
;
var response = Queryable()
.Where(predicate.ToExpression())
.GroupBy(it => it.Project)
.Select(it => new ProPlanAchievementrate()
{
Project = it.Project,
AgroupPlanNum = SqlFunc.AggregateSum(it.AgroupPlanNum ?? 0),
AgroupProductNum = SqlFunc.AggregateSum(it.AgroupProductNum ?? 0),
AgroupCompletionRate = SqlFunc.AggregateAvg(it.AgroupCompletionRate),
BgroupPlanNum = SqlFunc.AggregateSum(it.BgroupPlanNum ?? 0),
BgroupProductNum = SqlFunc.AggregateSum(it.BgroupProductNum ?? 0),
BgroupCompletionRate = SqlFunc.AggregateAvg(it.BgroupCompletionRate),
SummaryActualNum = SqlFunc.AggregateSum(it.SummaryActualNum ?? 0),
SummaryPlanNum = SqlFunc.AggregateSum(it.SummaryPlanNum ?? 0),
SummaryPlanAchievementRate = SqlFunc.AggregateAvg(it.SummaryPlanAchievementRate),
DownQuality = SqlFunc.AggregateSum(it.DownQuality ?? 0),
DownSuppler = SqlFunc.AggregateSum(it.DownSuppler ?? 0),
DownDeviceFailure = SqlFunc.AggregateSum(it.DownDeviceFailure ?? 0),
DownDeviceDebug = SqlFunc.AggregateSum(it.DownDeviceDebug ?? 0),
DownLogisticsWaitMaterial = SqlFunc.AggregateSum(it.DownLogisticsWaitMaterial ?? 0),
DownLackMaterial = SqlFunc.AggregateSum(it.DownLackMaterial ?? 0),
DownInjection = SqlFunc.AggregateSum(it.DownInjection ?? 0),
DownAssembly = SqlFunc.AggregateSum(it.DownAssembly ?? 0),
AllLineStopTime = SqlFunc.AggregateSum(it.AllLineStopTime ?? 0),
RecordDate = Handlemonth.FirstDay
})
.ToPage<ProPlanAchievementrate, ProPlanAchievementrateDto>(parm);
return response;
}
private (DateTime FirstDay, DateTime LastDay) GetFirstAndLastDayOfMonth(DateTime date)
{
DateTime firstDay = new DateTime(date.Year, date.Month, 1);
int lastDay = DateTime.DaysInMonth(date.Year, date.Month);
DateTime lastDayDate = new DateTime(date.Year, date.Month, lastDay);
return (firstDay, lastDayDate);
}
/// <summary>
/// 获取详情
/// </summary>
/// <param name="Id"></param>
/// <returns></returns>
public ProPlanAchievementrate GetInfo(int Id)
{
var response = Queryable()
.Where(x => x.Id == Id)
.First();
return response;
}
/// <summary>
/// 添加日计划达成率
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public ProPlanAchievementrate AddProPlanAchievementrate(ProPlanAchievementrate model)
{
return Context.Insertable(model).IgnoreColumns(it => new { it.Id }).ExecuteReturnEntity();
}
/// <summary>
/// 修改日计划达成率
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public int UpdateProPlanAchievementrate(ProPlanAchievementrate model)
{
//var response = Update(w => w.Id == model.Id, it => new ProPlanAchievementrate()
//{
// Project = model.Project,
// AgroupMonitor = model.AgroupMonitor,
// AgroupProductNum = model.AgroupProductNum,
// AgroupStandardYield = model.AgroupStandardYield,
// AgroupPlanNum = model.AgroupPlanNum,
// AgroupCompletionRate = model.AgroupCompletionRate,
// BgroupMonitor = model.BgroupMonitor,
// BgroupProductNum = model.BgroupProductNum,
// BgroupStandardYield = model.BgroupStandardYield,
// BgroupPlanNum = model.BgroupPlanNum,
// BgroupCompletionRate = model.BgroupCompletionRate,
// SummaryActualNum = model.SummaryActualNum,
// SummaryPlanNum = model.SummaryPlanNum,
// SummaryPlanAchievementRate = model.SummaryPlanAchievementRate,
// DownQuality = model.DownQuality,
// DownSuppler = model.DownSuppler,
// DownDeviceFailure = model.DownDeviceFailure,
// DownDeviceDebug = model.DownDeviceDebug,
// DownLogisticsWaitMaterial = model.DownLogisticsWaitMaterial,
// DownLackMaterial = model.DownLackMaterial,
// DownProject = model.DownProject,
// DownInjection = model.DownInjection,
// DownAssembly = model.DownAssembly,
// AllLineStopTime = model.AllLineStopTime,
// MainProblemDescription = model.MainProblemDescription,
// Strategy = model.Strategy,
// ResponsiblePerson = model.ResponsiblePerson,
// RecordDate = model.RecordDate,
// CreatedBy = model.CreatedBy,
// CreatedTime = model.CreatedTime,
// UpdatedBy = model.UpdatedBy,
// UpdatedTime = model.UpdatedTime,
//});
//return response;
return Update(model, true);
}
public List<ProPlanAchievementrateDto> GetTodayList()
{
DateTime today = DateTime.Today;
var response = Queryable()
.Where(it => it.RecordDate == today)
.ToList()
.Adapt<List<ProPlanAchievementrate>, List<ProPlanAchievementrateDto>>()
;
return response;
}
public List<ProPlanAchievementrateDto> GetTodayRealTimeList()
{
ProPlanAchievementrateQueryDto3 parm = new ProPlanAchievementrateQueryDto3();
parm.GenarateDate = DateTime.Today;
bool result = DayofplanAchievementRate(parm);
var response = Queryable()
.Where(it => it.RecordDate == parm.GenarateDate)
.ToList()
.Adapt<List<ProPlanAchievementrate>, List<ProPlanAchievementrateDto>>()
;
return response;
}
public List<ProPlanAchievementrateDto> GetYesterdayList()
{
DateTime yesterday = DateTime.Today.AddDays(-1);
var response = Queryable()
.Where(it => it.RecordDate == yesterday)
.ToList()
.Adapt<List<ProPlanAchievementrate>, List<ProPlanAchievementrateDto>>()
;
return response;
}
public List<ProPlanAchievementrateDto> GetListByMonth()
{
(DateTime FirstDay, DateTime LastDay) Handlemonth = GetFirstAndLastDayOfMonth(DateTime.Today);
var predicate = Expressionable.Create<ProPlanAchievementrate>()
.And(it => it.RecordDate >= Handlemonth.FirstDay && it.RecordDate <= Handlemonth.LastDay)
;
var response = Queryable()
.Where(predicate.ToExpression())
.GroupBy(it => it.Project)
.Select(it => new ProPlanAchievementrate()
{
Project = it.Project,
AgroupPlanNum = SqlFunc.AggregateSum(it.AgroupPlanNum ?? 0),
AgroupProductNum = SqlFunc.AggregateSum(it.AgroupProductNum ?? 0),
AgroupCompletionRate = SqlFunc.AggregateAvg(it.AgroupCompletionRate),
BgroupPlanNum = SqlFunc.AggregateSum(it.BgroupPlanNum ?? 0),
BgroupProductNum = SqlFunc.AggregateSum(it.BgroupProductNum ?? 0),
BgroupCompletionRate = SqlFunc.AggregateAvg(it.BgroupCompletionRate),
SummaryActualNum = SqlFunc.AggregateSum(it.SummaryActualNum ?? 0),
SummaryPlanNum = SqlFunc.AggregateSum(it.SummaryPlanNum ?? 0),
SummaryPlanAchievementRate = SqlFunc.AggregateAvg(it.SummaryPlanAchievementRate),
DownQuality = SqlFunc.AggregateSum(it.DownQuality ?? 0),
DownSuppler = SqlFunc.AggregateSum(it.DownSuppler ?? 0),
DownDeviceFailure = SqlFunc.AggregateSum(it.DownDeviceFailure ?? 0),
DownDeviceDebug = SqlFunc.AggregateSum(it.DownDeviceDebug ?? 0),
DownLogisticsWaitMaterial = SqlFunc.AggregateSum(it.DownLogisticsWaitMaterial ?? 0),
DownLackMaterial = SqlFunc.AggregateSum(it.DownLackMaterial ?? 0),
DownInjection = SqlFunc.AggregateSum(it.DownInjection ?? 0),
DownAssembly = SqlFunc.AggregateSum(it.DownAssembly ?? 0),
AllLineStopTime = SqlFunc.AggregateSum(it.AllLineStopTime ?? 0),
RecordDate = Handlemonth.FirstDay
})
.ToList()
.Adapt<List<ProPlanAchievementrate>, List<ProPlanAchievementrateDto>>();
return response;
}
public int ImportData(IFormFile formFile, string name, DateTime RecordDate)
{
using (var stream = formFile.OpenReadStream())
{
try
{
IWorkbook workbook = new XSSFWorkbook(stream);
ISheet sheet = workbook.GetSheetAt(0);
List<ProPlanAchievementrate> AchievementrateList = new List<ProPlanAchievementrate>();
// 遍历每一行
for (int row = 4; row <= sheet.LastRowNum; row++)
{
IRow currentRow = sheet.GetRow(row);
if (currentRow != null && currentRow.GetCell(0) != null) // 确保行不为空
{
ProPlanAchievementrate achievementrate = new ProPlanAchievementrate();
//获取项目号
if (currentRow.GetCell(0) != null && currentRow.GetCell(0).CellType == CellType.String)
achievementrate.Project = currentRow.GetCell(0).ToString();
//A班班长
if (currentRow.GetCell(1) != null && currentRow.GetCell(1).CellType == CellType.String)
achievementrate.AgroupMonitor = currentRow.GetCell(1).ToString();
//A班生产数量
if (currentRow.GetCell(2) != null && currentRow.GetCell(2).CellType == CellType.Numeric)
achievementrate.AgroupProductNum = (int)currentRow.GetCell(2).NumericCellValue;
//A班标准班产
if (currentRow.GetCell(3) != null && currentRow.GetCell(3).CellType == CellType.Numeric)
achievementrate.AgroupStandardYield = (int)currentRow.GetCell(3).NumericCellValue;
//A班计划数量
if (currentRow.GetCell(4) != null && currentRow.GetCell(4).CellType == CellType.Numeric)
achievementrate.AgroupPlanNum = (int)currentRow.GetCell(4).NumericCellValue;
//A班完成率
if (currentRow.GetCell(5) != null && currentRow.GetCell(5).CellType == CellType.Numeric)
achievementrate.AgroupCompletionRate = (decimal)currentRow.GetCell(5).NumericCellValue;
//B班班长
if (currentRow.GetCell(6) != null && currentRow.GetCell(6).CellType == CellType.String)
achievementrate.BgroupMonitor = currentRow.GetCell(6).ToString();
//B班生产数量
if (currentRow.GetCell(7) != null && currentRow.GetCell(7).CellType == CellType.Numeric)
achievementrate.BgroupProductNum = (int)currentRow.GetCell(7).NumericCellValue;
//B班标准班产
if (currentRow.GetCell(8) != null && currentRow.GetCell(8).CellType == CellType.Numeric)
achievementrate.BgroupStandardYield = (int)currentRow.GetCell(8).NumericCellValue;
//B班计划数量
if (currentRow.GetCell(9) != null && currentRow.GetCell(9).CellType == CellType.Numeric)
achievementrate.BgroupPlanNum = (int)currentRow.GetCell(9).NumericCellValue;
//B班完成率
if (currentRow.GetCell(10) != null && currentRow.GetCell(10).CellType == CellType.Numeric)
achievementrate.BgroupCompletionRate = (decimal)currentRow.GetCell(10).NumericCellValue;
//汇总实际数量
if (currentRow.GetCell(11) != null && currentRow.GetCell(11).CellType == CellType.Numeric)
achievementrate.SummaryActualNum = (int)currentRow.GetCell(11).NumericCellValue;
//汇总计划数量
if (currentRow.GetCell(12) != null && currentRow.GetCell(12).CellType == CellType.Numeric)
achievementrate.SummaryPlanNum = (int)currentRow.GetCell(12).NumericCellValue;
//汇总计划达成率
if (currentRow.GetCell(13) != null && currentRow.GetCell(13).CellType == CellType.Numeric)
achievementrate.SummaryPlanAchievementRate = (decimal)currentRow.GetCell(13).NumericCellValue;
//记录日期
//if (currentRow.GetCell(14) != null && currentRow.GetCell(14).CellType == CellType.String)
// achievementrate.RecordDate = DateTime.ParseExact(currentRow.GetCell(14).ToString(), "yyyy-MM-dd", CultureInfo.InvariantCulture);
//质量问题
if (currentRow.GetCell(14) != null && currentRow.GetCell(14).CellType == CellType.Numeric)
achievementrate.DownQuality = (int)currentRow.GetCell(14).NumericCellValue;
//供应商问题
if (currentRow.GetCell(15) != null && currentRow.GetCell(15).CellType == CellType.Numeric)
achievementrate.DownSuppler = (int)currentRow.GetCell(15).NumericCellValue;
//设备故障
if (currentRow.GetCell(16) != null && currentRow.GetCell(16).CellType == CellType.Numeric)
achievementrate.DownDeviceFailure = (int)currentRow.GetCell(16).NumericCellValue;
//设备调试
if (currentRow.GetCell(17) != null && currentRow.GetCell(17).CellType == CellType.Numeric)
achievementrate.DownDeviceDebug = (int)currentRow.GetCell(17).NumericCellValue;
//物流等待物料
if (currentRow.GetCell(18) != null && currentRow.GetCell(18).CellType == CellType.Numeric)
achievementrate.DownLogisticsWaitMaterial = (int)currentRow.GetCell(18).NumericCellValue;
//物料短缺
if (currentRow.GetCell(19) != null && currentRow.GetCell(19).CellType == CellType.Numeric)
achievementrate.DownLackMaterial = (int)currentRow.GetCell(19).NumericCellValue;
//注塑异常
if (currentRow.GetCell(20) != null && currentRow.GetCell(20).CellType == CellType.Numeric)
achievementrate.DownInjection = (int)currentRow.GetCell(20).NumericCellValue;
//装配异常
if (currentRow.GetCell(21) != null && currentRow.GetCell(21).CellType == CellType.Numeric)
achievementrate.DownAssembly = (int)currentRow.GetCell(21).NumericCellValue;
//全线停机时间
if (currentRow.GetCell(22) != null && currentRow.GetCell(22).CellType == CellType.Numeric)
achievementrate.AllLineStopTime = (int)currentRow.GetCell(22).NumericCellValue;
//主要问题描述
if (currentRow.GetCell(23) != null && currentRow.GetCell(23).CellType == CellType.String)
achievementrate.MainProblemDescription = currentRow.GetCell(23).ToString();
//改善对策
if (currentRow.GetCell(24) != null && currentRow.GetCell(24).CellType == CellType.String)
achievementrate.Strategy = currentRow.GetCell(24).ToString();
//责任人
if (currentRow.GetCell(25) != null && currentRow.GetCell(25).CellType == CellType.String)
achievementrate.ResponsiblePerson = currentRow.GetCell(25).ToString();
achievementrate.RecordDate = RecordDate.Date;
AchievementrateList.Add(achievementrate);
}
}
if (AchievementrateList.Count == 0)
{
return 0;
}
UseTran2(() =>
{
Context.Deleteable<ProPlanAchievementrate>().Where(it => it.RecordDate == RecordDate.Date).ExecuteCommand();
Context.Insertable(AchievementrateList).ExecuteCommand();
});
return AchievementrateList.Count;
}
catch (Exception ex)
{
throw new CustomException("excel文件异常请详细核对");
}
}
}
public byte[] ExportData(DateTime exportDate)
{
string templatePath = Path.Combine(
Directory.GetCurrentDirectory(),
"wwwroot",
"ImportTemplate",
"PlanAchievementRate.xlsx"
);
if (!global::System.IO.File.Exists(templatePath))
{
throw new CustomException("Excel 模板文件不存在");
}
List<ProPlanAchievementrate> dataList = Context.Queryable<ProPlanAchievementrate>()
.Where(it => it.RecordDate.HasValue && it.RecordDate.Value.Date == exportDate.Date)
.ToList();
using (var fileStream = new FileStream(templatePath, FileMode.Open, FileAccess.Read))
{
IWorkbook workbook = WorkbookFactory.Create(fileStream);
ISheet sheet = workbook.GetSheetAt(0);
int startRowIndex = 4;
// 创建带边框的样式(只需创建一次,推荐提到循环外面)
ICellStyle borderedCellStyle = workbook.CreateCellStyle();
borderedCellStyle.BorderTop = BorderStyle.Thin;
borderedCellStyle.BorderBottom = BorderStyle.Thin;
borderedCellStyle.BorderLeft = BorderStyle.Thin;
borderedCellStyle.BorderRight = BorderStyle.Thin;
borderedCellStyle.TopBorderColor = IndexedColors.Black.Index;
borderedCellStyle.BottomBorderColor = IndexedColors.Black.Index;
borderedCellStyle.LeftBorderColor = IndexedColors.Black.Index;
borderedCellStyle.RightBorderColor = IndexedColors.Black.Index;
for (int i = 0; i < dataList.Count; i++)
{
var item = dataList[i];
IRow row = sheet.GetRow(startRowIndex + i) ?? sheet.CreateRow(startRowIndex + i);
row.CreateCell(1).SetCellValue(item.Project);
row.CreateCell(2).SetCellValue(item.AgroupMonitor);
row.CreateCell(3).SetCellValue((double)(item.AgroupProductNum ?? 0));
row.CreateCell(4).SetCellValue((double)(item.AgroupStandardYield ?? 0));
row.CreateCell(5).SetCellValue((double)(item.AgroupPlanNum ?? 0));
row.CreateCell(6).SetCellValue((double)item.AgroupCompletionRate);
row.CreateCell(7).SetCellValue(item.BgroupMonitor);
row.CreateCell(8).SetCellValue((double)(item.BgroupProductNum ?? 0));
row.CreateCell(9).SetCellValue((double)(item.BgroupStandardYield ?? 0));
row.CreateCell(10).SetCellValue((double)(item.BgroupPlanNum ?? 0));
row.CreateCell(11).SetCellValue((double)item.BgroupCompletionRate);
row.CreateCell(12).SetCellValue((double)(item.SummaryActualNum ?? 0));
row.CreateCell(13).SetCellValue((double)(item.SummaryPlanNum ?? 0));
row.CreateCell(14).SetCellValue((double)item.SummaryPlanAchievementRate);
row.CreateCell(15).SetCellValue((double)(item.DownQuality ?? 0));
row.CreateCell(16).SetCellValue((double)(item.DownSuppler ?? 0));
row.CreateCell(17).SetCellValue((double)(item.DownDeviceFailure ?? 0));
row.CreateCell(18).SetCellValue((double)(item.DownDeviceDebug ?? 0));
row.CreateCell(19).SetCellValue((double)(item.DownLogisticsWaitMaterial ?? 0));
row.CreateCell(20).SetCellValue((double)(item.DownLackMaterial ?? 0));
row.CreateCell(21).SetCellValue((double)(item.DownInjection ?? 0));
row.CreateCell(22).SetCellValue((double)(item.DownAssembly ?? 0));
row.CreateCell(23).SetCellValue((double)(item.AllLineStopTime ?? 0));
row.CreateCell(24).SetCellValue(item.MainProblemDescription);
row.CreateCell(25).SetCellValue(item.Strategy);
row.CreateCell(26).SetCellValue(item.ResponsiblePerson);
}
// 改为写入 MemoryStream 然后转成 byte[]
var memoryStream = new MemoryStream();
workbook.Write(memoryStream);
// memoryStream.Position = 0;
return memoryStream.ToArray(); // ✅ 直接返回 byte 数组
}
}
}
}