From 7e70458d0868daa336986197b22e0096d56df3cb Mon Sep 17 00:00:00 2001 From: rakhaliullov Date: Mon, 25 Nov 2024 19:22:26 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B2=D1=8B=D0=B9=20=D0=BE?= =?UTF-8?q?=D1=82=D1=87=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectShedule/Entities/Classroom.cs | 6 - .../ProjectShedule/Entities/Curriculum.cs | 8 +- .../Entities/CurriculumSubject.cs | 6 - .../ProjectShedule/Entities/Shedule.cs | 5 - .../ProjectShedule/Entities/StudentsGroup.cs | 5 - .../ProjectShedule/Entities/Subject.cs | 8 +- .../ProjectShedule/Entities/SubjectSubject.cs | 7 +- .../ProjectShedule/Entities/Teacher.cs | 8 +- .../FormSchedulingBureau.Designer.cs | 21 ++- .../ProjectShedule/FormSchedulingBureau.cs | 14 ++ .../Forms/FormDirectoryReport.Designer.cs | 132 ++++++++++++++++++ .../Forms/FormDirectoryReport.cs | 52 +++++++ .../Forms/FormDirectoryReport.resx | 120 ++++++++++++++++ .../ProjectShedule/ProjectShedule.csproj | 1 + .../ProjectShedule/Reports/DocReport.cs | 125 +++++++++++++++++ .../ProjectShedule/Reports/WordBuilder.cs | 125 +++++++++++++++++ 16 files changed, 589 insertions(+), 54 deletions(-) create mode 100644 ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.Designer.cs create mode 100644 ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.cs create mode 100644 ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.resx create mode 100644 ProjectShedule/ProjectShedule/Reports/DocReport.cs create mode 100644 ProjectShedule/ProjectShedule/Reports/WordBuilder.cs diff --git a/ProjectShedule/ProjectShedule/Entities/Classroom.cs b/ProjectShedule/ProjectShedule/Entities/Classroom.cs index fb4730f..c125dee 100644 --- a/ProjectShedule/ProjectShedule/Entities/Classroom.cs +++ b/ProjectShedule/ProjectShedule/Entities/Classroom.cs @@ -1,10 +1,4 @@ using ProjectShedule.Entities.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - namespace ProjectShedule.Entities; diff --git a/ProjectShedule/ProjectShedule/Entities/Curriculum.cs b/ProjectShedule/ProjectShedule/Entities/Curriculum.cs index 7e7ec20..888e7d7 100644 --- a/ProjectShedule/ProjectShedule/Entities/Curriculum.cs +++ b/ProjectShedule/ProjectShedule/Entities/Curriculum.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectShedule.Entities; +namespace ProjectShedule.Entities; public class Curriculum { diff --git a/ProjectShedule/ProjectShedule/Entities/CurriculumSubject.cs b/ProjectShedule/ProjectShedule/Entities/CurriculumSubject.cs index e2d85a7..bda0107 100644 --- a/ProjectShedule/ProjectShedule/Entities/CurriculumSubject.cs +++ b/ProjectShedule/ProjectShedule/Entities/CurriculumSubject.cs @@ -1,9 +1,4 @@ using ProjectShedule.Entities.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ProjectShedule.Entities; @@ -24,5 +19,4 @@ public class CurriculumSubject SubjectSubject = subjectSubjects }; } - } diff --git a/ProjectShedule/ProjectShedule/Entities/Shedule.cs b/ProjectShedule/ProjectShedule/Entities/Shedule.cs index 21e23c7..7b3d5d5 100644 --- a/ProjectShedule/ProjectShedule/Entities/Shedule.cs +++ b/ProjectShedule/ProjectShedule/Entities/Shedule.cs @@ -1,9 +1,4 @@ using ProjectShedule.Entities.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ProjectShedule.Entities; diff --git a/ProjectShedule/ProjectShedule/Entities/StudentsGroup.cs b/ProjectShedule/ProjectShedule/Entities/StudentsGroup.cs index 1d1751a..092af9a 100644 --- a/ProjectShedule/ProjectShedule/Entities/StudentsGroup.cs +++ b/ProjectShedule/ProjectShedule/Entities/StudentsGroup.cs @@ -1,9 +1,4 @@ using ProjectShedule.Entities.Enums; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace ProjectShedule.Entities; diff --git a/ProjectShedule/ProjectShedule/Entities/Subject.cs b/ProjectShedule/ProjectShedule/Entities/Subject.cs index ea6805a..5632319 100644 --- a/ProjectShedule/ProjectShedule/Entities/Subject.cs +++ b/ProjectShedule/ProjectShedule/Entities/Subject.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectShedule.Entities; +namespace ProjectShedule.Entities; public class Subject { diff --git a/ProjectShedule/ProjectShedule/Entities/SubjectSubject.cs b/ProjectShedule/ProjectShedule/Entities/SubjectSubject.cs index a3bb02d..401758b 100644 --- a/ProjectShedule/ProjectShedule/Entities/SubjectSubject.cs +++ b/ProjectShedule/ProjectShedule/Entities/SubjectSubject.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - + namespace ProjectShedule.Entities; public class SubjectSubject diff --git a/ProjectShedule/ProjectShedule/Entities/Teacher.cs b/ProjectShedule/ProjectShedule/Entities/Teacher.cs index 630bc54..08b6512 100644 --- a/ProjectShedule/ProjectShedule/Entities/Teacher.cs +++ b/ProjectShedule/ProjectShedule/Entities/Teacher.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace ProjectShedule.Entities; +namespace ProjectShedule.Entities; public class Teacher { diff --git a/ProjectShedule/ProjectShedule/FormSchedulingBureau.Designer.cs b/ProjectShedule/ProjectShedule/FormSchedulingBureau.Designer.cs index 4249d94..1431998 100644 --- a/ProjectShedule/ProjectShedule/FormSchedulingBureau.Designer.cs +++ b/ProjectShedule/ProjectShedule/FormSchedulingBureau.Designer.cs @@ -39,6 +39,7 @@ createSheduleToolStripMenuItem = new ToolStripMenuItem(); createCurriculumToolStripMenuItem = new ToolStripMenuItem(); отчетыToolStripMenuItem = new ToolStripMenuItem(); + directoryReportToolStripMenuItem = new ToolStripMenuItem(); menuStrip.SuspendLayout(); SuspendLayout(); // @@ -62,35 +63,35 @@ // classroomToolStripMenuItem // classroomToolStripMenuItem.Name = "classroomToolStripMenuItem"; - classroomToolStripMenuItem.Size = new Size(224, 26); + classroomToolStripMenuItem.Size = new Size(216, 26); classroomToolStripMenuItem.Text = "Аудитории"; classroomToolStripMenuItem.Click += classroomToolStripMenuItem_Click; // // teacherToolStripMenuItem // teacherToolStripMenuItem.Name = "teacherToolStripMenuItem"; - teacherToolStripMenuItem.Size = new Size(224, 26); + teacherToolStripMenuItem.Size = new Size(216, 26); teacherToolStripMenuItem.Text = "Преподаватели"; teacherToolStripMenuItem.Click += teacherToolStripMenuItem_Click; // // subjectsToolStripMenuItem // subjectsToolStripMenuItem.Name = "subjectsToolStripMenuItem"; - subjectsToolStripMenuItem.Size = new Size(224, 26); + subjectsToolStripMenuItem.Size = new Size(216, 26); subjectsToolStripMenuItem.Text = "Дисциплины"; subjectsToolStripMenuItem.Click += subjectsToolStripMenuItem_Click; // // curriculumsToolStripMenuItem // curriculumsToolStripMenuItem.Name = "curriculumsToolStripMenuItem"; - curriculumsToolStripMenuItem.Size = new Size(224, 26); + curriculumsToolStripMenuItem.Size = new Size(216, 26); curriculumsToolStripMenuItem.Text = "Направлении"; curriculumsToolStripMenuItem.Click += curriculumsToolStripMenuItem_Click; // // studentGroupsToolStripMenuItem // studentGroupsToolStripMenuItem.Name = "studentGroupsToolStripMenuItem"; - studentGroupsToolStripMenuItem.Size = new Size(224, 26); + studentGroupsToolStripMenuItem.Size = new Size(216, 26); studentGroupsToolStripMenuItem.Text = "Группы студентов"; studentGroupsToolStripMenuItem.Click += studentGroupsToolStripMenuItem_Click; // @@ -117,10 +118,19 @@ // // отчетыToolStripMenuItem // + отчетыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { directoryReportToolStripMenuItem }); отчетыToolStripMenuItem.Name = "отчетыToolStripMenuItem"; отчетыToolStripMenuItem.Size = new Size(73, 24); отчетыToolStripMenuItem.Text = "Отчеты"; // + // directoryReportToolStripMenuItem + // + directoryReportToolStripMenuItem.Name = "directoryReportToolStripMenuItem"; + directoryReportToolStripMenuItem.ShortcutKeys = Keys.Control | Keys.W; + directoryReportToolStripMenuItem.Size = new Size(354, 26); + directoryReportToolStripMenuItem.Text = "Документ со справочниками "; + directoryReportToolStripMenuItem.Click += directoryReportToolStripMenuItem_Click; + // // FormSchedulingBureau // AutoScaleDimensions = new SizeF(8F, 20F); @@ -152,5 +162,6 @@ private ToolStripMenuItem createSheduleToolStripMenuItem; private ToolStripMenuItem отчетыToolStripMenuItem; private ToolStripMenuItem createCurriculumToolStripMenuItem; + private ToolStripMenuItem directoryReportToolStripMenuItem; } } diff --git a/ProjectShedule/ProjectShedule/FormSchedulingBureau.cs b/ProjectShedule/ProjectShedule/FormSchedulingBureau.cs index 1ea15a6..197ec8b 100644 --- a/ProjectShedule/ProjectShedule/FormSchedulingBureau.cs +++ b/ProjectShedule/ProjectShedule/FormSchedulingBureau.cs @@ -1,3 +1,4 @@ +using ProjectGasStation.Forms; using ProjectShedule.Forms; using System.ComponentModel; using Unity; @@ -104,5 +105,18 @@ namespace ProjectShedule MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private void directoryReportToolStripMenuItem_Click(object sender, EventArgs e) + { + try + { + _container.Resolve().ShowDialog(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, " ", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } } } diff --git a/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.Designer.cs b/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.Designer.cs new file mode 100644 index 0000000..08c907d --- /dev/null +++ b/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.Designer.cs @@ -0,0 +1,132 @@ +namespace ProjectGasStation.Forms +{ + partial class FormDirectoryReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + checkBoxClassrooms = new CheckBox(); + checkBoxTeachers = new CheckBox(); + checkBoxSubjects = new CheckBox(); + checkBoxCurriculums = new CheckBox(); + buttonBuild = new Button(); + checkBoxGroups = new CheckBox(); + SuspendLayout(); + // + // checkBoxClassrooms + // + checkBoxClassrooms.AutoSize = true; + checkBoxClassrooms.Location = new Point(14, 16); + checkBoxClassrooms.Margin = new Padding(3, 4, 3, 4); + checkBoxClassrooms.Name = "checkBoxClassrooms"; + checkBoxClassrooms.Size = new Size(107, 24); + checkBoxClassrooms.TabIndex = 0; + checkBoxClassrooms.Text = "Аудитории"; + checkBoxClassrooms.UseVisualStyleBackColor = true; + // + // checkBoxTeachers + // + checkBoxTeachers.AutoSize = true; + checkBoxTeachers.Location = new Point(14, 61); + checkBoxTeachers.Margin = new Padding(3, 4, 3, 4); + checkBoxTeachers.Name = "checkBoxTeachers"; + checkBoxTeachers.Size = new Size(140, 24); + checkBoxTeachers.TabIndex = 1; + checkBoxTeachers.Text = "Преподаватели"; + checkBoxTeachers.UseVisualStyleBackColor = true; + // + // checkBoxSubjects + // + checkBoxSubjects.AutoSize = true; + checkBoxSubjects.Location = new Point(14, 109); + checkBoxSubjects.Margin = new Padding(3, 4, 3, 4); + checkBoxSubjects.Name = "checkBoxSubjects"; + checkBoxSubjects.Size = new Size(121, 24); + checkBoxSubjects.TabIndex = 2; + checkBoxSubjects.Text = "Дисциплины"; + checkBoxSubjects.UseVisualStyleBackColor = true; + // + // checkBoxCurriculums + // + checkBoxCurriculums.AutoSize = true; + checkBoxCurriculums.Location = new Point(14, 157); + checkBoxCurriculums.Margin = new Padding(3, 4, 3, 4); + checkBoxCurriculums.Name = "checkBoxCurriculums"; + checkBoxCurriculums.Size = new Size(127, 24); + checkBoxCurriculums.TabIndex = 3; + checkBoxCurriculums.Text = "Направлении"; + checkBoxCurriculums.UseVisualStyleBackColor = true; + // + // buttonBuild + // + buttonBuild.Location = new Point(12, 257); + buttonBuild.Margin = new Padding(3, 4, 3, 4); + buttonBuild.Name = "buttonBuild"; + buttonBuild.Size = new Size(159, 31); + buttonBuild.TabIndex = 4; + buttonBuild.Text = "Сформировать"; + buttonBuild.UseVisualStyleBackColor = true; + buttonBuild.Click += buttonBuild_Click; + // + // checkBoxGroups + // + checkBoxGroups.AutoSize = true; + checkBoxGroups.Location = new Point(14, 206); + checkBoxGroups.Margin = new Padding(3, 4, 3, 4); + checkBoxGroups.Name = "checkBoxGroups"; + checkBoxGroups.Size = new Size(83, 24); + checkBoxGroups.TabIndex = 5; + checkBoxGroups.Text = "Группы"; + checkBoxGroups.UseVisualStyleBackColor = true; + // + // FormDirectoryReport + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(191, 317); + Controls.Add(checkBoxGroups); + Controls.Add(buttonBuild); + Controls.Add(checkBoxCurriculums); + Controls.Add(checkBoxSubjects); + Controls.Add(checkBoxTeachers); + Controls.Add(checkBoxClassrooms); + Margin = new Padding(3, 4, 3, 4); + Name = "FormDirectoryReport"; + Text = "FormDirectoryReport"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private CheckBox checkBoxClassrooms; + private CheckBox checkBoxTeachers; + private CheckBox checkBoxSubjects; + private CheckBox checkBoxCurriculums; + private Button buttonBuild; + private CheckBox checkBoxGroups; + } +} \ No newline at end of file diff --git a/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.cs b/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.cs new file mode 100644 index 0000000..84c6d3b --- /dev/null +++ b/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.cs @@ -0,0 +1,52 @@ +using ProjectShedule.Reports; +using Unity; + +namespace ProjectGasStation.Forms; + +public partial class FormDirectoryReport : Form +{ + private readonly IUnityContainer _container; + public FormDirectoryReport(IUnityContainer container) + { + InitializeComponent(); + _container = container ?? throw new ArgumentNullException(nameof(container)); + } + + private void buttonBuild_Click(object sender, EventArgs e) + { + try + { + if (!checkBoxClassrooms.Checked && !checkBoxTeachers.Checked && !checkBoxSubjects.Checked && !checkBoxCurriculums.Checked && !checkBoxGroups.Checked) + { + throw new Exception("Не выбран ни один справочник для выгрузки"); + } + var sfd = new SaveFileDialog() + { + Filter = "Docx Files | *.docx" + }; + if (sfd.ShowDialog() != DialogResult.OK) + { + throw new Exception("Не выбран файла для отчета"); + } + if + (_container.Resolve().CreateDoc(sfd.FileName, checkBoxClassrooms.Checked, checkBoxTeachers.Checked, checkBoxSubjects.Checked, checkBoxCurriculums.Checked, checkBoxGroups.Checked)) + { + MessageBox.Show("Документ сформирован", + "Формирование документа", + MessageBoxButtons.OK, + MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Возникли ошибки при формировании документа.Подробности в логах", + "Формирование документа", + MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка при создании отчета", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + } +} diff --git a/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.resx b/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/ProjectShedule/ProjectShedule/Forms/FormDirectoryReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ProjectShedule/ProjectShedule/ProjectShedule.csproj b/ProjectShedule/ProjectShedule/ProjectShedule.csproj index f946d78..9c7e82f 100644 --- a/ProjectShedule/ProjectShedule/ProjectShedule.csproj +++ b/ProjectShedule/ProjectShedule/ProjectShedule.csproj @@ -10,6 +10,7 @@ + diff --git a/ProjectShedule/ProjectShedule/Reports/DocReport.cs b/ProjectShedule/ProjectShedule/Reports/DocReport.cs new file mode 100644 index 0000000..786e812 --- /dev/null +++ b/ProjectShedule/ProjectShedule/Reports/DocReport.cs @@ -0,0 +1,125 @@ +using Microsoft.Extensions.Logging; +using ProjectShedule.Repositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectShedule.Reports; +internal class DocReport +{ + private readonly IClassroomRepository _classroomRepository; + private readonly ITeacherRepository _teacherRepository; + private readonly ISubjectRepository _subjectRepository; + private readonly ICurriculumRepository _curriculumRepository; + private readonly IGroupRepository _groupRepository; + private readonly ILogger _logger; + public DocReport(IClassroomRepository classroomRepository, + ITeacherRepository teacherRepository, + ISubjectRepository subjectRepository, + ICurriculumRepository curriculumRepository, + IGroupRepository groupRepository, + ILogger logger) + { + _classroomRepository = classroomRepository ?? + throw new ArgumentNullException(nameof(classroomRepository)); + _teacherRepository = teacherRepository ?? + throw new ArgumentNullException(nameof(teacherRepository)); + _subjectRepository = subjectRepository ?? + throw new ArgumentNullException(nameof(subjectRepository)); + _curriculumRepository = curriculumRepository ?? + throw new ArgumentNullException(nameof(curriculumRepository)); + _groupRepository = groupRepository ?? + throw new ArgumentNullException(nameof(groupRepository)); + _logger = logger ?? + throw new ArgumentNullException(nameof(logger)); + + } + public bool CreateDoc(string filePath, bool includeClassrooms, + bool includeTeachers, bool includeSubjects, + bool includeCurriculums, bool includeGroups) + { + try + { + var builder = new WordBuilder(filePath) + .AddHeader("Документ со справочниками"); + if (includeClassrooms) + { + builder.AddParagraph("Аудитории") + .AddTable([2400, 1200, 2400], + GetClassrooms()); + } + if (includeTeachers) + { + builder.AddParagraph("Преподаватели") + .AddTable([2400, 2400], + GetTeachers()); + } + if (includeSubjects) + { + builder.AddParagraph("Дисциплины") + .AddTable([2400], + GetSubjects()); + } + if (includeCurriculums) + { + builder.AddParagraph("Направлении") + .AddTable([2400], + GetCurriculums()); + } + if (includeGroups) + { + builder.AddParagraph("Группы студентов") + .AddTable([2400, 2400, 1200, 2400], + GetGroups()); + } + builder.Build(); + return true; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при формировании документа"); + return false; + } + } + private List GetClassrooms() + { + return [ + ["Размер", "Номер аудитории", "Тип"], + .. _classroomRepository.ReadClassroom().Select(x => new string[] + { x.Size.ToString(), x.Name, x.ClassType.ToString() }), + ]; + } + private List GetTeachers() + { + return [ + ["Имя", "Фамилия"], + .. _teacherRepository.ReadTeacher().Select(x => new string[] { x.FirstName, x.LastName }), + ]; + } + private List GetSubjects() + { + return [ + ["Название предмета"], + .. _subjectRepository.ReadSubject().Select(x => new string[] + { x.Name }), + ]; + } + private List GetCurriculums() + { + return [ + ["Направление"], + .. _curriculumRepository.ReadCurriculum().Select(x => new string[] + { x.Direction }), + ]; + } + private List GetGroups() + { + return [ + ["Количество студентов", "Номер группы", "Курс", "Направление"], + .. _groupRepository.ReadGroup().Select(x => new string[] + { x.StudentsCount.ToString(),x.GroupNumber.ToString(), x.Course.ToString(), x.CurriculumId.ToString()}), + ]; + } +} diff --git a/ProjectShedule/ProjectShedule/Reports/WordBuilder.cs b/ProjectShedule/ProjectShedule/Reports/WordBuilder.cs new file mode 100644 index 0000000..2eb7407 --- /dev/null +++ b/ProjectShedule/ProjectShedule/Reports/WordBuilder.cs @@ -0,0 +1,125 @@ +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Wordprocessing; +using DocumentFormat.OpenXml; + +namespace ProjectShedule.Reports; + +internal class WordBuilder +{ + private readonly string _filePath; + private readonly Document _document; + private readonly Body _body; + public WordBuilder(string filePath) + { + if (string.IsNullOrWhiteSpace(filePath)) + { + throw new ArgumentNullException(nameof(filePath)); + } + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + _filePath = filePath; + _document = new Document(); + _body = _document.AppendChild(new Body()); + } + public WordBuilder AddHeader(string header) + { + var paragraph = _body.AppendChild(new Paragraph()); + var run = paragraph.AppendChild(new Run()); + var runProperties = run.AppendChild(new RunProperties()); + runProperties.AppendChild(new Bold()); + run.AppendChild(new Text(header)); + return this; + } + + public WordBuilder AddParagraph(string text) + { + var paragraph = _body.AppendChild(new Paragraph()); + var run = paragraph.AppendChild(new Run()); + run.AppendChild(new Text(text)); + return this; + } + public WordBuilder AddTable(int[] widths, List data) + { + if (widths == null || widths.Length == 0) + { + throw new ArgumentNullException(nameof(widths)); + } + if (data == null || data.Count == 0) + { + throw new ArgumentNullException(nameof(data)); + } + if (data.Any(x => x.Length != widths.Length)) + { + throw new InvalidOperationException("widths.Length != data.Length"); + } + var table = new Table(); + table.AppendChild(new TableProperties( + new TableBorders( + new TopBorder() + { + Val = new + EnumValue(BorderValues.Single), + Size = 12 + }, + new BottomBorder() + { + Val = new + EnumValue(BorderValues.Single), + Size = 12 + }, + new LeftBorder() + { + Val = new + EnumValue(BorderValues.Single), + Size = 12 + }, + new RightBorder() + { + Val = new + EnumValue(BorderValues.Single), + Size = 12 + }, + new InsideHorizontalBorder() + { + Val = new + EnumValue(BorderValues.Single), + Size = 12 + }, + new InsideVerticalBorder() + { + Val = new + EnumValue(BorderValues.Single), + Size = 12 + } + ) + )); + + var tr = new TableRow(); + for (var j = 0; j < widths.Length; ++j) + { + tr.Append(new TableCell( + new TableCellProperties(new TableCellWidth() + { + Width = + widths[j].ToString() + }), + new Paragraph(new Run(new RunProperties(new Bold()), new + Text(data.First()[j]))))); + } + table.Append(tr); + + table.Append(data.Skip(1).Select(x => + new TableRow(x.Select(y => new TableCell(new Paragraph(new Run(new Text(y)))))))); + _body.Append(table); + return this; + } + public void Build() + { + using var wordDocument = WordprocessingDocument.Create(_filePath, + WordprocessingDocumentType.Document); + var mainPart = wordDocument.AddMainDocumentPart(); + mainPart.Document = _document; + } +}