diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/BuilderWordDocumentOpenXML.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/BuilderWordDocumentOpenXML.cs
new file mode 100644
index 0000000..a998b36
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/BuilderWordDocumentOpenXML.cs
@@ -0,0 +1,76 @@
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+using System.IO;
+using ToolsOffice.Implements.WordOpenXML.Extenstions;
+using ToolsOffice.Implements.WordOpenXML.Models;
+using ToolsOffice.Interfaces.Word;
+using ToolsOffice.Interfaces.Word.Models;
+
+namespace ToolsOffice.Implements.WordOpenXML
+{
+ public class BuilderWordDocumentOpenXML : BuilderWordDocument
+ {
+ private WordprocessingDocument _wordDocument;
+
+ private Body _docBody;
+
+ private MemoryStream _memoryStream;
+
+ public override void CreateDocument(ICreateWordModel model)
+ {
+ _memoryStream = new MemoryStream();
+ _wordDocument = WordprocessingDocument.Create(_memoryStream, WordprocessingDocumentType.Document);
+ var mainPart = _wordDocument.AddMainDocumentPart();
+ mainPart.Document = new Document();
+ _docBody = mainPart.Document.AppendChild(new Body());
+ if (model is WordCreateDocument document)
+ {
+ mainPart.AddParts(document.WordDocumentParts);
+ }
+ }
+
+ public override void CreateParagraph(IParagraphWordModel model)
+ {
+ if (model is WordParagraph paragraph)
+ {
+ var docParagraph = new Paragraph();
+ docParagraph.AddParagraphProperties(paragraph.ParagraphProperties);
+ foreach (var run in paragraph.Texts)
+ {
+ docParagraph.AddRun(run);
+ }
+ _docBody.AppendChild(docParagraph);
+ }
+ }
+
+ public override void CreateTable(ITableWordModel model)
+ {
+ if (model is WordTable table)
+ {
+ var docTable = new Table();
+
+ docTable.AddTableProperties(table.TableProperties);
+
+ docTable.AddGridColumn(table.TableGrid);
+
+ foreach (var row in table.Rows)
+ {
+ docTable.AddTableRow(row);
+ }
+ _docBody.AppendChild(docTable);
+ }
+ }
+
+ public override Stream SaveDocument(ISaveWordModel info)
+ {
+ if (info is WordSaveDocument document)
+ {
+ _docBody.AddSectionProperties(document);
+ }
+ _wordDocument.MainDocumentPart.Document.Save();
+ _wordDocument.Close();
+ return _memoryStream;
+ }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Extenstions/WordDocumentExtenstion.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Extenstions/WordDocumentExtenstion.cs
new file mode 100644
index 0000000..c31f2f8
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Extenstions/WordDocumentExtenstion.cs
@@ -0,0 +1,516 @@
+using DocumentFormat.OpenXml;
+using DocumentFormat.OpenXml.Packaging;
+using DocumentFormat.OpenXml.Wordprocessing;
+using System;
+using ToolsModule.ManagmentExtension;
+using ToolsOffice.Implements.WordOpenXML.Models;
+
+namespace ToolsOffice.Implements.WordOpenXML.Extenstions
+{
+ public static class WordDocumentExtenstion
+ {
+ ///
+ /// Добавление общих элементов документа
+ ///
+ ///
+ ///
+ public static void AddParts(this MainDocumentPart mainPart, WordDocumentParts parts)
+ {
+ if (parts == null)
+ {
+ return;
+ }
+ CreateDocumentSettingsPart(parts, mainPart);
+ CreateFontTablesPart(parts, mainPart);
+ CreateNumberingsPart(parts, mainPart);
+ CreateStyleDefinitionsPart(parts, mainPart);
+ CreateThemePart(parts, mainPart);
+ CreateWebSetting(parts, mainPart);
+ }
+
+ ///
+ /// Добавление общих настроек документа
+ ///
+ ///
+ ///
+ public static void AddSectionProperties(this Body body, WordSaveDocument document)
+ {
+ if (document == null || document.DocumentSettings == null)
+ {
+ return;
+ }
+
+ var properties = new SectionProperties();
+
+ var pageSize = new PageSize();
+ if (document.DocumentSettings.PageSizeHeight != null)
+ {
+ pageSize.Height = document.DocumentSettings.PageSizeHeight;
+ }
+ if (document.DocumentSettings.PageSizeWidth != null)
+ {
+ pageSize.Width = document.DocumentSettings.PageSizeWidth;
+ }
+ if (document.DocumentSettings.WordPageOrientation.HasValue)
+ {
+ pageSize.Orient = (PageOrientationValues)Enum.Parse(typeof(PageOrientationValues), document.DocumentSettings.WordPageOrientation.Value.ToString());
+ }
+ properties.AppendChild(pageSize);
+
+ var pageMargin = new PageMargin();
+ if (document.DocumentSettings.PageMarginBottom.HasValue)
+ {
+ pageMargin.Bottom = document.DocumentSettings.PageMarginBottom.Value;
+ }
+ if (document.DocumentSettings.PageMarginFooter != null)
+ {
+ pageMargin.Footer = document.DocumentSettings.PageMarginFooter;
+ }
+ if (document.DocumentSettings.PageMarginGutter != null)
+ {
+ pageMargin.Gutter = document.DocumentSettings.PageMarginGutter;
+ }
+ if (document.DocumentSettings.PageMarginLeft != null)
+ {
+ pageMargin.Left = document.DocumentSettings.PageMarginLeft;
+ }
+ if (document.DocumentSettings.PageMarginRight != null)
+ {
+ pageMargin.Right = document.DocumentSettings.PageMarginRight;
+ }
+ if (document.DocumentSettings.PageMarginTop.HasValue)
+ {
+ pageMargin.Top = document.DocumentSettings.PageMarginTop.Value;
+ }
+ properties.AppendChild(pageMargin);
+
+ body.AppendChild(properties);
+ }
+
+ ///
+ /// Добавление свойств абзаца
+ ///
+ ///
+ ///
+ public static void AddParagraphProperties(this Paragraph paragraph, WordParagraphProperties wordProperties)
+ {
+ if (wordProperties == null)
+ {
+ return;
+ }
+ var properties = new ParagraphProperties();
+
+ if (wordProperties.JustificationType.HasValue)
+ {
+ var justification = new Justification()
+ {
+ Val = (JustificationValues)Enum.Parse(typeof(JustificationValues), wordProperties.JustificationType.Value.ToString())
+ };
+ properties.AppendChild(justification);
+ }
+
+ var spacingBetweenLines = new SpacingBetweenLines();
+ if (wordProperties.SpacingBetweenLinesLine != null)
+ {
+ spacingBetweenLines.Line = wordProperties.SpacingBetweenLinesLine;
+ }
+ if (wordProperties.SpacingBetweenLinesBefore != null)
+ {
+ spacingBetweenLines.Before = wordProperties.SpacingBetweenLinesBefore;
+ }
+ if (wordProperties.SpacingBetweenLinesAfter != null)
+ {
+ spacingBetweenLines.After = wordProperties.SpacingBetweenLinesAfter;
+ }
+ properties.AppendChild(spacingBetweenLines);
+
+ var indentation = new Indentation();
+ if (wordProperties.IndentationFirstLine != null)
+ {
+ indentation.FirstLine = wordProperties.IndentationFirstLine;
+ }
+ if (wordProperties.IndentationHanging != null)
+ {
+ indentation.Hanging = wordProperties.IndentationHanging;
+ }
+ if (wordProperties.IndentationLeft != null)
+ {
+ indentation.Left = wordProperties.IndentationLeft;
+ }
+ if (wordProperties.IndentationRight != null)
+ {
+ indentation.Right = wordProperties.IndentationRight;
+ }
+ properties.AppendChild(indentation);
+
+ var paragraphMarkRunProperties = new ParagraphMarkRunProperties();
+ if (wordProperties.Size != null)
+ {
+ paragraphMarkRunProperties.AppendChild(new FontSize { Val = wordProperties.Size });
+ }
+ if (wordProperties.IsBold)
+ {
+ paragraphMarkRunProperties.AppendChild(new Bold());
+ }
+ if (wordProperties.IsItalic)
+ {
+ paragraphMarkRunProperties.AppendChild(new Italic());
+ }
+ if (wordProperties.IsUnderline)
+ {
+ paragraphMarkRunProperties.AppendChild(new Underline());
+ }
+ properties.AppendChild(paragraphMarkRunProperties);
+
+ paragraph.AppendChild(properties);
+ }
+
+ ///
+ /// Добавление текста в абзац
+ ///
+ ///
+ ///
+ ///
+ public static void AddRun(this Paragraph paragraph, WordRun run)
+ {
+ if (run == null)
+ {
+ return;
+ }
+ var docRun = new Run();
+
+ docRun.AddRunProperties(run.RunProperties);
+
+ if (run.IsBreak)
+ {
+ docRun.AppendChild(new Break());
+ }
+ else if (run.IsTabChar)
+ {
+ docRun.AppendChild(new TabChar());
+ }
+ else
+ {
+ docRun.AppendChild(new Text { Text = run.Text, Space = SpaceProcessingModeValues.Preserve });
+ }
+
+ paragraph.AppendChild(docRun);
+ }
+
+ public static void AddTableProperties(this Table table, WordTableProperties wordTableProperties)
+ {
+ if (wordTableProperties == null)
+ {
+ return;
+ }
+
+ var properties = new TableProperties();
+
+ if (wordTableProperties.Width != null)
+ {
+ properties.AppendChild(new TableWidth() { Width = wordTableProperties.Width });
+ }
+
+ var tableLook = new TableLook();
+ if (wordTableProperties.LookValue != null)
+ {
+ tableLook.Val = wordTableProperties.LookValue;
+ }
+ if (wordTableProperties.LookFirstRow)
+ {
+ tableLook.FirstRow = new OnOffValue(wordTableProperties.LookFirstRow);
+ }
+ if (wordTableProperties.LookFirstColumn)
+ {
+ tableLook.FirstColumn = new OnOffValue(wordTableProperties.LookFirstColumn);
+ }
+ if (wordTableProperties.LookLastRow)
+ {
+ tableLook.LastRow = new OnOffValue(wordTableProperties.LookLastRow);
+ }
+ if (wordTableProperties.LookLastColumn)
+ {
+ tableLook.LastColumn = new OnOffValue(wordTableProperties.LookLastColumn);
+ }
+ if (wordTableProperties.LookNoHorizontalBand)
+ {
+ tableLook.NoHorizontalBand = new OnOffValue(wordTableProperties.LookNoHorizontalBand);
+ }
+ if (wordTableProperties.LookNoVerticalBand)
+ {
+ tableLook.NoVerticalBand = new OnOffValue(wordTableProperties.LookNoVerticalBand);
+ }
+ properties.AppendChild(tableLook);
+
+ var tableBorders = new TableBorders();
+
+ tableBorders.AddBorder(wordTableProperties.TopBorder, new TopBorder());
+ tableBorders.AddBorder(wordTableProperties.BottomBorder, new BottomBorder());
+ tableBorders.AddBorder(wordTableProperties.LeftBorder, new LeftBorder());
+ tableBorders.AddBorder(wordTableProperties.RightBorder, new RightBorder());
+
+ properties.AppendChild(tableBorders);
+
+ table.AppendChild(properties);
+ }
+
+ public static void AddGridColumn(this Table table, WordTableGrid wordTableGrid)
+ {
+ if (wordTableGrid == null || wordTableGrid.Widths == null || wordTableGrid.Widths.Count == 0)
+ {
+ return;
+ }
+ var tableGrid = new TableGrid();
+ foreach (var grid in wordTableGrid.Widths)
+ {
+ tableGrid.AppendChild(new GridColumn() { Width = grid });
+ }
+ table.AppendChild(tableGrid);
+ }
+
+ public static void AddTableRow(this Table table, WordTableRow row)
+ {
+ if (row == null)
+ {
+ return;
+ }
+ var docRow = new TableRow();
+
+ docRow.AddTableRowProperties(row.RowProperties);
+
+ foreach (var cell in row.Cells)
+ {
+ docRow.AddTableCell(cell);
+ }
+ table.AppendChild(docRow);
+ }
+
+ ///
+ /// Добавление свойств текста
+ ///
+ ///
+ ///
+ private static void AddRunProperties(this Run run, WordRunProperties wordProperties)
+ {
+ if (wordProperties == null)
+ {
+ return;
+ }
+
+ if (wordProperties.Size != null || wordProperties.IsBold || wordProperties.IsItalic || wordProperties.IsUnderline)
+ {
+ var properties = new RunProperties();
+ if (wordProperties.Size != null)
+ {
+ properties.AppendChild(new FontSize { Val = wordProperties.Size });
+ }
+ if (wordProperties.IsBold)
+ {
+ properties.AppendChild(new Bold());
+ }
+ if (wordProperties.IsItalic)
+ {
+ properties.AppendChild(new Italic());
+ }
+ if (wordProperties.IsUnderline)
+ {
+ properties.AppendChild(new Underline());
+ }
+
+ run.AppendChild(properties);
+ }
+ }
+
+ private static void AddBorder(this TableBorders tableBorders, WordTableBorder wordTableBorder, BorderType borderType)
+ {
+ if (wordTableBorder == null)
+ {
+ return;
+ }
+ if (wordTableBorder.BorderType.HasValue)
+ {
+ borderType.Val = (BorderValues)Enum.Parse(typeof(BorderValues), wordTableBorder.BorderType.Value.ToString());
+ }
+ if (wordTableBorder.Color != null)
+ {
+ borderType.Color = wordTableBorder.Color;
+ }
+ if (wordTableBorder.Size != null)
+ {
+ borderType.Size = wordTableBorder.Size;
+ }
+ if (wordTableBorder.Space != null)
+ {
+ borderType.Space = wordTableBorder.Space;
+ }
+ tableBorders.AppendChild(borderType);
+ }
+
+ private static void AddTableRowProperties(this TableRow row, WordTableRowProperties wordTableRowProperties)
+ {
+ if (wordTableRowProperties == null)
+ {
+ return;
+ }
+
+ if (wordTableRowProperties.CantSplit.HasValue || wordTableRowProperties.TableRowHeight != null)
+ {
+ var properties = new TableRowProperties();
+
+ if (wordTableRowProperties.CantSplit.HasValue)
+ {
+ properties.AppendChild(new CantSplit() { Val = wordTableRowProperties.CantSplit.Value ? OnOffOnlyValues.On : OnOffOnlyValues.Off });
+ }
+
+ if (wordTableRowProperties.TableRowHeight != null)
+ {
+ properties.AppendChild(new TableRowHeight() { Val = wordTableRowProperties.TableRowHeight });
+ }
+
+ row.AppendChild(properties);
+ }
+ }
+
+ private static void AddTableCell(this TableRow row, WordTableCell cell)
+ {
+ if (cell == null)
+ {
+ return;
+ }
+ var docCell = new TableCell();
+ docCell.AddTableCellProperties(cell.CellProperties);
+ foreach (var paragraph in cell.Paragraphs)
+ {
+ docCell.AddParagraph(paragraph);
+ }
+ row.AppendChild(docCell);
+ }
+
+ private static void AddTableCellProperties(this TableCell cell, WordTableCellProperties wordTableCellProperties)
+ {
+ if (wordTableCellProperties == null)
+ {
+ return;
+ }
+
+ var properties = new TableCellProperties();
+ if (wordTableCellProperties.TableCellWidth != null)
+ {
+ properties.AppendChild(new TableCellWidth() { Width = wordTableCellProperties.TableCellWidth });
+ }
+ if (wordTableCellProperties.GridSpan != null)
+ {
+ properties.AppendChild(new GridSpan() { Val = wordTableCellProperties.GridSpan });
+ }
+ if (wordTableCellProperties.MergeType.HasValue)
+ {
+ if (wordTableCellProperties.MergeType.Value)
+ {
+ properties.AppendChild(new VerticalMerge()
+ {
+ Val = MergedCellValues.Restart
+ });
+ }
+ else
+ {
+ properties.AppendChild(new VerticalMerge());
+ }
+ }
+
+ cell.AppendChild(properties);
+ }
+
+ private static void AddParagraph(this TableCell cell, WordParagraph paragraph)
+ {
+ if (paragraph == null)
+ {
+ return;
+ }
+ var docParagraph = new Paragraph();
+ docParagraph.AddParagraphProperties(paragraph.ParagraphProperties);
+ foreach (var run in paragraph.Texts)
+ {
+ docParagraph.AddRun(run);
+ }
+ cell.AppendChild(docParagraph);
+ }
+
+ private static void CreateDocumentSettingsPart(WordDocumentParts parts, MainDocumentPart mainPart)
+ {
+ if (parts.DocumentSettings.IsNotEmpty())
+ {
+ var settings = mainPart.AddNewPart();
+ settings.Settings = new Settings
+ {
+ InnerXml = parts.DocumentSettings
+ };
+ settings.Settings.Save();
+ }
+ }
+
+ private static void CreateFontTablesPart(WordDocumentParts parts, MainDocumentPart mainPart)
+ {
+ if (parts.FontTable.IsNotEmpty())
+ {
+ var fonts = mainPart.AddNewPart();
+ fonts.Fonts = new Fonts
+ {
+ InnerXml = parts.FontTable
+ };
+ fonts.Fonts.Save();
+ }
+ }
+
+ private static void CreateNumberingsPart(WordDocumentParts parts, MainDocumentPart mainPart)
+ {
+ if (parts.NumberingDefinitions.IsNotEmpty())
+ {
+ var numbering = mainPart.AddNewPart();
+ numbering.Numbering = new Numbering
+ {
+ InnerXml = parts.NumberingDefinitions
+ };
+ numbering.Numbering.Save();
+ }
+ }
+
+ private static void CreateStyleDefinitionsPart(WordDocumentParts parts, MainDocumentPart mainPart)
+ {
+ if (parts.StyleDefinitions.IsNotEmpty())
+ {
+ var styles = mainPart.AddNewPart();
+ styles.Styles = new Styles
+ {
+ InnerXml = parts.StyleDefinitions
+ };
+ styles.Styles.Save();
+ }
+ }
+
+ private static void CreateThemePart(WordDocumentParts parts, MainDocumentPart mainPart)
+ {
+ if (parts.Theme.IsNotEmpty())
+ {
+ var thems = mainPart.AddNewPart();
+ thems.Theme = new DocumentFormat.OpenXml.Drawing.Theme
+ {
+ InnerXml = parts.Theme
+ };
+ thems.Theme.Save();
+ }
+ }
+
+ private static void CreateWebSetting(WordDocumentParts parts, MainDocumentPart mainPart)
+ {
+ if (parts.WebSettings.IsNotEmpty())
+ {
+ var settings = mainPart.AddNewPart();
+ settings.WebSettings = new WebSettings
+ {
+ InnerXml = parts.WebSettings
+ };
+ settings.WebSettings.Save();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordCreateDocument.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordCreateDocument.cs
new file mode 100644
index 0000000..76def18
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordCreateDocument.cs
@@ -0,0 +1,9 @@
+using ToolsOffice.Interfaces.Word.Models;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordCreateDocument : ICreateWordModel
+ {
+ public WordDocumentParts WordDocumentParts { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordDocumentParts.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordDocumentParts.cs
new file mode 100644
index 0000000..47bfcfb
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordDocumentParts.cs
@@ -0,0 +1,17 @@
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordDocumentParts
+ {
+ public string DocumentSettings { get; set; }
+
+ public string FontTable { get; set; }
+
+ public string NumberingDefinitions { get; set; }
+
+ public string StyleDefinitions { get; set; }
+
+ public string Theme { get; set; }
+
+ public string WebSettings { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordDocumentSettings.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordDocumentSettings.cs
new file mode 100644
index 0000000..371bb13
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordDocumentSettings.cs
@@ -0,0 +1,26 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordDocumentSettings
+ {
+ public UInt32Value PageSizeHeight { get; set; }
+
+ public UInt32Value PageSizeWidth { get; set; }
+
+ public WordPageOrientationType? WordPageOrientation { get; set; }
+
+
+ public UInt32Value PageMarginFooter { get; set; }
+
+ public UInt32Value PageMarginGutter { get; set; }
+
+ public int? PageMarginBottom { get; set; }
+
+ public int? PageMarginTop { get; set; }
+
+ public UInt32Value PageMarginLeft { get; set; }
+
+ public UInt32Value PageMarginRight { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordJustificationType.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordJustificationType.cs
new file mode 100644
index 0000000..04fb33b
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordJustificationType.cs
@@ -0,0 +1,13 @@
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public enum WordJustificationType
+ {
+ Left = 0,
+
+ Center = 2,
+
+ Right = 3,
+
+ Both = 5
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordPageOrientationType.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordPageOrientationType.cs
new file mode 100644
index 0000000..b91c497
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordPageOrientationType.cs
@@ -0,0 +1,12 @@
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ ///
+ /// Ориентация страниц документа
+ ///
+ public enum WordPageOrientationType
+ {
+ Portrait = 0,
+
+ Landscape = 1
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordParagraph.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordParagraph.cs
new file mode 100644
index 0000000..37fafb2
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordParagraph.cs
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+using ToolsOffice.Interfaces.Word.Models;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordParagraph : IParagraphWordModel
+ {
+ public List Texts { get; set; }
+
+ public WordParagraphProperties ParagraphProperties { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordParagraphProperties.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordParagraphProperties.cs
new file mode 100644
index 0000000..5b2a639
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordParagraphProperties.cs
@@ -0,0 +1,31 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordParagraphProperties
+ {
+ public StringValue Size { get; set; }
+
+ public bool IsBold { get; set; }
+
+ public bool IsItalic { get; set; }
+
+ public bool IsUnderline { get; set; }
+
+ public WordJustificationType? JustificationType { get; set; }
+
+ public StringValue SpacingBetweenLinesLine { get; set; }
+
+ public StringValue SpacingBetweenLinesBefore { get; set; }
+
+ public StringValue SpacingBetweenLinesAfter { get; set; }
+
+ public StringValue IndentationFirstLine { get; set; }
+
+ public StringValue IndentationHanging { get; set; }
+
+ public StringValue IndentationLeft { get; set; }
+
+ public StringValue IndentationRight { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordRun.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordRun.cs
new file mode 100644
index 0000000..19fc568
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordRun.cs
@@ -0,0 +1,13 @@
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordRun
+ {
+ public string Text { get; set; }
+
+ public bool IsBreak { get; set; }
+
+ public bool IsTabChar { get; set; }
+
+ public WordRunProperties RunProperties { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordRunProperties.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordRunProperties.cs
new file mode 100644
index 0000000..e97bad2
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordRunProperties.cs
@@ -0,0 +1,15 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordRunProperties
+ {
+ public StringValue Size { get; set; }
+
+ public bool IsBold { get; set; }
+
+ public bool IsItalic { get; set; }
+
+ public bool IsUnderline { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordSaveDocument.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordSaveDocument.cs
new file mode 100644
index 0000000..130aa39
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordSaveDocument.cs
@@ -0,0 +1,9 @@
+using ToolsOffice.Interfaces.Word.Models;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordSaveDocument : ISaveWordModel
+ {
+ public WordDocumentSettings DocumentSettings { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTable.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTable.cs
new file mode 100644
index 0000000..c59f691
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTable.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+using ToolsOffice.Interfaces.Word.Models;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTable : ITableWordModel
+ {
+ public WordTableProperties TableProperties { get; set; }
+
+ public WordTableGrid TableGrid { get; set; }
+
+ public List Rows { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableBorder.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableBorder.cs
new file mode 100644
index 0000000..2f6b40d
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableBorder.cs
@@ -0,0 +1,15 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableBorder
+ {
+ public UInt32Value Size { get; set; }
+
+ public UInt32Value Space { get; set; }
+
+ public StringValue Color { get; set; }
+
+ public WordTableBorderType? BorderType { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableBorderType.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableBorderType.cs
new file mode 100644
index 0000000..5c21b88
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableBorderType.cs
@@ -0,0 +1,21 @@
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public enum WordTableBorderType
+ {
+ None = 1,
+
+ Single = 2,
+
+ Thick = 3,
+
+ Double = 4,
+
+ Dotted = 5,
+
+ Dashed = 6,
+
+ DotDash = 7,
+
+ DotDotDash = 8,
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableCell.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableCell.cs
new file mode 100644
index 0000000..c19a171
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableCell.cs
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableCell
+ {
+ public WordTableCellProperties CellProperties { get; set; }
+
+ public List Paragraphs { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableCellProperties.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableCellProperties.cs
new file mode 100644
index 0000000..392192c
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableCellProperties.cs
@@ -0,0 +1,13 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableCellProperties
+ {
+ public StringValue TableCellWidth { get; set; }
+
+ public Int32Value GridSpan { get; set; }
+
+ public bool? MergeType { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableGrid.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableGrid.cs
new file mode 100644
index 0000000..ac4a5ed
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableGrid.cs
@@ -0,0 +1,10 @@
+using DocumentFormat.OpenXml;
+using System.Collections.Generic;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableGrid
+ {
+ public List Widths { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableProperties.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableProperties.cs
new file mode 100644
index 0000000..fd5ee89
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableProperties.cs
@@ -0,0 +1,31 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableProperties
+ {
+ public StringValue Width { get; set; }
+
+ public HexBinaryValue LookValue { get; set; }
+
+ public bool LookFirstRow { get; set; }
+
+ public bool LookFirstColumn { get; set; }
+
+ public bool LookLastRow { get; set; }
+
+ public bool LookLastColumn { get; set; }
+
+ public bool LookNoHorizontalBand { get; set; }
+
+ public bool LookNoVerticalBand { get; set; }
+
+ public WordTableBorder TopBorder { get; set; }
+
+ public WordTableBorder BottomBorder { get; set; }
+
+ public WordTableBorder LeftBorder { get; set; }
+
+ public WordTableBorder RightBorder { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableRow.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableRow.cs
new file mode 100644
index 0000000..a21687c
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableRow.cs
@@ -0,0 +1,11 @@
+using System.Collections.Generic;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableRow
+ {
+ public WordTableRowProperties RowProperties { get; set; }
+
+ public List Cells { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableRowProperties.cs b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableRowProperties.cs
new file mode 100644
index 0000000..9220936
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Implements/WordOpenXML/Models/WordTableRowProperties.cs
@@ -0,0 +1,11 @@
+using DocumentFormat.OpenXml;
+
+namespace ToolsOffice.Implements.WordOpenXML.Models
+{
+ public class WordTableRowProperties
+ {
+ public bool? CantSplit { get; set; }
+
+ public UInt32Value TableRowHeight { get; set; }
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/BuilderWordDocument.cs b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/BuilderWordDocument.cs
new file mode 100644
index 0000000..661836d
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/BuilderWordDocument.cs
@@ -0,0 +1,32 @@
+using System.IO;
+using ToolsOffice.Interfaces.Word.Models;
+
+namespace ToolsOffice.Interfaces.Word
+{
+ public abstract class BuilderWordDocument
+ {
+ ///
+ /// Создание документа
+ ///
+ ///
+ public abstract void CreateDocument(ICreateWordModel model);
+
+ ///
+ /// Создание абзаца с текстом
+ ///
+ ///
+ public abstract void CreateParagraph(IParagraphWordModel model);
+
+ ///
+ /// Создание абзаца с текстом
+ ///
+ ///
+ public abstract void CreateTable(ITableWordModel model);
+
+ ///
+ /// Сохранение файла
+ ///
+ ///
+ public abstract Stream SaveDocument(ISaveWordModel info);
+ }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ICreateWordModel.cs b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ICreateWordModel.cs
new file mode 100644
index 0000000..009121e
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ICreateWordModel.cs
@@ -0,0 +1,4 @@
+namespace ToolsOffice.Interfaces.Word.Models
+{
+ public interface ICreateWordModel { }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/IParagraphWordModel.cs b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/IParagraphWordModel.cs
new file mode 100644
index 0000000..1bdf6b3
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/IParagraphWordModel.cs
@@ -0,0 +1,4 @@
+namespace ToolsOffice.Interfaces.Word.Models
+{
+ public interface IParagraphWordModel { }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ISaveWordModel.cs b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ISaveWordModel.cs
new file mode 100644
index 0000000..856273a
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ISaveWordModel.cs
@@ -0,0 +1,4 @@
+namespace ToolsOffice.Interfaces.Word.Models
+{
+ public interface ISaveWordModel { }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ITableWordModel.cs b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ITableWordModel.cs
new file mode 100644
index 0000000..297c22c
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/Interfaces/Word/Models/ITableWordModel.cs
@@ -0,0 +1,4 @@
+namespace ToolsOffice.Interfaces.Word.Models
+{
+ public interface ITableWordModel { }
+}
\ No newline at end of file
diff --git a/DepartmentPortal/Common/ToolsOffice/ToolsOffice.csproj b/DepartmentPortal/Common/ToolsOffice/ToolsOffice.csproj
new file mode 100644
index 0000000..2bff211
--- /dev/null
+++ b/DepartmentPortal/Common/ToolsOffice/ToolsOffice.csproj
@@ -0,0 +1,15 @@
+
+
+
+ net5.0
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DepartmentPortal/DepartmentPortal.sln b/DepartmentPortal/DepartmentPortal.sln
index 2ed5003..2ee198f 100644
--- a/DepartmentPortal/DepartmentPortal.sln
+++ b/DepartmentPortal/DepartmentPortal.sln
@@ -37,7 +37,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DepartmentContract", "Depar
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WindowServices", "WindowServices", "{045965BC-9297-45DF-96E1-6986C286A81B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowServiceSyncStudentOrders", "WindowServices\WindowServiceSyncStudentOrders\WindowServiceSyncStudentOrders.csproj", "{4A68AC9F-07F9-43C3-83E6-359A9CFBC80E}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WindowServiceSyncStudentOrders", "WindowServices\WindowServiceSyncStudentOrders\WindowServiceSyncStudentOrders.csproj", "{4A68AC9F-07F9-43C3-83E6-359A9CFBC80E}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ToolsOffice", "Common\ToolsOffice\ToolsOffice.csproj", "{782DE093-CE87-48B5-A037-47C2189ACC13}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -101,6 +103,10 @@ Global
{4A68AC9F-07F9-43C3-83E6-359A9CFBC80E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4A68AC9F-07F9-43C3-83E6-359A9CFBC80E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A68AC9F-07F9-43C3-83E6-359A9CFBC80E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {782DE093-CE87-48B5-A037-47C2189ACC13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {782DE093-CE87-48B5-A037-47C2189ACC13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {782DE093-CE87-48B5-A037-47C2189ACC13}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {782DE093-CE87-48B5-A037-47C2189ACC13}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -119,6 +125,7 @@ Global
{E9F9B0D8-18F3-40C3-843F-53D2F8B2293E} = {7DA26C36-778E-4563-9AEC-966E26EA7B2A}
{5AA4DBD9-FD82-46D6-8A62-78DB269296B3} = {A19E7709-6AD8-4E9B-B3AB-4339C67D9F39}
{4A68AC9F-07F9-43C3-83E6-359A9CFBC80E} = {045965BC-9297-45DF-96E1-6986C286A81B}
+ {782DE093-CE87-48B5-A037-47C2189ACC13} = {6F154F8D-3437-45EE-9D89-02B96BDF3E8E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FBA0CB49-EF2D-4538-9D00-FCEDA24879A9}