From d29d0674ca38ea5029d357f89c0c83fc2804dad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=91=D0=B0=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D1=81=D0=BA=D0=B0=D1=8F?= Date: Wed, 6 Nov 2024 17:14:14 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B2=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D0=BB?= =?UTF-8?q?=D0=B0=D0=B1=D0=B0=20=D1=81=D0=B4=D0=B0=D0=BD=D0=B0,=20=D0=B0?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82=20=D0=B2=20=D1=82=D1=80?= =?UTF-8?q?=D0=B5=D1=82=D1=8C=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppShopInternetOption19.csproj | 5 + .../AppShopInternetOption19/Form1.Designer.cs | 14 +- .../AppShopInternetOption19/Form1.resx | 120 ++++++++++ .../FormTestNoVisibleComponents.cs | 46 ++-- .../DiagramWordNoVisibleComponent.cs | 214 +----------------- .../TableWordNoVisibleComponent.cs | 50 ++-- 6 files changed, 201 insertions(+), 248 deletions(-) create mode 100644 UserComponentsOption19/AppShopInternetOption19/Form1.resx diff --git a/UserComponentsOption19/AppShopInternetOption19/AppShopInternetOption19.csproj b/UserComponentsOption19/AppShopInternetOption19/AppShopInternetOption19.csproj index 663fdb8..6b8ff78 100644 --- a/UserComponentsOption19/AppShopInternetOption19/AppShopInternetOption19.csproj +++ b/UserComponentsOption19/AppShopInternetOption19/AppShopInternetOption19.csproj @@ -8,4 +8,9 @@ enable + + + + + \ No newline at end of file diff --git a/UserComponentsOption19/AppShopInternetOption19/Form1.Designer.cs b/UserComponentsOption19/AppShopInternetOption19/Form1.Designer.cs index 5a88dd1..60ef221 100644 --- a/UserComponentsOption19/AppShopInternetOption19/Form1.Designer.cs +++ b/UserComponentsOption19/AppShopInternetOption19/Form1.Designer.cs @@ -28,10 +28,16 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "Form1"; + SuspendLayout(); + // + // Form1 + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 450); + Name = "Form1"; + Text = "Главная форма"; + ResumeLayout(false); } #endregion diff --git a/UserComponentsOption19/AppShopInternetOption19/Form1.resx b/UserComponentsOption19/AppShopInternetOption19/Form1.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/UserComponentsOption19/AppShopInternetOption19/Form1.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/UserComponentsOption19/TestAppForCheckComponentsWorking/FormTestNoVisibleComponents.cs b/UserComponentsOption19/TestAppForCheckComponentsWorking/FormTestNoVisibleComponents.cs index 50cc694..a2bdf26 100644 --- a/UserComponentsOption19/TestAppForCheckComponentsWorking/FormTestNoVisibleComponents.cs +++ b/UserComponentsOption19/TestAppForCheckComponentsWorking/FormTestNoVisibleComponents.cs @@ -46,21 +46,18 @@ namespace TestAppForCheckComponentsWorking new Employee { Id = 5, Status = "да", FirstName = "Татьяна", LastName = "Петрова", Age = 44, Children = "да", Car = "нет", Position = "Ст. бух.", Departament = "Бухг.", Bonus = 7000.6 } }; - string[] headerRow1 = { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" }; - string[] headerRow2 = { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" }; - - var headerTitles = new List + List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths = new List<(float, string, string, string)> { - new[] { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" }, - new[] { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" } - }; - - var columnWidths = new List { 3.0f, 3.0f, 2.0f, 2.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 2.0f }; - - var columnMerges = new List<(int StartColumn, int EndColumn)> - { - (2, 4), // Объединяем "Личные данные" на три столбца - (7, 8) // Объединяем "Работа" на два столбца + (1.0f, "Идент.", "Идент.", "Id"), + (2.0f, "Статус.", "Статус", "Status" ), + (2.0f, "Личные данные.", "Имя.", "FirstName"), + (3.0f, "Личные данные.", "Фамилия.", "LastName" ), + (2.0f, "Личные данные.", "Возраст.", "Age"), + (2.0f, "Дети.", "Дети.", "Children" ), + (2.0f, "Машина.", "Машина.", "Car" ), + (3.0f, "Работа.", "Должность.", "Position" ), + (3.0f, "Работа.", "Подразделение.", "Departament"), + (3.0f, "Премия.", "Премия.", "Bonus" ), }; var columnPropertyMapping = new Dictionary @@ -77,8 +74,25 @@ namespace TestAppForCheckComponentsWorking { 9, "Bonus" } }; + string[] headerRow1 = { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" }; + string[] headerRow2 = { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" }; + + var headerTitles = new List + { + new[] { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" }, + new[] { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" } + }; + + //var columnWidths = new List { 3.0f, 3.0f, 2.0f, 2.0f, 2.0f, 2.0f, 3.0f, 3.0f, 2.0f, 2.0f }; + + var columnMerges = new List<(int StartColumn, int EndColumn)> + { + (2, 4), // Объединяем "Личные данные" на три столбца + (7, 8) // Объединяем "Работа" на два столбца + }; + tableWordNoVisibleComponent.CreateTableInWordDocument(filePath, "Оп... какие-то рабы", columnMerges, columnWidths, - headerRow1, headerRow2, columnPropertyMapping, dataList); + dataList); //tableWordNoVisibleComponent.CreateWordTestTable(filePath); MessageBox.Show("Успешно :D проверяй скорее наличие файла..."); @@ -127,7 +141,7 @@ namespace TestAppForCheckComponentsWorking new DiagramWordNoVisibleComponent.ChartSeries { Name = "Ем пельмени день 1", - Data = new List { 10, 5, 30, 4, 500 } + Data = new List { 10, 5, 30, 4, 2 } }, new DiagramWordNoVisibleComponent.ChartSeries { diff --git a/UserComponentsOption19/UserComponentsOption19/DiagramWordNoVisibleComponent.cs b/UserComponentsOption19/UserComponentsOption19/DiagramWordNoVisibleComponent.cs index 553d94c..17ffe20 100644 --- a/UserComponentsOption19/UserComponentsOption19/DiagramWordNoVisibleComponent.cs +++ b/UserComponentsOption19/UserComponentsOption19/DiagramWordNoVisibleComponent.cs @@ -33,10 +33,18 @@ namespace UserComponentsOption19 } // Основной метод для создания документа с диаграммой - public void CreateDocumentWithChart(string fileName, string documentTitle, string chartTitle, LegendPosition legendPosition, List chartData) + public void CreateDocumentWithChart( + string fileName, + string documentTitle, + string chartTitle, + LegendPosition legendPosition, + List chartData + ) { // Проверка входных данных - if (string.IsNullOrWhiteSpace(fileName) || string.IsNullOrWhiteSpace(documentTitle) || chartData == null || chartData.Count == 0) + if ( + string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(documentTitle) || + chartData == null || chartData.Count == 0) { throw new ArgumentException("Некорректные входные данные: проверьте имя файла, заголовок документа и наличие данных для диаграммы."); } @@ -98,15 +106,6 @@ namespace UserComponentsOption19 break; } - //// Экспорт диаграммы в PNG - //string chartPath = Path.Combine(Path.GetTempPath(), "chart.png"); - //chart.Export(chartPath, "PNG", false); - - // Теперь вставляем изображение в документ Word - //var paragraph = document.Content.Paragraphs.Add(); - //paragraph.Range.InlineShapes.AddChart2(chart); - - // Копирование диаграммы в буфер обмена chartObject.Copy(); @@ -126,196 +125,3 @@ namespace UserComponentsOption19 } } } - - - - - -//using DocumentFormat.OpenXml.Drawing.Charts; -//using DocumentFormat.OpenXml.Drawing.Wordprocessing; -//using DocumentFormat.OpenXml.Packaging; -//using DocumentFormat.OpenXml; -//using System.ComponentModel; -//using DocumentFormat.OpenXml.Wordprocessing; -//using Index = DocumentFormat.OpenXml.Drawing.Charts.Index; -//using DocumentFormat.OpenXml.Drawing; -//DocumentFormat.OpenXml.Drawing.Charts.Index chartIndex = new DocumentFormat.OpenXml.Drawing.Charts.Index(); - -//namespace UserComponentsOption19 -//{ -// public partial class DiagramWordNoVisibleComponent : Component -// { -// public DiagramWordNoVisibleComponent() -// { -// InitializeComponent(); -// } - -// public DiagramWordNoVisibleComponent(IContainer container) : this() -// { -// container.Add(this); -// } - -// // Перечисление для позиции легенды -// public enum LegendPosition -// { -// Top, -// Bottom, -// Left, -// Right -// } - -// // Класс для представления серии данных -// public class ChartSeries -// { -// public string? Name { get; set; } -// public List? Data { get; set; } -// } - -// // Основной метод для создания документа с диаграммой -// public void CreateDocumentWithChart(string fileName, string documentTitle, string chartTitle, LegendPosition legendPosition, List chartData) -// { -// // Проверка входных данных -// if (string.IsNullOrWhiteSpace(fileName) || string.IsNullOrWhiteSpace(documentTitle) || chartData == null || chartData.Count == 0) -// { -// throw new ArgumentException("Некорректные входные данные: проверьте имя файла, заголовок документа и наличие данных для диаграммы."); -// } - -// // Создаем Word документ -// using (WordprocessingDocument wordDocument = WordprocessingDocument.Create(fileName, WordprocessingDocumentType.Document)) -// { -// // Основная часть документа -// MainDocumentPart mainPart = wordDocument.AddMainDocumentPart(); -// mainPart.Document = new Document(); -// Body body = new Body(); - -// // Добавляем заголовок документа -// DocumentFormat.OpenXml.Drawing.Paragraph titleParagraph = CreateTitle(documentTitle); -// body.AppendChild(titleParagraph); - -// // Добавляем диаграмму в документ -// ChartPart chartPart = mainPart.AddNewPart(); -// GenerateChart(chartPart, chartTitle, legendPosition, chartData); - -// // Вставляем диаграмму в документ -// Drawing chartDrawing = CreateChartDrawing(chartPart); -// DocumentFormat.OpenXml.Drawing.Paragraph chartParagraph = new DocumentFormat.OpenXml.Drawing.Paragraph(new DocumentFormat.OpenXml.Drawing.Run(chartDrawing)); -// body.AppendChild(chartParagraph); - -// mainPart.Document.Append(body); -// mainPart.Document.Save(); -// } -// } - -// // Метод для генерации заголовка документа -// private DocumentFormat.OpenXml.Drawing.Paragraph CreateTitle(string documentTitle) -// { -// var titleParagraph = new DocumentFormat.OpenXml.Drawing.Paragraph(new DocumentFormat.OpenXml.Drawing.Run(new DocumentFormat.OpenXml.Drawing.Text(documentTitle))); -// titleParagraph.ParagraphProperties = new DocumentFormat.OpenXml.Drawing.ParagraphProperties(new Justification { Val = JustificationValues.Center }); -// return titleParagraph; -// } - -// // Метод для создания диаграммы -// private void GenerateChart(ChartPart chartPart, string chartTitle, LegendPosition legendPosition, List chartData) -// { -// ChartSpace chartSpace = new ChartSpace(); -// DocumentFormat.OpenXml.Drawing.Charts.Chart chart = new DocumentFormat.OpenXml.Drawing.Charts.Chart(); -// chart.Append(new Title(new ChartText(new RichText(new DocumentFormat.OpenXml.Drawing.Run(new DocumentFormat.OpenXml.Drawing.Text(chartTitle)))))); - -// PlotArea plotArea = new PlotArea(); -// LineChart lineChart = new LineChart(); -// uint index = 0; - -// // Добавляем данные серий в диаграмму -// foreach (var series in chartData) -// { -// if (series.Name == null || series.Data == null || series.Data.Count == 0) -// { -// throw new ArgumentException("Некорректные данные серии."); -// } - -// LineChartSeries lineChartSeries = new LineChartSeries( -// new Index { Val = index }, -// new Order { Val = index }, -// new SeriesText(new StringReference { Formula = new DocumentFormat.OpenXml.Drawing.Charts.Formula(series.Name) })); - -// // Добавляем значения данных -// var numberLiteral = new NumberLiteral(); -// numberLiteral.Append(new PointCount() { Val = (uint)series.Data.Count }); -// foreach (var dataPoint in series.Data) -// { -// numberLiteral.Append(new NumericValue(dataPoint.ToString())); -// } - -// lineChartSeries.Append(new DocumentFormat.OpenXml.Drawing.Charts.Values(numberLiteral)); -// lineChart.Append(lineChartSeries); -// index++; -// } - -// plotArea.Append(lineChart); -// chart.Append(plotArea); - -// // Добавляем легенду -// Legend legend = CreateLegend(legendPosition); -// chart.Append(legend); - -// chartSpace.Append(chart); -// chartPart.ChartSpace = chartSpace; -// } - -// // Метод для создания легенды -// private Legend CreateLegend(LegendPosition legendPosition) -// { -// Legend legend = new Legend(); -// LegendPositionValues legendPos; - -// // Преобразуем наше перечисление в OpenXML значение -// switch (legendPosition) -// { -// case LegendPosition.Top: -// legendPos = LegendPositionValues.Top; -// break; -// case LegendPosition.Bottom: -// legendPos = LegendPositionValues.Bottom; -// break; -// case LegendPosition.Left: -// legendPos = LegendPositionValues.Left; -// break; -// case LegendPosition.Right: -// legendPos = LegendPositionValues.Right; -// break; -// default: -// throw new ArgumentOutOfRangeException(nameof(legendPosition), "Некорректная позиция легенды."); -// } - -// legend.Append(new DocumentFormat.OpenXml.Drawing.Charts.LegendPosition() -// { -// Val = new EnumValue(legendPos) -// }); - -// return legend; -// } - -// // Метод для вставки диаграммы в документ -// private Drawing CreateChartDrawing(ChartPart chartPart) -// { -// return new Drawing( -// new Inline( -// new Extent() { Cx = 5486400, Cy = 3200400 }, -// new EffectExtent() -// { -// LeftEdge = 0L, -// TopEdge = 0L, -// RightEdge = 0L, -// BottomEdge = 0L -// }, -// new DocProperties() { Id = (UInt32Value)1U, Name = "Chart 1" }, -// new Graphic( -// new GraphicData( -// new ChartReference() { Id = chartPart.GetIdOfPart(chartPart) }) -// { Uri = "http://schemas.openxmlformats.org/drawingml/2006/chart" }) -// ) -// { DistanceFromTop = (UInt32Value)0U, DistanceFromBottom = (UInt32Value)0U, DistanceFromLeft = (UInt32Value)0U, DistanceFromRight = (UInt32Value)0U } -// ); -// } -// } -//} diff --git a/UserComponentsOption19/UserComponentsOption19/TableWordNoVisibleComponent.cs b/UserComponentsOption19/UserComponentsOption19/TableWordNoVisibleComponent.cs index 66febc6..ffbe7e9 100644 --- a/UserComponentsOption19/UserComponentsOption19/TableWordNoVisibleComponent.cs +++ b/UserComponentsOption19/UserComponentsOption19/TableWordNoVisibleComponent.cs @@ -22,14 +22,13 @@ namespace UserComponentsOption19 string filePath, string title, List<(int start, int end)> mergeColumns, - List columnWidths, - string[] headerRow1, - string[] headerRow2, - Dictionary columnPropertyMapping, + + List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths, + List data) where T : class { // Проверка входных данных - ValidateInput(filePath, title, mergeColumns, columnWidths, headerRow1, headerRow2, columnPropertyMapping, data); + ValidateInput(filePath, title, mergeColumns, columnWidths, data); var wordApp = new Word.Application(); var document = wordApp.Documents.Add(); @@ -38,14 +37,15 @@ namespace UserComponentsOption19 document.Content.Text = title; // Добавление таблицы - var tableRange = document.Bookmarks["\\endofdoc"].Range; - Table table = document.Tables.Add(tableRange, data.Count + 2, headerRow1.Length); + //var tableRange = document.Bookmarks["\\endofdoc"].Range; + var tableRange = document.Content; + Table table = document.Tables.Add(tableRange, data.Count + 2, columnWidths.Count); table.Borders.Enable = 1; // Заполнение данных - FillData(table, data, columnPropertyMapping, columnWidths); + FillData(table, data, columnWidths); // Заполнение заголовка - FillHeader(table, headerRow1, headerRow2, mergeColumns); + FillHeader(table, columnWidths, mergeColumns); // Сохранение документа document.SaveAs2(filePath); @@ -57,26 +57,26 @@ namespace UserComponentsOption19 string filePath, string title, List<(int start, int end)> mergeColumns, - List columnWidths, - string[] headerRow1, - string[] headerRow2, - Dictionary columnPropertyMapping, + List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths, List data) { if (string.IsNullOrEmpty(filePath)) throw new ArgumentNullException("нужно ввести путь до файла"); if (string.IsNullOrEmpty(title)) throw new ArgumentNullException("нужно ввести заголовок документа"); if (mergeColumns == null) throw new ArgumentNullException("где информация по объединению колонок?"); - if (columnWidths == null) throw new ArgumentNullException("где информация по ширине колонок?"); - if (headerRow1 == null || headerRow2 == null) throw new ArgumentNullException("нужно ввести заголовки"); + if (columnWidths == null) throw new ArgumentNullException("где информация по ширине колонок и заголовкам?"); if (data == null) throw new ArgumentNullException("все ввел, а данные забыл ввести? ну ты и умник"); - if (columnPropertyMapping == null) throw new ArgumentNullException("все ввел, а данные забыл ввести? ну ты и умник"); } - private void FillHeader(Table table, string[] headerRow1, string[] headerRow2, List<(int start, int end)> mergeColumns) + private void FillHeader( + Table table, + List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths, + List<(int start, int end)> mergeColumns + ) { - for (int i = 0; i < headerRow2.Length; i++) + for (int i = 0; i < columnWidths.Count; i++) { - table.Cell(2, i + 1).Range.Text = headerRow2[i]; + table.Cell(2, i + 1).Range.Text = columnWidths[i].headerRowCell2; + table.Columns[i + 1].Width = columnWidths[i].columnWidth * 20; } var sortDeskMergeColumns = mergeColumns.OrderByDescending(x => x.start); @@ -100,25 +100,27 @@ namespace UserComponentsOption19 foreach (var item in notMergedColumns) { table.Cell(1, item + 1).Merge(table.Cell(2, item + 1)); - table.Cell(1, item + 1).Range.Text = headerRow1[item]; + table.Cell(1, item + 1).Range.Text = columnWidths[item].headerRowCell1; } foreach (var item in sortDeskMergeColumns) { table.Cell(1, item.start + 1).Merge(table.Cell(1, item.end + 1)); - table.Cell(1, item.start + 1).Range.Text = headerRow1[item.start]; + table.Cell(1, item.start + 1).Range.Text = columnWidths[item.start].headerRowCell1; } } - private void FillData(Table table, List data, Dictionary columnPropertyMapping, List columnWidths) where T : class + private void FillData(Table table, List data, + List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths + ) where T : class { int rowIndex = 3; foreach (var item in data) { - for (int i = 0; i < columnPropertyMapping.Count; i++) + for (int i = 0; i < columnWidths.Count; i++) { - string propName = columnPropertyMapping[i]; + string propName = columnWidths[i].property; var property = typeof(T).GetProperty(propName); if (property != null) {