using Infrastructure.Application; using Infrastructure.Data; using Infrastructure.Extensions; using Infrastructure.Web.Mvc; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Rendering; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Globalization; using System.IO; using System.Linq; using System.Text; using TeacherExt.Entities; using TeacherExt.Models; namespace TeacherExt.Controllers { public class HomeController : CrudController { private readonly IHostEnvironment _env; private readonly ILogger _logger; private readonly IRepository _teacherRepo; public HomeController(IHostEnvironment env, ILogger logger, IRepository teacherRepo) : base(teacherRepo) { this._env = env; _logger = logger; this._teacherRepo = teacherRepo; } /// /// 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 /// /// public FileResult Export() { 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); 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 void ExportInternal(ISheet sheet) { var style = sheet.Workbook.CreateCellStyle(); style.BorderTop = BorderStyle.Thin; style.BorderRight = BorderStyle.Thin; style.BorderBottom = BorderStyle.Thin; style.BorderLeft = BorderStyle.Thin; var list = this._teacherRepo.ReadOnlyTable() .ToList().Select(o => { var m = o.To(); this.EntityToModel(o, m); this.ToDisplayModel(o, m); 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; var row = sheet.CreateRow(rowIndex); row.Order(00).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(rowNumber); 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.UserType); row.Order(03).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.RealName); row.Order(04).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Sex); row.Order(05).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Birthday.Value.ToString("yyyy-MM")); row.Order(06).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.Age.Value); row.Order(07).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Nation); row.Order(08).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NativePlace); row.Order(09).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.PhoneNumber); row.Order(10).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.IdNumber); row.Order(11).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobStart.Value.ToString("yyyy-MM")); row.Order(12).CreateCell(++colIndex).SetStyle(style).SetType(CellType.Numeric).SetCellValue(teacher.JobAge.Value); row.Order(13).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeachDate.HasValue ? teacher.TeachDate.Value.ToString("yyyy-MM") : ""); row.Order(14).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentJobStart.HasValue ? teacher.CurrentJobStart.Value.ToString("yyyy-MM") : ""); row.Order(15).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(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(teacher.MaxTitle); row.Order(18).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxTitleStart.Value.ToString("yyyy-MM")); if (teacher.IsJobAsMaxTitle.Value) { row.Order(19).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsMaxTitleDate.Value.ToString("yyyy-MM")); row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); } else { row.Order(19).CreateCell(++colIndex).SetStyle(style); row.Order(20).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsNotMaxTitleReason); row.Order(21).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotMaxTitle); row.Order(22).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotMaxTitleStart.Value.ToString("yyyy-MM")); row.Order(23).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.JobAsNotMaxTitleDate.Value.ToString("yyyy-MM")); } row.Order(24).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.PostType); row.Order(25).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(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(29).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolType); row.Order(30).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchool); row.Order(31).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolMajor); row.Order(32).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolEducation); row.Order(33).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolEducationDate.HasValue ? teacher.FullTimeSchoolEducationDate.Value.ToString("yyyy-MM") : ""); row.Order(34).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolType); row.Order(35).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchool); row.Order(36).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolMajor); row.Order(37).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolEducation); row.Order(38).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.FullTimeSchoolEducationDate.HasValue ? teacher.FullTimeSchoolEducationDate.Value.ToString("yyyy-MM") : ""); row.Order(39).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MaxEducation); row.Order(40).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(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(teacher.MainTeachPeriod); row.Order(43).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MainTeachSubject); row.Order(44).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.MainTeachGrade); row.Order(45).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.OtherTeachPeriod); row.Order(46).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.OtherTeachSubject); if (teacher.HasPosition.Value) { if (teacher.IsMiddleLevel.Value) { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(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(teacher.FrontTeacher); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); } else { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); } } else { row.Order(47).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(48).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(49).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String); row.Order(50).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotOnPostReason); row.Order(51).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.NotOnPostReasonDate.HasValue ? teacher.NotOnPostReasonDate.Value.ToString("yyyy-MM") : ""); } row.Order(52).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeacherCardType); row.Order(53).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeacherCardSubject); row.Order(54).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.TeacherCardLangLevel); row.Order(55).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentAddressArea); row.Order(55).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.CurrentAddressStreat); row.Order(56).CreateCell(++colIndex).SetStyle(style).SetType(CellType.String).SetCellValue(teacher.Comment); } var colWidthList = new System.Collections.Generic.Dictionary(); for (int i = 0; i < rowIndex; i++) { var row = sheet.GetRow(i); for (int j = 0; j < colIndex; j++) { var cell = sheet.GetRow(i).GetCell(j); if (!colWidthList.ContainsKey(j)) { colWidthList.Add(j, 0); } var value = cell.ToString(); var array = value.Split('\n'); var length = array.Select(o => Encoding.UTF8.GetBytes(o).Count()).Max() + 2; if (length > colWidthList[j]) { if (!cell.IsMergedCell) { colWidthList[j] = length; Console.WriteLine($">>>>>{j}:{length}:{value}"); } } } } foreach (var item in colWidthList.Keys) { var width = colWidthList[item] * 256; if (width == 0) { continue; } sheet.SetColumnWidth(item, width); Console.WriteLine($"{sheet.GetRow(2).GetCell(item)}:{item}:{colWidthList[item]}"); } } public override void OnActionExecuting(ActionExecutingContext context) { } public override IQueryable Query(PagedListModel model, IQueryable query) { return query.WhereIf(!string.IsNullOrEmpty(model.Query.RealName), o => o.RealName.Contains(model.Query.RealName)) .WhereIf(!string.IsNullOrEmpty(model.Query.CheckStatus), o => o.CheckStatus == model.Query.CheckStatus); } public override IQueryable Include(IQueryable query) { return query.Include(o => o.Info).Include(o => o.Prop); } public override void EntityToModel(Teacher entity, EditTeacherModel model) { 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.JobAge = DateTime.Now.Year - entity.JobStart.Value.Year; } } public override void ToEditModel(Teacher entity, EditTeacherModel model) { 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.TeacherCardType, () => this.GetTeacherCardType(model.TeacherCardType)); ViewData.SelectList(o => model.TeacherCardLangLevel, () => this.GetLangLevel(model.TeacherCardLangLevel)); ViewData.SelectList(o => model.CurrentAddressArea, () => this.GetAddressArea(model.CurrentAddressArea)); } public override void ToDisplayModel(Teacher entity, EditTeacherModel model) { this.EntityToModel(entity, model); } 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 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); } } }