вторая лаба сдана, а коммит в третьей

This commit is contained in:
Елена Бакальская 2024-11-06 17:14:14 +04:00
parent 53121f5150
commit d29d0674ca
6 changed files with 201 additions and 248 deletions

View File

@ -8,4 +8,9 @@
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Components" Version="1.0.0" />
<PackageReference Include="FixedWinFormsLibrary1" Version="1.0.0" />
</ItemGroup>
</Project>

View File

@ -28,10 +28,16 @@
/// </summary>
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

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -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<string[]>
List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths = new List<(float, string, string, string)>
{
new[] { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" },
new[] { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" }
};
var columnWidths = new List<float> { 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<int, string>
@ -77,8 +74,25 @@ namespace TestAppForCheckComponentsWorking
{ 9, "Bonus" }
};
string[] headerRow1 = { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" };
string[] headerRow2 = { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" };
var headerTitles = new List<string[]>
{
new[] { "Идент.", "Статус", "Личные данные", "Личные данные", "Личные данные", "Дети", "Машина", "Работа", "Работа", "Премия" },
new[] { "Идент.", "Статус", "Имя", "Фамилия", "Возраст", "Дети", "Машина", "Должность", "Подразделение", "Премия" }
};
//var columnWidths = new List<float> { 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<double> { 10, 5, 30, 4, 500 }
Data = new List<double> { 10, 5, 30, 4, 2 }
},
new DiagramWordNoVisibleComponent.ChartSeries
{

View File

@ -33,10 +33,18 @@ namespace UserComponentsOption19
}
// Основной метод для создания документа с диаграммой
public void CreateDocumentWithChart(string fileName, string documentTitle, string chartTitle, LegendPosition legendPosition, List<ChartSeries> chartData)
public void CreateDocumentWithChart(
string fileName,
string documentTitle,
string chartTitle,
LegendPosition legendPosition,
List<ChartSeries> 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<double>? Data { get; set; }
// }
// // Основной метод для создания документа с диаграммой
// public void CreateDocumentWithChart(string fileName, string documentTitle, string chartTitle, LegendPosition legendPosition, List<ChartSeries> 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<ChartPart>();
// 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<ChartSeries> 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<LegendPositionValues>(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 }
// );
// }
// }
//}

View File

@ -22,14 +22,13 @@ namespace UserComponentsOption19
string filePath,
string title,
List<(int start, int end)> mergeColumns,
List<float> columnWidths,
string[] headerRow1,
string[] headerRow2,
Dictionary<int, string> columnPropertyMapping,
List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths,
List<T> 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<float> columnWidths,
string[] headerRow1,
string[] headerRow2,
Dictionary<int, string> columnPropertyMapping,
List<(float columnWidth, string headerRowCell1, string headerRowCell2, string property)> columnWidths,
List<T> 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<T>(Table table, List<T> data, Dictionary<int, string> columnPropertyMapping, List<float> columnWidths) where T : class
private void FillData<T>(Table table, List<T> 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)
{