Третий компонент и переход на Interop
This commit is contained in:
parent
d990fdb00f
commit
d7251322f3
@ -0,0 +1,15 @@
|
|||||||
|
namespace RodionovLibrary.NonVisualComponents.HelperEnums
|
||||||
|
{
|
||||||
|
public enum DiagramLegendLayout
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
|
||||||
|
Left,
|
||||||
|
|
||||||
|
Top,
|
||||||
|
|
||||||
|
Right,
|
||||||
|
|
||||||
|
Bottom
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
namespace RodionovLibrary.NonVisualComponents.HelperModels
|
||||||
|
{
|
||||||
|
public class SeriesParameters
|
||||||
|
{
|
||||||
|
public string SeriesName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public List<double> ValuesY { get; set; } = new();
|
||||||
|
|
||||||
|
public Color Color { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
using RodionovLibrary.NonVisualComponents.HelperEnums;
|
||||||
|
|
||||||
|
namespace RodionovLibrary.NonVisualComponents.HelperModels
|
||||||
|
{
|
||||||
|
public class WordDiagramInfo
|
||||||
|
{
|
||||||
|
public string FileName { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string DocumentTitle { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public string DiagramTitle { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public DiagramLegendLayout LegendLayout { get; set; }
|
||||||
|
|
||||||
|
public List<string> CategoriesX { get; set; } = new();
|
||||||
|
|
||||||
|
public List<SeriesParameters> SeriesParameters { get; set; } = new();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,8 @@
|
|||||||
using System.ComponentModel;
|
using RodionovLibrary.NonVisualComponents.HelperEnums;
|
||||||
|
using RodionovLibrary.NonVisualComponents.HelperModels;
|
||||||
|
using Word = Microsoft.Office.Interop.Word;
|
||||||
|
using Excel = Microsoft.Office.Interop.Excel;
|
||||||
|
using System.ComponentModel;
|
||||||
|
|
||||||
namespace RodionovLibrary.NonVisualComponents
|
namespace RodionovLibrary.NonVisualComponents
|
||||||
{
|
{
|
||||||
@ -15,5 +19,110 @@ namespace RodionovLibrary.NonVisualComponents
|
|||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void CreateDiagramDocument(WordDiagramInfo diagramInfo)
|
||||||
|
{
|
||||||
|
ValidateDiagramInfo(diagramInfo);
|
||||||
|
|
||||||
|
var wordApp = new Word.Application();
|
||||||
|
var document = wordApp.Documents.Add();
|
||||||
|
|
||||||
|
AddTitle(document, diagramInfo.DocumentTitle);
|
||||||
|
|
||||||
|
AddChart(document, diagramInfo);
|
||||||
|
|
||||||
|
document.SaveAs2(diagramInfo.FileName);
|
||||||
|
wordApp.Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddTitle(Word.Document document, string title)
|
||||||
|
{
|
||||||
|
var paragraph = document.Paragraphs.Add();
|
||||||
|
paragraph.Range.Text = title;
|
||||||
|
paragraph.Range.Font.Size = 24;
|
||||||
|
paragraph.Range.Font.Bold = 1;
|
||||||
|
paragraph.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
||||||
|
paragraph.Range.InsertParagraphAfter();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddChart(Word.Document document, WordDiagramInfo diagramInfo)
|
||||||
|
{
|
||||||
|
var paragraph = document.Paragraphs.Add();
|
||||||
|
var chartShape = document.InlineShapes.AddChart2(-1, (Microsoft.Office.Core.XlChartType)Excel.XlChartType.xlLine, paragraph.Range);
|
||||||
|
var chart = chartShape.Chart;
|
||||||
|
|
||||||
|
chart.HasTitle = true;
|
||||||
|
chart.ChartTitle.Text = diagramInfo.DiagramTitle;
|
||||||
|
|
||||||
|
var chartSeriesCollection = chart.SeriesCollection();
|
||||||
|
for (int i = chartSeriesCollection.Count; i >= 1; i--)
|
||||||
|
{
|
||||||
|
chartSeriesCollection.Item(i).Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
var categoriesX = diagramInfo.CategoriesX.ToArray();
|
||||||
|
|
||||||
|
for (int i = 0; i < diagramInfo.SeriesParameters.Count; i++)
|
||||||
|
{
|
||||||
|
var seriesInfo = diagramInfo.SeriesParameters[i];
|
||||||
|
var series = chartSeriesCollection.NewSeries();
|
||||||
|
|
||||||
|
series.Name = seriesInfo.SeriesName;
|
||||||
|
series.Values = seriesInfo.ValuesY.ToArray();
|
||||||
|
series.XValues = categoriesX;
|
||||||
|
|
||||||
|
SetSeriesColor(series, seriesInfo.Color);
|
||||||
|
|
||||||
|
series.MarkerStyle = Excel.XlMarkerStyle.xlMarkerStyleCircle;
|
||||||
|
series.MarkerSize = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
chart.HasLegend = true;
|
||||||
|
chart.Legend.Position = diagramInfo.LegendLayout switch
|
||||||
|
{
|
||||||
|
DiagramLegendLayout.Left => Word.XlLegendPosition.xlLegendPositionLeft,
|
||||||
|
DiagramLegendLayout.Top => Word.XlLegendPosition.xlLegendPositionTop,
|
||||||
|
DiagramLegendLayout.Right => Word.XlLegendPosition.xlLegendPositionRight,
|
||||||
|
DiagramLegendLayout.Bottom => Word.XlLegendPosition.xlLegendPositionBottom,
|
||||||
|
_ => Word.XlLegendPosition.xlLegendPositionBottom,
|
||||||
|
};
|
||||||
|
|
||||||
|
chart.ChartData.Workbook.Application.Quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetSeriesColor(dynamic series, Color color)
|
||||||
|
{
|
||||||
|
series.Format.Line.ForeColor.RGB = ColorTranslator.ToOle(color);
|
||||||
|
series.Format.Fill.ForeColor.RGB = ColorTranslator.ToOle(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ValidateDiagramInfo(WordDiagramInfo diagramInfo)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(diagramInfo.FileName) || string.IsNullOrEmpty(diagramInfo.DocumentTitle) ||
|
||||||
|
string.IsNullOrEmpty(diagramInfo.DiagramTitle) || diagramInfo.CategoriesX == null ||
|
||||||
|
diagramInfo.CategoriesX.Count == 0 || diagramInfo.SeriesParameters == null ||
|
||||||
|
diagramInfo.SeriesParameters.Count == 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Не все данные для диаграммы заполнены");
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var series in diagramInfo.SeriesParameters)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(series.SeriesName))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("Название серии не может быть пустым");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (series.ValuesY == null || series.ValuesY.Count == 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Список значений оси Y для серии '{series.SeriesName}' не заполнен");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (diagramInfo.CategoriesX.Count != series.ValuesY.Count)
|
||||||
|
{
|
||||||
|
throw new ArgumentException($"Количество категорий оси X и значений оси Y для серии '{series.SeriesName}' не совпадает");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,14 @@
|
|||||||
using DocumentFormat.OpenXml;
|
using Microsoft.Office.Interop.Word;
|
||||||
using DocumentFormat.OpenXml.Packaging;
|
|
||||||
using DocumentFormat.OpenXml.Wordprocessing;
|
|
||||||
using RodionovLibrary.NonVisualComponents.HelperModels;
|
using RodionovLibrary.NonVisualComponents.HelperModels;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using Application = Microsoft.Office.Interop.Word.Application;
|
||||||
|
|
||||||
namespace RodionovLibrary.NonVisualComponents
|
namespace RodionovLibrary.NonVisualComponents
|
||||||
{
|
{
|
||||||
public partial class WordLongTextComponent : Component
|
public partial class WordLongTextComponent : Component
|
||||||
{
|
{
|
||||||
private WordprocessingDocument? _wordDocument;
|
private Application? _wordApp;
|
||||||
|
private Document? _document;
|
||||||
private Body? _docBody;
|
|
||||||
|
|
||||||
public WordLongTextComponent()
|
public WordLongTextComponent()
|
||||||
{
|
{
|
||||||
@ -20,7 +18,6 @@ namespace RodionovLibrary.NonVisualComponents
|
|||||||
public WordLongTextComponent(IContainer container)
|
public WordLongTextComponent(IContainer container)
|
||||||
{
|
{
|
||||||
container.Add(this);
|
container.Add(this);
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,60 +28,54 @@ namespace RodionovLibrary.NonVisualComponents
|
|||||||
throw new ArgumentException("Не все данные заполнены");
|
throw new ArgumentException("Не все данные заполнены");
|
||||||
}
|
}
|
||||||
|
|
||||||
_wordDocument = WordprocessingDocument.Create(textInfo.FileName, WordprocessingDocumentType.Document);
|
_wordApp = new Application();
|
||||||
MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
|
_document = _wordApp.Documents.Add();
|
||||||
mainPart.Document = new Document();
|
|
||||||
_docBody = mainPart.Document.AppendChild(new Body());
|
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
AddText(textInfo);
|
AddText(textInfo);
|
||||||
|
_document.SaveAs2(textInfo.FileName);
|
||||||
_wordDocument.MainDocumentPart!.Document.Save();
|
}
|
||||||
_wordDocument.Dispose();
|
finally
|
||||||
|
{
|
||||||
|
_document.Close();
|
||||||
|
_wordApp.Quit();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddText(WordLongTextInfo textInfo)
|
private void AddText(WordLongTextInfo textInfo)
|
||||||
{
|
{
|
||||||
if (_docBody == null || _wordDocument == null)
|
if (_document == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
AddParagraph(textInfo.Title, fontSize: "48", isBold: true);
|
AddParagraph(textInfo.Title, fontSize: 22, isBold: true);
|
||||||
|
|
||||||
foreach (var paragraph in textInfo.Paragraphs)
|
foreach (var paragraph in textInfo.Paragraphs)
|
||||||
{
|
{
|
||||||
AddParagraph(paragraph, fontSize: "24", isBold: false);
|
AddParagraph(paragraph, fontSize: 14, isBold: false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddParagraph(string text, string fontSize, bool isBold)
|
private void AddParagraph(string text, int fontSize, bool isBold)
|
||||||
{
|
{
|
||||||
if (_docBody == null)
|
if (_document == null)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ParagraphProperties paragraphProperties = new();
|
var paragraph = _document.Content.Paragraphs.Add();
|
||||||
paragraphProperties.AppendChild(new Justification { Val = JustificationValues.Both });
|
var range = paragraph.Range;
|
||||||
|
|
||||||
Paragraph paragraph = new();
|
range.Text = text;
|
||||||
paragraph.AppendChild(paragraphProperties);
|
range.Font.Size = fontSize;
|
||||||
|
range.Font.Name = "Times New Roman";
|
||||||
|
range.Font.Bold = isBold ? 1 : 0;
|
||||||
|
|
||||||
Run docRun = new();
|
paragraph.Alignment = WdParagraphAlignment.wdAlignParagraphJustify;
|
||||||
|
|
||||||
RunProperties runProperties = new();
|
range.InsertParagraphAfter();
|
||||||
runProperties.AppendChild(new FontSize { Val = fontSize });
|
|
||||||
if (isBold)
|
|
||||||
{
|
|
||||||
runProperties.AppendChild(new Bold());
|
|
||||||
}
|
|
||||||
|
|
||||||
docRun.AppendChild(runProperties);
|
|
||||||
docRun.AppendChild(new Text(text));
|
|
||||||
|
|
||||||
paragraph.AppendChild(docRun);
|
|
||||||
|
|
||||||
_docBody.Append(paragraph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool CheckData(string[] data)
|
private bool CheckData(string[] data)
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
using DocumentFormat.OpenXml.Packaging;
|
using Word = Microsoft.Office.Interop.Word;
|
||||||
using DocumentFormat.OpenXml.Wordprocessing;
|
|
||||||
using DocumentFormat.OpenXml;
|
|
||||||
using RodionovLibrary.NonVisualComponents.HelperModels;
|
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
|
using RodionovLibrary.NonVisualComponents.HelperModels;
|
||||||
|
|
||||||
namespace RodionovLibrary.NonVisualComponents
|
namespace RodionovLibrary.NonVisualComponents
|
||||||
{
|
{
|
||||||
@ -24,57 +22,101 @@ namespace RodionovLibrary.NonVisualComponents
|
|||||||
{
|
{
|
||||||
ValidateInputData(tableInfo);
|
ValidateInputData(tableInfo);
|
||||||
|
|
||||||
using (WordprocessingDocument wordDoc = WordprocessingDocument.Create(tableInfo.FileName, WordprocessingDocumentType.Document))
|
var wordApp = new Word.Application();
|
||||||
|
var document = wordApp.Documents.Add();
|
||||||
|
var range = document.Range();
|
||||||
|
|
||||||
|
var paragraph = range.Paragraphs.Add();
|
||||||
|
paragraph.Range.Text = tableInfo.Title;
|
||||||
|
paragraph.Range.Font.Name = "Times New Roman";
|
||||||
|
paragraph.Range.Font.Size = 18;
|
||||||
|
paragraph.Range.Font.Bold = 1;
|
||||||
|
paragraph.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
||||||
|
paragraph.Range.ParagraphFormat.SpaceAfter = 8;
|
||||||
|
paragraph.Range.InsertParagraphAfter();
|
||||||
|
|
||||||
|
var table = document.Tables.Add(paragraph.Range, tableInfo.Items.Count + 2, tableInfo.ColumnParameters.Count);
|
||||||
|
table.Borders.Enable = 1;
|
||||||
|
table.Range.Font.Name = "Times New Roman";
|
||||||
|
table.Range.Font.Size = 11;
|
||||||
|
|
||||||
|
for (int i = 0; i < tableInfo.ColumnParameters.Count; i++)
|
||||||
{
|
{
|
||||||
MainDocumentPart mainPart = wordDoc.AddMainDocumentPart();
|
table.Columns[i + 1].Width = (float)(tableInfo.ColumnParameters[i].Width * 28.35);
|
||||||
mainPart.Document = new Document();
|
}
|
||||||
Body body = mainPart.Document.AppendChild(new Body());
|
|
||||||
|
|
||||||
ParagraphProperties paragraphProperties = new();
|
|
||||||
paragraphProperties.AppendChild(new Justification { Val = JustificationValues.Center });
|
|
||||||
|
|
||||||
Paragraph titleParagraph = new();
|
|
||||||
titleParagraph.AppendChild(paragraphProperties);
|
|
||||||
|
|
||||||
Run docRun = new();
|
|
||||||
|
|
||||||
RunProperties runProperties = new();
|
|
||||||
runProperties.AppendChild(new FontSize { Val = "48" });
|
|
||||||
runProperties.AppendChild(new Bold());
|
|
||||||
|
|
||||||
docRun.AppendChild(runProperties);
|
|
||||||
docRun.AppendChild(new Text(tableInfo.Title));
|
|
||||||
|
|
||||||
titleParagraph.AppendChild(docRun);
|
|
||||||
body.Append(titleParagraph);
|
|
||||||
|
|
||||||
Table table = new();
|
|
||||||
|
|
||||||
double totalWidthTwips = tableInfo.ColumnParameters.Sum(column => column.Width) * 566.93;
|
|
||||||
TableProperties tableProperties = new(
|
|
||||||
new TableBorders(
|
|
||||||
new TopBorder { Val = BorderValues.Single, Size = 8 },
|
|
||||||
new BottomBorder { Val = BorderValues.Single, Size = 8 },
|
|
||||||
new LeftBorder { Val = BorderValues.Single, Size = 8 },
|
|
||||||
new RightBorder { Val = BorderValues.Single, Size = 8 },
|
|
||||||
new InsideHorizontalBorder { Val = BorderValues.Single, Size = 8 },
|
|
||||||
new InsideVerticalBorder { Val = BorderValues.Single, Size = 8 }
|
|
||||||
),
|
|
||||||
new TableWidth { Width = totalWidthTwips.ToString("F0"), Type = TableWidthUnitValues.Dxa },
|
|
||||||
new TableJustification { Val = TableRowAlignmentValues.Center }
|
|
||||||
);
|
|
||||||
table.AppendChild(tableProperties);
|
|
||||||
|
|
||||||
AddTableHeaderRow(table, tableInfo.ColumnParameters, true);
|
AddTableHeaderRow(table, tableInfo.ColumnParameters, true);
|
||||||
|
|
||||||
AddTableHeaderRow(table, tableInfo.ColumnParameters, false);
|
AddTableHeaderRow(table, tableInfo.ColumnParameters, false);
|
||||||
|
|
||||||
MergeColumns(table, tableInfo.MergedColumns);
|
MergeColumns(table, tableInfo.MergedColumns);
|
||||||
|
|
||||||
AddTableData(table, tableInfo.Items, tableInfo.ColumnParameters);
|
AddTableData(table, tableInfo.Items, tableInfo.ColumnParameters);
|
||||||
|
|
||||||
body.Append(table);
|
document.SaveAs2(tableInfo.FileName);
|
||||||
|
wordApp.Quit();
|
||||||
|
}
|
||||||
|
|
||||||
mainPart.Document.Save();
|
private void AddTableHeaderRow(Word.Table table, List<ColumnParameters> columnParameters, bool isFirstRow)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < columnParameters.Count; i++)
|
||||||
|
{
|
||||||
|
var header = isFirstRow ? columnParameters[i].FirstRowHeader : columnParameters[i].SecondRowHeader;
|
||||||
|
if (!string.IsNullOrEmpty(header))
|
||||||
|
{
|
||||||
|
var cell = table.Cell(isFirstRow ? 1 : 2, i + 1);
|
||||||
|
cell.Range.Text = header;
|
||||||
|
cell.Range.Bold = 1;
|
||||||
|
cell.Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
||||||
|
cell.VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
|
||||||
|
cell.Range.ParagraphFormat.SpaceBefore = 4;
|
||||||
|
cell.Range.ParagraphFormat.SpaceAfter = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MergeColumns(Word.Table table, List<(int start, int end)> mergedColumns)
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= table.Columns.Count; i++)
|
||||||
|
{
|
||||||
|
bool isMergedHorizontally = mergedColumns.Any(m => m.start <= i - 1 && m.end >= i - 1);
|
||||||
|
|
||||||
|
if (!isMergedHorizontally)
|
||||||
|
{
|
||||||
|
table.Cell(1, i).Merge(table.Cell(2, i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int xOffset = 0;
|
||||||
|
foreach (var (start, end) in mergedColumns)
|
||||||
|
{
|
||||||
|
var cellStart = table.Cell(1, start + 1 - xOffset);
|
||||||
|
var cellEnd = table.Cell(1, end + 1 - xOffset);
|
||||||
|
|
||||||
|
string textToKeep = cellStart.Range.Text.TrimEnd('\r', '\a');
|
||||||
|
cellStart.Merge(cellEnd);
|
||||||
|
cellStart.Range.Text = textToKeep;
|
||||||
|
|
||||||
|
xOffset += end - start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddTableData<T>(Word.Table table, List<T> items, List<ColumnParameters> columnParameters)
|
||||||
|
{
|
||||||
|
for (int rowIndex = 0; rowIndex < items.Count; rowIndex++)
|
||||||
|
{
|
||||||
|
var item = items[rowIndex];
|
||||||
|
for (int colIndex = 0; colIndex < columnParameters.Count; colIndex++)
|
||||||
|
{
|
||||||
|
var property = typeof(T).GetProperty(columnParameters[colIndex].PropertyName);
|
||||||
|
var value = property?.GetValue(item)?.ToString() ?? string.Empty;
|
||||||
|
table.Cell(rowIndex + 3, colIndex + 1).Range.Text = value;
|
||||||
|
table.Cell(rowIndex + 3, colIndex + 1).Range.Bold = 0;
|
||||||
|
table.Cell(rowIndex + 3, colIndex + 1).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;
|
||||||
|
table.Cell(rowIndex + 3, colIndex + 1).VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalCenter;
|
||||||
|
table.Cell(rowIndex + 3, colIndex + 1).Range.ParagraphFormat.SpaceBefore = 2;
|
||||||
|
table.Cell(rowIndex + 3, colIndex + 1).Range.ParagraphFormat.SpaceAfter = 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,11 +160,11 @@ namespace RodionovLibrary.NonVisualComponents
|
|||||||
}
|
}
|
||||||
if (column.Width <= 0)
|
if (column.Width <= 0)
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"У колонки ширина должна быть больше нуля.");
|
throw new ArgumentException("Ширина колонки должна быть больше нуля.");
|
||||||
}
|
}
|
||||||
if (string.IsNullOrEmpty(column.PropertyName))
|
if (string.IsNullOrEmpty(column.PropertyName))
|
||||||
{
|
{
|
||||||
throw new ArgumentException($"Свойство не задано для одной из колонок");
|
throw new ArgumentException("Свойство не задано для одной из колонок.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -151,82 +193,5 @@ namespace RodionovLibrary.NonVisualComponents
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddTableHeaderRow(Table table, List<ColumnParameters> columnParameters, bool isFirstRow)
|
|
||||||
{
|
|
||||||
TableRow headerRow = new();
|
|
||||||
foreach (var column in columnParameters)
|
|
||||||
{
|
|
||||||
var header = isFirstRow ? column.FirstRowHeader : column.SecondRowHeader;
|
|
||||||
TableCell cell = new(new Paragraph(new Run(new Text(header))));
|
|
||||||
TableCellProperties cellProps = new()
|
|
||||||
{
|
|
||||||
TableCellWidth = new TableCellWidth { Type = TableWidthUnitValues.Dxa, Width = (column.Width * 566.93).ToString("F0") },
|
|
||||||
TableCellVerticalAlignment = new TableCellVerticalAlignment { Val = TableVerticalAlignmentValues.Center }
|
|
||||||
};
|
|
||||||
|
|
||||||
ParagraphProperties paragraphProperties = new(new Justification { Val = JustificationValues.Center });
|
|
||||||
RunProperties runProperties = new() { Bold = new Bold() };
|
|
||||||
|
|
||||||
cell.Append(cellProps);
|
|
||||||
cell.Append(paragraphProperties);
|
|
||||||
cell.Elements<Paragraph>().First().Elements<Run>().First().RunProperties = runProperties;
|
|
||||||
|
|
||||||
headerRow.Append(cell);
|
|
||||||
}
|
|
||||||
table.Append(headerRow);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MergeColumns(Table table, List<(int start, int end)> mergedColumns)
|
|
||||||
{
|
|
||||||
foreach (var (startCellIndex, endCellIndex) in mergedColumns)
|
|
||||||
{
|
|
||||||
for (int i = startCellIndex; i <= endCellIndex; i++)
|
|
||||||
{
|
|
||||||
TableCell cell = table.Elements<TableRow>().ElementAt(0).Elements<TableCell>().ElementAt(i);
|
|
||||||
cell.TableCellProperties.Append(new HorizontalMerge { Val = i == startCellIndex ? MergedCellValues.Restart : MergedCellValues.Continue });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int totalColumns = table.Elements<TableRow>().ElementAt(0).Elements<TableCell>().Count();
|
|
||||||
for (int i = 0; i < totalColumns; i++)
|
|
||||||
{
|
|
||||||
bool isColumnMergedHorizontally = mergedColumns.Any(m => m.start <= i && m.end >= i);
|
|
||||||
|
|
||||||
if (!isColumnMergedHorizontally)
|
|
||||||
{
|
|
||||||
TableCell firstRowCell = table.Elements<TableRow>().ElementAt(0).Elements<TableCell>().ElementAt(i);
|
|
||||||
TableCell secondRowCell = table.Elements<TableRow>().ElementAt(1).Elements<TableCell>().ElementAt(i);
|
|
||||||
|
|
||||||
firstRowCell.TableCellProperties.Append(new VerticalMerge { Val = MergedCellValues.Restart });
|
|
||||||
secondRowCell.TableCellProperties.Append(new VerticalMerge { Val = MergedCellValues.Continue });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddTableData<T>(Table table, List<T> items, List<ColumnParameters> columnParameters)
|
|
||||||
{
|
|
||||||
foreach (var item in items)
|
|
||||||
{
|
|
||||||
TableRow dataRow = new();
|
|
||||||
foreach (var column in columnParameters)
|
|
||||||
{
|
|
||||||
TableCell cell = new(new Paragraph(new Run(new Text(item?.GetType().GetProperty(column.PropertyName)?.GetValue(item)?.ToString() ?? string.Empty))));
|
|
||||||
|
|
||||||
TableCellProperties cellProps = new()
|
|
||||||
{
|
|
||||||
TableCellVerticalAlignment = new TableCellVerticalAlignment { Val = TableVerticalAlignmentValues.Center }
|
|
||||||
};
|
|
||||||
|
|
||||||
ParagraphProperties paragraphProperties = new(new Justification { Val = JustificationValues.Center });
|
|
||||||
|
|
||||||
cell.Append(cellProps);
|
|
||||||
cell.Append(paragraphProperties);
|
|
||||||
|
|
||||||
dataRow.Append(cell);
|
|
||||||
}
|
|
||||||
table.Append(dataRow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,33 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="DocumentFormat.OpenXml" Version="3.0.2" />
|
<COMReference Include="Microsoft.Office.Interop.Excel">
|
||||||
|
<WrapperTool>tlbimp</WrapperTool>
|
||||||
|
<VersionMinor>9</VersionMinor>
|
||||||
|
<VersionMajor>1</VersionMajor>
|
||||||
|
<Guid>00020813-0000-0000-c000-000000000046</Guid>
|
||||||
|
<Lcid>0</Lcid>
|
||||||
|
<Isolated>false</Isolated>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</COMReference>
|
||||||
|
<COMReference Include="Microsoft.Office.Interop.Word">
|
||||||
|
<WrapperTool>tlbimp</WrapperTool>
|
||||||
|
<VersionMinor>7</VersionMinor>
|
||||||
|
<VersionMajor>8</VersionMajor>
|
||||||
|
<Guid>00020905-0000-0000-c000-000000000046</Guid>
|
||||||
|
<Lcid>0</Lcid>
|
||||||
|
<Isolated>false</Isolated>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</COMReference>
|
||||||
|
<COMReference Include="Microsoft.Office.Core">
|
||||||
|
<WrapperTool>tlbimp</WrapperTool>
|
||||||
|
<VersionMinor>8</VersionMinor>
|
||||||
|
<VersionMajor>2</VersionMajor>
|
||||||
|
<Guid>2df8d04c-5bfa-101b-bde5-00aa0044de52</Guid>
|
||||||
|
<Lcid>0</Lcid>
|
||||||
|
<Isolated>false</Isolated>
|
||||||
|
<EmbedInteropTypes>True</EmbedInteropTypes>
|
||||||
|
</COMReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,6 +1,4 @@
|
|||||||
using DocumentFormat.OpenXml.ExtendedProperties;
|
using System.Reflection;
|
||||||
using DocumentFormat.OpenXml.Spreadsheet;
|
|
||||||
using System.Reflection;
|
|
||||||
|
|
||||||
namespace RodionovLibrary.VisualComponents
|
namespace RodionovLibrary.VisualComponents
|
||||||
{
|
{
|
||||||
|
2
COP/WinForms/FormTest.Designer.cs
generated
2
COP/WinForms/FormTest.Designer.cs
generated
@ -47,6 +47,7 @@
|
|||||||
buttonWordText = new Button();
|
buttonWordText = new Button();
|
||||||
wordLongTextComponent = new RodionovLibrary.NonVisualComponents.WordLongTextComponent(components);
|
wordLongTextComponent = new RodionovLibrary.NonVisualComponents.WordLongTextComponent(components);
|
||||||
wordTableComponent = new RodionovLibrary.NonVisualComponents.WordTableComponent(components);
|
wordTableComponent = new RodionovLibrary.NonVisualComponents.WordTableComponent(components);
|
||||||
|
wordDiagramComponent = new RodionovLibrary.NonVisualComponents.WordDiagramComponent(components);
|
||||||
panel1.SuspendLayout();
|
panel1.SuspendLayout();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
@ -271,5 +272,6 @@
|
|||||||
private Button buttonWordText;
|
private Button buttonWordText;
|
||||||
private RodionovLibrary.NonVisualComponents.WordLongTextComponent wordLongTextComponent;
|
private RodionovLibrary.NonVisualComponents.WordLongTextComponent wordLongTextComponent;
|
||||||
private RodionovLibrary.NonVisualComponents.WordTableComponent wordTableComponent;
|
private RodionovLibrary.NonVisualComponents.WordTableComponent wordTableComponent;
|
||||||
|
private RodionovLibrary.NonVisualComponents.WordDiagramComponent wordDiagramComponent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using RodionovLibrary.NonVisualComponents.HelperEnums;
|
||||||
using RodionovLibrary.NonVisualComponents.HelperModels;
|
using RodionovLibrary.NonVisualComponents.HelperModels;
|
||||||
|
|
||||||
namespace WinForms
|
namespace WinForms
|
||||||
@ -156,9 +157,43 @@ namespace WinForms
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void ButtonWordDiagram_Click(object sender, EventArgs e)
|
private void ButtonWordDiagram_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
using var dialog = new SaveFileDialog
|
||||||
|
{
|
||||||
|
Filter = "docx|*.docx"
|
||||||
|
};
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var series = new List<SeriesParameters>
|
||||||
|
{
|
||||||
|
new() {
|
||||||
|
SeriesName = "Ńĺđč˙ 1",
|
||||||
|
ValuesY = new List<double> { 10, 15, 20 },
|
||||||
|
Color = Color.FromArgb(255, 165, 0)
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
SeriesName = "Ńĺđč˙ 2",
|
||||||
|
ValuesY = new List<double> { 45, 34, 18 },
|
||||||
|
Color = Color.FromArgb(105, 105, 105)
|
||||||
|
},
|
||||||
|
new() {
|
||||||
|
SeriesName = "Ńĺđč˙ 3",
|
||||||
|
ValuesY = new List<double> { 25, 2, 7 },
|
||||||
|
Color = Color.FromArgb(255, 255, 0)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
wordDiagramComponent.CreateDiagramDocument(new WordDiagramInfo()
|
||||||
|
{
|
||||||
|
FileName = dialog.FileName,
|
||||||
|
DocumentTitle = "Çŕăîëîâîę",
|
||||||
|
DiagramTitle = "Ňĺńňîâŕ˙ äčŕăđŕěěŕ",
|
||||||
|
LegendLayout = DiagramLegendLayout.Bottom,
|
||||||
|
CategoriesX = new List<string> { "ßíâŕđü", "Ôĺâđŕëü", "Ěŕđň" },
|
||||||
|
SeriesParameters = series
|
||||||
|
});
|
||||||
|
|
||||||
MessageBox.Show("Ãîòîâî!");
|
MessageBox.Show("Ãîòîâî!");
|
||||||
}
|
}
|
||||||
@ -169,3 +204,4 @@ namespace WinForms
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
@ -123,4 +123,7 @@
|
|||||||
<metadata name="wordTableComponent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
<metadata name="wordTableComponent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
<value>210, 17</value>
|
<value>210, 17</value>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
<metadata name="wordDiagramComponent.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||||
|
<value>382, 17</value>
|
||||||
|
</metadata>
|
||||||
</root>
|
</root>
|
Loading…
Reference in New Issue
Block a user