99 lines
3.3 KiB
C#
99 lines
3.3 KiB
C#
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<string[]> 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>(BorderValues.Single), Size = 12 },
|
|
new BottomBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
|
|
new LeftBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
|
|
new RightBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
|
|
new InsideHorizontalBorder() { Val = new EnumValue<BorderValues>(BorderValues.Single), Size = 12 },
|
|
new InsideVerticalBorder() { Val = new EnumValue<BorderValues>(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;
|
|
}
|
|
} |