当前位置: 首页 > news >正文

.NET CORE Api 上传excel解析并生成错误excel下载

写在前面的话:

        【对外承接app API开发、网站建设、系统开发,有偿提供帮助,联系方式于文章最下方 】

因业务调整,不再需要生成错误无excel下载,所以先保存代码,回头再重新编辑

#region Excel校验部分if (files == null) throw Oops.Oh("文件不存在");string path = @"upload\{yyyy}\{MM}\{dd}";var reg = new Regex(@"(\{.+?})");var match = reg.Matches(path);match.ToList().ForEach(a =>{var str = DateTime.Now.ToString(a.ToString().Substring(1, a.Length - 2)); // 每天一个目录path = path.Replace(a.ToString(), str);});var sizeKb = (long)(files.Length / 1024.0); // 大小KBif (sizeKb > 1048576)throw Oops.Oh("文件超过允许大小");// 后缀var suffix = Path.GetExtension(files.FileName).ToLower();if (string.IsNullOrWhiteSpace(suffix)){var contentTypeProvider = FS.GetFileExtensionContentTypeProvider();suffix = contentTypeProvider.Mappings.FirstOrDefault(u => u.Value == files.ContentType).Key;}if (string.IsNullOrWhiteSpace(suffix))throw Oops.Oh("文件后缀错误");var finalName = Guid.NewGuid() + suffix;//组合路径并创建文件夹var filePath = Path.Combine(App.WebHostEnvironment.ContentRootPath, path);if (!Directory.Exists(filePath))Directory.CreateDirectory(filePath);//上传文件var realFile = Path.Combine(filePath, finalName);using (var stream = System.IO.File.Create(realFile)){await files.CopyToAsync(stream);}//判断文件格式(通过后缀名及文件头编码判断)byte[] bytes = new byte[4];FileStream fileStream = new FileStream(realFile, FileMode.Open, FileAccess.Read);string temstr = "";if (Convert.ToInt32(fileStream.Length) > 0){fileStream.Read(bytes, 0, 4);fileStream.Close();for (int i = 0; i < bytes.Length; i++){temstr += Convert.ToString(bytes[i], 16);}}var fileHeads = temstr.ToUpper();List<FileTypeModel> fileType = new List<FileTypeModel>();fileType.Add(new FileTypeModel { FileNameStr = "xlsx", FileHeadStr = "504B34" });fileType.Add(new FileTypeModel { FileNameStr = "xls", FileHeadStr = "D0CF11E0" });if (!fileType.Any(p => p.FileHeadStr.Contains(fileHeads)) || string.IsNullOrWhiteSpace(fileHeads)){//删除刚刚上传的文件Directory.Delete(realFile, true);throw Oops.Oh("文件类型错误");}#endregion#region//realFile//接下来就可以开始解析了IWorkbook _wb_xls = null;string fileEx = System.IO.Path.GetExtension(Path.GetFileName(realFile));FileStream _file = new FileStream(realFile, FileMode.Open, FileAccess.Read);if (realFile.IndexOf(".xlsx") > 0)_wb_xls = new XSSFWorkbook(_file);else if (realFile.IndexOf(".xls") > 0)_wb_xls = new HSSFWorkbook(_file);//保存成功信息List<DriverImportList> importList = new List<DriverImportList>();List<DriverImportList> errorList = new List<DriverImportList>();//开始读取excel中数据并作数据校验try{for (int i = 3; i < _wb_xls.GetSheet("DriverData").PhysicalNumberOfRows + 1; i++){var isDataCorrect = true;var cellList = _wb_xls.GetSheet("DriverData").GetRow(i);#region 解析司机个人信息PersonalInformationModel driverModel = new PersonalInformationModel();if (!string.IsNullOrEmpty(cellList.GetCell(1) + ""))driverModel.FirstName = cellList.GetCell(1) + "";//if (!string.IsNullOrEmpty(cellList.GetCell(2) + ""))//    driverModel.MiddleName = cellList.GetCell(2) + "";if (!string.IsNullOrEmpty(cellList.GetCell(3) + ""))driverModel.LastName = cellList.GetCell(3) + "";if (!string.IsNullOrEmpty(cellList.GetCell(4) + "")){driverModel.PhonetNo = cellList.GetCell(4) + "";}else{isDataCorrect = false;driverModel.PhonetNo = "Error!Not Null";}if (!string.IsNullOrEmpty(cellList.GetCell(5) + ""))driverModel.EMail = cellList.GetCell(5) + "";if (!string.IsNullOrEmpty(cellList.GetCell(6) + "")){driverModel.SocialInsurance = cellList.GetCell(6) + "";}else{isDataCorrect = false;driverModel.SocialInsurance = "Error!Not Null";}if (!string.IsNullOrEmpty(cellList.GetCell(7) + "")){driverModel.License = cellList.GetCell(7) + "";}else{isDataCorrect = false;driverModel.License = "Error!Not Null";}if (!string.IsNullOrEmpty(cellList.GetCell(8) + "")){driverModel.LicenseFirstIssueDate = cellList.GetCell(8) + "";}else if (!(cellList.GetCell(8) is DateTime)){isDataCorrect = false;driverModel.LicenseFirstIssueDate = "Error!Must Time Type";}else{isDataCorrect = false;driverModel.LicenseFirstIssueDate = "Error!Not Null";}if (!string.IsNullOrEmpty(cellList.GetCell(9) + "")){driverModel.LicenseFromDate = cellList.GetCell(9) + "";}else if (!(cellList.GetCell(9) is DateTime)){isDataCorrect = false;driverModel.LicenseFromDate = "Error!Must Time Type";}else{isDataCorrect = false;driverModel.LicenseFromDate = "Error!Not Null";}if (!string.IsNullOrEmpty(cellList.GetCell(10) + "")){driverModel.LicenseToDate = cellList.GetCell(10) + "";}else if (!(cellList.GetCell(10) is DateTime)){isDataCorrect = false;driverModel.LicenseToDate = "Error!Must Time Type";}else{isDataCorrect = false;driverModel.LicenseToDate = "Error!Not Null";}#endregion#region 解析司机车辆信息VehicleInformationModel carModel = new VehicleInformationModel();//车辆型号if (!string.IsNullOrEmpty(cellList.GetCell(12) + "")){carModel.CarModelType = cellList.GetCell(12) + "";}else{isDataCorrect = false;carModel.CarModelType = "Error!Not Null";}//车身颜色if (!string.IsNullOrEmpty(cellList.GetCell(13) + "")){carModel.ExteriorColor = cellList.GetCell(13) + "";}else{isDataCorrect = false;carModel.ExteriorColor = "Error!Not Null";}//座位数if (!string.IsNullOrEmpty(cellList.GetCell(14) + "")){carModel.Seats = cellList.GetCell(14) + "";}else{isDataCorrect = false;carModel.Seats = "Error!Not Null";}//出厂日期if (!string.IsNullOrEmpty(cellList.GetCell(15) + "")){carModel.ProductionDate = cellList.GetCell(15) + "";}else{isDataCorrect = false;carModel.ProductionDate = "Error!Not Null";}//车牌号if (!string.IsNullOrEmpty(cellList.GetCell(16) + "")){carModel.LicensePlate = cellList.GetCell(16) + "";}else{isDataCorrect = false;carModel.LicensePlate = "Error!Not Null";}//保险开始日期if (!string.IsNullOrEmpty(cellList.GetCell(17) + "")){carModel.InsuranceFromDate = cellList.GetCell(17) + "";}else{isDataCorrect = false;carModel.InsuranceFromDate = "Error!Not Null";}//保险结束日期if (!string.IsNullOrEmpty(cellList.GetCell(18) + "")){carModel.InsuranceToDate = cellList.GetCell(18) + "";}else{isDataCorrect = false;carModel.InsuranceToDate = "Error!Not Null";}#endregion#region 解析司机其他信息OtherInformation otherModel = new OtherInformation();//台班费if (!string.IsNullOrEmpty(cellList.GetCell(20) + "")){otherModel.Percentage_Or_Amount = cellList.GetCell(20) + "";//台班费收费周期if (!string.IsNullOrEmpty(cellList.GetCell(22) + "")){otherModel.ChargeCycle = cellList.GetCell(22) + "";}else{isDataCorrect = false;otherModel.ChargeCycle = "Error!Not Null";}}//订单抽成if (!string.IsNullOrEmpty(cellList.GetCell(21) + "")){otherModel.Percentage = cellList.GetCell(21) + "";}else{isDataCorrect = false;otherModel.Percentage = "Error!Not Null";}//账户状态if (!string.IsNullOrEmpty(cellList.GetCell(23) + "")){otherModel.IsEnabled = cellList.GetCell(23) + "";}else{isDataCorrect = false;otherModel.IsEnabled = "Error!Not Null";}#endregion//如果该条数据数据校验全通过,则添加到list中准备入库if (isDataCorrect){DriverImportList db_import = new DriverImportList();db_import.PersonalInformationModel = driverModel;db_import.VehicleInformationModel = carModel;db_import.OtherInformation = otherModel;importList.Add(db_import);}else{DriverImportList errorModel = new DriverImportList();errorModel.PersonalInformationModel = driverModel;errorModel.VehicleInformationModel = carModel;errorModel.OtherInformation = otherModel;errorList.Add(errorModel);}}}catch (Exception ex){throw Oops.Oh("解析失败,请在下载的模板文件上进行编辑并上传");}#endregion//表头信息var headers = new List<ExcelHeader>{//司机信息new ExcelHeader{ Adress="B2", Value="PersonalInformation\r\n(司机信息)" },new ExcelHeader{ Adress="B3",Width=15,Value="First_Name"},new ExcelHeader{ Adress="C3",Width=15,Value="Last_Name"},new ExcelHeader{ Adress="D3",Width=15,Value="Phonet_No"},new ExcelHeader{ Adress="E3",Width=15,Value="E_Mail"},new ExcelHeader{ Adress="F3",Width=30,Value="Social_Insurance\r\n(社会保险)"},new ExcelHeader{ Adress="G3",Width=15,Value="License\r\n(驾照)"},new ExcelHeader{ Adress="H3",Width=40,Value="License_First_Issue_Date\r\n(驾照首次领证日期)"},new ExcelHeader{ Adress="I3",Width=35,Value="License_From_Date\r\n(驾照起始日期)"},new ExcelHeader{ Adress="J3",Width=35,Value="License_To_Date\r\n(驾照结束日期)"},//车辆信息new ExcelHeader{ Adress="L2", Value="VehicleInformation\r\n(车辆信息)"},new ExcelHeader{ Adress="L3",Width=25,Value="Car_Model_Type\r\n(车辆型号)"},new ExcelHeader{ Adress="M3",Width=25,Value="Exterior_Color\r\n(车辆颜色)"},new ExcelHeader{ Adress="N3",Width=25,Value="Seats\r\n(座椅数量)"},new ExcelHeader{ Adress="O3",Width=25,Value="Production_Date\r\n(出厂日期)"},new ExcelHeader{ Adress="P3",Width=25,Value="License_Plate\r\n(车牌号)"},new ExcelHeader{ Adress="Q3",Width=25,Value="Insurance_From_Date\r\n(保险起始日期)"},new ExcelHeader{ Adress="R3",Width=25,Value="Insurance_To_Date\r\n(保险结束日期)"},//其他信息new ExcelHeader{ Adress="T2", Value="OtherInformation\r\n(其他信息)"},new ExcelHeader{ Adress="T3",Width=30,Value="Percentage_Or_Amount\r\n\r\n(台班费)"},new ExcelHeader{ Adress="U3",Width=30,Value="Percentage\r\n(订单抽成)"},new ExcelHeader{ Adress="V3",Width=30,Value="ChargeCycle\r\n(台班费收费周期)"},new ExcelHeader{ Adress="W3",Width=30,Value="IsEnabled\r\n(账户状态)"},};string localPath = AppDomain.CurrentDomain.BaseDirectory + System.DateTime.Now.ToString("yyyyMMdd");var filepath = Path.Combine(localPath, $"{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.xlsx");FileInfo file = new FileInfo(filepath);if (file.Exists){file.Delete();file = new FileInfo(filepath);}//创建文件夹if (!Directory.Exists(localPath))Directory.CreateDirectory(localPath);ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;ExcelPackage package = new ExcelPackage(file);//创建sheetExcelWorksheet worksheet = package.Workbook.Worksheets.Add("DriverData");//生成表头for (int i = 0; i < headers.Count; i++){worksheet.Cells[headers[i].Adress].Value = headers[i].Value;//合并单元格worksheet.Cells[2, 2, 2, 12].Merge = true;worksheet.Cells[2, 14, 2, 23].Merge = true;worksheet.Cells[2, 24, 2, 26].Merge = true;worksheet.Cells[headers[i].Adress].Style.Font.Size = 12; //字体大小worksheet.Cells[headers[i].Adress].Style.Font.Bold = true; //设置粗体worksheet.Cells[headers[i].Adress].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center; //水平居中对齐worksheet.Cells[headers[i].Adress].Style.VerticalAlignment = OfficeOpenXml.Style.ExcelVerticalAlignment.Center; //垂直居中对齐if (headers[i].Width > 0)worksheet.Column(ColumnIndex(headers[i].Adress)).Width = headers[i].Width;//给第三行设置行高worksheet.Row(3).Height = 35;//设置表格边框线(设置单元格所有边框)#region 表头设置边框线worksheet.Cells["B2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["C2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["D2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["E2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["F2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["G2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["H2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["I2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["J2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["L2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["M2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["N2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["O2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["P2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["Q2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["R2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["S2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["T2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["V2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["W2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["X2"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["B3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["C3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["D3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["E3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["F3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["G3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["H3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["I3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["J3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["L3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["M3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["N3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["O3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["P3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["Q3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["R3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["S3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["T3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["V3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["W3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));worksheet.Cells["X3"].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));//worksheet.Cells[1, 1].Style.Border.Bottom.Style = ExcelBorderStyle.Thin;//单独设置单元格底部边框样式和颜色(上下左右均可分开设置)//worksheet.Cells[1, 1].Style.Border.Bottom.Color.SetColor(Color.FromArgb(191, 191, 191));#endregion}//循环填充内容if (errorList != null){//设置背景色Color colFromHex = System.Drawing.ColorTranslator.FromHtml("#7fcbfe");for (int i = 0; i < errorList.Count; i++){if (errorList[i].PersonalInformationModel != null){//姓worksheet.Cells["B" + (4 + i)].Value = errorList[i].PersonalInformationModel.FirstName;worksheet.Cells["B" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.FirstName != null && errorList[i].PersonalInformationModel.FirstName.IndexOf("Error!") > -1){worksheet.Cells["B" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["B" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//名worksheet.Cells["C" + (4 + i)].Value = errorList[i].PersonalInformationModel.LastName;worksheet.Cells["C" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.LastName != null && errorList[i].PersonalInformationModel.LastName.IndexOf("Error!") > -1){worksheet.Cells["C" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["C" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//电话号码worksheet.Cells["D" + (4 + i)].Value = errorList[i].PersonalInformationModel.PhonetNo;worksheet.Cells["D" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.PhonetNo != null && errorList[i].PersonalInformationModel.PhonetNo.IndexOf("Error!") > -1){worksheet.Cells["D" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["D" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//邮箱worksheet.Cells["E" + (4 + i)].Value = errorList[i].PersonalInformationModel.EMail;worksheet.Cells["E" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.EMail != null && errorList[i].PersonalInformationModel.EMail.IndexOf("Error!") > -1){worksheet.Cells["E" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["E" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//社会保障号worksheet.Cells["F" + (4 + i)].Value = errorList[i].PersonalInformationModel.SocialInsurance;worksheet.Cells["F" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.SocialInsurance != null && errorList[i].PersonalInformationModel.SocialInsurance.IndexOf("Error!") > -1){worksheet.Cells["F" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["F" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//驾照号码worksheet.Cells["G" + (4 + i)].Value = errorList[i].PersonalInformationModel.License;worksheet.Cells["G" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.License != null && errorList[i].PersonalInformationModel.License.IndexOf("Error!") > -1){worksheet.Cells["G" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["G" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//初次领证日期worksheet.Cells["H" + (4 + i)].Value = errorList[i].PersonalInformationModel.LicenseFirstIssueDate;worksheet.Cells["H" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.LicenseFirstIssueDate != null && errorList[i].PersonalInformationModel.LicenseFirstIssueDate.IndexOf("Error!") > -1){worksheet.Cells["H" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["H" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//驾照起始日期worksheet.Cells["I" + (4 + i)].Value = errorList[i].PersonalInformationModel.LicenseFromDate;worksheet.Cells["I" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.LicenseFromDate != null && errorList[i].PersonalInformationModel.LicenseFromDate.IndexOf("Error!") > -1){worksheet.Cells["I" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["I" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//驾照结束日期worksheet.Cells["J" + (4 + i)].Value = errorList[i].PersonalInformationModel.LicenseToDate;worksheet.Cells["J" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].PersonalInformationModel.LicenseToDate != null && errorList[i].PersonalInformationModel.LicenseToDate.IndexOf("Error!") > -1){worksheet.Cells["J" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["J" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}}if (errorList[i].VehicleInformationModel != null){//车辆型号worksheet.Cells["M" + (4 + i)].Value = errorList[i].VehicleInformationModel.CarModelType;worksheet.Cells["M" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.CarModelType != null && errorList[i].VehicleInformationModel.CarModelType.IndexOf("Error!") > -1){worksheet.Cells["M" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["M" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//车身颜色worksheet.Cells["N" + (4 + i)].Value = errorList[i].VehicleInformationModel.ExteriorColor;worksheet.Cells["N" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.ExteriorColor != null && errorList[i].VehicleInformationModel.ExteriorColor.IndexOf("Error!") > -1){worksheet.Cells["N" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["N" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//座位数worksheet.Cells["O" + (4 + i)].Value = errorList[i].VehicleInformationModel.Seats;worksheet.Cells["O" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.Seats != null && errorList[i].VehicleInformationModel.Seats.IndexOf("Error!") > -1){worksheet.Cells["O" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["O" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//出厂日期worksheet.Cells["P" + (4 + i)].Value = errorList[i].VehicleInformationModel.ProductionDate;worksheet.Cells["P" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.ProductionDate != null && errorList[i].VehicleInformationModel.ProductionDate.IndexOf("Error!") > -1){worksheet.Cells["P" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["P" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//车牌号worksheet.Cells["Q" + (4 + i)].Value = errorList[i].VehicleInformationModel.LicensePlate;worksheet.Cells["Q" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.LicensePlate != null && errorList[i].VehicleInformationModel.LicensePlate.IndexOf("Error!") > -1){worksheet.Cells["Q" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["Q" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//保险起始日期worksheet.Cells["R" + (4 + i)].Value = errorList[i].VehicleInformationModel.InsuranceFromDate;worksheet.Cells["R" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.InsuranceFromDate != null && errorList[i].VehicleInformationModel.InsuranceFromDate.IndexOf("Error!") > -1){worksheet.Cells["R" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["R" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//保险结束日期worksheet.Cells["S" + (4 + i)].Value = errorList[i].VehicleInformationModel.InsuranceToDate;worksheet.Cells["S" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].VehicleInformationModel.InsuranceToDate != null && errorList[i].VehicleInformationModel.InsuranceToDate.IndexOf("Error!") > -1){worksheet.Cells["S" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["S" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}}if (errorList[i].OtherInformation != null){//台班费worksheet.Cells["X" + (4 + i)].Value = errorList[i].OtherInformation.Percentage_Or_Amount;worksheet.Cells["X" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].OtherInformation.Percentage_Or_Amount.IndexOf("Error!") > -1){worksheet.Cells["X" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["X" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//订单抽成worksheet.Cells["X" + (4 + i)].Value = errorList[i].OtherInformation.Percentage;worksheet.Cells["X" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].OtherInformation.Percentage.IndexOf("Error!") > -1){worksheet.Cells["X" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["X" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//台班费收费周期worksheet.Cells["X" + (4 + i)].Value = errorList[i].OtherInformation.ChargeCycle;worksheet.Cells["X" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].OtherInformation.ChargeCycle.IndexOf("Error!") > -1){worksheet.Cells["X" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["X" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}//账户状态worksheet.Cells["X" + (4 + i)].Value = errorList[i].OtherInformation.IsEnabled;worksheet.Cells["X" + (4 + i)].Style.Border.BorderAround(ExcelBorderStyle.Thin, Color.FromArgb(0, 0, 0));if (errorList[i].OtherInformation.IsEnabled.IndexOf("Error!") > -1){worksheet.Cells["X" + (4 + i)].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;worksheet.Cells["X" + (4 + i)].Style.Fill.BackgroundColor.SetColor(colFromHex);}}}}package.Save();//转成流之后下载using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read)){byte[] byteArray = new byte[fs.Length];fs.Read(byteArray, 0, byteArray.Length);//删除昨日生成的excel文件夹System.IO.File.Delete(AppDomain.CurrentDomain.BaseDirectory + System.DateTime.Now.AddDays(-1).ToString("yyyyMMdd"));return new FileContentResult(byteArray, "application/octet-stream"){FileDownloadName = $"{DateTime.Now.ToString("yyyyMMddHHmmss")}错误记录.xlsx"};}/// <summary>
/// 根据单元格地址计算出单元格所在列的索引
/// </summary>
/// <param name="reference">单元格地址,示例A1,AB2</param>
/// <returns></returns>
private static int ColumnIndex(string reference)
{int ci = 0;reference = reference.ToUpper();for (int ix = 0; ix < reference.Length && reference[ix] >= 'A'; ix++)ci = (ci * 26) + ((int)reference[ix] - 64);return ci;
}

