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();
        }
Example #2
0
        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;
            }
        }