using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; internal class WordBuilder { private readonly string _filePath; private readonly Document _doc; 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; _doc = new Document(); _body = _doc.AppendChild(new Body()); } public WordBuilder AddHeader(string header) { var paragraph = _body.AppendChild(new Paragraph()); var run = paragraph.AppendChild(new Run()); // Set bold text using RunProperties run.AppendChild(new RunProperties(new Bold())); run.AppendChild(new Text(header)); // Use Wordprocessing.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]))))); // Use Wordprocessing.Text } table.Append(tr); // Данные table.Append(data.Skip(1).Select(x => new TableRow(x.Select(y => new TableCell(new Paragraph(new Run(new Text(y)))))))); // Use Wordprocessing.Text _body.Append(table); return this; } public WordBuilder AddParagraph(string text) { var paragraph = _body.AppendChild(new Paragraph()); var run = paragraph.AppendChild(new Run()); run.AppendChild(new Text(text)); // Use Wordprocessing.Text return this; } public void Build() { using var wordDocument = WordprocessingDocument.Create(_filePath, WordprocessingDocumentType.Document); var mainPart = wordDocument.AddMainDocumentPart(); mainPart.Document = _doc; } }