using Infrastructure.Data; using Infrastructure.Extensions; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Drawing; using System.Globalization; using System.IO; using System.Linq; using System.Text; using TeacherExt.Entities; using TeacherExt.Models; using System.Reflection; using NPOI.SS.Util; using NPOI.HSSF.Util; namespace TeacherExt.Controllers { [Authorize] [ApiController] [Route("[controller]/[action]")] public class HomeController : Controller { private readonly IHostEnvironment _env; private readonly ILogger _logger; private readonly IRepository _organRepo; private readonly IRepository _userRepo; private readonly IRepository _teacherRepo; private readonly IRepository _checkLogRepo; public HomeController(IHostEnvironment env, ILogger logger, IRepository organRepo, IRepository userRepo, IRepository teacherRepo, IRepository checkLogRepo) { this._env = env; _logger = logger; this._organRepo = organRepo; this._userRepo = userRepo; this._teacherRepo = teacherRepo; this._checkLogRepo = checkLogRepo; } [HttpGet] [Route("/")] public IActionResult Index(QueryTeacherModel model) { var query = Query(model); model.TotalCount = query.Count(); var list = query .Skip(model.PageSize * (model.PageIndex - 1)) .Take(model.PageSize) .ToList() .Select(o => { var m = o.Teacher != null ? o.Teacher.To() : new EditTeacherModel(); if (o.Teacher != null) { this.EntityToModel(o.Teacher, m); } m.UserName = o.UserName; m.UserId = o.Id; m.Organ = o.Organ.Name; m.RealName = o.RealName; return m; }).ToList(); model.List.AddRange(list); ViewData.SelectList(o => model.RequestEditStatus, () => this.GetRequestEditStatus(model.RequestEditStatus)); ViewData.SelectList(o => model.CheckStatus, () => this.GetCheckStatus(model.CheckStatus)); return Result(model); } [HttpPost] [Route("/")] public IActionResult Index(QueryTeacherModel model,bool isPost) { return this.Index(model); } [HttpGet] public IActionResult Details(Guid userId) { var entity = this._userRepo.ReadOnlyTable() .Include(o => o.Organ) .Include(o => o.Teacher) .FirstOrDefault(o => o.Id == userId); var model = entity.To(); if (entity.Teacher != null) { model.From(entity.Teacher); } model.UserName = entity.UserName; model.UserId = entity.Id; model.Organ = entity.Organ.Name; model.RealName = entity.RealName; this.EntityToModel(entity.Teacher, model); this.ToEditModel(entity.Teacher, model); return Result(model); } [HttpPost] public IActionResult Details([FromForm] EditTeacherModel model) { ValidEditModel(model); var entity = this._userRepo.Table().Include(o => o.Organ).Include(o => o.Teacher).FirstOrDefault(o => o.Id == model.UserId); if (ModelState.IsValid) { if (entity.Teacher.CheckStatus != model.CheckStatus) { this._checkLogRepo.Add(new CheckLog { UpdateBy = User.Identity.Name, UpdateAt = DateTime.Now, UserName = entity.UserName, FromStatus = entity.Teacher.CheckStatus, ToStatus = model.CheckStatus }); } entity.Teacher.From(model); this._userRepo.SaveChanges(); return RedirectToAction("Index"); } this.EntityToModel(entity?.Teacher, model); this.ToEditModel(entity?.Teacher, model); return Result(model); } [HttpGet] public IActionResult Add() { var model = new EditTeacherModel(); this.ToEditModel(null, model); return View(model); } [HttpGet] public IActionResult Edit(Guid userId) { var entity = this._userRepo.ReadOnlyTable() .Include(o => o.Organ) .Include(o => o.Teacher) .FirstOrDefault(o => o.Id == userId); var model = entity.To(); if (entity.Teacher != null) { model.From(entity.Teacher); } model.UserName = entity.UserName; model.UserId = entity.Id; model.Organ = entity.Organ.Name; model.RealName = entity.RealName; this.EntityToModel(entity.Teacher, model); this.ToEditModel(entity.Teacher, model); return Result(model); } [HttpPost] public IActionResult Add([FromForm] EditTeacherModel model) { if (ModelState.IsValid) { var entity = new Teacher(); entity.From(model); this._teacherRepo.Add(entity); this._teacherRepo.SaveChanges(); return RedirectToAction("Index"); } this.ToEditModel(null, model); return View(model); } [HttpPost] public IActionResult Edit([FromForm] EditTeacherModel model) { ValidEditModel(model); var entity = this._userRepo.Table().Include(o => o.Organ).Include(o => o.Teacher).FirstOrDefault(o => o.Id == model.UserId); if (ModelState.IsValid) { if (entity.Teacher == null) { entity.Teacher = new Teacher(); } entity.Teacher.From(model); this._userRepo.SaveChanges(); return RedirectToAction("Index"); } this.EntityToModel(entity?.Teacher, model); this.ToEditModel(entity?.Teacher, model); return View(model); } [HttpGet] public IActionResult History([FromQuery] QueryHistoryModel model) { var query = this._checkLogRepo.ReadOnlyTable() .Where(o => o.UserName == model.UserName) .OrderByDescending(o => o.UpdateAt); model.TotalCount = query.Count(); var list = query.Skip(model.PageSize * (model.PageIndex - 1)) .OrderByDescending(o => o.UpdateAt) .Take(model.PageSize) .ToList() .Select(o => { var m = o.To(); return m; }) .ToList(); model.List.AddRange(list); return Result(model); } /// /// https://github.com/nissl-lab/npoi/wiki/How-to-use-NPOI-on-Linux /// apt-get install libgdiplus libc6-dev /// cd /usr/lib /// ln -s libgdiplus.so gdiplus.dll /// /// [HttpPost] public FileResult Export([FromForm] QueryTeacherModel model) { var template = Path.Combine(this._env.ContentRootPath, "wwwroot", "teacher.xlsx"); using var fs = System.IO.File.OpenRead(template); var wk = new XSSFWorkbook(fs); var sheet = wk.GetSheetAt(0); this.ExportInternal(sheet, model); using var ms = new MemoryStream(); wk.Write(ms); return File(ms.ToArray(), "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"教师列表_{DateTime.Now.ToString("yyyy_MM-dd_HH_mm_ss")}.xlsx"); } private IQueryable Query(QueryTeacherModel model) { var userName = User.Identity.Name; var organId = this._userRepo.ReadOnlyTable().Where(o => o.UserName == userName).Select(o => o.OrganId).FirstOrDefault(); if (User.IsInRole("局管理员")) { model.Organs = this._organRepo.Table().ToList().Where(o => o.ParentId == null).ToList(); } else { model.Organs = this._organRepo.ReadOnlyTable().ToList().Where(o => o.Id == organId).ToList(); } var query = this._userRepo.ReadOnlyTable().Include(o => o.Organ).Include(o => o.Teacher).AsQueryable(); if (User.IsInRole("局管理员")) { if (model.OrganId.HasValue) { query = query.Where(o => o.OrganId == model.OrganId.Value); } } else if (User.IsInRole("校管理员")) { query = query.Where(o => o.OrganId == organId); } else { query = query.Where(o => o.UserName == userName); } if (!model.OrganId.HasValue) { model.OrganId = organId; } query = query .WhereIf(!string.IsNullOrEmpty(model.RequestEditStatus), o => o.Teacher.RequestEditStatus == model.RequestEditStatus) .WhereIf(!string.IsNullOrEmpty(model.CheckStatus), o => o.Teacher.CheckStatus == model.CheckStatus) .WhereIf(!string.IsNullOrEmpty(model.RealName), o => o.RealName.Contains(model.RealName)); return query; } private void ValidEditModel(EditTeacherModel model) { if (!ModelState.IsValid) { if (model.IsJobAsMaxTitle.HasValue) { if (model.IsJobAsMaxTitle.Value) {//最高职称聘任 if (ModelState.ContainsKey(nameof(model.JobAsNotMaxTitleReason))) { ModelState.Remove(nameof(model.JobAsNotMaxTitleReason)); } if (ModelState.ContainsKey(nameof(model.NotMaxTitle))) { ModelState.Remove(nameof(model.NotMaxTitle)); } if (ModelState.ContainsKey(nameof(model.NotMaxTitleStart))) { ModelState.Remove(nameof(model.NotMaxTitleStart)); } if (ModelState.ContainsKey(nameof(model.JobAsNotMaxTitleDate))) { ModelState.Remove(nameof(model.JobAsNotMaxTitleDate)); } } else { if (ModelState.ContainsKey(nameof(model.JobAsMaxTitleDate))) { ModelState.Remove(nameof(model.JobAsMaxTitleDate)); } } } if (string.IsNullOrEmpty(model.EducationGrade) && ModelState.ContainsKey(nameof(model.EducationGradeDate))) {//不享受待遇 ModelState.Remove(nameof(model.EducationGradeDate)); } if (model.HasPosition.HasValue) { if (model.HasPosition.Value) {//在编在岗 if (ModelState.ContainsKey(nameof(model.NotOnPostReason))) { ModelState.Remove(nameof(model.NotOnPostReason)); } if (ModelState.ContainsKey(nameof(model.NotOnPostReasonDate))) { ModelState.Remove(nameof(model.NotOnPostReasonDate)); } if (model.IsMiddleLevel.HasValue) { if (model.IsMiddleLevel.Value) {//中层 if (ModelState.ContainsKey(nameof(model.FrontTeacher))) { ModelState.Remove(nameof(model.FrontTeacher)); } } else {//一线教师 if (ModelState.ContainsKey(nameof(model.Position))) { ModelState.Remove(nameof(model.Position)); } if (ModelState.ContainsKey(nameof(model.PositionStart))) { ModelState.Remove(nameof(model.PositionStart)); } } } } else {//在编不在岗 if (ModelState.ContainsKey(nameof(model.Position))) { ModelState.Remove(nameof(model.Position)); } if (ModelState.ContainsKey(nameof(model.PositionStart))) { ModelState.Remove(nameof(model.PositionStart)); } if (ModelState.ContainsKey(nameof(model.FrontTeacher))) { ModelState.Remove(nameof(model.FrontTeacher)); } } } } } private void ExportInternal(ISheet sheet, QueryTeacherModel model) { var style = this.CreateStyle(sheet); CreateHader(sheet, model); return; var list = this.Query(model) .ToList() .Select(o => { var m = o.Teacher != null ? o.Teacher.To() : new EditTeacherModel { Id = Guid.Empty }; if (o.Teacher != null) { this.EntityToModel(o.Teacher, m); } m.UserId = o.Id; m.Organ = o.Organ.Name; m.RealName = o.RealName; return m; }) .ToList(); var rowIndex = 0; var colIndex = -1; for (int i = 0; i < list.Count; i++) { var teacher = list[i]; var rowNumber = i + 1; rowIndex = i + 4; colIndex = -1; var row = sheet.CreateRow(rowIndex); row.Order(00).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(rowNumber); // this.IsExport(teacher); row.Order(01).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Organ); row.Order(02).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.RealName); row.Order(03).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Sex)?"无":teacher.Sex); row.Order(04).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Birthday.HasValue ? teacher.Birthday.Value.ToString("yyyy-MM") : "无"); if(teacher.Age.HasValue) { row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.Age.Value); } else { row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } row.Order(06).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Nation) ? "无" : teacher.Nation); row.Order(07).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.NativePlace) ? "无" : teacher.NativePlace); row.Order(08).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.PhoneNumber) ? "无" : teacher.PhoneNumber); row.Order(09).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.IdNumber) ? "无" : teacher.IdNumber); row.Order(10).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobStart.HasValue ? teacher.JobStart.Value.ToString("yyyy-MM") : "无"); row.Order(11).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeachDate.HasValue ? teacher.TeachDate.Value.ToString("yyyy-MM") : "无"); row.Order(12).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentJobStart.HasValue ? teacher.CurrentJobStart.Value.ToString("yyyy-MM") : "无"); if (teacher.JobStart.HasValue) { row.Order(13).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAgeYear.Value); row.Order(14).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAgeMonth.Value); } else { row.Order(13).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(14).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } row.Order(15).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Politics)?"无":teacher.Politics); row.Order(16).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JoinPartyDate.HasValue ? teacher.JoinPartyDate.Value.ToString("yyyy-MM") : "无"); row.Order(17).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MaxTitle)?"无":teacher.MaxTitle); row.Order(18).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxTitleStart.HasValue ? teacher.MaxTitleStart.Value.ToString("yyyy-MM") : "无"); if (teacher.IsJobAsMaxTitle.HasValue) { if (teacher.IsJobAsMaxTitle.Value) { row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsMaxTitleDate.HasValue ? teacher.JobAsMaxTitleDate.Value.ToString("yyyy-MM") : "无"); row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } else { row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobAsNotMaxTitleReason)?"无":teacher.JobAsNotMaxTitleReason); row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.NotMaxTitle)?"无":teacher.NotMaxTitle); row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotMaxTitleStart.HasValue ? teacher.NotMaxTitleStart.Value.ToString("yyyy-MM") : "无"); row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsNotMaxTitleDate.HasValue ? teacher.JobAsNotMaxTitleDate.Value.ToString("yyyy-MM") : "无"); } } else { row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } row.Order(24).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.PostType) ? "无" : teacher.PostType); row.Order(25).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.PostGrade) ? "无" : teacher.PostGrade); row.Order(26).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentPostGradeStart.HasValue ? teacher.CurrentPostGradeStart.Value.ToString("yyyy-MM") : "无"); row.Order(27).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.EducationGrade); row.Order(28).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.EducationGrade) ? "无" : teacher.EducationGradeDate.Value.ToString("yyyy-MM")); row.Order(30).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchool) ? "无" : teacher.FullTimeSchool); row.Order(29).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchoolType) ? "无" : teacher.FullTimeSchoolType); row.Order(31).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchoolMajor) ? "无" : teacher.FullTimeSchoolMajor); row.Order(32).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FullTimeSchoolEducation) ? "无" : teacher.FullTimeSchoolEducation); row.Order(33).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolEducationDate.HasValue ? teacher.FullTimeSchoolEducationDate.Value.ToString("yyyy-MM") : "无"); row.Order(35).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchool) ? "无" : teacher.JobTimeSchool); row.Order(34).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchoolType) ? "无" : teacher.JobTimeSchoolType); row.Order(36).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchoolMajor) ? "无" : teacher.JobTimeSchoolMajor); row.Order(37).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.JobTimeSchoolEducation) ? "无" : teacher.JobTimeSchoolEducation); row.Order(38).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobTimeSchoolEducationDate.HasValue ? teacher.JobTimeSchoolEducationDate.Value.ToString("yyyy-MM") : "无"); row.Order(39).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MaxEducation) ? "无" : teacher.MaxEducation); row.Order(40).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MaxDegree) ? "无" : teacher.MaxDegree); row.Order(41).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.IsClassTeacher ? "是" : "否"); row.Order(42).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MainTeachPeriod) ? "无" : teacher.MainTeachPeriod); row.Order(43).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MainTeachSubject) ? "无" : teacher.MainTeachSubject); row.Order(44).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.MainTeachGrade) ? "无" : teacher.MainTeachGrade); row.Order(45).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.OtherTeachPeriod) ? "无" : teacher.OtherTeachPeriod); row.Order(46).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.OtherTeachSubject) ? "无" : teacher.OtherTeachSubject); if (teacher.HasPosition.HasValue) { if (teacher.HasPosition.Value) { if (teacher.IsMiddleLevel.Value) { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Position) ? "无" : teacher.Position); row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.PositionStart.HasValue ? teacher.PositionStart.Value.ToString("yyyy-MM") : "无"); row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.FrontTeacher) ? "无" : teacher.FrontTeacher); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } else { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } } else { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.NotOnPostReason) ? "无" : teacher.NotOnPostReason); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotOnPostReasonDate.HasValue ? teacher.NotOnPostReasonDate.Value.ToString("yyyy-MM") : "无"); } } else { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue("无"); } row.Order(52).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.TeacherCardType) ? "无" : teacher.TeacherCardType); row.Order(53).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.TeacherCardSubject) ? "无" : teacher.TeacherCardSubject); row.Order(54).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.TeacherCardLangLevel) ? "无" : teacher.TeacherCardLangLevel); row.Order(55).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.CurrentAddressArea) ? "无" : teacher.CurrentAddressArea); row.Order(55).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.CurrentAddressStreat) ? "无" : teacher.CurrentAddressStreat); row.Order(56).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(string.IsNullOrEmpty(teacher.Comment) ? "无" : teacher.Comment); } for (int i = 0; i < rowIndex; i++) { sheet.AutoSizeColumn(i); var row = sheet.GetRow(i); if (row != null) { for (int j = 0; j < colIndex; j++) { var cell = sheet.GetRow(i).GetCell(j); if (cell != null) { var length = cell.ToString().Split('\n').Select(o=> Encoding.UTF8.GetBytes(o).Count()).Max()*256; if (length > sheet.GetColumnWidthInPixels(j)) { if (!cell.IsMergedCell) { sheet.SetColumnWidth(j, length); } } } } } } } private List CreateHader(ISheet sheet, QueryTeacherModel model) { var style = this.CreateStyle(sheet, HSSFColor.PaleBlue.Index, 11,HSSFColor.White.Index,true,"黑体"); var result = new List(); var headers = typeof(EditTeacherModel).GetProperties().Select(o => o.GetCustomAttribute()).Where(o => o != null).ToList(); var colIndex = 0; foreach (var item in headers) { if (model.Headers.Contains(item.Header)) { result.Add(item.Header); int i = 0; foreach (var head in item.Headers) { //var cell = (sheet.GetRow(i)??sheet.CreateRow(i)).CreateCell(colIndex); //cell.SetCellValue(head.Key); //var length = cell.ToString().Split('\n').Select(o => Encoding.UTF8.GetBytes(o).Count()).Max()*256; //if (length>sheet.GetColumnWidthInPixels(colIndex)) //{ // sheet.SetColumnWidth(colIndex, length); //} for (int j = i; j < i + head.Value; j++) { var cell = (sheet.GetRow(j) ?? sheet.CreateRow(j)).CreateCell(colIndex);sheet.me cell.SetStyle(style).SetCellValue(head.Key); } i = i + head.Value; //if (head.Value>1) //{ // sheet.AddMergedRegion(new CellRangeAddress(i,i+head.Value-1,colIndex,colIndex)); // sheet.GetRow(i).GetCell(colIndex).SetStyle(style); //} //cell.SetStyle(style); } //sheet.AutoSizeColumn(colIndex); colIndex += 1; } } for (int i = 0; i < sheet.LastRowNum; i++) { var row = sheet.GetRow(i); for (int j = 0; j < row.LastCellNum; j++) { var cell = row.GetCell(j); if (cell != null && cell.StringCellValue != "") { var col = 1; for (int k = j + 1; k < row.LastCellNum; k++) { var next = row.GetCell(k); if (next == null || next.StringCellValue != cell.StringCellValue) { break; } col++; } if (col > 1) { //sheet.AddMergedRegion(new CellRangeAddress(i,i,j,j+col-1)); Console.WriteLine($"@@@@@:{i},{i},{j},{j + col - 1}"); } var rowRange= for (int k = i+1; k < sheet.LastRowNum; k++) { var next = sheet.GetRow(k)?.GetCell(j); if(next==null||next.StringCellValue!=cell.StringCellValue) { break; } } } Console.WriteLine($">>>>>>>>>>>>>{i}x{j}:{cell?.StringCellValue}"); } } return result; } private ICellStyle CreateStyle(ISheet sheet,short? backgroundColor=null,double? fontSize=null,short? fontColor=null,bool isBold=false,string fontName=null) { var style = sheet.Workbook.CreateCellStyle(); style.WrapText = true; if(backgroundColor.HasValue) { style.FillPattern = FillPattern.SolidForeground; style.FillForegroundColor = backgroundColor.Value; } var font = sheet.Workbook.CreateFont(); if(!string.IsNullOrEmpty(fontName)) { font.FontName = fontName; } font.IsBold = isBold; if(fontSize.HasValue) { font.FontHeightInPoints = fontSize.Value; } if(fontColor.HasValue) { font.Color = fontColor.Value; } style.SetFont(font); style.Alignment = HorizontalAlignment.Center; style.VerticalAlignment = VerticalAlignment.Center; style.BorderTop = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; return style; } private void EntityToModel(Teacher entity, EditTeacherModel model) { if (entity != null) { if (!string.IsNullOrEmpty(entity.IdNumber)) { var value = entity.IdNumber.Length == 15 ? $"19{entity.IdNumber.Substring(6, 6)}" : entity.IdNumber.Substring(6, 8); var birthday = DateTime.ParseExact(value, "yyyyMMdd", CultureInfo.InvariantCulture); model.Age = DateTime.Now.Year - birthday.Year; } if (entity.JobStart.HasValue) { model.JobAgeYear = DateTime.Now.Year - entity.JobStart.Value.Year; model.JobAgeMonth = model.JobAgeYear*12 + Math.Abs((entity.JobStart.Value.Month - DateTime.Now.Month)); } } } private void ToEditModel(Teacher entity, EditTeacherModel model) { ViewData.SelectList(o => model.RequestEditStatus, () => this.GetRequestEditStatus(model.RequestEditStatus)); ViewData.SelectList(o => model.CheckStatus, () => this.GetCheckStatus(model.CheckStatus)); ViewData.SelectList(o => model.UserType, () => this.GetUserType(model.UserType)); ViewData.SelectList(o => model.Sex, () => this.GetSex(model.Sex)); ViewData.SelectList(o => model.Nation, () => this.GetNation(model.Nation)); ViewData.SelectList(o => model.Politics, () => this.GetPolitics(model.Politics)); ViewData.SelectList(o => model.MaxTitle, () => this.GetTitle(model.MaxTitle)); ViewData.SelectList(o => model.NotMaxTitle, () => this.GetTitle(model.NotMaxTitle)); ViewData.SelectList(o => model.PostType, () => this.GetPost(model.PostType)); ViewData.SelectList(o => model.PostGrade, () => this.GetPostGrade(model.PostGrade)); ViewData.SelectList(o => model.EducationGrade, () => this.GetEducationGrade(model.EducationGrade)); ViewData.SelectList(o => model.FullTimeSchoolType, () => this.GetFullTimeSchoolType(model.FullTimeSchoolType)); ViewData.SelectList(o => model.FullTimeSchoolEducation, () => this.GetEducation(model.FullTimeSchoolEducation)); ViewData.SelectList(o => model.JobTimeSchoolType, () => this.GetFullTimeSchoolType(model.JobTimeSchoolType)); ViewData.SelectList(o => model.JobTimeSchoolEducation, () => this.GetEducation(model.JobTimeSchoolEducation)); ViewData.SelectList(o => model.MaxEducation, () => this.GetEducation(model.MaxEducation)); ViewData.SelectList(o => model.MaxDegree, () => this.GetDegree(model.MaxDegree)); ViewData.SelectList(o => model.MainTeachPeriod, () => this.GetTeachPeriod(model.MainTeachPeriod)); ViewData.SelectList(o => model.MainTeachSubject, () => this.GetTeachSubject(model.MainTeachSubject)); ViewData.SelectList(o => model.MainTeachGrade, () => this.GetTeachGrade(model.MainTeachGrade)); ViewData.SelectList(o => model.OtherTeachPeriod, () => this.GetTeachPeriod(model.OtherTeachPeriod)); ViewData.SelectList(o => model.OtherTeachSubject, () => this.GetTeachSubject(model.OtherTeachSubject)); ViewData.SelectList(o => model.Position, () => this.GetPosition(model.Position)); ViewData.SelectList(o => model.FrontTeacher, () => this.GetFrontTeacher(model.FrontTeacher)); ViewData.SelectList(o => model.NotOnPostReason, () => this.GetNotOnPostReason(model.NotOnPostReason)); ViewData.SelectList(o => model.TeacherCardType, () => this.GetTeacherCardType(model.TeacherCardType)); ViewData.SelectList(o => model.TeacherCardLangLevel, () => this.GetLangLevel(model.TeacherCardLangLevel)); ViewData.SelectList(o => model.CurrentAddressArea, () => this.GetAddressArea(model.CurrentAddressArea)); } private SelectList GetRequestEditStatus(string selected) { return new string[] { "未申请", "已申请", }.ToSelectList(selected); } private SelectList GetCheckStatus(string selected) { return new string[] { "未提交", "待校级审核", "校级审核失败", "待局级审核", "局级审核失败", "局级审核成功", }.ToSelectList(selected); } private SelectList GetUserType(string selected) { return new string[] { "在编教师", "区聘教师", "校聘教师", }.ToSelectList(selected); } private SelectList GetSex(string selected) { return new string[] { "男", "女", }.ToSelectList(selected); } private SelectList GetNation(string selected) { return new string[] { "汉族", "蒙古族", "回族", "藏族", "维吾尔族", "苗族", "彝族", "壮族", "布依族", "朝鲜族", "满族", "侗族", "瑶族", "白族", "土家族", "哈尼族", "哈萨克族", "傣族", "黎族", "傈僳族", "佤族", "畲族", "高山族", "拉祜族", "水族", "东乡族", "纳西族", "景颇族", "柯尔克孜族", "土族", "达斡尔族", "仫佬族", "羌族", "布朗族", "撒拉族", "毛难族", "仡佬族", "锡伯族", "阿昌族", "普米族", "塔吉克族", "怒族", "乌孜别克族", "俄罗斯族", "鄂温克族", "崩龙族", "保安族", "裕固族", "京族", "塔塔尔族", "独龙族", "鄂伦春族", "赫哲族", "门巴族", "珞巴族", "基诺族", "无" }.ToSelectList(selected); } private SelectList GetPolitics(string selected) { return new string[] { "中共党员", "中共预备党员", "共青团员", "群众", "民革会员", "民盟盟员", "民建会员", "民进会员", "农工党党员", "致公党党员", "九三学社社员", "台盟盟员", "其他民主党派", }.ToSelectList(selected); } private SelectList GetTitle(string selected) { return new string[] { "正高级教师", "高级教师", "一级教师", "二级教师", "未评", "工勤", }.ToSelectList(selected); } private SelectList GetPost(string selected) { return new string[] { "专技岗位", "管理岗位", "工勤岗位", }.ToSelectList(selected); } private SelectList GetPostGrade(string selected) { return new string[] { "四级", "五级", "六级", "七级", "八级", "九级", "十级", "十一级", "十二级", }.ToSelectList(selected); } private SelectList GetEducationGrade(string selected) { return new string[] { "专技十一级", "专技十二级", }.ToSelectList(selected); } private SelectList GetFullTimeSchoolType(string selected) { return new string[] { "师范院校师范专业", "师范院校非师范专业", "非师范院校师范专业", "非师范院校非师范专业", }.ToSelectList(selected); } private SelectList GetEducation(string selected) { return new string[] { "研究生博士教育", "研究生硕士教育", "大学本科教育", "大学专科教育", "中等专业教育", "普通高级中学教育", "初级中学教育", "小学教育", "其他", }.ToSelectList(selected); } private SelectList GetDegree(string selected) { return new string[] { "学士学位", "硕士学位", "博士学位", }.ToSelectList(selected); } private SelectList GetTeachPeriod(string selected) { return new string[] { "学前教育", "小学", "普通初中", "无", }.ToSelectList(selected); } private SelectList GetTeachSubject(string selected) { return new string[] { "语文", "数学", "英语", "音乐", "体育", "美术", "科学", "书法", "信息技术", "政治", "历史", "地理", "物理", "化学", "生物", "幼教全科", "心理健康", "综合实践课", "无", }.ToSelectList(selected); } private SelectList GetTeachGrade(string selected) { return new string[] { "九年级", "八年级", "七年级", "六年级", "五年级", "四年级", "三年级", "二年级", "一年级", "幼儿园大班", "幼儿园中班", "幼儿园小班", "无", }.ToSelectList(selected); } private SelectList GetPosition(string selected) { return new string[] { "校长", "副校长", "党支部副书记", "办公室主任", "办公室副主任", "教导处主任", "教导处副主任", "德育主任", "团支部书记", "大队辅导员", "工会主席", "总务主任", "总务副主任", "无", }.ToSelectList(selected); } private SelectList GetFrontTeacher(string selected) { return new string[] { "一线教师", "无", }.ToSelectList(selected); } private SelectList GetNotOnPostReason(string selected) { return new string[] { "长期病假", "产假", "挂职", "支教", }.ToSelectList(selected); } private SelectList GetTeacherCardType(string selected) { return new string[] { "幼儿园教师资格", "小学教师资格", "初级中学教师资格", "高级中学教师资格", "中等职业学校教师资格", "中等职业学校实习指导教师资格", "高等学校教师资格", "无", }.ToSelectList(selected); } private SelectList GetLangLevel(string selected) { return new string[] { "一级甲等", "一级乙等", "二级甲等", "二级乙等", "三级甲等", "无", }.ToSelectList(selected); } private SelectList GetAddressArea(string selected) { return new string[] { "城中区", "城北区", "城西区", "城东区", }.ToSelectList(selected); } private IActionResult Result(object model) { if (this.IsJsonRequest()) { return Json(new { schema = this.GetJsonSchema(), model, errors = ModelState.Where(o => o.Value.ValidationState == ModelValidationState.Invalid), data = ViewData }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver(), ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); } return View(model); } } }