model部分


public class DriverImportList
{public PersonalInformationModel PersonalInformationModel { get; set; }public VehicleInformationModel VehicleInformationModel { get; set; }public OtherInformation OtherInformation { get; set; }
}/// <summary>
/// excel上传、司机个人信息
/// </summary>
public class PersonalInformationModel
{/// <summary>/// 姓/// </summary>public string FirstName { get; set; }/// <summary>/// 名/// </summary>public string LastName { get; set; }/// <summary>/// 电话号码/// </summary>public string PhonetNo { get; set; }/// <summary>/// 邮箱/// </summary>public string EMail { get; set; }/// <summary>/// 社会保障号/// </summary>public string SocialInsurance { get; set; }/// <summary>/// 驾照/// </summary>public string License { get; set; }/// <summary>/// 初次领证日期/// </summary>public string LicenseFirstIssueDate { get; set; }/// <summary>/// 驾照有效期起始时间/// </summary>public string LicenseFromDate { get; set; }/// <summary>/// 驾照有效期结束时间/// </summary>public string LicenseToDate { get; set; }
}/// <summary>
/// excel上传、车辆相关信息
/// </summary>
public class VehicleInformationModel
{/// <summary>/// 车辆型号/// </summary>public string CarModelType { get; set; }/// <summary>/// 车身颜色/// </summary>public string ExteriorColor { get; set; }/// <summary>/// 座椅数量/// </summary>public string Seats { get; set; }/// <summary>/// 出厂日期/// </summary>public string ProductionDate { get; set; }/// <summary>/// 车牌号/// </summary>public string LicensePlate { get; set; }/// <summary>/// 保险开始日期/// </summary>public string InsuranceFromDate { get; set; }/// <summary>/// 保险结束日期/// </summary>public string InsuranceToDate { get; set; }
}/// <summary>
/// excel上传、其他杂项信息
/// </summary>
public class OtherInformation
{ /// <summary>/// 台班费/// </summary>public string Percentage_Or_Amount { get; set; }/// <summary>/// 台班费收费周期/// </summary>public string ChargeCycle { get; set; }/// <summary>/// 订单抽成/// </summary>public string Percentage { get; set; }/// <summary>/// 账户状态/// </summary>public string IsEnabled { get; set; } 
}public class ExcelHeader
{/// <summary>/// 单元格地址A1,B2等/// </summary>public string Adress { get; set; }/// <summary>/// 单元格值/// </summary>public string Value { get; set; }/// <summary>/// 单元格合并区域,示例A1:B2,为空表示不合并/// </summary>public string MergeArea { get; set; }/// <summary>/// 列宽度,合并列不需要指定宽度,示例:/// | A |/// |B|C|/// 表头A是单元格B和单元格C合并而来,不需要指定宽度,只指定B和C宽度即可/// </summary>public int Width { get; set; }
}

