{"id":13706500,"url":"https://github.com/EvilLord666/ReportGenerator","last_synced_at":"2025-05-05T20:31:52.182Z","repository":{"id":129924467,"uuid":"127747608","full_name":"EvilLord666/ReportGenerator","owner":"EvilLord666","description":"A small cross-database tool for building excel documents (reports) based on data from database that extacts via View or Stored Procedures with parametres, ordering e.t.c.","archived":false,"fork":false,"pushed_at":"2022-06-14T07:07:16.000Z","size":512,"stargazers_count":9,"open_issues_count":5,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-10-07T05:47:42.929Z","etag":null,"topics":["cross-database","database","database-reporting","di-service","etl","etl-automation","excel","excel-export","excel-to-sql","generator","reportgenerator","reporting-engine","reporting-tool","reports","smart-reporting","sql-to-excel","statement","stored-procedures"],"latest_commit_sha":null,"homepage":"https://evillord666.github.io/ReportGenerator/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EvilLord666.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2018-04-02T11:32:03.000Z","updated_at":"2024-09-19T20:29:54.000Z","dependencies_parsed_at":"2023-03-21T00:27:24.070Z","dependency_job_id":null,"html_url":"https://github.com/EvilLord666/ReportGenerator","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvilLord666%2FReportGenerator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvilLord666%2FReportGenerator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvilLord666%2FReportGenerator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EvilLord666%2FReportGenerator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EvilLord666","download_url":"https://codeload.github.com/EvilLord666/ReportGenerator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224465929,"owners_count":17315899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cross-database","database","database-reporting","di-service","etl","etl-automation","excel","excel-export","excel-to-sql","generator","reportgenerator","reporting-engine","reporting-tool","reports","smart-reporting","sql-to-excel","statement","stored-procedures"],"created_at":"2024-08-02T22:00:58.274Z","updated_at":"2024-11-13T14:31:19.182Z","avatar_url":"https://github.com/EvilLord666.png","language":"C#","readme":"# ReportGenerator\n## 1 Overview\nA small tool (library) for generating reports (plain dataset) from ***Stored Procedures*** or ***Views*** following databases:\n* MS SQL (SQL Server)\n* MySQL\n* Postgres\n\nThese reports could be generated in ***MS Excel*** or ***CSV*** formats with templates files (typically Headers only).\nLogic of data extracting depends on parameters (variables) Stored procedures or Views (**WHERE** parameters, **ORDER BY** and **GROUP BY** parameters). \n\nReport generator core passes parameters for data filtering in View or Variables for Stored Procedures, parameters are taking from:\n* 1) ExecutionConfig (.xml file)\n* 2) in runtime (as instance of ExecutionConfig class).\n\nThere are two ways for getting data:\n\n- from stored procedure (passing variables)\n- from view (passing where clauses, ordering and grouping conditions)\n\nIn both 2 ways there are a possibility to manipulate data selection by setting parameters (for stored procedure) and automatic sql generation for filtering \nView data. It should be noted that there is a configuration of View and StoredProcedure in xml.\n\n### 1.1 Configuration\nFor Stored Procedure Configuration we must set \u003cDataSource\u003eStoredProcedure\u003c/DataSource\u003e\n\nName to stored procedure name\n\nAnd also if we have aparameters we should specify collection of StoredProcedureParameters like, ParameterType is a integer value which is specific for databaseEngine :\n\nSQL Server - SqlDbType (https://msdn.microsoft.com/ru-ru/library/system.data.sqldbtype(v=vs.110).aspx)\n\nMySQL Server - MySqlDbType (https://dev.mysql.com/doc/dev/connector-net/8.0/html/T_MySql_Data_MySqlClient_MySqlDbType.htm)\n\nPostgres - NpgsqlDbType (https://www.npgsql.org/doc/api/NpgsqlTypes.NpgsqlDbType.html)\n`\nExample of config for SQL server (examples of config could be found in ReportGenerator.Core.Tests/ExampleConfig)\n```xml\n\u003c?xml version=\"1.0\"?\u003e\n\u003cExecutionConfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\u003e\n    \u003c!-- \n       If use SQL Server see for parameters Type : https://docs.microsoft.com/ru-ru/dotnet/api/system.data.sqldbtype \n    --\u003e\n    \u003cDataSource\u003eStoredProcedure\u003c/DataSource\u003e\n    \u003cName\u003eGetSitizensByCityAndDateOfBirth\u003c/Name\u003e\n    \u003cStoredProcedureParameters\u003e\n        \u003c!-- SQL Server NVarChar enum value is 12--\u003e\n        \u003cParameterType\u003e12\u003c/ParameterType\u003e \n        \u003cParameterName\u003eCity\u003c/ParameterName\u003e\n        \u003cParameterValue xsi:type=\"xsd:string\"\u003eN'Yekaterinburg\u003c/ParameterValue\u003e\n    \u003c/StoredProcedureParameters\u003e\n    \u003cStoredProcedureParameters\u003e\n        \u003c!-- SQL Server Int enum value is 8--\u003e\n        \u003cParameterType\u003e8\u003c/ParameterType\u003e\n        \u003cParameterName\u003ePostalCode\u003c/ParameterName\u003e\n        \u003cParameterValue xsi:type=\"xsd:string\"\u003e620000\u003c/ParameterValue\u003e\n    \u003c/StoredProcedureParameters\u003e\n    \u003cStoredProcedureParameters\u003e\n        \u003c!-- SQL Server Date enum value is 4--\u003e\n        \u003cParameterType\u003e4\u003c/ParameterType\u003e\n        \u003cParameterName\u003eDateOfBirth\u003c/ParameterName\u003e\n        \u003cParameterValue xsi:type=\"xsd:string\"\u003e'2018-01-01'\u003c/ParameterValue\u003e\n    \u003c/StoredProcedureParameters\u003e\n\u003c/ExecutionConfig\u003e\n```\nFor View Configuration is a little similar as DataSource we must note View:\n\n\u003cDataSource\u003eView\u003c/DataSource\u003e\n\nName is a name of View\n\nBut here we should also specify parameters for rows selection (WHERE, ORDER BY and GROUP BY parameters). All of them are represented with only one type - DbQueryParameter.\n\nDbQueryParameter consist of following:\n\n-collection of JoinCondition (works only for WHERE parameters) - is way of how parameters joined in WHERE statement by logical AND or logical OR, or maybe AND/OR with inversion - AND NOT Condition ... OR NOT Condition (see example below). Should be ommited for first parameter in WHERE statement.\n\n-parameter Name make sense for every type of parameter (WHERE, ORDER BY and GROUP BY)\n\n-comparison operator (make sense only for WHERE parameters) - is any valid SQL condition operator like \u003e, \u003c, =, IS, IS NOT, IN, BETWEEN, LIKE and so on...\n\n-parameter value works for WHERE (value for comparison) and ORDER BY (ASC or DESC),  THESE are DEFAULT values, they OF COURSE could be set during the runtime\n\nExample:\n\n```xml\n\u003c?xml version=\"1.0\"?\u003e\n\u003cExecutionConfig xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\u003e\n    \u003cDataSource\u003eView\u003c/DataSource\u003e\n    \u003cName\u003eCitizensView\u003c/Name\u003e\n    \u003cViewParameters\u003e\n        \u003cWhereParameters\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cParameterName\u003eFirstName\u003c/ParameterName\u003e\n                \u003cParameterValue\u003eN'Michael'\u003c/ParameterValue\u003e\n                \u003cComparisonOperator\u003e=\u003c/ComparisonOperator\u003e\n            \u003c/DbQueryParameter\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cConditions\u003e\n                    \u003cJoinCondition\u003eAnd\u003c/JoinCondition\u003e\n                    \u003cJoinCondition\u003eNot\u003c/JoinCondition\u003e\n                \u003c/Conditions\u003e\n                \u003cParameterName\u003eCity\u003c/ParameterName\u003e\n                \u003cParameterValue\u003eN'Yekaterinburg'\u003c/ParameterValue\u003e\n                \u003cComparisonOperator\u003e=\u003c/ComparisonOperator\u003e\n            \u003c/DbQueryParameter\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cConditions\u003e\n                    \u003cJoinCondition\u003eBetween\u003c/JoinCondition\u003e\n                \u003c/Conditions\u003e\n                \u003cParameterName\u003eAge\u003c/ParameterName\u003e\n                \u003cParameterValue\u003e18 AND 60\u003c/ParameterValue\u003e\n            \u003c/DbQueryParameter\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cConditions\u003e\n                    \u003cJoinCondition\u003eIn\u003c/JoinCondition\u003e\n                \u003c/Conditions\u003e\n                \u003cParameterName\u003eDistrict\u003c/ParameterName\u003e\n                \u003cParameterValue\u003e(N'D1', N'A3', N'A5', N'C7')\u003c/ParameterValue\u003e\n            \u003c/DbQueryParameter\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cConditions\u003e\n                    \u003cJoinCondition\u003eOr\u003c/JoinCondition\u003e\n                \u003c/Conditions\u003e\n                \u003cParameterName\u003eRegion\u003c/ParameterName\u003e\n                \u003cParameterValue\u003eN'Sverdlovskaya oblast'\u003c/ParameterValue\u003e\n                \u003cComparisonOperator\u003e!=\u003c/ComparisonOperator\u003e\n            \u003c/DbQueryParameter\u003e\n        \u003c/WhereParameters\u003e\n        \u003cOrderByParameters\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cParameterName\u003eFirstName\u003c/ParameterName\u003e\n                \u003cParameterValue\u003eASC\u003c/ParameterValue\u003e\n            \u003c/DbQueryParameter\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cParameterName\u003eLastName\u003c/ParameterName\u003e\n                \u003cParameterValue\u003eDESC\u003c/ParameterValue\u003e\n            \u003c/DbQueryParameter\u003e\n        \u003c/OrderByParameters\u003e\n        \u003cGroupByParameters\u003e\n            \u003cDbQueryParameter\u003e\n                \u003cParameterName\u003eDistrict\u003c/ParameterName\u003e\n            \u003c/DbQueryParameter\u003e\n        \u003c/GroupByParameters\u003e\n    \u003c/ViewParameters\u003e\n\u003c/ExecutionConfig\u003e\n```\n\n## 2 Example of usage\nTop interface is - IReportGeneratorManager.\nFor all functionality were written Unit tests with xUnit (sucks), full example could be found in unit test project (ReportGenerator.Core.Tests/ReportsGenerator/TestExcelReportGeneratorManager):\n\n```csharp\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Threading.Tasks;\n    using Microsoft.Extensions.Logging;\n    using ReportGenerator.Core.Database;\n    using ReportGenerator.Core.Database.Managers;\n    using ReportGenerator.Core.Database.Utils;\n    using ReportGenerator.Core.Helpers;\n    using ReportGenerator.Core.ReportsGenerator;\n    using Xunit;\n\n    namespace ReportGenerator.Core.Tests.ReportsGenerator\n    {\n        public class TestExcelReportGeneratorManager\n        {\n            [Fact]\n            public void TestGenerateReportSqlServer()\n            {\n                _testSqlServerDbName = TestSqlServerDatabasePattern + \"_\" + DateTime.Now.Millisecond.ToString();\n                SetUpSqlServerTestData();\n                // executing extraction ...\n                object[] parameters = ExcelReportGeneratorHelper.CreateParameters(1, 2, 3);\n                ILoggerFactory loggerFactory = new LoggerFactory();\n                IReportGeneratorManager manager = new ExcelReportGeneratorManager(loggerFactory, DbEngine.SqlServer, \n                                                                                  TestSqlServerHost, _testSqlServerDbName);\n                Task\u003cint\u003e result = manager.GenerateAsync(TestExcelTemplate, SqlServerDataExecutionConfig, ReportFile, parameters);\n                result.Wait();\n                Assert.True(result.Result \u003e 0);\n                TearDownSqlServerTestData();\n            }\n\n            [Fact]\n            public void TestGenerateReportSqLite()\n            {\n                SetUpSqLiteTestData();\n                object[] parameters = ExcelReportGeneratorHelper.CreateParameters(1, 2, 3);\n                ILoggerFactory loggerFactory = new LoggerFactory();\n                loggerFactory.AddConsole();\n                loggerFactory.AddDebug();\n                IReportGeneratorManager manager = new ExcelReportGeneratorManager(loggerFactory, DbEngine.SqLite, _connectionString);\n                Task\u003cint\u003e result = manager.GenerateAsync(TestExcelTemplate, SqLiteDataExecutionConfig, ReportFile, parameters);\n                result.Wait();\n                Assert.True(result.Result \u003e 0);\n                TearDownSqLiteTestData();\n            }\n        \n            [Fact]\n            public void TestGenerateReportPostgres()\n            {\n                SetUpPostgresSqlTestData();\n                object[] parameters = ExcelReportGeneratorHelper.CreateParameters(1, 2, 3);\n                ILoggerFactory loggerFactory = new LoggerFactory();\n                loggerFactory.AddConsole();\n                loggerFactory.AddDebug();\n                IReportGeneratorManager manager = new ExcelReportGeneratorManager(loggerFactory, DbEngine.PostgresSql, _connectionString);\n                Task\u003cint\u003e result = manager.GenerateAsync(TestExcelTemplate, PostgresSqlViewDataExecutionConfig, ReportFile, parameters);\n                result.Wait();\n                Assert.True(result.Result \u003e 0);\n                TearDownPostgresSqlTestData();\n            }\n        \n            [Fact]\n            public void TestGenerateReportMySql()\n            {\n                SetUpMySqlTestData();\n                object[] parameters = ExcelReportGeneratorHelper.CreateParameters(1, 2, 3);\n                ILoggerFactory loggerFactory = new LoggerFactory();\n                loggerFactory.AddConsole();\n                loggerFactory.AddDebug();\n                IReportGeneratorManager manager = new ExcelReportGeneratorManager(loggerFactory, DbEngine.MySql, _connectionString);\n                Task\u003cint\u003e result = manager.GenerateAsync(TestExcelTemplate, MySqlDataExecutionConfig, ReportFile, parameters);\n                result.Wait();\n                Assert.True(result.Result \u003e 0);\n                TearDownMySqlTestData();\n            }\n\n            private void SetUpSqlServerTestData()\n            {\n                _dbManager = new CommonDbManager(DbEngine.SqlServer, _loggerFactory.CreateLogger\u003cCommonDbManager\u003e());\n                IDictionary\u003cstring, string\u003e connectionStringParams = new Dictionary\u003cstring, string\u003e()\n                {\n                    {DbParametersKeys.HostKey, TestSqlServerHost},\n                    {DbParametersKeys.DatabaseKey, _testSqlServerDbName},\n                    {DbParametersKeys.UseIntegratedSecurityKey, \"true\"},\n                    {DbParametersKeys.UseTrustedConnectionKey, \"true\"}\n                };\n                _connectionString = ConnectionStringBuilder.Build(DbEngine.SqlServer, connectionStringParams);\n                _dbManager.CreateDatabase(_connectionString, true);\n                // \n                string createDatabaseStatement = File.ReadAllText(Path.GetFullPath(SqlServerCreateDatabaseScript));\n                string insertDataStatement = File.ReadAllText(Path.GetFullPath(SqlServerInsertDataScript));\n                _dbManager.ExecuteNonQueryAsync(_connectionString, createDatabaseStatement).Wait();\n                _dbManager.ExecuteNonQueryAsync(_connectionString, insertDataStatement).Wait();\n            }\n\n            private void TearDownSqlServerTestData()\n            {\n                _dbManager.DropDatabase(_connectionString);\n            }\n\n            private void SetUpSqLiteTestData()\n            {\n                _dbManager = new CommonDbManager(DbEngine.SqLite, _loggerFactory.CreateLogger\u003cCommonDbManager\u003e());\n                IDictionary\u003cstring, string\u003e connectionStringParams = new Dictionary\u003cstring, string\u003e()\n                {\n                    {DbParametersKeys.DatabaseKey, TestSqLiteDatabase},\n                    {DbParametersKeys.DatabaseEngineVersion, \"3\"}\n                };\n                _connectionString = ConnectionStringBuilder.Build(DbEngine.SqLite, connectionStringParams);\n                _dbManager.CreateDatabase(_connectionString, true);\n                string createDatabaseStatement = File.ReadAllText(Path.GetFullPath(SqLiteCreateDatabaseScript));\n                string insertDataStatement = File.ReadAllText(Path.GetFullPath(SqLiteInsertDataScript));\n                _dbManager.ExecuteNonQueryAsync(_connectionString, createDatabaseStatement).Wait();\n                _dbManager.ExecuteNonQueryAsync(_connectionString, insertDataStatement).Wait();\n            }\n\n            private void TearDownSqLiteTestData()\n            {\n                _dbManager.DropDatabase(_connectionString);\n            }\n        \n            private void SetUpMySqlTestData()\n            {\n                _dbManager = new CommonDbManager(DbEngine.MySql, _loggerFactory.CreateLogger\u003cCommonDbManager\u003e());\n                IDictionary\u003cstring, string\u003e connectionStringParams = new Dictionary\u003cstring, string\u003e()\n                {\n                    {DbParametersKeys.HostKey, TestMySqlHost},\n                    {DbParametersKeys.DatabaseKey, TestMySqlDatabase},\n                    // {DbParametersKeys.UseIntegratedSecurityKey, \"true\"} // is not working ...\n                    {DbParametersKeys.LoginKey, \"root\"},\n                    {DbParametersKeys.PasswordKey, \"123\"}\n                };\n                _connectionString = ConnectionStringBuilder.Build(DbEngine.MySql, connectionStringParams);\n                _dbManager.CreateDatabase(_connectionString, true);\n                string createDatabaseStatement = File.ReadAllText(Path.GetFullPath(MySqlCreateDatabaseScript));\n                string insertDataStatement = File.ReadAllText(Path.GetFullPath(MySqlInsertDataScript));\n                _dbManager.ExecuteNonQueryAsync(_connectionString, createDatabaseStatement).Wait();\n                _dbManager.ExecuteNonQueryAsync(_connectionString, insertDataStatement).Wait();\n            }\n\n            private void TearDownMySqlTestData()\n            {\n                _dbManager.DropDatabase(_connectionString);\n            }\n\n            private void SetUpPostgresSqlTestData()\n            {\n                _dbManager = new CommonDbManager(DbEngine.PostgresSql, _loggerFactory.CreateLogger\u003cCommonDbManager\u003e());\n                IDictionary\u003cstring, string\u003e connectionStringParams = new Dictionary\u003cstring, string\u003e()\n                {\n                    {DbParametersKeys.HostKey, TestPostgresSqlHost},\n                    {DbParametersKeys.DatabaseKey, TestPostgresSqlDatabase},\n                    // {DbParametersKeys.UseIntegratedSecurityKey, \"true\"} // is not working ...\n                    {DbParametersKeys.LoginKey, \"postgres\"},\n                    {DbParametersKeys.PasswordKey, \"123\"}\n                };\n                _connectionString = ConnectionStringBuilder.Build(DbEngine.PostgresSql, connectionStringParams);\n                _dbManager.CreateDatabase(_connectionString, true);\n                string createDatabaseStatement = File.ReadAllText(Path.GetFullPath(PostgresSqlCreateDatabaseScript));\n                string insertDataStatement = File.ReadAllText(Path.GetFullPath(PostgresSqlInsertDataScript));\n                _dbManager.ExecuteNonQueryAsync(_connectionString, createDatabaseStatement).Wait();\n                _dbManager.ExecuteNonQueryAsync(_connectionString, insertDataStatement).Wait();\n            }\n        \n            private void TearDownPostgresSqlTestData()\n            {\n                _dbManager.DropDatabase(_connectionString);\n            }\n\n            private const string TestExcelTemplate = @\"..\\..\\..\\TestExcelTemplates\\CitizensTemplate.xlsx\";\n            private const string ReportFile = @\".\\Report.xlsx\";\n            private const string SqlServerDataExecutionConfig = @\"..\\..\\..\\ExampleConfig\\sqlServerDataExtractionParams.xml\";\n            private const string SqLiteDataExecutionConfig = @\"..\\..\\..\\ExampleConfig\\sqLiteDataExtractionParams.xml\";\n            private const string MySqlDataExecutionConfig = @\"..\\..\\..\\ExampleConfig\\mySql_testReport4_StoredProcedure.xml\";\n            private const string PostgresSqlViewDataExecutionConfig = @\"..\\..\\..\\ExampleConfig\\postgresViewDataExtractionParams.xml\";\n            private const string PostgresSqlStoredProcedureDataExecutionConfig = @\"..\\..\\..\\ExampleConfig\\postgresStoredProcDataExtractionParams.xml\";\n\n            private const string TestSqlServerHost = @\"(localdb)\\mssqllocaldb\";\n            private const string TestSqlServerDatabasePattern = \"ReportGeneratorTestDb\";\n            private const string TestSqLiteDatabase = \"ReportGeneratorTestDb.sqlite\";\n            private const string TestMySqlHost = \"localhost\";\n            private const string TestMySqlDatabase = \"ReportGeneratorTestDb\";\n            private const string TestPostgresSqlHost = \"localhost\";\n            private const string TestPostgresSqlDatabase = \"ReportGeneratorTestDb\";\n\n            private const string SqlServerCreateDatabaseScript = @\"..\\..\\..\\DbScripts\\SqlServerCreateDb.sql\";\n            private const string SqlServerInsertDataScript = @\"..\\..\\..\\DbScripts\\SqlServerCreateData.sql\";\n            private const string SqLiteCreateDatabaseScript = @\"..\\..\\..\\DbScripts\\SqLiteCreateDb.sql\";\n            private const string SqLiteInsertDataScript = @\"..\\..\\..\\DbScripts\\SqLiteCreateData.sql\";\n            private const string MySqlCreateDatabaseScript = @\"..\\..\\..\\DbScripts\\MySqlCreateDb.sql\";\n            private const string MySqlInsertDataScript = @\"..\\..\\..\\DbScripts\\MySqlCreateData.sql\";\n            private const string PostgresSqlCreateDatabaseScript = @\"..\\..\\..\\DbScripts\\PostgresSqlCreateDb.sql\";\n            private const string PostgresSqlInsertDataScript = @\"..\\..\\..\\DbScripts\\PostgresSqlCreateData.sql\";\n\n            private string _testSqlServerDbName;\n            private string _connectionString;\n            private readonly ILoggerFactory _loggerFactory = new LoggerFactory();\n            private IDbManager _dbManager;\n        }\n    }\n  `\n\n## 3 Service for Dependency injection\n  \nHere is example of how to use ReportGenerator with dependency injection:\n`csharp\n    using System;\n    using System.Collections.Generic;\n    using Microsoft.Extensions.DependencyInjection;\n    using Microsoft.Extensions.Logging;\n    using ReportGenerator.Core.Database;\n    using ReportGenerator.Core.Database.Managers;\n    using ReportGenerator.Core.Database.Utils;\n    using ReportGenerator.Core.Extensions;\n    using ReportGenerator.Core.ReportsGenerator;\n    using Xunit;\n\n    namespace ReportGenerator.Core.Tests.Extensions\n    {\n        public class ServiceCollectionExtensionsTests : IDisposable\n        {\n            public ServiceCollectionExtensionsTests()\n            {\n                _testDbName = TestDatabasePattern + \"_\" + DateTime.Now.ToString(\"YYYYMMDDHHmmss\");\n                _dbManager = new CommonDbManager(DbEngine.SqlServer, _loggerFactory.CreateLogger\u003cCommonDbManager\u003e());\n                IDictionary\u003cstring, string\u003e connectionStringParams = new Dictionary\u003cstring, string\u003e()\n                {\n                    {DbParametersKeys.HostKey, Server},\n                    {DbParametersKeys.DatabaseKey, _testDbName},\n                    {DbParametersKeys.UseIntegratedSecurityKey, \"true\"},\n                    {DbParametersKeys.UseTrustedConnectionKey, \"true\"}\n                };\n                _connectionString = ConnectionStringBuilder.Build(DbEngine.SqlServer, connectionStringParams);\n                _dbManager.CreateDatabase(_connectionString, true);\n                _services = new ServiceCollection();\n                _services.AddScoped\u003cILoggerFactory\u003e(_ =\u003e new LoggerFactory());\n                _services.AddReportGenerator(DbEngine.SqlServer, _connectionString);\n            }\n\n            public void Dispose()\n            {\n                _dbManager.DropDatabase(_connectionString);\n            }\n\n            [Fact]\n            public void TestServiceInstantiationViaProvider()\n            {\n                IServiceProvider serviceProvider = _services.BuildServiceProvider();\n                IReportGeneratorManager reportGenerator = serviceProvider.GetService\u003cIReportGeneratorManager\u003e();\n                \n                Assert.NotNull(reportGenerator);\n            }\n\n            private const string Server = @\"(localdb)\\mssqllocaldb\";\n            private const string TestDatabasePattern = \"ReportGeneratorTestDb\";\n\n            private readonly IServiceCollection _services;\n            private readonly string _testDbName;\n            private readonly string _connectionString;\n            private IDbManager _dbManager;\n            private readonly ILoggerFactory _loggerFactory = new LoggerFactory();\n        }\n    }\n```\n## 4 GUI\n  \nA Full Web application (NET Core) with usage Report Generator as DI service will be implemented in this project: \nhttps://github.com/Wissance/ReportGeneratorWebGui it is also allow to use Web API for ReportsGeneration \n  \n# 5 Nuget Package\nNuget package is available on nuget.org : https://www.nuget.org/packages/ReportsGenerator/\nThere are some strange troubles with import of version 1.1.0 and 1.1.1 they are **Broken and unlisted**. **ACTUAL NUGET PACKAGE IS 1.1.2**\n","funding_links":[],"categories":["C# #"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEvilLord666%2FReportGenerator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FEvilLord666%2FReportGenerator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEvilLord666%2FReportGenerator/lists"}