From 3341f9f729e2c9f37d7fd8cbfdfe7b0a9411e61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?old=E6=98=93?= <156663459@qq.com> Date: Wed, 3 Jul 2024 11:18:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=87=BApdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Front/PcVolunteerController.cs | 115 +++++++++++-- New_College.Api/New_College.xml | 2 +- PdfOpt/PdfOptHelper.cs | 162 ++++++++++-------- 3 files changed, 195 insertions(+), 84 deletions(-) diff --git a/New_College.Api/Controllers/Front/PcVolunteerController.cs b/New_College.Api/Controllers/Front/PcVolunteerController.cs index 380dec7..4a8c6ea 100644 --- a/New_College.Api/Controllers/Front/PcVolunteerController.cs +++ b/New_College.Api/Controllers/Front/PcVolunteerController.cs @@ -215,23 +215,113 @@ namespace New_College.Api.Controllers.Front /// /// [HttpGet("generate")] - public IActionResult Generate([FromQuery] MinExcelAttrDto dto) + public async Task GenerateAsync([FromQuery] MinExcelAttrDto dto) { string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2023", "2022", "2021" }; - var stream = PdfOptHelper.CreatePdf("test", unversityheaders.ToList(), new List() { - new PdfOptHelper.dataModel() - { id=1, - history="录取人数\n计划人数\n最低分\n最低位次\n效位差", - planName="A222", - probability="90%", - universityCode="A99", - universityName="中科大大家四大石窟记得哈就开始大肆扩大数据库", - years=new List(){"2023", "2022", "2021" } - } + // 添加表头 + string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2023", "2022", "2021" }; + if (dto.id <= 0) + { + throw new Exception("id为空"); + } + var view = new VolunteerExcelAttrModel(); + var query = await _VolunteerTableServices.QueryById(dto.id); + var items = await _VolunteerTableDetailServices.Query(c => c.VolunteerTableId == dto.id); + var PlanMajorIds = new List(); + foreach (var item in items) + { + var ids = item.PlanMajorIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(c => int.Parse(c)).ToList(); + PlanMajorIds.AddRange(ids); + } + var planmajordesc = await _TbSNeedDataInfoServices.Query(c => SqlFunc.ContainsArray(PlanMajorIds, c.ID));// + var location = planmajordesc.FirstOrDefault().Location; + var majorlist = planmajordesc.Select(c => c.MajorName).ToList(); + var universityname = planmajordesc.Select(c => c.UniversityName).Distinct().ToList(); + var planmajorcomplist = await _TbSNeedDataInfoServices.Query(c => c.Location == location && SqlFunc.ContainsArray(majorlist, c.MajorName) && SqlFunc.ContainsArray(universityname, c.UniversityName));// + view.VolunteerTableName = query.VolunteerTableName; + view.SubjectClaim = query.SubjectClaim; + view.Score = query.Score; + view.Type = query.Type; + var tableDetailItemsViews = new List(); + + var optmodels = new List(); + items.ForEach(s => + { + var planids = s.PlanMajorIds.Split(",", StringSplitOptions.RemoveEmptyEntries).Select(ss => long.Parse(ss)).ToList(); + var typeinfo = new List(); + if (!string.IsNullOrWhiteSpace(s.VolunteerRemark)) + { + typeinfo = s.VolunteerRemark.FromJson>(); + } + var planstatus = planmajordesc.Any(e => e.UniversityName == s.UniversityName); + var firstmodels = planmajordesc.Where(e => e.UniversityName == s.UniversityName).FirstOrDefault(); + planmajordesc.Where(ww => planids.Contains(ww.ID)).ToList().ForEach(a => + { + tableDetailItemsViews.Add(new VolunteerItemsViewMinExcelAttr() + { + UniversityName = s.UniversityName, + UniversityCode = s.UniversityCode, + AreaName = planstatus ? firstmodels.Province != null ? firstmodels.Province + "|" + (planstatus ? firstmodels.City : "") : "" : "", + Nature = planstatus ? firstmodels.Nature != null ? firstmodels.Nature : "" : "", + fee = string.IsNullOrEmpty(a.Fee) ? "--" : a.Fee, + Major = a.MajorName, + MajorCode = a.MajorCode, + // MajorGroup = a.MajorGroup, + //// MajorRemark = a.Remark, + planCount = a._plancount, + AcademicYear = a.AcademicYear, + Sort = s.OrderSort, + MajorSubjectClam = a._23subject, + MajorGroup = a.MajorGroup, + Percentage = typeinfo.Where(e => e.planId == a.ID).FirstOrDefault().tage.ToString() + "%", + _23PlanCount = a._23Count == "0" ? "--" : a._23Count, + _22PlanCount = a._22Count == "0" ? "--" : a._22Count, + _21PlanCount = a._21Count == "0" ? "--" : a._21Count, + _21RankLine = a._21ScoreLine == "0" ? "--" : a._21ScoreLine, + _21Scoreline = a._21Score == "0" ? "--" : a._21Score, + _22RankLine = a._22ScoreLine == "0" ? "--" : a._22ScoreLine, + _22Scoreline = a._22Score == "0" ? "--" : a._22Score, + _23RankLine = a._23ScoreLine == 0 ? "--" : a._23ScoreLine.ToString(), + _23Scoreline = a._23Score == "0" ? "--" : a._23Score, + }); + }); + }); + var ulist = tableDetailItemsViews.Select(c => new PdfOptHelper.dataModel() + { + universityCode = c.UniversityCode, + universityName = c.UniversityName + }).ToList(); + int k = 0; + ulist.ForEach(a => + { + k++; + a.planCount = string.Format("计划数:{0}", "-"); + a.id = k; + a.years = new List() + { "-", "-","-" }; + a.history = "-"; + a.probability = "-"; + a.majorModels = tableDetailItemsViews.Select(c => new PdfOptHelper.dataMajorModel() + { + id = c.Sort, + history = "计划人数\n最低分\n最低位次\n效位差", + majorCode = c.MajorCode, + mjaorName = c.Major, + planCount = string.Format("{0}人\n{1}年\n¥{2}\n{3}", c.planCount.ToString(), c.AcademicYear, c.fee, c.MajorSubjectClam), + probability = c.Percentage, + years = new List() { + string.Format("{0}\n{1}\n{2}\n{3}", c._23PlanCount == "0" ? "--":c._23PlanCount, c._23Scoreline == "0" ? "--" : c._23Scoreline, c._23RankLine == "0" ? "--" : c._23RankLine, "--"), + string.Format("{0}\n{1}\n{2}\n{3}", c._22PlanCount == "0" ? "--":c._22PlanCount, c._22Scoreline == "0" ? "--" : c._22Scoreline, c._22RankLine == "0" ? "--" : c._22RankLine, "--"), + string.Format("{0}\n{1}\n{2}\n{3}", c._21PlanCount == "0" ? "--":c._21PlanCount, c._21Scoreline == "0" ? "--" : c._21Scoreline, c._21RankLine == "0" ? "--" : c._21RankLine, "--") + } + }).ToList(); }); + + var stream = PdfOptHelper.CreatePdf(string.Format("{0}-{1}-{2}", query.VolunteerTableName, query.SubjectClaim, query.Score), unversityheaders.ToList(), majorlistheaders.ToList(), ulist); + // 返回 PDF 文件 - return File(stream.ToArray(), "application/pdf", "table_example_with_logo_and_title.pdf"); + return File(stream.ToArray(), "application/pdf", string.Format("{0}.pdf", DateTime.Now.ToString("yyyyMMddhhssfff_"))); } [HttpGet("Export")] @@ -302,7 +392,6 @@ namespace New_College.Api.Controllers.Front }); }); }); - // view.viewMinExcelAttrs = tableDetailItemsViews; //在内存中当开辟空间 var memoryStream = new MemoryStream(); diff --git a/New_College.Api/New_College.xml b/New_College.Api/New_College.xml index c68a440..85d7f85 100644 --- a/New_College.Api/New_College.xml +++ b/New_College.Api/New_College.xml @@ -688,7 +688,7 @@ 志愿表Id - + diff --git a/PdfOpt/PdfOptHelper.cs b/PdfOpt/PdfOptHelper.cs index 6ff7807..a472163 100644 --- a/PdfOpt/PdfOptHelper.cs +++ b/PdfOpt/PdfOptHelper.cs @@ -15,14 +15,16 @@ namespace PDFGenerateApi public class PdfOptHelper { + /// /// /// /// /// + /// /// /// - public static MemoryStream CreatePdf(string pagetitle, List headers, List dataModels) + public static MemoryStream CreatePdf(string pagetitle, List headers, List majors, List dataModels) { // 创建内存流 using (var stream = new MemoryStream()) @@ -57,74 +59,19 @@ namespace PDFGenerateApi // 添加标题下方内容 Paragraph subtitle = CreateSubTitle(font, string.Format("最后修改时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm"))); document.Add(subtitle); - // 添加表头 - // string[] unversityheaders = { "志愿", "概率", "院校代码", "院校名称", "24招生计划", "历年", "2023", "2022", "2021" }; - Table universitytable = HeaderTable(font, 9, headers, new List() { }); - document.Add(universitytable); - #region ***********写入表格 - // 创建一个 8列的表格,设置表格宽度为 100% 以适应页面宽度 - // Table universitytable = new Table(9); - // universitytable.SetWidth(UnitValue.CreatePercentValue(100)); + dataModels.ForEach(a => + { + Table universitytable = HeaderTable(font, 9, headers, new List() { a }); + universitytable.SetMarginTop(20); + document.Add(universitytable); + Table majortable = MajorTable(font, 9, majors, a.majorModels); + document.Add(majortable); + // 手动分页并添加新的表格,不带表头 + // document.Add(new AreaBreak(AreaBreakType.NEXT_PAGE)); + }); + //专业 - //int h = 0; - //foreach (var header in unversityheaders) - //{ - // h++; - // if (h == 4) - // { - // universitytable.AddHeaderCell(new Cell().Add(new Paragraph(header).SetWidth(85).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER))); - // } - // else - // { - // universitytable.AddHeaderCell(new Cell().Add(new Paragraph(header).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER))); - // } - //} - - //// 可选:添加表格数据,这里仅作为示例 - //for (int i = 1; i <= 1; i++) - //{ - // universitytable.AddCell(new Cell().Add(new Paragraph(i.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("0.9").SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("A999").SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("山东师范大学(本科)(山东公办)省重点 保研 研究生院 省部共建山东 济南市/综合/公办/排名190" + i).SetWidth(85).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("100").SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - - // universitytable.AddCell(new Cell().Add(new Paragraph("历史数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("2023数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("2022数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // universitytable.AddCell(new Cell().Add(new Paragraph("2021数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - - //} - //document.Add(universitytable); - //// float[] columnWidths = { 0.5f, 0.5f, 1, 2, 1, 1, 1, 1, 1 }; - //Table majortable = new Table(9); - //majortable.SetWidth(UnitValue.CreatePercentValue(100)); - //// 添加表头 - //string[] majorlistheaders = { "序号", "概率", "专业代码", "专业名称", "24招生计划", "历年", "2023", "2022", "2021" }; - //foreach (var header in majorlistheaders) - //{ - // majortable.AddHeaderCell(new Cell().Add(new Paragraph(header).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER))); - //} - - - //for (int i = 1; i <= 5; i++) - //{ - // majortable.AddCell(new Cell().Add(new Paragraph(i.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("0.9").SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("QL").SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("垫子信息技术" + i).SetWidth(85).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("20").SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - - // majortable.AddCell(new Cell().Add(new Paragraph("录取人数\n计划人数\n最低分\n最低位次\n效位差" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("2023数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("2022数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - // majortable.AddCell(new Cell().Add(new Paragraph("2021数据" + i).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - - //} - //document.Add(majortable); - #endregion - // 将表格添加到文档中 // 关闭文档 document.Close(); // 返回 PDF 文件 @@ -177,7 +124,8 @@ namespace PDFGenerateApi /// private static Table HeaderTable(PdfFont font, int tb, List headers, List dataList) { - Table table = new Table(tb); + float[] columnWidths = { 1, 1, 2, 3, 2, 2, 2, 1, 1 }; + Table table = new Table(columnWidths); table.SetWidth(UnitValue.CreatePercentValue(100)); @@ -200,7 +148,44 @@ namespace PDFGenerateApi table.AddCell(new Cell().Add(new Paragraph(a.probability).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); table.AddCell(new Cell().Add(new Paragraph(a.universityCode).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); table.AddCell(new Cell().Add(new Paragraph(a.universityName).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); - table.AddCell(new Cell().Add(new Paragraph(a.planName).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.planCount).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.history).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + a.years.ForEach(a => + { + table.AddCell(new Cell().Add(new Paragraph(a).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + }); + }); + + + return table; + } + + + private static Table MajorTable(PdfFont font, int tb, List headers, List dataList) + { + float[] columnWidths = { 1, 1, 2, 3, 2, 2, 2, 1, 1 }; + Table table = new Table(columnWidths); + table.SetWidth(UnitValue.CreatePercentValue(100)); + int h = 0; + foreach (var header in headers) + { + h++; + if (h == 4) + { + table.AddCell(new Cell().Add(new Paragraph(header).SetWidth(85).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER))); + } + else + { + table.AddCell(new Cell().Add(new Paragraph(header).SetFont(font).SetBold().SetTextAlignment(TextAlignment.CENTER))); + } + } + dataList.ForEach(a => + { + table.AddCell(new Cell().Add(new Paragraph(a.id.ToString()).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.probability).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.majorCode).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.mjaorName).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); + table.AddCell(new Cell().Add(new Paragraph(a.planCount).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); table.AddCell(new Cell().Add(new Paragraph(a.history).SetFont(font).SetTextAlignment(TextAlignment.CENTER))); a.years.ForEach(a => { @@ -211,6 +196,7 @@ namespace PDFGenerateApi } + public class dataModel { public int id { get; set; } @@ -231,7 +217,41 @@ namespace PDFGenerateApi public string universityName { get; set; } - public string planName { get; set; } + public string planCount { get; set; } + + + public string history { get; set; } + + public List years { get; set; } + + /// + /// + /// + public List majorModels { get; set; } + } + + + public class dataMajorModel + { + public int id { get; set; } + + /// + /// + /// + public string probability { get; set; } + + /// + /// + /// + public string majorCode { get; set; } + + /// + /// + /// + public string mjaorName { get; set; } + + + public string planCount { get; set; } public string history { get; set; } @@ -240,5 +260,7 @@ namespace PDFGenerateApi } + + } }