public void exportTable(UIResult result) { var adjustRecord = base.LocalID.DeSerializeAdjustRecord <ResultAdjustmentModel>(result.TaskID); if (adjustRecord != null) { if (!result.IsUploaded) { this.ShowDialog("提示信息", "本地结果发生改变上传后才可以导出!", DialogSettingType.OnlyOkButton, DialogType.Warning); return; } } // (1:班级 2:教师 3:学生) int exportType = 1; ExportTypeWindow window = new ExportTypeWindow(true); window.Closed += (s, arg) => { if (window.DialogResult.Value) { exportType = window.Type; #region 导出 var cl = CommonDataManager.GetCLCase(base.LocalID); var local = CommonDataManager.GetLocalCase(base.LocalID); ResultModel resultModel = base.LocalID.DeSerializeLocalResult <ResultModel>(result.TaskID); if (resultModel == null) { var value = OSHttpClient.Instance.GetResult(result.TaskID); if (value.Item1) { resultModel = value.Item2; } else { this.ShowDialog("提示信息", "获取走班结果失败", CustomControl.Enums.DialogSettingType.OnlyOkButton, CustomControl.Enums.DialogType.Warning); return; } } string typeName = "班级课表"; if (exportType == 2) { typeName = "教师课表"; } else if (exportType == 3) { typeName = "学生课表"; } System.Windows.Forms.SaveFileDialog saveDialog = new System.Windows.Forms.SaveFileDialog(); saveDialog.Filter = "Microsoft Excel files(*.xls)|*.xls;*.xlsx"; saveDialog.FileName = $"{local.Name}-{result.TaskID}-({typeName})"; var confirm = saveDialog.ShowDialog(); if (confirm == System.Windows.Forms.DialogResult.OK) { Dictionary <string, DataTable> values = new Dictionary <string, DataTable>(); Dictionary <string, List <UIExcelExport> > studentPreselections = new Dictionary <string, List <UIExcelExport> >(); if (exportType == 1) { var dt = this.CreateTableFrame(); values.Add("课表", dt); var details = (from c in resultModel.ResultClasses from rc in c.ResultDetails select new { c.ClassID, rc.ClassHourId, rc.DayPeriod, rc.Teachers, rc }); var groups = details.GroupBy(g => $"{g.DayPeriod.Day}|{g.DayPeriod.Period}|{g.DayPeriod.PeriodName}")?.ToList(); groups?.ForEach(g => { var first = g.First(); var dayPeriod = first.DayPeriod; StringBuilder sb = new StringBuilder(); g.ToList()?.ForEach(gi => { sb.AppendLine(cl.GetClassByID(gi.ClassID)?.Display); if (gi.Teachers != null) { var teachers = cl.GetTeachersByIds(gi.Teachers.ToList()); sb.AppendLine(teachers.Select(t => t.Name).Parse()); sb.AppendLine(); } }); //var setValue = g.ToList()?.Select(gi => // { // return cl.GetClassByID(gi.ClassID)?.Display; // })?.Parse("\n"); if (sb.Length > 0) { SetCellData(dt, sb.ToString(), dayPeriod); } }); } else if (exportType == 2) { // 获取所有教师 var classHourIDs = from c in resultModel.ResultClasses from rd in c.ResultDetails select rd.ClassHourId; var classHours = cl.GetClassHours(classHourIDs?.ToArray()); List <UITeacher> teachers = new List <UITeacher>(); classHours?.ForEach(ch => { ch.Teachers.ForEach(t => { var teacher = teachers.FirstOrDefault(tt => tt.ID.Equals(t.ID)); if (teacher == null) { teachers.Add(new UITeacher() { ID = t.ID, Name = t.Name, ClassHourIDs = new List <int> { ch.ID } }); } else { teacher.ClassHourIDs.Add(ch.ID); } }); }); if (teachers.Count == 0) { this.ShowDialog("提示信息", "没有教师信息无法导出教师课表!", DialogSettingType.OnlyOkButton, DialogType.Warning); return; } teachers.ForEach(t => { // 创建基础结构 var dt = this.CreateTableFrame(); values.Add(t.Name, dt); var resultDetails = (from rc in resultModel.ResultClasses from rd in rc.ResultDetails select new { rc.ClassID, rd.ClassHourId, rd.DayPeriod, }); var filters = (from ch in t.ClassHourIDs from rc in resultDetails where ch == rc.ClassHourId select rc)?.ToList(); var groups = filters?.GroupBy(g => $"{g.DayPeriod.Day}|{g.DayPeriod.Period}|{g.DayPeriod.PeriodName}")?.ToList(); groups?.ForEach(g => { var first = g.First(); var dayPeriod = first.DayPeriod; var setValue = g.ToList()?.Select(gi => { return(cl.GetClassByID(gi.ClassID)?.Display); })?.Parse("\n"); SetCellData(dt, setValue, dayPeriod); }); }); } else if (exportType == 3) { var preselectionsGroups = (from stu in cl.Students from sp in stu.Preselections where stu.Preselections?.Count > 0 select new { stu.ID, stu.Name, stu.Preselections, groupString = stu.Preselections.OrderBy(o => o.CourseID).OrderBy(o => o.LevelID).Select(pss => $"{pss.CourseID}|{pss.LevelID}")?.Parse() })?.GroupBy(g => g.groupString)?.ToList(); preselectionsGroups?.ForEach(g => { var first = g.First(); var sheetString = first.Preselections.Select(p => { var courseInfo = cl.Courses.FirstOrDefault(c => c.ID.Equals(p.CourseID)); if (courseInfo != null) { var levelInfo = courseInfo.Levels.FirstOrDefault(l => l.ID.Equals(p.LevelID)); if (levelInfo != null) { return($"{courseInfo.Name}{levelInfo.Name}"); } else { return($"{courseInfo.Name}"); } } else { return(string.Empty); } })?.Parse(); List <UIExcelExport> exports = new List <UIExcelExport>(); var students = g.Distinct()?.ToList(); students.ForEach(gi => { // 创建表格 var dt = this.CreateTableFrame(); UIExcelExport export = new UIExcelExport(); export.Table = dt; export.CreateTime = DateTime.Now; export.StudentID = gi.ID; export.Student = gi.Name; // 获取结果数据 var resultDetails = (from rc in resultModel.ResultClasses from rd in rc.ResultDetails where rc.ResultStudents.Contains(gi.ID) select new { rc.ClassID, rd.ClassHourId, rd.DayPeriod, }); // 根据位置分组 var groups = resultDetails?.Where(rd => { var classHour = cl.GetClassHours(new int[] { rd.ClassHourId })?.FirstOrDefault(); if (classHour == null) { return(false); } else { if (gi.Preselections == null) { return(false); } else { return(gi.Preselections.Any(p => p.CourseID.Equals(classHour.CourseID) && p.LevelID.Equals(classHour.LevelID))); } } })?.GroupBy(gg => $"{gg.DayPeriod.Day}{gg.DayPeriod.Period}")?.ToList(); // 填充表格数据 groups?.ForEach(gg => { var firstgg = gg.First(); var dayPeriod = firstgg.DayPeriod; StringBuilder sb = new StringBuilder(); gg.ToList()?.ForEach(ggi => { sb.AppendLine(cl.GetClassByID(ggi.ClassID)?.Display); var classInfo = cl.GetClassByID(ggi.ClassID); if (classInfo != null) { if (classInfo.TeacherIDs?.Count > 0) { var teachers = cl.GetTeachersByIds(classInfo.TeacherIDs); var teacherString = teachers?.Select(t => t.Name)?.Parse(); sb.AppendLine(teacherString); sb.AppendLine(); } } }); //var setValue = gg.ToList()?.Select(ggi => //{ // return cl.GetClassByID(ggi.ClassID)?.Display; //})?.Parse("\n"); if (sb.Length > 0) { SetCellData(dt, sb.ToString(), dayPeriod); } }); // 向集合中添加 exports.Add(export); }); studentPreselections.Add(sheetString, exports); }); } List <int> enableIndex = new List <int>(); var abIndex = cl.Positions.FirstOrDefault(p => p.Position == XYKernel.OS.Common.Enums.Position.AB); if (abIndex != null) { enableIndex.Add(abIndex.DayPeriod.Period); } var noonIndex = cl.Positions.FirstOrDefault(p => p.Position == XYKernel.OS.Common.Enums.Position.Noon); if (noonIndex != null) { enableIndex.Add(noonIndex.DayPeriod.Period); } var pbIndex = cl.Positions.FirstOrDefault(p => p.Position == XYKernel.OS.Common.Enums.Position.PB); if (pbIndex != null) { enableIndex.Add(pbIndex.DayPeriod.Period); } if (exportType == 3) { var table = NPOIClass.DataTableToExcel(studentPreselections, saveDialog.FileName, enableIndex); if (table.Item1) { this.ShowDialog("提示信息", "导出成功!", CustomControl.Enums.DialogSettingType.NoButton, CustomControl.Enums.DialogType.None); } else { this.ShowDialog("提示信息", table.Item2, CustomControl.Enums.DialogSettingType.OnlyOkButton, CustomControl.Enums.DialogType.Warning); } } else { var table = NPOIClass.DataTableToExcel(values, saveDialog.FileName, enableIndex); if (table.Item1) { this.ShowDialog("提示信息", "导出成功!", CustomControl.Enums.DialogSettingType.NoButton, CustomControl.Enums.DialogType.None); } else { this.ShowDialog("提示信息", table.Item2, CustomControl.Enums.DialogSettingType.OnlyOkButton, CustomControl.Enums.DialogType.Warning); } } } #endregion } }; window.ShowDialog(); }
static void FillSheet(UIExcelExport export, ISheet sheet, ICellStyle columnStyle, ICellStyle rowStyle, ICellStyle enableStyle, ICellStyle rowHeaderStyle, List <int> enableRow, int startIndex = 0) { var columnCount = export.Table.Columns.Count; var rowCount = export.Table.Rows.Count; var table = export.Table; #region 设置标题 var title = sheet.CreateRow(startIndex); title.Height = 60 * 15; for (int c = 0; c < columnCount; c++) { sheet.SetColumnWidth(c, 200 * 25); var cell = title.CreateCell(c); cell.SetCellValue(export.Title); cell.CellStyle = columnStyle; } CellRangeAddress region = new CellRangeAddress(startIndex, startIndex, 0, columnCount - 1); sheet.AddMergedRegion(region); #endregion #region 设置头 var row = sheet.CreateRow(startIndex + 1); row.Height = 60 * 15; for (int c = 0; c < columnCount; c++) { sheet.SetColumnWidth(c, 200 * 25); var cell = row.CreateCell(c); cell.SetCellValue(table.Columns[c].ColumnName); cell.CellStyle = columnStyle; } #endregion var newRowIndex = startIndex + 1; var newEnableRows = new List <int>(); enableRow.ForEach(n => { newEnableRows.Add(n + newRowIndex); }); //设置每行每列的单元格, int tableRow = 0; for (int i = newRowIndex; i < newRowIndex + rowCount; i++) { row = sheet.CreateRow(i + 1); row.Height = 60 * 10; short iCount = 1; for (int j = 0; j < columnCount; j++) { var cell = row.CreateCell(j); cell.SetCellValue(table.Rows[tableRow][j].ToString()); if (table.Rows[tableRow][j].ToString() != string.Empty) { short iCurCount = (short)table.Rows[tableRow][j].ToString().Split('\n').Count(); if (iCurCount > iCount) { iCount = iCurCount; } } if (j == 0) { cell.CellStyle = rowHeaderStyle; } else { var has = newEnableRows.Contains(i); if (has) { cell.CellStyle = enableStyle; } else { cell.CellStyle = rowStyle; } } } row.Height = (short)(row.Height * ((iCount / 2) + 1)); tableRow += 1; } }