From 038edaef76d70bde89ccf04b61853a24744f2fdb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=B2=20=D0=AD=D0=BB=D0=B0=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=D1=86=D0=B5=D0=B2?= <el.lev2003@yandex.ru> Date: Wed, 29 Jan 2025 04:40:14 +0400 Subject: [PATCH] lab2 --- Library36/Library36/CustomDataGridView.cs | 4 +- .../Library36/ExcelCustomTable.Designer.cs | 36 ++ Library36/Library36/ExcelCustomTable.cs | 54 +++ .../Library36/ExcelGistogram.Designer.cs | 36 ++ Library36/Library36/ExcelGistogram.cs | 29 ++ Library36/Library36/ExcelTable.Designer.cs | 36 ++ Library36/Library36/ExcelTable.cs | 34 ++ Library36/Library36/Helpers/ChartGenerator.cs | 448 ++++++++++++++++++ Library36/Library36/Helpers/IContext.cs | 12 + Library36/Library36/Helpers/ICreator.cs | 11 + Library36/Library36/Helpers/WorkWithExcel.cs | 406 ++++++++++++++++ Library36/Library36/Library36.csproj | 4 + Library36/Library36/Models/ChartConfig.cs | 15 + Library36/Library36/Models/DocumentConfig.cs | 8 + Library36/Library36/Models/Location.cs | 7 + Library36/Library36/Models/TableConfig.cs | 13 + .../Library36/Models/TableWithHeaderConfig.cs | 21 + Library36/Test/FormTest.Designer.cs | 407 +++++++++------- Library36/Test/FormTest.cs | 75 ++- Library36/Test/FormTest.resx | 9 + 20 files changed, 1479 insertions(+), 186 deletions(-) create mode 100644 Library36/Library36/ExcelCustomTable.Designer.cs create mode 100644 Library36/Library36/ExcelCustomTable.cs create mode 100644 Library36/Library36/ExcelGistogram.Designer.cs create mode 100644 Library36/Library36/ExcelGistogram.cs create mode 100644 Library36/Library36/ExcelTable.Designer.cs create mode 100644 Library36/Library36/ExcelTable.cs create mode 100644 Library36/Library36/Helpers/ChartGenerator.cs create mode 100644 Library36/Library36/Helpers/IContext.cs create mode 100644 Library36/Library36/Helpers/ICreator.cs create mode 100644 Library36/Library36/Helpers/WorkWithExcel.cs create mode 100644 Library36/Library36/Models/ChartConfig.cs create mode 100644 Library36/Library36/Models/DocumentConfig.cs create mode 100644 Library36/Library36/Models/Location.cs create mode 100644 Library36/Library36/Models/TableConfig.cs create mode 100644 Library36/Library36/Models/TableWithHeaderConfig.cs diff --git a/Library36/Library36/CustomDataGridView.cs b/Library36/Library36/CustomDataGridView.cs index 000be96..a785a97 100644 --- a/Library36/Library36/CustomDataGridView.cs +++ b/Library36/Library36/CustomDataGridView.cs @@ -4,7 +4,7 @@ { private DataGridView dataGridView; - public CustomDataGridView() + public CustomDataGridView() { InitializeComponent(); } @@ -39,7 +39,7 @@ dataGridViewItems.Columns[i].Name = columnsData.NameColumn[i]; dataGridViewItems.Columns[i].Width = columnsData.Width[i]; dataGridViewItems.Columns[i].Visible = columnsData.Visible[i]; - dataGridViewItems.Columns[i].DataPropertyName = columnsData.PropertiesObject[i]; + dataGridViewItems.Columns[i].DataPropertyName = columnsData.PropertiesObject[i]; } } public T GetSelectedObjectInRow<T>() where T : class, new() diff --git a/Library36/Library36/ExcelCustomTable.Designer.cs b/Library36/Library36/ExcelCustomTable.Designer.cs new file mode 100644 index 0000000..05741b0 --- /dev/null +++ b/Library36/Library36/ExcelCustomTable.Designer.cs @@ -0,0 +1,36 @@ +namespace Library36 +{ + partial class ExcelCustomTable + { + /// <summary> + /// Обязательная переменная конструктора. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Освободить все используемые ресурсы. + /// </summary> + /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// <summary> + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// </summary> + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Library36/Library36/ExcelCustomTable.cs b/Library36/Library36/ExcelCustomTable.cs new file mode 100644 index 0000000..5db1a9a --- /dev/null +++ b/Library36/Library36/ExcelCustomTable.cs @@ -0,0 +1,54 @@ +using Library36.Helpers; +using Library36.Models; +using System.ComponentModel; + +namespace Library36 +{ + public partial class ExcelCustomTable : Component + { + public ExcelCustomTable() + { + InitializeComponent(); + } + + public ExcelCustomTable(IContainer container) + { + container.Add(this); + InitializeComponent(); + } + + public void CreateDoc<T>(TableWithHeaderConfig<T> config) + { + config.CheckFields(); + config.ColumnsRowsDataCount = (config.ColumnsRowsWidth.Count, config.Data.Count + 1); + IContext creator = new WorkWithExcel(); + creator.CreateHeader(config.Header); + creator.CreateTableWithHeader(); + creator.CreateMultiHeader(config); + + var array = new string[config.Data.Count, config.Headers.Count]; + for (var j = 0; j < config.Data.Count; j++) + { + for (var i = 0; i < config.Headers.Count; i++) + { + (int, string, string) first = (0, null, null)!; + foreach (var x in config.Headers.Where(x => x.ColumnIndex == i)) + { + first = x; + break; + } + + var (_, _, name) = first; + if (name != null) + { + object? value = config.Data[j]?.GetType().GetProperty(name)!.GetValue(config.Data[j], null); + array[j, i] = value?.ToString() ?? string.Empty; + } + } + } + + creator.LoadDataToTableWithMultiHeader(array, config.ColumnsRowsWidth[1].Row); + creator.SaveDoc(config.FilePath); + } + } +} diff --git a/Library36/Library36/ExcelGistogram.Designer.cs b/Library36/Library36/ExcelGistogram.Designer.cs new file mode 100644 index 0000000..2051c83 --- /dev/null +++ b/Library36/Library36/ExcelGistogram.Designer.cs @@ -0,0 +1,36 @@ +namespace Library36 +{ + partial class ExcelGistogram + { + /// <summary> + /// Обязательная переменная конструктора. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Освободить все используемые ресурсы. + /// </summary> + /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// <summary> + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// </summary> + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Library36/Library36/ExcelGistogram.cs b/Library36/Library36/ExcelGistogram.cs new file mode 100644 index 0000000..b7e9f6c --- /dev/null +++ b/Library36/Library36/ExcelGistogram.cs @@ -0,0 +1,29 @@ +using Library36.Helpers; +using Library36.Models; +using System.ComponentModel; + +namespace Library36 +{ + public partial class ExcelGistogram : Component + { + public ExcelGistogram() + { + InitializeComponent(); + } + + public ExcelGistogram(IContainer container) + { + container.Add(this); + InitializeComponent(); + } + + public void CreateDoc(ChartConfig config) + { + config.CheckFields(); + IContext creator = new WorkWithExcel(); + creator.CreateHeader(config.Header); + creator.CreateBarChart(config); + creator.SaveDoc(config.FilePath); + } + } +} diff --git a/Library36/Library36/ExcelTable.Designer.cs b/Library36/Library36/ExcelTable.Designer.cs new file mode 100644 index 0000000..66ab08f --- /dev/null +++ b/Library36/Library36/ExcelTable.Designer.cs @@ -0,0 +1,36 @@ +namespace Library36 +{ + partial class ExcelTable + { + /// <summary> + /// Обязательная переменная конструктора. + /// </summary> + private System.ComponentModel.IContainer components = null; + + /// <summary> + /// Освободить все используемые ресурсы. + /// </summary> + /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param> + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// <summary> + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// </summary> + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Library36/Library36/ExcelTable.cs b/Library36/Library36/ExcelTable.cs new file mode 100644 index 0000000..412c337 --- /dev/null +++ b/Library36/Library36/ExcelTable.cs @@ -0,0 +1,34 @@ +using Library36.Helpers; +using Library36.Models; +using System.ComponentModel; + +namespace Library36 +{ + public partial class ExcelTable : Component + { + public ExcelTable() + { + InitializeComponent(); + } + + public ExcelTable(IContainer container) + { + container.Add(this); + InitializeComponent(); + } + + public void CreateDoc(TableConfig config) + { + config.CheckFields(); + IContext creator = new WorkWithExcel(); + creator.CreateHeader(config.Header); + if (config.Data != null) + foreach (var datum in config.Data) + { + creator.CreateTable(datum); + } + + creator.SaveDoc(config.FilePath); + } + } +} \ No newline at end of file diff --git a/Library36/Library36/Helpers/ChartGenerator.cs b/Library36/Library36/Helpers/ChartGenerator.cs new file mode 100644 index 0000000..f172943 --- /dev/null +++ b/Library36/Library36/Helpers/ChartGenerator.cs @@ -0,0 +1,448 @@ +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml; +using Library36.Models; +using System.Globalization; + +namespace Library36.Helpers +{ + public class ChartGenerator + { + private static uint _order; + + private static uint _index = 1u; + + public static DocumentFormat.OpenXml.Drawing.Charts.Chart GenerateBarChart(ChartConfig config) + { + var axisId = new AxisId + { + Val = (UInt32Value)97045504u + }; + var axisId2 = new AxisId + { + Val = (UInt32Value)97055488u + }; + var barChart = new BarChart(); + barChart.Append(new BarDirection + { + Val = (EnumValue<BarDirectionValues>)BarDirectionValues.Column + }); + barChart.Append(new BarGrouping + { + Val = (EnumValue<BarGroupingValues>)BarGroupingValues.Clustered + }); + if (config.Data != null) + barChart.Append( + GenerateBarChartSeries(config.Data.First().Key, config.Data.First().Value)); + barChart.Append(axisId); + barChart.Append(axisId2); + var outline = new Outline + { + Width = (Int32Value)25400 + }; + outline.Append(new NoFill()); + var shapeProperties = new DocumentFormat.OpenXml.Drawing.Charts.ShapeProperties(); + shapeProperties.Append(new NoFill()); + shapeProperties.Append(outline); + var plotArea = new PlotArea(); + plotArea.Append(new Layout()); + plotArea.Append(barChart); + plotArea.Append(GenerateCategoryAxis(axisId, AxisPositionValues.Bottom, axisId2)); + plotArea.Append(GenerateValueAxis(axisId2, AxisPositionValues.Left, axisId)); + plotArea.Append(shapeProperties); + return GenerateChart(config.ChartTitle, plotArea, config.LegendLocation); + } + + private static DocumentFormat.OpenXml.Drawing.Charts.Chart GenerateChart( + string titleText, + OpenXmlElement plotArea, + Location legendLocation) + { + var chart = new DocumentFormat.OpenXml.Drawing.Charts.Chart(); + if (String.IsNullOrWhiteSpace(titleText)) + { + chart.Append(GenerateTitle(titleText)); + } + else + { + chart.Append(new AutoTitleDeleted + { + Val = (BooleanValue)true + }); + } + + var position = legendLocation switch + { + Location.Top => LegendPositionValues.Top, + Location.Right => LegendPositionValues.Right, + Location.Left => LegendPositionValues.Left, + _ => LegendPositionValues.Bottom, + }; + chart.Append(plotArea); + chart.Append(GenerateLegend(position)); + chart.Append(new PlotVisibleOnly + { + Val = (BooleanValue)true + }); + return chart; + } + + private static Title GenerateTitle(string titleText) + { + var run = new Run(); + run.Append(new RunProperties + { + FontSize = (Int32Value)1100 + }); + run.Append(new Text(titleText)); + var paragraphProperties = new ParagraphProperties(); + paragraphProperties.Append(new DefaultRunProperties + { + FontSize = (Int32Value)1100 + }); + var paragraph = new Paragraph(); + paragraph.Append(paragraphProperties); + paragraph.Append(run); + var richText = new RichText(); + richText.Append(new BodyProperties()); + richText.Append(new ListStyle()); + richText.Append(paragraph); + var chartText = new ChartText(); + chartText.Append(richText); + var title = new Title(); + title.Append(chartText); + title.Append(new Layout()); + title.Append(new Overlay + { + Val = (BooleanValue)false + }); + return title; + } + + private static BarChartSeries GenerateBarChartSeries( + string seriesName, + IReadOnlyCollection<(string Name, double Value)> data) + { + var barChartSeries = new BarChartSeries(); + barChartSeries.Append(new DocumentFormat.OpenXml.Drawing.Charts.Index + { + Val = (UInt32Value)_index + }); + barChartSeries.Append(new Order + { + Val = (UInt32Value)_order + }); + barChartSeries.Append(GenerateSeriesText(seriesName)); + barChartSeries.Append(GenerateCategoryAxisData(data.Select(c => c.Name).ToArray())); + barChartSeries.Append(GenerateValues(data.Select(v => v.Value).ToArray())); + _index++; _order++; + return barChartSeries; + } + + private static SeriesText GenerateSeriesText(string seriesName) + { + var stringPoint = new StringPoint + { + Index = (UInt32Value)0u + }; + stringPoint.Append(new NumericValue + { + Text = seriesName + }); + var stringCache = new StringCache(); + stringCache.Append(new PointCount + { + Val = (UInt32Value)1u + }); + stringCache.Append(stringPoint); + var stringReference = new StringReference(); + stringReference.Append(stringCache); + var seriesText = new SeriesText(); + seriesText.Append(stringReference); + return seriesText; + } + + private static CategoryAxisData GenerateCategoryAxisData(IReadOnlyList<string> data) + { + var num = (uint)data.Count; + var stringCache = GenerateStringCache(num); + for (var num2 = 0u; num2 < num; num2++) + { + stringCache.Append(GenerateStringPoint(num2, data[(int)num2])); + } + + var stringReference = new StringReference(); + stringReference.Append(stringCache); + var categoryAxisData = new CategoryAxisData(); + categoryAxisData.Append(stringReference); + return categoryAxisData; + } + + private static Values GenerateValues(double[] data) + { + var num = (uint)data.Length; + var numberingCache = GenerateNumberingCache(num); + for (var num2 = 0u; num2 < num; num2++) + { + numberingCache.Append(GenerateNumericPoint(num2, data[num2] + .ToString(CultureInfo.CurrentCulture))); + } + + var numberReference = new NumberReference(); + numberReference.Append(numberingCache); + var values = new Values(); + values.Append(numberReference); + return values; + } + + private static NumberingCache GenerateNumberingCache(uint numPoints) + { + var numberingCache = new NumberingCache(); + numberingCache.Append(new FormatCode + { + Text = "General" + }); + numberingCache.Append(new PointCount + { + Val = (UInt32Value)numPoints + }); + return numberingCache; + } + + private static StringCache GenerateStringCache(uint numPoints) + { + var stringCache = new StringCache(); + stringCache.Append(new PointCount + { + Val = (UInt32Value)numPoints + }); + return stringCache; + } + + private static NumericPoint GenerateNumericPoint(UInt32Value idx, string text) + { + var numericPoint = new NumericPoint + { + Index = idx + }; + numericPoint.Append(new NumericValue + { + Text = text + }); + return numericPoint; + } + + private static StringPoint GenerateStringPoint(UInt32Value idx, string text) + { + var stringPoint = new StringPoint + { + Index = idx + }; + stringPoint.Append(new NumericValue + { + Text = text + }); + return stringPoint; + } + + private static CategoryAxis GenerateCategoryAxis( + UnsignedIntegerType axisId, + AxisPositionValues axisPosition, + UnsignedIntegerType crossingAxisId) + { + var scaling = new Scaling(); + scaling.Append(new DocumentFormat.OpenXml.Drawing.Charts.Orientation + { + Val = (EnumValue<OrientationValues>)OrientationValues.MinMax + }); + var solidFill = new SolidFill(); + solidFill.Append(new RgbColorModelHex + { + Val = (HexBinaryValue)"000000" + }); + var defaultRunProperties = new DefaultRunProperties + { + FontSize = (Int32Value)1000, + Bold = (BooleanValue)false, + Italic = (BooleanValue)false, + Underline = (EnumValue<TextUnderlineValues>)TextUnderlineValues.None, + Strike = (EnumValue<TextStrikeValues>)TextStrikeValues.NoStrike, + Baseline = (Int32Value)0 + }; + defaultRunProperties.Append(solidFill); + var paragraphProperties = new ParagraphProperties(); + paragraphProperties.Append(defaultRunProperties); + var paragraph = new Paragraph(); + paragraph.Append(paragraphProperties); + paragraph.Append(new EndParagraphRunProperties()); + var textProperties = new TextProperties(); + textProperties.Append(new BodyProperties + { + Rotation = (Int32Value)(-1800000), + Vertical = (EnumValue<TextVerticalValues>)TextVerticalValues.Horizontal + }); + textProperties.Append(new ListStyle()); + textProperties.Append(paragraph); + var categoryAxis = new CategoryAxis(); + categoryAxis.Append(new AxisId + { + Val = axisId.Val + }); + categoryAxis.Append(scaling); + categoryAxis.Append(new AxisPosition + { + Val = (EnumValue<AxisPositionValues>)axisPosition + }); + categoryAxis.Append(new NumberingFormat + { + FormatCode = (StringValue)"General", + SourceLinked = (BooleanValue)true + }); + categoryAxis.Append(new TickLabelPosition + { + Val = (EnumValue<TickLabelPositionValues>)TickLabelPositionValues.Low + }); + categoryAxis.Append(GenerateChartShapeProperties(3175)); + categoryAxis.Append(textProperties); + categoryAxis.Append(new CrossingAxis + { + Val = crossingAxisId.Val + }); + categoryAxis.Append(new Crosses + { + Val = (EnumValue<CrossesValues>)CrossesValues.AutoZero + }); + categoryAxis.Append(new AutoLabeled + { + Val = (BooleanValue)true + }); + categoryAxis.Append(new LabelAlignment + { + Val = (EnumValue<LabelAlignmentValues>)LabelAlignmentValues.Center + }); + categoryAxis.Append(new LabelOffset + { + Val = (UInt16Value)(ushort)100 + }); + categoryAxis.Append(new TickLabelSkip + { + Val = (Int32Value)1 + }); + categoryAxis.Append(new TickMarkSkip + { + Val = (Int32Value)1 + }); + return categoryAxis; + } + + private static ValueAxis GenerateValueAxis( + UnsignedIntegerType axisId, + AxisPositionValues position, + UnsignedIntegerType crossingAxisId) + { + var scaling = new Scaling(); + scaling.Append(new DocumentFormat.OpenXml.Drawing.Charts.Orientation + { + Val = (EnumValue<OrientationValues>)OrientationValues.MinMax + }); + var paragraphProperties = new ParagraphProperties(); + paragraphProperties.Append(new DefaultRunProperties()); + var paragraph = new Paragraph(); + paragraph.Append(paragraphProperties); + paragraph.Append(new EndParagraphRunProperties()); + var textProperties = new TextProperties(); + textProperties.Append(new BodyProperties()); + textProperties.Append(new ListStyle()); + textProperties.Append(paragraph); + var valueAxis = new ValueAxis(); + valueAxis.Append(new AxisId + { + Val = axisId.Val + }); + valueAxis.Append(scaling); + valueAxis.Append(new Delete + { + Val = (BooleanValue)false + }); + valueAxis.Append(new AxisPosition + { + Val = (EnumValue<AxisPositionValues>)position + }); + valueAxis.Append(new MajorGridlines()); + valueAxis.Append(new NumberingFormat + { + FormatCode = (StringValue)"General", + SourceLinked = (BooleanValue)false + }); + valueAxis.Append(new MajorTickMark + { + Val = (EnumValue<TickMarkValues>)TickMarkValues.None + }); + valueAxis.Append(new TickLabelPosition + { + Val = (EnumValue<TickLabelPositionValues>)TickLabelPositionValues.NextTo + }); + valueAxis.Append(GenerateChartShapeProperties(9525)); + valueAxis.Append(textProperties); + valueAxis.Append(new CrossingAxis + { + Val = crossingAxisId.Val + }); + valueAxis.Append(new Crosses + { + Val = (EnumValue<CrossesValues>)CrossesValues.AutoZero + }); + valueAxis.Append(new CrossBetween + { + Val = (EnumValue<CrossBetweenValues>)CrossBetweenValues.Between + }); + return valueAxis; + } + + private static ChartShapeProperties GenerateChartShapeProperties(int width) + { + var solidFill = new SolidFill(); + solidFill.Append(new RgbColorModelHex + { + Val = (HexBinaryValue)"000000" + }); + var outline = new Outline + { + Width = (Int32Value)width + }; + outline.Append(solidFill); + outline.Append(new PresetDash + { + Val = (EnumValue<PresetLineDashValues>)PresetLineDashValues.Solid + }); + var chartShapeProperties = new ChartShapeProperties(); + chartShapeProperties.Append(outline); + return chartShapeProperties; + } + + private static Legend GenerateLegend(LegendPositionValues position) + { + var paragraphProperties = new ParagraphProperties(); + paragraphProperties.Append(new DefaultRunProperties()); + var paragraph = new Paragraph(); + paragraph.Append(paragraphProperties); + paragraph.Append(new EndParagraphRunProperties()); + var textProperties = new TextProperties(); + textProperties.Append(new BodyProperties()); + textProperties.Append(new ListStyle()); + textProperties.Append(paragraph); + var legend = new Legend(); + legend.Append(new LegendPosition + { + Val = (EnumValue<LegendPositionValues>)position + }); + legend.Append(new Layout()); + legend.Append(new Overlay + { + Val = (BooleanValue)false + }); + legend.Append(textProperties); + return legend; + } + } +} diff --git a/Library36/Library36/Helpers/IContext.cs b/Library36/Library36/Helpers/IContext.cs new file mode 100644 index 0000000..cf0bb5f --- /dev/null +++ b/Library36/Library36/Helpers/IContext.cs @@ -0,0 +1,12 @@ +using Library36.Models; + +namespace Library36.Helpers +{ + public interface IContext : ICreator + { + void CreateTable(string[,] data); + void CreateTableWithHeader(); + void CreateMultiHeader<T>(TableWithHeaderConfig<T> config); + void LoadDataToTableWithMultiHeader(string[,] data, int rowHeigth); + } +} diff --git a/Library36/Library36/Helpers/ICreator.cs b/Library36/Library36/Helpers/ICreator.cs new file mode 100644 index 0000000..8e2dd5c --- /dev/null +++ b/Library36/Library36/Helpers/ICreator.cs @@ -0,0 +1,11 @@ +using Library36.Models; + +namespace Library36.Helpers +{ + public interface ICreator + { + void CreateHeader(string header); + void SaveDoc(string filepath); + void CreateBarChart(ChartConfig config); + } +} diff --git a/Library36/Library36/Helpers/WorkWithExcel.cs b/Library36/Library36/Helpers/WorkWithExcel.cs new file mode 100644 index 0000000..1ad8cfb --- /dev/null +++ b/Library36/Library36/Helpers/WorkWithExcel.cs @@ -0,0 +1,406 @@ +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml.Drawing.Spreadsheet; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using Library36.Models; + +namespace Library36.Helpers +{ + public class WorkWithExcel : IContext + { + + private uint _index; + private SheetData? _sheetData; + private uint _startRowIndex; + private Columns? _columns; + private DocumentFormat.OpenXml.Drawing.Charts.Chart? _chart; + + private SheetData SheetData => _sheetData ??= new SheetData(); + private Columns Columns => _columns ??= new Columns(); + + public void CreateBarChart(ChartConfig config) + { + _chart = ChartGenerator.GenerateBarChart(config); + } + public void CreateMultiHeader<T>(TableWithHeaderConfig<T> config) + { + var counter = 1u; + var num = 2; + if (config.ColumnsRowsWidth != null) + { + foreach (var item in config.ColumnsRowsWidth.Where(x => x.Column > 0)) + { + Columns.Append(new Column + { + Min = (UInt32Value)counter, + Max = (UInt32Value)counter, + Width = (DoubleValue)(item.Column * num), + CustomWidth = (BooleanValue)true + }); + counter++; + } + + counter = _startRowIndex; + num = 5; + if ((from r in SheetData.Elements<Row>() + where (uint)r.RowIndex == counter + select r).Any()) + { + var row = (from r in SheetData.Elements<Row>() + where (uint)r.RowIndex == counter + select r).First(); + row.Height = (DoubleValue)(config.ColumnsRowsWidth[0].Row * num); + row.CustomHeight = (BooleanValue)true; + } + else + { + SheetData.Append(new Row + { + RowIndex = (UInt32Value)counter, + Height = (DoubleValue)(config.ColumnsRowsWidth[0].Row * num), + CustomHeight = (BooleanValue)true + }); + } + } + + const uint styleIndex = 2u; + if (config.Headers == null) return; + { + var num3 = config.Headers.Count(x => x.ColumnIndex > 0); + CreateCell(0, _startRowIndex, config.Headers.FirstOrDefault<(int, string, string)>(((int ColumnIndex, string Header, string PropertyName) x) => x is { ColumnIndex: 0, }).Item3, styleIndex); + for (var i = 0; i < num3; i++) + { + CreateCell(i + 1, _startRowIndex, config.Headers.FirstOrDefault<(int, string, string)>(((int ColumnIndex, string Header, string PropertyName) x) => x.ColumnIndex == i + 1 ).Item3, styleIndex); + } + } + } + private static void GenerateStyle(OpenXmlPartContainer workbookPart) + { + var workbookStylesPart = workbookPart.AddNewPart<WorkbookStylesPart>(); + workbookStylesPart.Stylesheet = new Stylesheet(); + var fonts = new DocumentFormat.OpenXml.Spreadsheet.Fonts + { + Count = (UInt32Value)2u, + KnownFonts = BooleanValue.FromBoolean(value: true) + }; + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize + { + Val = (DoubleValue)11.0 + }, + FontName = new FontName + { + Val = (StringValue)"Calibri" + }, + FontFamilyNumbering = new FontFamilyNumbering + { + Val = (Int32Value)2 + }, + FontScheme = new DocumentFormat.OpenXml.Spreadsheet.FontScheme + { + Val = new EnumValue<FontSchemeValues>(FontSchemeValues.Minor) + } + }); + fonts.Append(new DocumentFormat.OpenXml.Spreadsheet.Font + { + FontSize = new FontSize + { + Val = (DoubleValue)11.0 + }, + FontName = new FontName + { + Val = (StringValue)"Calibri" + }, + FontFamilyNumbering = new FontFamilyNumbering + { + Val = (Int32Value)2 + }, + FontScheme = new DocumentFormat.OpenXml.Spreadsheet.FontScheme + { + Val = new EnumValue<FontSchemeValues>(FontSchemeValues.Minor) + }, + Bold = new Bold() + }); + workbookStylesPart.Stylesheet.Append(fonts); + var fills = new Fills + { + Count = (UInt32Value)1u + }; + fills.Append(new DocumentFormat.OpenXml.Spreadsheet.Fill + { + PatternFill = new DocumentFormat.OpenXml.Spreadsheet.PatternFill + { + PatternType = new EnumValue<PatternValues>(PatternValues.None) + } + }); + workbookStylesPart.Stylesheet.Append(fills); + var borders = new Borders + { + Count = (UInt32Value)2u + }; + borders.Append(new Border + { + LeftBorder = new DocumentFormat.OpenXml.Spreadsheet.LeftBorder(), + RightBorder = new DocumentFormat.OpenXml.Spreadsheet.RightBorder(), + TopBorder = new DocumentFormat.OpenXml.Spreadsheet.TopBorder(), + BottomBorder = new DocumentFormat.OpenXml.Spreadsheet.BottomBorder(), + DiagonalBorder = new DiagonalBorder() + }); + borders.Append(new Border + { + LeftBorder = new DocumentFormat.OpenXml.Spreadsheet.LeftBorder + { + Style = (EnumValue<BorderStyleValues>)BorderStyleValues.Thin + }, + RightBorder = new DocumentFormat.OpenXml.Spreadsheet.RightBorder + { + Style = (EnumValue<BorderStyleValues>)BorderStyleValues.Thin + }, + TopBorder = new DocumentFormat.OpenXml.Spreadsheet.TopBorder + { + Style = (EnumValue<BorderStyleValues>)BorderStyleValues.Thin + }, + BottomBorder = new DocumentFormat.OpenXml.Spreadsheet.BottomBorder + { + Style = (EnumValue<BorderStyleValues>)BorderStyleValues.Thin + } + }); + workbookStylesPart.Stylesheet.Append(borders); + var cellFormats = new CellFormats + { + Count = (UInt32Value)3u + }; + cellFormats.Append(new CellFormat + { + NumberFormatId = (UInt32Value)0u, + FormatId = (UInt32Value)0u, + FontId = (UInt32Value)0u, + BorderId = (UInt32Value)0u, + FillId = (UInt32Value)0u + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = (UInt32Value)0u, + FormatId = (UInt32Value)0u, + FontId = (UInt32Value)0u, + BorderId = (UInt32Value)1u, + FillId = (UInt32Value)0u + }); + cellFormats.Append(new CellFormat + { + NumberFormatId = (UInt32Value)0u, + FormatId = (UInt32Value)0u, + FontId = (UInt32Value)1u, + BorderId = (UInt32Value)1u, + FillId = (UInt32Value)0u, + Alignment = new Alignment + { + Horizontal = (EnumValue<HorizontalAlignmentValues>)HorizontalAlignmentValues.Center, + Vertical = (EnumValue<VerticalAlignmentValues>)VerticalAlignmentValues.Center, + WrapText = (BooleanValue)true + } + }); + workbookStylesPart.Stylesheet.Append(cellFormats); + } + public void CreateHeader(string header) + { + _index = 1u; + var cell = CreateCell("A", _index); + var run = new DocumentFormat.OpenXml.Spreadsheet.Run(); + run.Append(new DocumentFormat.OpenXml.Spreadsheet.Text(header)); + run.RunProperties = new DocumentFormat.OpenXml.Spreadsheet.RunProperties(new Bold()); + var inlineString = new InlineString(); + inlineString.Append(run); + cell.Append(inlineString); + cell.DataType = (EnumValue<CellValues>)CellValues.InlineString; + _index++; + } + public void CreateTable(string[,] data) + { + for (var i = 0; i < data.GetLength(0); i++) + for (var j = 0; j < data.GetLength(1); j++) + CreateCell(j, (uint)(i + _index), data[i, j], 2u); + + _index += (uint)data.GetLength(0); + } + private Cell CreateCell(string columnName, uint rowIndex) + { + var columnName2 = columnName; + var text = columnName2 + rowIndex; + Row row; + if ((from r in SheetData.Elements<Row>() + where (uint)r.RowIndex == rowIndex + select r).Any()) + { + row = (from r in SheetData.Elements<Row>() + where (uint)r.RowIndex == rowIndex + select r).First(); + } + else + { + row = new Row + { + RowIndex = (UInt32Value)rowIndex + }; + SheetData.Append(row); + } + + var cell = row.Elements<Cell>().FirstOrDefault(c => c.CellReference!.Value == columnName2 + rowIndex); + if (cell != null) return cell; + var referenceChild = row.Elements<Cell>() + .FirstOrDefault( + item => item.CellReference!.Value!.Length == text.Length && + string.Compare(item.CellReference!.Value, text, StringComparison.OrdinalIgnoreCase) > 0); + + cell = new Cell + { + CellReference = (StringValue)text + }; + row.InsertBefore(cell, referenceChild); + + return cell; + } + private static string GetExcelColumnName(int columnNumber) + { + columnNumber++; + var num = columnNumber; + var text = string.Empty; + while (num > 0) + { + var num2 = (num - 1) % 26; + text = Convert.ToChar(65 + num2) + text; + num = (num - num2) / 26; + } + + return text; + } + private void CreateCell(int columnIndex, uint rowIndex, string text, uint styleIndex) + { + var cell = CreateCell(GetExcelColumnName(columnIndex), rowIndex); + cell.CellValue = new CellValue(text); + cell.DataType = (EnumValue<CellValues>)CellValues.String; + cell.StyleIndex = (UInt32Value)styleIndex; + } + public void SaveDoc(string filepath) + { + if (string.IsNullOrEmpty(filepath)) + { + throw new ArgumentNullException("File name is empty"); + } + + if (SheetData == null) + { + throw new ArgumentNullException("Dock body is empty! Nothing to save!"); + } + + using var spreadsheetDocument = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook); + var workbookPart = spreadsheetDocument.AddWorkbookPart(); + GenerateStyle(workbookPart); + workbookPart.Workbook = new Workbook(); + var worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); + worksheetPart.Worksheet = new Worksheet(); + if (_columns != null) + { + worksheetPart.Worksheet.Append(_columns); + } + + worksheetPart.Worksheet.Append(SheetData); + var sheets = spreadsheetDocument.WorkbookPart!.Workbook.AppendChild(new Sheets()); + var sheet = new Sheet + { + Id = (StringValue)spreadsheetDocument.WorkbookPart!.GetIdOfPart(worksheetPart), + SheetId = (UInt32Value)1u, + Name = (StringValue)"List 1" + }; + sheets.Append(sheet); + if (_chart == null) return; + var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>(); + worksheetPart.Worksheet.Append(new Drawing + { + Id = (StringValue)worksheetPart.GetIdOfPart(drawingsPart) + }); + worksheetPart.Worksheet.Save(); + var chartPart = drawingsPart.AddNewPart<ChartPart>(); + chartPart.ChartSpace = new ChartSpace(); + chartPart.ChartSpace.Append(new EditingLanguage + { + Val = new StringValue("en-US") + }); + chartPart.ChartSpace.Append(_chart); + chartPart.ChartSpace.Save(); + drawingsPart.WorksheetDrawing = new WorksheetDrawing(); + var twoCellAnchor = drawingsPart.WorksheetDrawing.AppendChild(new TwoCellAnchor()); + twoCellAnchor.Append(new DocumentFormat.OpenXml.Drawing.Spreadsheet.FromMarker(new ColumnId("2"), new ColumnOffset("581025"), new RowId("2"), new RowOffset("114300"))); + twoCellAnchor.Append(new DocumentFormat.OpenXml.Drawing.Spreadsheet.ToMarker(new ColumnId("17"), new ColumnOffset("276225"), new RowId("32"), new RowOffset("0"))); + var graphicFrame = twoCellAnchor.AppendChild(new DocumentFormat.OpenXml.Drawing.Spreadsheet.GraphicFrame()); + graphicFrame.Macro = (StringValue)""; + graphicFrame.Append(new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualGraphicFrameProperties(new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualDrawingProperties + { + Id = new UInt32Value(2u), + Name = (StringValue)"Chart 1" + }, new DocumentFormat.OpenXml.Drawing.Spreadsheet.NonVisualGraphicFrameDrawingProperties())); + graphicFrame.Append(new Transform(new Offset + { + X = (Int64Value)0L, + Y = (Int64Value)0L + }, new Extents + { + Cx = (Int64Value)0L, + Cy = (Int64Value)0L + })); + graphicFrame.Append(new Graphic(new GraphicData(new ChartReference + { + Id = (StringValue)drawingsPart.GetIdOfPart(chartPart) + }) + { + Uri = (StringValue)"http://schemas.openxmlformats.org/drawingml/2006/chart" + })); + twoCellAnchor.Append(new ClientData()); + drawingsPart.WorksheetDrawing.Save(); + } + public void CreateTableWithHeader() + { + _startRowIndex = _index; + } + public void LoadDataToTableWithMultiHeader(string[,] data, int rowHeight) + { + const int num = 5; + for (var i = 0u; i < data.GetLength(0); i++) + { + if ((from r in SheetData.Elements<Row>() + where (uint)r.RowIndex == i + 1 + select r).Any()) + { + var row = (from r in SheetData.Elements<Row>() + where (uint)r.RowIndex == i + 1 + select r).First(); + row.Height = (DoubleValue)(rowHeight * num); + row.CustomHeight = (BooleanValue)true; + } + else + { + SheetData.Append(new Row + { + RowIndex = (UInt32Value)(i + 1), + Height = (DoubleValue)(rowHeight * num), + CustomHeight = (BooleanValue)true + }); + } + } + + _startRowIndex++; + for (var j = 0; j < data.GetLength(0); j++) + { + for (var k = 0; k < data.GetLength(1); k++) + { + CreateCell(k, _startRowIndex, data[j, k], k == 0 ? 2u : 1u); + } + + _startRowIndex++; + } + } + } +} diff --git a/Library36/Library36/Library36.csproj b/Library36/Library36/Library36.csproj index 060aa1c..c63bde5 100644 --- a/Library36/Library36/Library36.csproj +++ b/Library36/Library36/Library36.csproj @@ -7,4 +7,8 @@ <ImplicitUsings>enable</ImplicitUsings> </PropertyGroup> + <ItemGroup> + <PackageReference Include="DocumentFormat.OpenXml" Version="3.2.0" /> + </ItemGroup> + </Project> diff --git a/Library36/Library36/Models/ChartConfig.cs b/Library36/Library36/Models/ChartConfig.cs new file mode 100644 index 0000000..e5b8e13 --- /dev/null +++ b/Library36/Library36/Models/ChartConfig.cs @@ -0,0 +1,15 @@ +namespace Library36.Models +{ + public class ChartConfig : DocumentConfig + { + public string ChartTitle { get; init; } = string.Empty; + public Location LegendLocation { get; init; } + public Dictionary<string, List<(string Name, double Value)>>? Data { get; init; } + + public void CheckFields() + { + if (Data == null || Data.Count == 0) + throw new ArgumentNullException("Data count is null"); + } + } +} diff --git a/Library36/Library36/Models/DocumentConfig.cs b/Library36/Library36/Models/DocumentConfig.cs new file mode 100644 index 0000000..8de6e0c --- /dev/null +++ b/Library36/Library36/Models/DocumentConfig.cs @@ -0,0 +1,8 @@ +namespace Library36.Models +{ + public class DocumentConfig + { + public string FilePath { get; init; } = string.Empty; + public string Header { get; init; } = string.Empty; + } +} diff --git a/Library36/Library36/Models/Location.cs b/Library36/Library36/Models/Location.cs new file mode 100644 index 0000000..2454182 --- /dev/null +++ b/Library36/Library36/Models/Location.cs @@ -0,0 +1,7 @@ +namespace Library36.Models +{ + public enum Location + { + Left, Right, Top, Bottom + } +} diff --git a/Library36/Library36/Models/TableConfig.cs b/Library36/Library36/Models/TableConfig.cs new file mode 100644 index 0000000..c5ba297 --- /dev/null +++ b/Library36/Library36/Models/TableConfig.cs @@ -0,0 +1,13 @@ +namespace Library36.Models +{ + public class TableConfig : DocumentConfig + { + public List<string[,]>? Data { get; init; } + + public void CheckFields() + { + if (Data == null || Data.Count == 0 || Data.All(x => x.Length == 0)) + throw new ArgumentNullException("Data is null"); + } + } +} diff --git a/Library36/Library36/Models/TableWithHeaderConfig.cs b/Library36/Library36/Models/TableWithHeaderConfig.cs new file mode 100644 index 0000000..f41ffb6 --- /dev/null +++ b/Library36/Library36/Models/TableWithHeaderConfig.cs @@ -0,0 +1,21 @@ +namespace Library36.Models +{ + public class TableWithHeaderConfig<T> : DocumentConfig + { + + public (int Columns, int Rows) ColumnsRowsDataCount { get; set; } + public List<(int Column, int Row)>? ColumnsRowsWidth { get; init; } + public List<(int ColumnIndex, string Header, string PropertyName)>? Headers { get; init; } + public List<T>? Data { get; init; } + + public void CheckFields() + { + if (Data == null || Data.Count == 0) + throw new ArgumentNullException("No data"); + if (ColumnsRowsWidth is null || ColumnsRowsWidth.Count == 0) + throw new ArgumentNullException("Rows width invalid"); + if (Headers is null || Headers.Count == 0) + throw new ArgumentNullException("Header data invalid"); + } + } +} diff --git a/Library36/Test/FormTest.Designer.cs b/Library36/Test/FormTest.Designer.cs index a6803d7..15f52db 100644 --- a/Library36/Test/FormTest.Designer.cs +++ b/Library36/Test/FormTest.Designer.cs @@ -25,187 +25,230 @@ namespace Test base.Dispose(disposing); } - #region Windows Form Designer generated code + #region Windows Form Designer generated code - /// <summary> - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// </summary> - private void InitializeComponent() - { - customDataGridView1 = new CustomDataGridView(); - customListBox1 = new CustomListBox(); - dateBoxWithNull1 = new DateBoxWithNull(); - buttonClear = new Button(); - buttonLoad = new Button(); - buttonClearTable = new Button(); - buttonTableAdd = new Button(); - buttonGetValue = new Button(); - buttonGetValueCheckBox = new Button(); - buttonSetValueCheckBox = new Button(); - buttonGetList = new Button(); - buttonAddOneRow = new Button(); - textBoxDate = new TextBox(); - SuspendLayout(); - // - // customDataGridView1 - // - customDataGridView1.Location = new Point(329, 16); - customDataGridView1.Margin = new Padding(4, 5, 4, 5); - customDataGridView1.Name = "customDataGridView1"; - customDataGridView1.Size = new Size(419, 289); - customDataGridView1.TabIndex = 0; - // - // customListBox1 - // - customListBox1.Location = new Point(15, 16); - customListBox1.Margin = new Padding(4, 5, 4, 5); - customListBox1.Name = "customListBox1"; - customListBox1.SelectedValue = ""; - customListBox1.Size = new Size(306, 232); - customListBox1.TabIndex = 1; - customListBox1.ValueChanged += CustomListBox1_ValueChanged; - // - // dateBoxWithNull1 - // - dateBoxWithNull1.Location = new Point(15, 314); - dateBoxWithNull1.Margin = new Padding(5); - dateBoxWithNull1.Name = "dateBoxWithNull1"; - dateBoxWithNull1.Size = new Size(306, 42); - dateBoxWithNull1.TabIndex = 2; - // - // buttonClear - // - buttonClear.Location = new Point(203, 257); - buttonClear.Margin = new Padding(4); - buttonClear.Name = "buttonClear"; - buttonClear.Size = new Size(118, 36); - buttonClear.TabIndex = 3; - buttonClear.Text = "Clear List"; - buttonClear.UseVisualStyleBackColor = true; - buttonClear.Click += buttonClear_Click; - // - // buttonLoad - // - buttonLoad.Location = new Point(15, 258); - buttonLoad.Margin = new Padding(4); - buttonLoad.Name = "buttonLoad"; - buttonLoad.Size = new Size(100, 36); - buttonLoad.TabIndex = 4; - buttonLoad.Text = "Load List"; - buttonLoad.UseVisualStyleBackColor = true; - buttonLoad.Click += buttonLoad_Click; - // - // buttonClearTable - // - buttonClearTable.Location = new Point(329, 314); - buttonClearTable.Margin = new Padding(4); - buttonClearTable.Name = "buttonClearTable"; - buttonClearTable.Size = new Size(103, 36); - buttonClearTable.TabIndex = 5; - buttonClearTable.Text = "Table clear"; - buttonClearTable.UseVisualStyleBackColor = true; - buttonClearTable.Click += buttonClearTable_Click; - // - // buttonTableAdd - // - buttonTableAdd.Location = new Point(440, 314); - buttonTableAdd.Margin = new Padding(4); - buttonTableAdd.Name = "buttonTableAdd"; - buttonTableAdd.Size = new Size(105, 36); - buttonTableAdd.TabIndex = 6; - buttonTableAdd.Text = "Add Table"; - buttonTableAdd.UseVisualStyleBackColor = true; - buttonTableAdd.Click += buttonTableAdd_Click; - // - // buttonGetValue - // - buttonGetValue.Location = new Point(553, 315); - buttonGetValue.Margin = new Padding(4); - buttonGetValue.Name = "buttonGetValue"; - buttonGetValue.Size = new Size(94, 36); - buttonGetValue.TabIndex = 7; - buttonGetValue.Text = "Get Value"; - buttonGetValue.UseVisualStyleBackColor = true; - buttonGetValue.Click += buttonGetValue_Click; - // - // buttonGetValueCheckBox - // - buttonGetValueCheckBox.Location = new Point(12, 358); - buttonGetValueCheckBox.Margin = new Padding(4); - buttonGetValueCheckBox.Name = "buttonGetValueCheckBox"; - buttonGetValueCheckBox.Size = new Size(103, 31); - buttonGetValueCheckBox.TabIndex = 8; - buttonGetValueCheckBox.Text = "Get value"; - buttonGetValueCheckBox.UseVisualStyleBackColor = true; - buttonGetValueCheckBox.Click += buttonGetValueCheckBox_Click; - // - // buttonSetValueCheckBox - // - buttonSetValueCheckBox.Location = new Point(271, 358); - buttonSetValueCheckBox.Margin = new Padding(4); - buttonSetValueCheckBox.Name = "buttonSetValueCheckBox"; - buttonSetValueCheckBox.Size = new Size(50, 31); - buttonSetValueCheckBox.TabIndex = 9; - buttonSetValueCheckBox.Text = "Set"; - buttonSetValueCheckBox.UseVisualStyleBackColor = true; - buttonSetValueCheckBox.Click += buttonSetDate_Click; - // - // buttonGetList - // - buttonGetList.Location = new Point(122, 257); - buttonGetList.Name = "buttonGetList"; - buttonGetList.Size = new Size(74, 36); - buttonGetList.TabIndex = 11; - buttonGetList.Text = "Get"; - buttonGetList.UseVisualStyleBackColor = true; - buttonGetList.Click += buttonGetList_Click; - // - // buttonAddOneRow - // - buttonAddOneRow.Location = new Point(654, 316); - buttonAddOneRow.Name = "buttonAddOneRow"; - buttonAddOneRow.Size = new Size(94, 34); - buttonAddOneRow.TabIndex = 12; - buttonAddOneRow.Text = "Add Row"; - buttonAddOneRow.UseVisualStyleBackColor = true; - buttonAddOneRow.Click += buttonAddOneRow_Click; - // - // textBoxDate - // - textBoxDate.Location = new Point(122, 358); - textBoxDate.Name = "textBoxDate"; - textBoxDate.Size = new Size(142, 31); - textBoxDate.TabIndex = 13; - // - // FormTest - // - AutoScaleDimensions = new SizeF(10F, 25F); - AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(763, 398); - Controls.Add(textBoxDate); - Controls.Add(buttonAddOneRow); - Controls.Add(buttonGetList); - Controls.Add(buttonSetValueCheckBox); - Controls.Add(buttonGetValueCheckBox); - Controls.Add(buttonGetValue); - Controls.Add(buttonTableAdd); - Controls.Add(buttonClearTable); - Controls.Add(buttonLoad); - Controls.Add(buttonClear); - Controls.Add(dateBoxWithNull1); - Controls.Add(customListBox1); - Controls.Add(customDataGridView1); - Margin = new Padding(4); - Name = "FormTest"; - Text = "FormTest"; - ResumeLayout(false); - PerformLayout(); - } + /// <summary> + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// </summary> + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + customDataGridView1 = new CustomDataGridView(); + customListBox1 = new CustomListBox(); + dateBoxWithNull1 = new DateBoxWithNull(); + buttonClear = new Button(); + buttonLoad = new Button(); + buttonClearTable = new Button(); + buttonTableAdd = new Button(); + buttonGetValue = new Button(); + buttonGetValueCheckBox = new Button(); + buttonSetValueCheckBox = new Button(); + buttonGetList = new Button(); + buttonAddOneRow = new Button(); + textBoxDate = new TextBox(); + buttonExcelTable = new Button(); + buttonExcelCustomTable = new Button(); + buttonExcelGistogram = new Button(); + excelCustomTable1 = new ExcelCustomTable(components); + excelGistogram1 = new ExcelGistogram(components); + excelTable1 = new ExcelTable(components); + SuspendLayout(); + // + // customDataGridView1 + // + customDataGridView1.Location = new Point(329, 16); + customDataGridView1.Margin = new Padding(4, 5, 4, 5); + customDataGridView1.Name = "customDataGridView1"; + customDataGridView1.Size = new Size(419, 289); + customDataGridView1.TabIndex = 0; + // + // customListBox1 + // + customListBox1.Location = new Point(15, 16); + customListBox1.Margin = new Padding(4, 5, 4, 5); + customListBox1.Name = "customListBox1"; + customListBox1.SelectedValue = ""; + customListBox1.Size = new Size(306, 232); + customListBox1.TabIndex = 1; + customListBox1.ValueChanged += CustomListBox1_ValueChanged; + // + // dateBoxWithNull1 + // + dateBoxWithNull1.Location = new Point(15, 314); + dateBoxWithNull1.Margin = new Padding(5); + dateBoxWithNull1.Name = "dateBoxWithNull1"; + dateBoxWithNull1.Size = new Size(306, 42); + dateBoxWithNull1.TabIndex = 2; + // + // buttonClear + // + buttonClear.Location = new Point(203, 257); + buttonClear.Margin = new Padding(4); + buttonClear.Name = "buttonClear"; + buttonClear.Size = new Size(118, 36); + buttonClear.TabIndex = 3; + buttonClear.Text = "Clear List"; + buttonClear.UseVisualStyleBackColor = true; + buttonClear.Click += buttonClear_Click; + // + // buttonLoad + // + buttonLoad.Location = new Point(15, 258); + buttonLoad.Margin = new Padding(4); + buttonLoad.Name = "buttonLoad"; + buttonLoad.Size = new Size(100, 36); + buttonLoad.TabIndex = 4; + buttonLoad.Text = "Load List"; + buttonLoad.UseVisualStyleBackColor = true; + buttonLoad.Click += buttonLoad_Click; + // + // buttonClearTable + // + buttonClearTable.Location = new Point(329, 314); + buttonClearTable.Margin = new Padding(4); + buttonClearTable.Name = "buttonClearTable"; + buttonClearTable.Size = new Size(103, 36); + buttonClearTable.TabIndex = 5; + buttonClearTable.Text = "Table clear"; + buttonClearTable.UseVisualStyleBackColor = true; + buttonClearTable.Click += buttonClearTable_Click; + // + // buttonTableAdd + // + buttonTableAdd.Location = new Point(440, 314); + buttonTableAdd.Margin = new Padding(4); + buttonTableAdd.Name = "buttonTableAdd"; + buttonTableAdd.Size = new Size(105, 36); + buttonTableAdd.TabIndex = 6; + buttonTableAdd.Text = "Add Table"; + buttonTableAdd.UseVisualStyleBackColor = true; + buttonTableAdd.Click += buttonTableAdd_Click; + // + // buttonGetValue + // + buttonGetValue.Location = new Point(553, 315); + buttonGetValue.Margin = new Padding(4); + buttonGetValue.Name = "buttonGetValue"; + buttonGetValue.Size = new Size(94, 36); + buttonGetValue.TabIndex = 7; + buttonGetValue.Text = "Get Value"; + buttonGetValue.UseVisualStyleBackColor = true; + buttonGetValue.Click += buttonGetValue_Click; + // + // buttonGetValueCheckBox + // + buttonGetValueCheckBox.Location = new Point(12, 358); + buttonGetValueCheckBox.Margin = new Padding(4); + buttonGetValueCheckBox.Name = "buttonGetValueCheckBox"; + buttonGetValueCheckBox.Size = new Size(103, 31); + buttonGetValueCheckBox.TabIndex = 8; + buttonGetValueCheckBox.Text = "Get value"; + buttonGetValueCheckBox.UseVisualStyleBackColor = true; + buttonGetValueCheckBox.Click += buttonGetValueCheckBox_Click; + // + // buttonSetValueCheckBox + // + buttonSetValueCheckBox.Location = new Point(271, 358); + buttonSetValueCheckBox.Margin = new Padding(4); + buttonSetValueCheckBox.Name = "buttonSetValueCheckBox"; + buttonSetValueCheckBox.Size = new Size(50, 31); + buttonSetValueCheckBox.TabIndex = 9; + buttonSetValueCheckBox.Text = "Set"; + buttonSetValueCheckBox.UseVisualStyleBackColor = true; + buttonSetValueCheckBox.Click += buttonSetDate_Click; + // + // buttonGetList + // + buttonGetList.Location = new Point(122, 257); + buttonGetList.Name = "buttonGetList"; + buttonGetList.Size = new Size(74, 36); + buttonGetList.TabIndex = 11; + buttonGetList.Text = "Get"; + buttonGetList.UseVisualStyleBackColor = true; + buttonGetList.Click += buttonGetList_Click; + // + // buttonAddOneRow + // + buttonAddOneRow.Location = new Point(654, 316); + buttonAddOneRow.Name = "buttonAddOneRow"; + buttonAddOneRow.Size = new Size(94, 34); + buttonAddOneRow.TabIndex = 12; + buttonAddOneRow.Text = "Add Row"; + buttonAddOneRow.UseVisualStyleBackColor = true; + buttonAddOneRow.Click += buttonAddOneRow_Click; + // + // textBoxDate + // + textBoxDate.Location = new Point(122, 358); + textBoxDate.Name = "textBoxDate"; + textBoxDate.Size = new Size(142, 31); + textBoxDate.TabIndex = 13; + // + // buttonExcelTable + // + buttonExcelTable.Location = new Point(440, 358); + buttonExcelTable.Margin = new Padding(3, 4, 3, 4); + buttonExcelTable.Name = "buttonExcelTable"; + buttonExcelTable.Size = new Size(105, 31); + buttonExcelTable.TabIndex = 12; + buttonExcelTable.Text = "Table"; + buttonExcelTable.UseVisualStyleBackColor = true; + buttonExcelTable.Click += ButtonExcelTable_Click; + // + // buttonExcelCustomTable + // + buttonExcelCustomTable.Location = new Point(553, 358); + buttonExcelCustomTable.Margin = new Padding(3, 4, 3, 4); + buttonExcelCustomTable.Name = "buttonExcelCustomTable"; + buttonExcelCustomTable.Size = new Size(94, 31); + buttonExcelCustomTable.TabIndex = 13; + buttonExcelCustomTable.Text = "Custom "; + buttonExcelCustomTable.UseVisualStyleBackColor = true; + buttonExcelCustomTable.Click += ButtonExcelCustomTable_Click; + // + // buttonExcelGistogram + // + buttonExcelGistogram.Location = new Point(654, 358); + buttonExcelGistogram.Margin = new Padding(3, 4, 3, 4); + buttonExcelGistogram.Name = "buttonExcelGistogram"; + buttonExcelGistogram.Size = new Size(94, 31); + buttonExcelGistogram.TabIndex = 14; + buttonExcelGistogram.Text = "Gist"; + buttonExcelGistogram.UseVisualStyleBackColor = true; + buttonExcelGistogram.Click += ButtonExcelGistogram_Click; + // + // FormTest + // + AutoScaleDimensions = new SizeF(10F, 25F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(763, 404); + Controls.Add(buttonExcelGistogram); + Controls.Add(buttonExcelCustomTable); + Controls.Add(buttonExcelTable); + Controls.Add(textBoxDate); + Controls.Add(buttonAddOneRow); + Controls.Add(buttonGetList); + Controls.Add(buttonSetValueCheckBox); + Controls.Add(buttonGetValueCheckBox); + Controls.Add(buttonGetValue); + Controls.Add(buttonTableAdd); + Controls.Add(buttonClearTable); + Controls.Add(buttonLoad); + Controls.Add(buttonClear); + Controls.Add(dateBoxWithNull1); + Controls.Add(customListBox1); + Controls.Add(customDataGridView1); + Margin = new Padding(4); + Name = "FormTest"; + Text = "FormTest"; + ResumeLayout(false); + PerformLayout(); + } - #endregion + #endregion - private Library36.CustomDataGridView customDataGridView1; + private Library36.CustomDataGridView customDataGridView1; private Library36.CustomListBox customListBox1; private Library36.DateBoxWithNull dateBoxWithNull1; private Button buttonClear; @@ -218,5 +261,11 @@ namespace Test private Button buttonGetList; private Button buttonAddOneRow; private TextBox textBoxDate; - } + private Button buttonExcelTable; + private Button buttonExcelCustomTable; + private Button buttonExcelGistogram; + private Library36.ExcelTable excelTable1; + private Library36.ExcelGistogram excelGistogram1; + private Library36.ExcelCustomTable excelCustomTable1; + } } diff --git a/Library36/Test/FormTest.cs b/Library36/Test/FormTest.cs index aaaec01..d4458d8 100644 --- a/Library36/Test/FormTest.cs +++ b/Library36/Test/FormTest.cs @@ -1,3 +1,6 @@ +using Library36.Models; +using Library36; + namespace Test { public partial class FormTest : Form @@ -97,10 +100,6 @@ namespace Test } } - - - - private void buttonGetValueCheckBox_Click(object sender, EventArgs e) { MessageBox.Show($"Value is {dateBoxWithNull1.Value}"); @@ -116,5 +115,71 @@ namespace Test dateBoxWithNull1.Value = date; } } - } + + private void ButtonExcelTable_Click(object sender, EventArgs e) + { + (sender as Control).BackColor = Color.White; + excelTable1.CreateDoc(new Library36.Models.TableConfig + { + FilePath = "table.xlsx", + Header = "Example", + Data = new List<string[,]> + { + new string[,] { + { "1", "1", "1" }, + { "1", "2", "2" }, + { "1", "3", "3" } + }, + new string[,] { { "\n",} }, + new string[,] { + { "2", "3", "3" }, + { "3", "4", "4" }, + { "4", "5", "5" }, + } + } + + }); + + (sender as Control).BackColor = Color.Green; + } + + private void ButtonExcelCustomTable_Click(object sender, EventArgs e) + { + (sender as Control).BackColor = Color.White; + excelCustomTable1.CreateDoc(new Library36.Models.TableWithHeaderConfig<Student> + { + FilePath = "customTable.xlsx", + Header = "Student", + ColumnsRowsWidth = new List<(int Column, int Row)> { (5, 5), (10, 5), (10, 0), (5, 0), (7, 0) }, + Headers = new List<(int ColumnIndex, string Header, string PropertyName)> + { + (0, "Id", "Id"), + (1, "Surname", "Surname"), + (2, "Height", "Height"), + (3, "Iq", "Iq"), + }, + Data = students, + }); + (sender as Control).BackColor = Color.Green; + } + + private void ButtonExcelGistogram_Click(object sender, EventArgs e) + { + (sender as Control).BackColor = Color.White; + var rnd = new Random(); + var list2d = new List<(string Name, double value)>() { ("Series 2", rnd.Next()), ("Series 3", rnd.Next()), ("Series 4", rnd.Next()) }; + excelGistogram1.CreateDoc(new ChartConfig + { + FilePath = "gistogram.xlsx", + Header = "Chart", + ChartTitle = "BarChart", + LegendLocation = Library36.Models.Location.Top, + Data = new Dictionary<string, List<(string Name, double Value)>> + { + { "Series 1", list2d } + } + }); + (sender as Control).BackColor = Color.Green; + } + } } diff --git a/Library36/Test/FormTest.resx b/Library36/Test/FormTest.resx index 8b2ff64..fc375ac 100644 --- a/Library36/Test/FormTest.resx +++ b/Library36/Test/FormTest.resx @@ -117,4 +117,13 @@ <resheader name="writer"> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> </resheader> + <metadata name="excelCustomTable1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>17, 17</value> + </metadata> + <metadata name="excelGistogram1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>226, 17</value> + </metadata> + <metadata name="excelTable1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> + <value>416, 17</value> + </metadata> </root> \ No newline at end of file