参考文档

1、Asp.NET Core 导出数据到 Excel 文件 - 码农教程

2、.net5下使用EPPlus导出Excel(复杂表头)_.net 导出excel 多表头_数据的流的博客-CSDN博客

3、Excel操作库--EPPLUS常用操作命令汇总(1)_韦_恩的博客-CSDN博客
 

联系方式:

                 wechat&QQ&Tel:13501715983(如查不到请加QQ:631931078或352167311)

                 个人邮箱:13212644043@163.com

OK,暂且这样~

相关文章:

.NET CORE Api 上传excel解析并生成错误excel下载

写在前面的话&#xff1a; 【对外承接app API开发、网站建设、系统开发&#xff0c;有偿提供帮助&#xff0c;联系方式于文章最下方 】 因业务调整&#xff0c;不再需要生成错误无excel下载&#xff0c;所以先保存代码&#xff0c;回头再重新编辑 #region Excel校验部分if (f…...

数据结构,二叉树,前中后序遍历

二叉树的种类 最优二叉树 最优二叉树画法 排序取最小两个值和&#xff0c;得到新值加入排序重复1&#xff0c;2 前序、中序和后序遍历是树形数据结构&#xff08;如二叉树&#xff09;中常用的遍历方式&#xff0c;用于按照特定顺序遍历树的节点。这些遍历方式在不同应用中有不…...

