// Generates document public static void Generate(ILogger logger) { #region Retrieve report data //Informe reportData = BuildAverageByDaysReportData("EN"); Informe reportData = BuildAverageByDaysReportData("ES"); //Informe reportData = BuildSumByDaysReportData("EN"); //Informe reportData = BuildSumByDaysReportData("ES"); //Informe reportData = BuildAverageByMonthsReportData("EN"); //Informe reportData = BuildAverageByMonthsReportData("ES"); //Informe reportData = BuildSumByMonthsReportData("EN"); //Informe reportData = BuildSumByMonthsReportData("ES"); #endregion #region Add dynamic xlsx styles CellStylesTable.Add( "ShortDateValue", new XlsxCellStyle { Font = { Bold = YesNo.Yes, }, Borders = { new XlsxStyleBorder { Show = YesNo.Yes, Position = KnownBorderPosition.Right } }, Content = { DataType = new DateTimeDataType { Locale = (KnownCulture)EnumHelper.CreateEnumTypeFromDescriptionAttribute <KnownCulture>(reportData.ConfiguracionInforme.IdiomaInforme) }, Alignment = { Horizontal = KnownHorizontalAlignment.Right } } }); // Add dynamic xlsx styles CellStylesTable.Add( "MonthYearDateValue", new XlsxCellStyle { Font = { Bold = YesNo.Yes, }, Borders = { new XlsxStyleBorder { Show = YesNo.Yes, Position = KnownBorderPosition.Right } }, Content = { DataType = new DateTimeDataType { Format = KnownDateTimeFormat.YearMonthShortPattern, Locale = (KnownCulture)EnumHelper.CreateEnumTypeFromDescriptionAttribute <KnownCulture>(reportData.ConfiguracionInforme.IdiomaInforme), }, Alignment = { Horizontal = KnownHorizontalAlignment.Right } } }); CellStylesTable.Add( "SummaryDateValue", new XlsxCellStyle { Content = { DataType = new DateTimeDataType { Locale = (KnownCulture)EnumHelper.CreateEnumTypeFromDescriptionAttribute <KnownCulture>(reportData.ConfiguracionInforme.IdiomaInforme) }, Alignment = { Horizontal = KnownHorizontalAlignment.Left } } }); #endregion #region Defines custom styles to use XlsxCellStyle dateAxisStyle = reportData.ConfiguracionInforme.ValoresPor.Equals("DIA", StringComparison.OrdinalIgnoreCase) ? CellStylesTable["ShortDateValue"] : CellStylesTable["MonthYearDateValue"]; #endregion #region Defines localized literals bool isSpanishLanguage = reportData.ConfiguracionInforme.IdiomaInforme.Equals("ES", StringComparison.OrdinalIgnoreCase); #region Summary Sheet string summarySheetName = "Hoja1"; if (!isSpanishLanguage) { summarySheetName = "Sheet1"; } string summaryParameterLiteral = "Parámetro"; if (!isSpanishLanguage) { summaryParameterLiteral = "Parameter"; } string summaryTypeLiteral = "Tipo"; if (!isSpanishLanguage) { summaryTypeLiteral = "Type"; } string summaryValuesByLiteral = "Valores Por"; if (!isSpanishLanguage) { summaryValuesByLiteral = "Values By"; } string summaryInitialDateLiteral = "Fecha Inicio"; if (!isSpanishLanguage) { summaryInitialDateLiteral = "Initial Date"; } string summaryEndDateLiteral = "Fecha Fin"; if (!isSpanishLanguage) { summaryEndDateLiteral = "End Date"; } #endregion #region Rawdata Sheet string rawDataSheetName = "Hoja2"; if (!isSpanishLanguage) { rawDataSheetName = "Sheet2"; } string averageLiteral = "Media"; if (!isSpanishLanguage) { averageLiteral = "Average"; } string sumLiteral = "Suma"; if (!isSpanishLanguage) { sumLiteral = "Sum"; } #endregion #endregion #region Report type to generate bool generateSumReport = reportData.ConfiguracionInforme.Tipo.Equals("SUMA", StringComparison.OrdinalIgnoreCase); #endregion #region Determines locals to include in report IEnumerable <Local> localsToPrint = generateSumReport ? reportData.Locales.Where(local => local.Nombre.Equals("Suma", StringComparison.OrdinalIgnoreCase)) : reportData.Locales; #endregion #region Creates xlsx file reference XlsxInput doc = XlsxInput.Create(new[] { summarySheetName, rawDataSheetName }); #endregion #region Sheet 1 #region Sheet 1 > Populates configuration data doc.Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["ReportTitle"], Location = new XlsxPointRange { Column = 2, Row = 1 }, Data = reportData.ConfiguracionInforme.TituloInforme }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryLabel"], Location = new XlsxPointRange { Column = 2, Row = 3 }, Data = summaryParameterLiteral }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryValue"], Location = new XlsxPointRange { Column = 3, Row = 3 }, Data = reportData.ConfiguracionInforme.Parametro }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryLabel"], Location = new XlsxPointRange { Column = 2, Row = 4 }, Data = summaryTypeLiteral }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryValue"], Location = new XlsxPointRange { Column = 3, Row = 4 }, Data = reportData.ConfiguracionInforme.Tipo }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryLabel"], Location = new XlsxPointRange { Column = 2, Row = 5 }, Data = summaryValuesByLiteral }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryValue"], Location = new XlsxPointRange { Column = 3, Row = 5 }, Data = reportData.ConfiguracionInforme.ValoresPor }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryLabel"], Location = new XlsxPointRange { Column = 2, Row = 6 }, Data = summaryInitialDateLiteral }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryDateValue"], Location = new XlsxPointRange { Column = 3, Row = 6 }, Data = reportData.ConfiguracionInforme.FechaInicioPeriodo }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryLabel"], Location = new XlsxPointRange { Column = 2, Row = 7 }, Data = summaryEndDateLiteral }).Insert(new InsertText { SheetName = summarySheetName, Style = CellStylesTable["SummaryDateValue"], Location = new XlsxPointRange { Column = 3, Row = 7 }, Data = reportData.ConfiguracionInforme.FechaFinPeriodo }); #endregion #endregion #region Sheet 2 #region Sheet 2 > Populates data table var localId = -1; var headerLocation = new XlsxPointRange { Column = 3, Row = 2 }; var dateAxisLocation = new XlsxPointRange { Column = 2, Row = 3 }; var parameterValueLocation = new XlsxPointRange { Column = 3, Row = 3 }; var localHeaderStyle = CellStylesTable["LocalHeader"]; foreach (var local in localsToPrint) { // Defines local header text string localName = local.Nombre; if (localName.Equals("Suma", StringComparison.OrdinalIgnoreCase)) { localName = sumLiteral; } else if (localName.Equals("Media", StringComparison.OrdinalIgnoreCase)) { localName = averageLiteral; } // Defines local style localHeaderStyle.Name = $"LocalHeader{localId}"; localHeaderStyle.Content.Color = local.Color; doc.Insert(new InsertText { SheetName = rawDataSheetName, Data = localName, Location = headerLocation, Style = localHeaderStyle }); headerLocation.Offset(1, 0); localId++; var series = local.Series; foreach (var serie in series) { if (localId == 0) { doc.Insert(new InsertText { SheetName = rawDataSheetName, Data = serie.Fecha, Location = dateAxisLocation, Style = dateAxisStyle }); } doc.Insert(new InsertText { SheetName = rawDataSheetName, Data = serie.Valor, Location = parameterValueLocation, Style = CellStylesTable["ParameterValue"] }); dateAxisLocation.Offset(0, 1); parameterValueLocation.Offset(0, 1); } parameterValueLocation = new XlsxPointRange { Column = parameterValueLocation.Column + 1, Row = 3 }; } #endregion #region Sheet 2 > Insert autofilter doc.Insert(new InsertAutoFilter { SheetName = rawDataSheetName, Location = new XlsxStringRange { Address = "C2:E2" } }); #endregion #region Sheet 2 > Insert Mini-Charts doc.Insert(new InsertMiniChart { SheetName = rawDataSheetName, Location = new XlsxPointRange { Column = 3, Row = 33 }, // B3:B33 MiniChart = new XlsxMiniChart { Name = "MiniChart1", EmptyValueAs = MiniChartEmptyValuesAs.Gap, ChartAxes = { Horizontal = { Type = MiniChartHorizontalAxisType.Date } }, ChartSize = { VerticalCells = 3, HorizontalCells = 3 }, ChartRanges = { Axis = new XlsxRange { Start = { Column= 2, Row = 3 }, End = { Column = 2, Row = 32 } }, //B3:B32 Data = new XlsxStringRange { Address = "C3:C32" } }, ChartType = { Active = MiniChartType.Line, Column = { Serie = { Color = "#FF5733" }, Points = { First = { Color = "Yellow" }, Last = { Color = "Black" }, High = { Color = "Blue" }, Low = { Color = "Green" }, Negative = { Color = "Red" } } }, Line = { Serie = { Color = "#FF5733" }, Points = { First = { Color = "Yellow" }, Last = { Color = "Black" }, High = { Color = "Blue" }, Low = { Color = "Green" }, Negative = { Color = "Red" } } }, WinLoss = { Serie = { Color = "#FF5733" }, Points = { First = { Color = "Yellow" }, Last = { Color = "Black" }, High = { Color = "Blue" }, Low = { Color = "Green" }, Negative = { Color = "Red" } } } } } }); #endregion #endregion #region Create output result var result = doc.CreateResult(new OutputResultConfig { AutoFitColumns = true }); if (!result.Success) { logger.Info(" > Error creating output result"); logger.Info($" > Error: {result.Errors.AsMessages().ToStringBuilder()}"); return; } #endregion #region Saves output result var saveResult = result.Result.Action(new SaveToFile { OutputPath = "~/Output/Sample05/Sample-05" }); if (!saveResult.Success) { logger.Info(" > Error while saving to disk"); logger.Info($" > Error: {saveResult.Errors.AsMessages().ToStringBuilder()}"); return; } logger.Info(" > Saved to disk correctly"); logger.Info(" > Path: ~/Output/Sample05/Sample-05.xlsx"); #endregion }
private static InsertResult InsertImpl(IInput context, Stream input, string sheetName, XlsxPointRange location, Dictionary <string, object> data, DictionaryStyles styles) { var outputStream = new MemoryStream(); try { using (var excel = new ExcelPackage(input)) { var ws = excel.Workbook.Worksheets.FirstOrDefault(worksheet => worksheet.Name.Equals(sheetName, StringComparison.OrdinalIgnoreCase)); if (ws == null) { return(InsertResult.CreateErroResult( $"Sheet '{sheetName}' not found", new InsertResultData { Context = context, InputStream = input, OutputStream = input })); } // cell styles > Headers XlsxCellStyle headerTextTextStyle = excel.CreateStyle(styles.Headers.Text); // cell styles > Values XlsxCellStyle valueTextTextStyle = excel.CreateStyle(styles.Values.Text); XlsxCellStyle valueDatetimeCellStyle = excel.CreateStyle(styles.Values.DateTime); XlsxCellStyle valueDecimalCellStyle = excel.CreateStyle(styles.Values.Decimal); var keys = data.Keys; foreach (var key in keys) { var isOdd = location.Row.IsOdd(); var headerCell = ws.Cells[location.Row, location.Column]; headerCell.StyleName = isOdd ? $"{headerTextTextStyle.Name}_Alternate" : headerTextTextStyle.Name ?? XlsxBaseStyle.NameOfDefaultStyle; headerCell.Value = key; var value = data[key]; var valueCell = ws.Cells[location.Row, location.Column + 1]; XlsxCellStyle styleToUse; switch (value) { case string _: styleToUse = valueTextTextStyle; break; case float _: case double _: styleToUse = valueDecimalCellStyle; break; case DateTime _: styleToUse = valueDatetimeCellStyle; break; default: styleToUse = valueTextTextStyle; break; } valueCell.StyleName = isOdd ? $"{styleToUse.Name}_Alternate" : styleToUse.Name ?? XlsxBaseStyle.NameOfDefaultStyle; valueCell.Value = styleToUse.Content.DataType.GetFormattedDataValue(value.ToString()).FormattedValue; location.Offset(0, 1); } excel.SaveAs(outputStream); return(InsertResult.CreateSuccessResult(new InsertResultData { Context = context, InputStream = input, OutputStream = outputStream })); } } catch (Exception ex) { return(InsertResult.FromException( ex, new InsertResultData { Context = context, InputStream = input, OutputStream = input })); } }