protected virtual void WriteRecords(IEnumerable source, IExcelReportConfiguration config, TypeAccessor.TypeAccessor accessor) { var memberOptions = config.MemberConfigurations.GetActiveOrderlyOptions().ToList(); int countRows = CountRows(source); var cacheFormatterExpression = new Dictionary <string, Func <object, string> >(); int excelRowsCount = memberOptions.Max(r => r.RowSpan) * countRows; int excelColSpanCount = memberOptions.Sum(r => r.ColSpan); var data = new object[excelRowsCount, excelColSpanCount]; var insertedRowFromSource = -1; foreach (var row in source) { insertedRowFromSource++; var columnIndex = -1; foreach (var options in memberOptions) { object value = accessor.GetValue(row, options.MemberName); if (!options.IsStyleSet && config.Options.IsSetDefaultStyle) { options.IsStyleSet = config.Options.IsSetDefaultStyle; options.StyleName = config.Options.DefaultStyleName; } string formattedValue = null; if (options.Formatter != null) { formattedValue = options.Formatter.Format(value); } else if (options.FormatterExpression != null) { if (!cacheFormatterExpression.ContainsKey(options.MemberName)) { cacheFormatterExpression[options.MemberName] = ReportHelper.ReportHelper.CreateFormatFunc(value, options.FormatterExpression); } formattedValue = cacheFormatterExpression[options.MemberName](value); } for (var rowIndex = 0; rowIndex < options.RowSpan; rowIndex++) { for (var colIndex = 0; colIndex < options.ColSpan; colIndex++) { columnIndex++; data[insertedRowFromSource + rowIndex, columnIndex] = formattedValue ?? value; } } } } var prevCursor = (Cursor)Cursor.Clone(); WriteData(data); ApplyStyleForWrittenData(prevCursor, config, memberOptions, data); }
protected virtual void WriteHeader(IExcelReportConfiguration config) { if (config.Options.IsHideHeader) { return; } var memberOptions = config.MemberConfigurations.GetActiveOrderlyOptions(); foreach (var options in memberOptions) { string header = options.GetHeader(config.Options.UseHeaderHumanizer); if (!options.IsHeaderStyleSet && !config.Options.IsSetHeaderStyle && config.Options.IsSetDefaultStyle) { options.HeaderStyle = config.Options.DefaultStyle; options.HeaderStyleName = config.Options.DefaultStyleName; } WriteMember(header, options, DisplayType.Inline, true); } Cursor.CurrentRow++; Cursor.CurrentColumn = StartColumn; }
private void Write(IEnumerable source, IExcelReportConfiguration config, TypeAccessor.TypeAccessor accessor) { if (config.Options.IsSetHeaderStyle) { var headerCells = GetHeaderRange(Worksheet, config, Cursor); ExcelStyleApplier.ApplyStyle(config.Options.HeaderStyleName, config.Options.HeaderStyle, headerCells); } WriteHeader(config); WriteRecords(source, config, accessor); }
public void Write <T>(IEnumerable <T> source, IExcelReportConfiguration configuration) where T : class { if (source is null) { throw new ArgumentNullException(nameof(source)); } var accessor = new TypeAccessor <T>(); Write(source, configuration, accessor); }
private static ExcelRange GetHeaderRange(ExcelWorksheet worksheet, IExcelReportConfiguration config, Cursor cursor) { var columnCount = 0; var memberOptions = config.MemberConfigurations.GetActiveOrderlyOptions(); foreach (var column in memberOptions) { columnCount += column.ColSpan; } var endColumn = cursor.CurrentColumn + columnCount - 1; return(worksheet.Cells[cursor.CurrentRow, cursor.CurrentColumn, cursor.CurrentRow, endColumn]); }
protected virtual TSheetBuilder DataContentInternal <T>(IEnumerable <T> data, IExcelReportConfiguration configuration) where T : class { var writer = new ExcelDataWriter(Worksheet, StyleApplier, Cursor, InitColumnNumber); writer.Write(data, configuration); return((TSheetBuilder)this); }
public virtual ISheetBuilder DataContent <T>(IEnumerable <T> data, IExcelReportConfiguration configuration) where T : class { return(base.DataContentInternal(data, configuration)); }
private void ApplyStyleForWrittenData(Cursor prevCursor, IExcelReportConfiguration config, IReadOnlyCollection <IExcelMemberOptions> memberOptions, object[,] data) { var alternativeCursor = (Cursor)prevCursor.Clone(); var rowsCount = data.GetLength(0); if (rowsCount == 0) { return; } var maxRow = GetLastMemberPosition(alternativeCursor.CurrentRow, rowsCount); var maxColumn = data.GetLength(1); var allRange = Worksheet.Cells[2, 1, maxRow, maxColumn]; // set default style for all cells for performance reasons var optionsWithStyle = memberOptions.FirstOrDefault(x => x.IsStyleSet); if (optionsWithStyle != null) { ApplyStylesForRange(allRange, optionsWithStyle); } // set default background color for all cells for performance reasons if (config.Options.HasAlternateBackgroundColor && config.Options.AlternateBackgroundColors?.Count > 0) { if (optionsWithStyle is null || allRange.Style.Fill.PatternType != ExcelFillStyle.Solid) { allRange.Style.Fill.PatternType = ExcelFillStyle.Solid; } allRange.Style.Fill.BackgroundColor.SetColor(config.Options.AlternateBackgroundColors[0].Value); } var currentMemberColumn = prevCursor.CurrentColumn; foreach (var options in memberOptions) { var lastMemberRow = GetLastMemberPosition(prevCursor.CurrentRow, rowsCount); var lastMemberColumn = GetLastMemberPosition(currentMemberColumn, options.ColSpan); var columnRange = allRange[prevCursor.CurrentRow, currentMemberColumn, lastMemberRow, lastMemberColumn]; if (!string.IsNullOrWhiteSpace(options.FormatNumber)) { columnRange.Style.Numberformat.Format = options.FormatNumber; } object value = data[0, currentMemberColumn - 1]; if ((value is DateTime || value is DateTimeOffset) && IsDefaultFormatNumber(columnRange) && DateTimeFormatInfo.CurrentInfo != null && columnRange.Style.Numberformat.Format != DateTimeFormatInfo.CurrentInfo.ShortDatePattern) { columnRange.Style.Numberformat.Format = DateTimeFormatInfo.CurrentInfo.ShortDatePattern; } ApplyStylesForRange(columnRange, options); currentMemberColumn = lastMemberColumn + 1; } if (config.Options.HasAlternateBackgroundColor) { ApplyAlternativeBackgroundColors(config.Options.AlternateBackgroundColors, allRange, maxRow, maxColumn); } }