项目实战笔记2:硬技能(上)

序&#xff1a; 本节串讲了项目管理硬技能&#xff0c;有些术语可以结合书或者网上资料来理解。没有想书上讲的那样一一列举。 做计划 首先强调为什么做计划&#xff1f; 计划就是各个角色协同工作的基准&#xff08;后面做风险监控、进度的监控&#xff09;&#xff0c;贯穿于…...

神经网络基础-神经网络补充概念-59-padding

概念 在深度学习中&#xff0c;“padding”&#xff08;填充&#xff09;通常是指在卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNNs&#xff09;等神经网络层中&#xff0c;在输入数据的周围添加额外的元素&#xff08;通常是零&#xff09;&#xf…...

【开源免费】ChatGPT-Java版SDK重磅更新收获2.3k,支持插件模式、实现ChatGpt联网操作。

everybody 七夕来了还单着么&#xff1f; 一、简介 ChatGPT Java版SDK开源地址&#xff1a;https://github.com/Grt1228/chatgpt-java&#xff0c;目前收获将近2200个star&#x1f31f;。 最新版&#xff1a;1.1.1-beta0 <dependency><groupId>com.unfbx</g…...

情报与GPT技术大幅降低鱼叉攻击成本

邮件鱼叉攻击&#xff08;spear phishing attack&#xff09;是一种高度定制化的网络诈骗手段&#xff0c;攻击者通常假装是受害人所熟知的公司或组织发送电子邮件&#xff0c;以骗取受害人的个人信息或企业机密。 以往邮件鱼叉攻击需要花费较多的时间去采集情报、深入了解受…...

