diff --git a/ComponentOrientedProgramming/ComponentOrientedProgramming.sln b/ComponentOrientedProgramming/ComponentOrientedProgramming.sln index e50bfd1..f559b88 100644 --- a/ComponentOrientedProgramming/ComponentOrientedProgramming.sln +++ b/ComponentOrientedProgramming/ComponentOrientedProgramming.sln @@ -3,9 +3,11 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.9.34622.214 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateVisualComponent", "CreateVisualComponent\CreateVisualComponent.csproj", "{97D95702-D830-4B2E-B310-7E8586859473}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreateVisualComponent", "CreateVisualComponent\CreateVisualComponent.csproj", "{97D95702-D830-4B2E-B310-7E8586859473}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WinFormsTest", "WinFormsTest\WinFormsTest.csproj", "{598218F4-A9A1-49E9-9DE9-D145C618D65E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinFormsTest", "WinFormsTest\WinFormsTest.csproj", "{598218F4-A9A1-49E9-9DE9-D145C618D65E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotVisualComponent", "NotVisualComponent\NotVisualComponent.csproj", "{117AD77E-0A05-4128-9BB4-F04FB81B371A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,6 +23,10 @@ Global {598218F4-A9A1-49E9-9DE9-D145C618D65E}.Debug|Any CPU.Build.0 = Debug|Any CPU {598218F4-A9A1-49E9-9DE9-D145C618D65E}.Release|Any CPU.ActiveCfg = Release|Any CPU {598218F4-A9A1-49E9-9DE9-D145C618D65E}.Release|Any CPU.Build.0 = Release|Any CPU + {117AD77E-0A05-4128-9BB4-F04FB81B371A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {117AD77E-0A05-4128-9BB4-F04FB81B371A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {117AD77E-0A05-4128-9BB4-F04FB81B371A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {117AD77E-0A05-4128-9BB4-F04FB81B371A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ComponentOrientedProgramming/NotVisualComponent/ExcelDiagram.Designer.cs b/ComponentOrientedProgramming/NotVisualComponent/ExcelDiagram.Designer.cs new file mode 100644 index 0000000..4748c74 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/ExcelDiagram.Designer.cs @@ -0,0 +1,36 @@ +namespace NotVisualComponent +{ + partial class ExcelDiagram + { + /// + /// Обязательная переменная конструктора. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Освободить все используемые ресурсы. + /// + /// истинно, если управляемый ресурс должен быть удален; иначе ложно. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/ExcelDiagram.cs b/ComponentOrientedProgramming/NotVisualComponent/ExcelDiagram.cs new file mode 100644 index 0000000..5bfa923 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/ExcelDiagram.cs @@ -0,0 +1,35 @@ +using NotVisualComponent.Helpers; +using NotVisualComponent.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent +{ + public partial class ExcelDiagram : Component + { + public ExcelDiagram() + { + InitializeComponent(); + } + + public ExcelDiagram(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/ComponentOrientedProgramming/NotVisualComponent/ExcelHardTable.Designer.cs b/ComponentOrientedProgramming/NotVisualComponent/ExcelHardTable.Designer.cs new file mode 100644 index 0000000..8a471ab --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/ExcelHardTable.Designer.cs @@ -0,0 +1,36 @@ +namespace NotVisualComponent +{ + partial class ExcelHardTable + { + /// + /// Обязательная переменная конструктора. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Освободить все используемые ресурсы. + /// + /// истинно, если управляемый ресурс должен быть удален; иначе ложно. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/ExcelHardTable.cs b/ComponentOrientedProgramming/NotVisualComponent/ExcelHardTable.cs new file mode 100644 index 0000000..89de061 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/ExcelHardTable.cs @@ -0,0 +1,72 @@ +using NotVisualComponent.Helpers; +using NotVisualComponent.Models; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent +{ + public partial class ExcelHardTable : Component + { + public ExcelHardTable() + { + InitializeComponent(); + } + + public ExcelHardTable(IContainer container) + { + container.Add(this); + InitializeComponent(); + } + public void CreateDoc(TableWithHeaderConfig 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, int, string, string) first = (0, 0, null, null); + foreach (var x in config.Headers.Where(x => x.ColumnIndex == i)) + { + first = x; + break; + } + + var (_, _, _, name) = first; + if (name != null) + { + var propertyInfo = config.Data[j]?.GetType().GetProperty(name); + if (propertyInfo != null) + { + object? value = propertyInfo.GetValue(config.Data[j], null); + array[j, i] = value == null + ? config.NullReplace + : value.ToString(); + } + else + { + array[j, i] = config.NullReplace; + } + } + else + { + array[j, i] = config.NullReplace; + } + } + } + + creator.LoadDataToTableWithMultiHeader(array, config.ColumnsRowsWidth[1].Row); + creator.SaveDoc(config.FilePath); + } + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/ExcelTable.Designer.cs b/ComponentOrientedProgramming/NotVisualComponent/ExcelTable.Designer.cs new file mode 100644 index 0000000..948f04d --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/ExcelTable.Designer.cs @@ -0,0 +1,36 @@ +namespace NotVisualComponent +{ + partial class ExcelTable + { + /// + /// Обязательная переменная конструктора. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Освободить все используемые ресурсы. + /// + /// истинно, если управляемый ресурс должен быть удален; иначе ложно. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Код, автоматически созданный конструктором компонентов + + /// + /// Требуемый метод для поддержки конструктора — не изменяйте + /// содержимое этого метода с помощью редактора кода. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/ExcelTable.cs b/ComponentOrientedProgramming/NotVisualComponent/ExcelTable.cs new file mode 100644 index 0000000..e65a775 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/ExcelTable.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using NotVisualComponent.Models; +using NotVisualComponent.Helpers; + +namespace NotVisualComponent +{ + 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); + } + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Helpers/ChartGenerator.cs b/ComponentOrientedProgramming/NotVisualComponent/Helpers/ChartGenerator.cs new file mode 100644 index 0000000..471f9ac --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Helpers/ChartGenerator.cs @@ -0,0 +1,452 @@ +using System.Globalization; +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml.Drawing; +using DocumentFormat.OpenXml; +using NotVisualComponent.Models; +using static System.String; +using Index = DocumentFormat.OpenXml.Drawing.Charts.Index; +using Orientation = DocumentFormat.OpenXml.Drawing.Charts.Orientation; + + +namespace NotVisualComponent.Helpers +{ + public static 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.Column + }); + barChart.Append(new BarGrouping + { + Val = (EnumValue)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 (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 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 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 Orientation + { + Val = (EnumValue)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.None, + Strike = (EnumValue)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.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)axisPosition + }); + categoryAxis.Append(new NumberingFormat + { + FormatCode = (StringValue)"General", + SourceLinked = (BooleanValue)true + }); + categoryAxis.Append(new TickLabelPosition + { + Val = (EnumValue)TickLabelPositionValues.Low + }); + categoryAxis.Append(GenerateChartShapeProperties(3175)); + categoryAxis.Append(textProperties); + categoryAxis.Append(new CrossingAxis + { + Val = crossingAxisId.Val + }); + categoryAxis.Append(new Crosses + { + Val = (EnumValue)CrossesValues.AutoZero + }); + categoryAxis.Append(new AutoLabeled + { + Val = (BooleanValue)true + }); + categoryAxis.Append(new LabelAlignment + { + Val = (EnumValue)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 Orientation + { + Val = (EnumValue)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)position + }); + valueAxis.Append(new MajorGridlines()); + valueAxis.Append(new NumberingFormat + { + FormatCode = (StringValue)"General", + SourceLinked = (BooleanValue)false + }); + valueAxis.Append(new MajorTickMark + { + Val = (EnumValue)TickMarkValues.None + }); + valueAxis.Append(new TickLabelPosition + { + Val = (EnumValue)TickLabelPositionValues.NextTo + }); + valueAxis.Append(GenerateChartShapeProperties(9525)); + valueAxis.Append(textProperties); + valueAxis.Append(new CrossingAxis + { + Val = crossingAxisId.Val + }); + valueAxis.Append(new Crosses + { + Val = (EnumValue)CrossesValues.AutoZero + }); + valueAxis.Append(new CrossBetween + { + Val = (EnumValue)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.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)position + }); + legend.Append(new Layout()); + legend.Append(new Overlay + { + Val = (BooleanValue)false + }); + legend.Append(textProperties); + return legend; + } + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Helpers/IContext.cs b/ComponentOrientedProgramming/NotVisualComponent/Helpers/IContext.cs new file mode 100644 index 0000000..df28011 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Helpers/IContext.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NotVisualComponent.Models; + +namespace NotVisualComponent.Helpers +{ + public interface IContext : ICreator + { + void CreateTable(string[,] data); + void CreateTableWithHeader(); + void CreateMultiHeader(TableWithHeaderConfig config); + void LoadDataToTableWithMultiHeader(string[,] data, int rowHeight); + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Helpers/ICreator.cs b/ComponentOrientedProgramming/NotVisualComponent/Helpers/ICreator.cs new file mode 100644 index 0000000..53452ab --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Helpers/ICreator.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using NotVisualComponent.Models; + +namespace NotVisualComponent.Helpers +{ + public interface ICreator + { + void CreateHeader(string header); + void SaveDoc(string filepath); + void CreateBarChart(ChartConfig config); + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Helpers/WorkWithExcel.cs b/ComponentOrientedProgramming/NotVisualComponent/Helpers/WorkWithExcel.cs new file mode 100644 index 0000000..ab093cc --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Helpers/WorkWithExcel.cs @@ -0,0 +1,405 @@ +using DocumentFormat.OpenXml; +using DocumentFormat.OpenXml.Packaging; +using DocumentFormat.OpenXml.Spreadsheet; +using NotVisualComponent.Models; +using DocumentFormat.OpenXml.Drawing.Charts; +using DocumentFormat.OpenXml.Drawing.Spreadsheet; +using DocumentFormat.OpenXml.Drawing; + +namespace NotVisualComponent.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(TableWithHeaderConfig 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() + where (uint)r.RowIndex == counter + select r).Any()) + { + var row = (from r in SheetData.Elements() + 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, int, string, string)>(((int ColumnIndex, int RowIndex, string Header, string PropertyName) x) => x is { ColumnIndex: 0, RowIndex: 0 }).Item3, styleIndex); + for (var i = 0; i < num3; i++) + { + CreateCell(i + 1, _startRowIndex, config.Headers.FirstOrDefault<(int, int, string, string)>(((int ColumnIndex, int RowIndex, string Header, string PropertyName) x) => x.ColumnIndex == i + 1 && x.RowIndex == 0).Item3, styleIndex); + } + } + } + private static void GenerateStyle(OpenXmlPartContainer workbookPart) + { + var workbookStylesPart = workbookPart.AddNewPart(); + 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.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.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.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.Thin + }, + RightBorder = new DocumentFormat.OpenXml.Spreadsheet.RightBorder + { + Style = (EnumValue)BorderStyleValues.Thin + }, + TopBorder = new DocumentFormat.OpenXml.Spreadsheet.TopBorder + { + Style = (EnumValue)BorderStyleValues.Thin + }, + BottomBorder = new DocumentFormat.OpenXml.Spreadsheet.BottomBorder + { + Style = (EnumValue)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.Center, + Vertical = (EnumValue)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.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() + where (uint)r.RowIndex == rowIndex + select r).Any()) + { + row = (from r in SheetData.Elements() + where (uint)r.RowIndex == rowIndex + select r).First(); + } + else + { + row = new Row + { + RowIndex = (UInt32Value)rowIndex + }; + SheetData.Append(row); + } + + var cell = row.Elements().FirstOrDefault(c => c.CellReference!.Value == columnName2 + rowIndex); + if (cell != null) return cell; + var referenceChild = row.Elements() + .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.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.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(); + worksheetPart.Worksheet.Append(new Drawing + { + Id = (StringValue)worksheetPart.GetIdOfPart(drawingsPart) + }); + worksheetPart.Worksheet.Save(); + var chartPart = drawingsPart.AddNewPart(); + 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() + where (uint)r.RowIndex == i + 1 + select r).Any()) + { + var row = (from r in SheetData.Elements() + 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/ComponentOrientedProgramming/NotVisualComponent/Models/ChartConfig.cs b/ComponentOrientedProgramming/NotVisualComponent/Models/ChartConfig.cs new file mode 100644 index 0000000..0041419 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Models/ChartConfig.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent.Models +{ + public class ChartConfig : DocumentConfig + { + public string ChartTitle { get; set; } = string.Empty; + public Location LegendLocation { get; set; } + public Dictionary>? Data { get; set; } + + public void CheckFields() + { + if (Data == null || Data.Count == 0) + throw new ArgumentNullException("Data count is null"); + } + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Models/DocumentConfig.cs b/ComponentOrientedProgramming/NotVisualComponent/Models/DocumentConfig.cs new file mode 100644 index 0000000..c6f0b83 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Models/DocumentConfig.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent.Models +{ + public class DocumentConfig + { + public string FilePath { get; set; } = string.Empty; + public string Header { get; set; } = string.Empty; + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Models/Location.cs b/ComponentOrientedProgramming/NotVisualComponent/Models/Location.cs new file mode 100644 index 0000000..733583e --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Models/Location.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent.Models +{ + public enum Location + { + Left, + Right, + Top, + Bottom + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Models/TableConfig.cs b/ComponentOrientedProgramming/NotVisualComponent/Models/TableConfig.cs new file mode 100644 index 0000000..e43ad8e --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Models/TableConfig.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent.Models +{ + public class TableConfig : DocumentConfig + { + public List? Data { get; set; } + + public void CheckFields() + { + if (Data == null || Data.Count == 0 || Data.All(x => x.Length == 0)) + throw new ArgumentNullException("Data is null"); + } + } +} diff --git a/ComponentOrientedProgramming/NotVisualComponent/Models/TableWithHeaderConfig.cs b/ComponentOrientedProgramming/NotVisualComponent/Models/TableWithHeaderConfig.cs new file mode 100644 index 0000000..2a32b5c --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/Models/TableWithHeaderConfig.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace NotVisualComponent.Models +{ + public class TableWithHeaderConfig : DocumentConfig + { + public (int Columns, int Rows) ColumnsRowsDataCount { get; set; } + public List<(int Column, int Row)>? ColumnsRowsWidth { get; set; } + public List<(int ColumnIndex, int RowIndex, string Header, string PropertyName)>? Headers { get; set; } + public List? Data { get; set; } + public string NullReplace { get; set; } = "null"; + + 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/ComponentOrientedProgramming/NotVisualComponent/NotVisualComponent.csproj b/ComponentOrientedProgramming/NotVisualComponent/NotVisualComponent.csproj new file mode 100644 index 0000000..0264634 --- /dev/null +++ b/ComponentOrientedProgramming/NotVisualComponent/NotVisualComponent.csproj @@ -0,0 +1,14 @@ + + + + net6.0-windows + enable + true + enable + + + + + + + diff --git a/ComponentOrientedProgramming/WinFormsTest/Form1.Designer.cs b/ComponentOrientedProgramming/WinFormsTest/Form1.Designer.cs index 6c8704f..1eb3abd 100644 --- a/ComponentOrientedProgramming/WinFormsTest/Form1.Designer.cs +++ b/ComponentOrientedProgramming/WinFormsTest/Form1.Designer.cs @@ -28,6 +28,7 @@ /// private void InitializeComponent() { + components = new System.ComponentModel.Container(); SelectionComponent = new CreateVisualComponent.SelectionComponent(); buttonLoad = new Button(); buttonClear = new Button(); @@ -39,6 +40,12 @@ buttonClearTable = new Button(); buttonShowTable = new Button(); buttonGet = new Button(); + buttonExcelTableSave = new Button(); + excelTable = new NotVisualComponent.ExcelTable(components); + buttonHardExcelSave = new Button(); + buttonDiagramSave = new Button(); + excelHardTable = new NotVisualComponent.ExcelHardTable(components); + excelDiagram = new NotVisualComponent.ExcelDiagram(components); SuspendLayout(); // // SelectionComponent @@ -142,11 +149,44 @@ buttonGet.UseVisualStyleBackColor = true; buttonGet.Click += ButtonGetString_Click; // + // buttonExcelTableSave + // + buttonExcelTableSave.Location = new Point(329, 355); + buttonExcelTableSave.Name = "buttonExcelTableSave"; + buttonExcelTableSave.Size = new Size(94, 50); + buttonExcelTableSave.TabIndex = 12; + buttonExcelTableSave.Text = "Save Excel"; + buttonExcelTableSave.UseVisualStyleBackColor = true; + buttonExcelTableSave.Click += buttonExcel_Click; + // + // buttonHardExcelSave + // + buttonHardExcelSave.Location = new Point(480, 355); + buttonHardExcelSave.Name = "buttonHardExcelSave"; + buttonHardExcelSave.Size = new Size(94, 50); + buttonHardExcelSave.TabIndex = 13; + buttonHardExcelSave.Text = "Save Hard Excel"; + buttonHardExcelSave.UseVisualStyleBackColor = true; + buttonHardExcelSave.Click += buttonHardExcelSave_Click; + // + // buttonDiagramSave + // + buttonDiagramSave.Location = new Point(627, 355); + buttonDiagramSave.Name = "buttonDiagramSave"; + buttonDiagramSave.Size = new Size(94, 50); + buttonDiagramSave.TabIndex = 14; + buttonDiagramSave.Text = "Save Diagram"; + buttonDiagramSave.UseVisualStyleBackColor = true; + buttonDiagramSave.Click += buttonDiagramSave_Click; + // // Form1 // AutoScaleDimensions = new SizeF(8F, 20F); AutoScaleMode = AutoScaleMode.Font; ClientSize = new Size(800, 450); + Controls.Add(buttonDiagramSave); + Controls.Add(buttonHardExcelSave); + Controls.Add(buttonExcelTableSave); Controls.Add(buttonGet); Controls.Add(buttonShowTable); Controls.Add(buttonClearTable); @@ -177,5 +217,11 @@ private Button buttonClearTable; private Button buttonShowTable; private Button buttonGet; + private Button buttonExcelTableSave; + private NotVisualComponent.ExcelTable excelTable; + private Button buttonHardExcelSave; + private Button buttonDiagramSave; + private NotVisualComponent.ExcelHardTable excelHardTable; + private NotVisualComponent.ExcelDiagram excelDiagram; } } diff --git a/ComponentOrientedProgramming/WinFormsTest/Form1.cs b/ComponentOrientedProgramming/WinFormsTest/Form1.cs index 254a2e3..0e7e70c 100644 --- a/ComponentOrientedProgramming/WinFormsTest/Form1.cs +++ b/ComponentOrientedProgramming/WinFormsTest/Form1.cs @@ -1,5 +1,7 @@ using CreateVisualComponent; using Microsoft.VisualBasic.Devices; +using NotVisualComponent; +using NotVisualComponent.Models; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Header; namespace WinFormsTest @@ -55,7 +57,7 @@ namespace WinFormsTest { if (InputComponent.Value == null) { - MessageBox.Show($"Pressed Checkbox"); + MessageBox.Show($"Pressed Checkbox"); } else { @@ -126,5 +128,54 @@ namespace WinFormsTest if (delivery is null) return; MessageBox.Show($"{delivery.Id}-{delivery.Name}-{delivery.DeliveryStatus}-{delivery.CountProduct}"); } + private void buttonExcel_Click(object sender, EventArgs e) + { + excelTable.CreateDoc(new TableConfig + { + FilePath = "C:\\Users\\sshan\\OneDrive\\Desktop\\PathKOP\\Excel1.xlsx", + Header = "Example", + Data = new List + { + new string[,] { + { "1", "1", "1" }, + { "1", "2", "2" }, + { "1", "3", "3" } + } + } + }); + } + private void buttonHardExcelSave_Click(object sender, EventArgs e) + { + excelHardTable.CreateDoc(new TableWithHeaderConfig + { + FilePath = "C:\\Users\\sshan\\OneDrive\\Desktop\\PathKOP\\Excel2.xlsx", + Header = "Computers", + ColumnsRowsWidth = new List<(int Column, int Row)> { (5, 5), (10, 5), (10, 0), (5, 0), (7, 0) }, + Headers = new List<(int ColumnIndex, int RowIndex, string Header, string PropertyName)> + { + (0, 0, "Id", "Id"), + (1, 0, "CPU", "CPU"), + (2, 0, "GPU", "GPU"), + (3, 0, "RAM", "RAM"), + }, + Data = delivers, + NullReplace = ")" + }); + } + private void buttonDiagramSave_Click(object sender, EventArgs e) + { + var rnd = new Random(); + excelDiagram.CreateDoc(new ChartConfig + { + FilePath = "C:\\Users\\sshan\\OneDrive\\Desktop\\PathKOP\\Excel3.xlsx", + Header = "Chart", + ChartTitle = "BarChart", + LegendLocation = NotVisualComponent.Models.Location.Top, + Data = new Dictionary> + { + { "Series 1", new() { ("GOVNO", rnd.Next()), ("ZALUPA", rnd.Next()), ("PENIS", rnd.Next()) } } + } + }); + } } } diff --git a/ComponentOrientedProgramming/WinFormsTest/Form1.resx b/ComponentOrientedProgramming/WinFormsTest/Form1.resx index af32865..e9ff729 100644 --- a/ComponentOrientedProgramming/WinFormsTest/Form1.resx +++ b/ComponentOrientedProgramming/WinFormsTest/Form1.resx @@ -117,4 +117,13 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + + + 142, 17 + + + 300, 17 + \ No newline at end of file diff --git a/ComponentOrientedProgramming/WinFormsTest/WinFormsTest.csproj b/ComponentOrientedProgramming/WinFormsTest/WinFormsTest.csproj index 174f460..f8b56d7 100644 --- a/ComponentOrientedProgramming/WinFormsTest/WinFormsTest.csproj +++ b/ComponentOrientedProgramming/WinFormsTest/WinFormsTest.csproj @@ -10,6 +10,7 @@ + \ No newline at end of file