< Summary

Information
Class: MRA.Services.Excel.ExcelService
Assembly: MRA.Services
File(s): D:\a\MiguelRomerART\MiguelRomerART\MRA.Services\Excel\ExcelService.cs
Line coverage
7%
Covered lines: 8
Uncovered lines: 95
Coverable lines: 103
Total lines: 219
Line coverage: 7.7%
Branch coverage
0%
Covered branches: 0
Total branches: 44
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_FilePath()100%210%
get_FileName()100%210%
get_FileDateFormat()100%210%
get_FileExtension()100%210%
get_SaveFileLocally()0%620%
.ctor(...)100%11100%
FillDrawingTable(...)0%2040%
FillDrawingRow(...)0%1332360%
FillSheetsDictionary(...)100%210%
GetFileName()100%210%
GetFileInfo()0%620%
GetPropertiesAttributes()100%210%
GetColumnMapDrawing(...)100%210%

File(s)

D:\a\MiguelRomerART\MiguelRomerART\MRA.Services\Excel\ExcelService.cs

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Microsoft.Extensions.Logging;
 3using MRA.DTO.Enums.Drawing;
 4using MRA.DTO.Models;
 5using MRA.Infrastructure.Excel;
 6using MRA.Infrastructure.Excel.Attributes;
 7using MRA.Infrastructure.Settings;
 8using MRA.Services.Excel.Interfaces;
 9using MRA.Services.Models.Drawings;
 10using OfficeOpenXml;
 11using OfficeOpenXml.Style;
 12using OfficeOpenXml.Table;
 13using System.Drawing;
 14using System.Reflection;
 15
 16namespace MRA.Services.Excel;
 17
 18public class ExcelService : IExcelService
 19{
 20    public const string EXCEL_DRAWING_SHEET_NAME = "Drawings";
 21    public const string EXCEL_DRAWING_TABLE_NAME = "TableDrawings";
 22
 23    public const string EXCEL_STYLE_SHEET_NAME = "Styles";
 24    public const string EXCEL_STYLE_TABLE_NAME = "TableStyles";
 25    public const string EXCEL_STYLE_COLUMN_NAME = "Type";
 26    public const string EXCEL_STYLE_COLUMN_INDEX = "#Type";
 27
 28    public const string EXCEL_PRODUCT_SHEET_NAME = "Products";
 29    public const string EXCEL_PRODUCT_TABLE_NAME = "TableProducts";
 30    public const string EXCEL_PRODUCT_COLUMN_NAME = "Product Type";
 31    public const string EXCEL_PRODUCT_COLUMN_INDEX = "#Product Type";
 32
 33    public const string EXCEL_SOFTWARE_SHEET_NAME = "Software";
 34    public const string EXCEL_SOFTWARE_TABLE_NAME = "TableSoftware";
 35    public const string EXCEL_SOFTWARE_COLUMN_NAME = "Software";
 36    public const string EXCEL_SOFTWARE_COLUMN_INDEX = "#Software";
 37
 38    public const string EXCEL_PAPER_SHEET_NAME = "Papers";
 39    public const string EXCEL_PAPER_TABLE_NAME = "TablePapers";
 40    public const string EXCEL_PAPER_COLUMN_NAME = "Paper";
 41    public const string EXCEL_PAPER_COLUMN_INDEX = "#Paper";
 42
 43    public const string EXCEL_FILTER_SHEET_NAME = "Filters";
 44    public const string EXCEL_FILTER_TABLE_NAME = "TableFilters";
 45    public const string EXCEL_FILTER_COLUMN_NAME = "Filter";
 46    public const string EXCEL_FILTER_COLUMN_INDEX = "#Filter";
 47
 48    public const string EXCEL_FAVORITE_VALUE = "Favorite";
 49    public const string EXCEL_VISIBLE_VALUE = "Visible";
 50    public const string EXCEL_SEPARATOR_COMMENTS = "\n";
 51
 052    public string FilePath { get { return _appConfiguration.EPPlus.File.Path; } }
 053    public string FileName { get { return _appConfiguration.EPPlus.File.Name; } }
 054    public string FileDateFormat { get { return _appConfiguration.EPPlus.File.DateFormat; } }
 055    public string FileExtension { get { return _appConfiguration.EPPlus.File.Extension; } }
 056    public bool SaveFileLocally { get { return FilePath != null && FileName != null; } }
 57
 58    private readonly AppSettings _appConfiguration;
 59    private readonly ILogger<ExcelService>? _logger;
 60    private readonly IExcelProvider _excel;
 61
 62
 163    public ExcelService(
 164        AppSettings appConfig,
 165        ILogger<ExcelService> logger,
 166        IExcelProvider excelProvider)
 67    {
 168        _appConfiguration = appConfig;
 169        _logger = logger;
 170        _excel = excelProvider;
 171    }
 72
 73
 74
 75    public void FillDrawingTable(ref ExcelWorksheet workSheet, List<ExcelColumnInfo> properties, List<DrawingModel> list
 76    {
 077        _excel.SetTableHeaders(ref workSheet, properties);
 078        int numberDocuments = listDrawings.Count;
 079        int row = 2;
 080        foreach (var drawing in listDrawings)
 81        {
 082            _logger?.LogInformation($"Procesando \"{drawing.Id}\" ({row - 1}/{numberDocuments})");
 083            FillDrawingRow(ref workSheet, properties, drawing, row);
 084            row++;
 85        }
 86
 087        _excel.CreateTable(ref workSheet, EXCEL_DRAWING_TABLE_NAME, 1, 1, listDrawings.Count + 1, properties.Count);
 088        _excel.SetBold(ref workSheet, 2, 1, listDrawings.Count + 1, 1);
 089    }
 90
 91    public void FillDrawingRow(ref ExcelWorksheet workSheet, List<ExcelColumnInfo> properties, DrawingModel drawing, int
 92    {
 093        int col = 1;
 094        foreach (var prop in properties)
 95        {
 096            workSheet.Column(col).Width = prop.Attribute.Width;
 097            var cell = workSheet.Cells[row, col];
 098            object value = prop.GetValue(drawing);
 099            cell.Value = value;
 100
 0101            if(value is bool valueBool)
 102            {
 0103                switch (prop.Attribute.Name)
 104                {
 105                    case "Visible":
 0106                        cell.Value = (valueBool ? EXCEL_VISIBLE_VALUE : "Oculto");
 0107                        break;
 108                    case "Favorite":
 0109                        cell.Value = (valueBool ? EXCEL_FAVORITE_VALUE : "");
 0110                        break;
 111                    default:
 0112                        cell.Value = (valueBool ? "TRUE" : "FALSE");
 0113                        break;
 114                }
 115            }
 0116            else if (value is double || value is float || value is decimal)
 117            {
 0118                cell.Style.Numberformat.Format = "#,##0.00";
 119            }
 0120            else if (value is int)
 121            {
 0122                cell.Style.Numberformat.Format = "#,##0";
 123            }
 0124            else if (value is DateTime)
 125            {
 0126                cell.Style.Numberformat.Format = "yyyy/mm/dd";
 127            }
 0128            else if (value is List<string> stringList)
 129            {
 0130                switch (prop.Attribute.Name)
 131                {
 132                    case "Tags":
 0133                        cell.Value = String.Join(DrawingTagManager.TAG_SEPARATOR, stringList);
 0134                        break;
 135                    default:
 0136                        cell.Value = String.Join(EXCEL_SEPARATOR_COMMENTS, stringList);
 137                        break;
 138                }
 0139                cell.Style.WrapText = true;
 0140                cell.Style.VerticalAlignment = ExcelVerticalAlignment.Top;
 0141                workSheet.Row(row).Height = 60;
 142            }
 0143            if (prop.Attribute.URL && value is string valueUrl && !String.IsNullOrEmpty(valueUrl))
 144            {
 0145                cell.Hyperlink = new Uri(valueUrl);
 0146                cell.Style.Font.UnderLine = true;
 0147                cell.Style.Font.Color.SetColor(Color.Blue);
 148            }
 0149            if (prop.Attribute.WrapText)
 150            {
 0151                cell.Style.WrapText = true;
 152            }
 0153            col++;
 154        }
 0155    }
 156
 157
 158
 159    public void FillSheetsDictionary(ExcelPackage excel, List<ExcelColumnInfo> drawingProperties, ExcelWorksheet workShe
 160    {
 0161        _excel.CreateWorksheetDictionary<DrawingTypes>(
 0162            excel,
 0163            sheetName: EXCEL_STYLE_SHEET_NAME,
 0164            tableName: EXCEL_STYLE_TABLE_NAME,
 0165            drawingProperties, workSheet,
 0166            nameColumnDropdown: EXCEL_STYLE_COLUMN_NAME,
 0167            nameColumnIndex: EXCEL_STYLE_COLUMN_INDEX);
 0168        _excel.CreateWorksheetDictionary<DrawingProductTypes>(
 0169            excel,
 0170            sheetName: EXCEL_PRODUCT_SHEET_NAME,
 0171            tableName: EXCEL_PRODUCT_TABLE_NAME,
 0172            drawingProperties, workSheet,
 0173            nameColumnDropdown: EXCEL_PRODUCT_COLUMN_NAME,
 0174            nameColumnIndex: EXCEL_PRODUCT_COLUMN_INDEX);
 0175        _excel.CreateWorksheetDictionary<DrawingSoftwares>(
 0176            excel,
 0177            sheetName: EXCEL_SOFTWARE_SHEET_NAME,
 0178            tableName: EXCEL_SOFTWARE_TABLE_NAME,
 0179            drawingProperties, workSheet,
 0180            nameColumnDropdown: EXCEL_SOFTWARE_COLUMN_NAME,
 0181            nameColumnIndex: EXCEL_SOFTWARE_COLUMN_INDEX);
 0182        _excel.CreateWorksheetDictionary<DrawingPaperSizes>(
 0183            excel,
 0184            sheetName: EXCEL_PAPER_SHEET_NAME,
 0185            tableName: EXCEL_PAPER_TABLE_NAME,
 0186            drawingProperties, workSheet,
 0187            nameColumnDropdown: EXCEL_PAPER_COLUMN_NAME,
 0188            nameColumnIndex: EXCEL_PAPER_COLUMN_INDEX);
 0189        _excel.CreateWorksheetDictionary<DrawingFilterTypes>(
 0190            excel,
 0191            sheetName: EXCEL_FILTER_SHEET_NAME,
 0192            tableName: EXCEL_FILTER_TABLE_NAME,
 0193            drawingProperties, workSheet,
 0194            nameColumnDropdown: EXCEL_FILTER_COLUMN_NAME,
 0195            nameColumnIndex: EXCEL_FILTER_COLUMN_INDEX);
 0196    }
 197
 0198    public string GetFileName() => $"{FileName}" + $"_{DateTime.Now.ToString(FileDateFormat)}" + $".{FileExtension}";
 199
 200    public FileInfo GetFileInfo()
 201    {
 0202        var fileName = GetFileName();
 0203        var filePath = Path.Combine(FilePath, fileName);
 204
 0205        if (!Directory.Exists(FilePath))
 206        {
 0207            Directory.CreateDirectory(FilePath);
 208        }
 209
 0210        return new FileInfo(filePath);
 211    }
 212
 213    public List<ExcelColumnInfo> GetPropertiesAttributes<T>()
 214    {
 0215        return _excel.GetPropertiesAttributes<T>();
 216    }
 217
 0218    public Dictionary<string, int> GetColumnMapDrawing(ExcelWorksheet workSheet) => _excel.GetColumnMapDrawing(workSheet
 219}