Swift 周报 第三十五期

文章目录 前言新闻和社区五天市值蒸发 2000 亿美元&#xff0c;苹果公司怎么了&#xff1f;在你的 App 中帮助顾客解决账单问题需要声明原因的 API 列表现已推出 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组整理周报的第三十五…...

uni-app + SpringBoot +stomp 支持websocket 打包app

文章目录 一、概述&#xff1a;二、配置&#xff1a;1. 后端配置2. uni-app(app端)3. 使用 一、概述&#xff1a; websocket 协议是在http 协议的基础上的升级&#xff0c;通过一次http 请求建立长连接&#xff0c;转而变为TCP 的全双工通信&#xff1b;而http 协议是一问一答…...

LeetCode--HOT100题(35)

目录 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09;题目接口解题思路1代码解题思路2代码 PS: 题目描述&#xff1a;23. 合并 K 个升序链表&#xff08;困难&#xff09; 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合…...

idea插件grep console最佳实践

首发博客地址 https://blog.zysicyj.top/ 参考博客&#xff1a;https://blog.csdn.net/ayunnuo/article/details/123997304 效果 配置 具体颜色 日志级别前景色背景色Error#FF0000#370000Warn#FFC033#1A0037Info#00FFF3无Debug#808080无 本文由 mdnice 多平台发布...

Android 12 源码分析 —— 应用层 二(SystemUI大体组织和启动过程)

Android 12 源码分析 —— 应用层 二&#xff08;SystemUI大体组织和启动过程&#xff09; 在前一篇文章中&#xff0c;我们介绍了SystemUI怎么使用IDE进行编辑和调试。这是分析SystemUI的最基础&#xff0c;希望读者能尽量掌握。 本篇文章&#xff0c;将会介绍SystemUI的大概…...

【C#】通用类型转换

【C#】通用类型转换 自动类型转换&#xff08;隐式类型转换&#xff09;强制类型转换&#xff08;显式类型转换&#xff09;通过函数进行转换&#xff08;通过方法进行类型转换&#xff09;使用 as 操作符转换通用类型转换方法实现 数据类型转换就是将数据&#xff08;变量、数…...

传统DNS、负载均衡服务发现框架与专业服务发现框架(Eurek、nacos)分析

1、DNS 服务器 DNS 服务器可以在一定程度上用作服务发现的机制&#xff0c;以下是其冲动服务发现的一些利弊 优势 广泛性&#xff1a; DNS是互联网的标准协议之一&#xff0c;已经广泛地被支持和使用。因此&#xff0c;使用DNS作为服务发现的机制可以借助现有的网络基础设施…...

js中数组常用操作函数

js数组经常会用到&#xff0c;当涉及到 JavaScript 数组的函数&#xff0c;有许多常用的函数可用于对数组进行操作和转换。以下是一些常见的数组函数的讲解 splice() splice() 函数用于修改数组&#xff0c;可以删除、插入或替换数组中的元素。 var fruits [apple, banana,…...

Windows、Mac、Linux端口占用解决

Windows、Mac、Linux端口占用解决 简介 在使用计算机网络时&#xff0c;经常会遇到端口被占用的问题。当一个应用程序尝试使用已经被其他程序占用的端口时&#xff0c;会导致端口冲突&#xff0c;使应用程序无法正常运行。本文将介绍在Windows、Mac和Linux操作系统上解决端口…...

企业文件透明加密软件——「天锐绿盾」数据防泄密管理软件系统

PC访问地址&#xff1a; 首页 一、文档透明加密软件 文档透明加密功能&#xff1a;在不影响单位内部员工对电脑任何正常操作的前提下&#xff0c;文档在复制、新建、修改时被系统强制自动加密。文档只能在单位内部电脑上正常使用&#xff0c;在外部电脑上使用是乱码或无法打…...

Postman接口自动化测试实例

一.实例背景 在实际业务中&#xff0c;经常会出现让用户输入用户密码进行验证的场景。而为了安全&#xff0c;一般都会先请求后台服务器获取一个随机数做为盐值&#xff0c;然后将盐值和用户输入的密码通过前端的加密算法生成加密后串传给后台服务器&#xff0c;后台服务器接到…...

软件团队降本增效-构建人员评价体系

在软件团队中&#xff0c;最大成本往往来自于人力。这是因为软件开发是一项高度技术密集和智力密集的工作&#xff0c;需要研发人员具备较高的专业知识和技能。研发人员的工作状态和主动性对产出和质量具有极大的影响。如果研发人员缺乏积极性和投入度&#xff0c;可能会导致项…...

Python实现SSA智能麻雀搜索算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法&#xff0c;在2020年提出&a…...

web JS高德地图标点、点聚合、自定义图标、自定义窗体信息、换肤等功能实现和高复用性组件封装教程

文章目录 前言一、点聚合是什么&#xff1f;二、开发前准备三、API示例1.引入高德地图2.创建地图实例3.添加标点4.删除标点5.删除所有标点&#xff08;覆盖物&#xff09;6.聚合点7.自定义聚合点样式8.清除聚合9.打开窗体信息 四、实战开发需求要求效果图如下&#xff1a;封装思…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...