示例#1
0
        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);
        }
示例#2
0
        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;
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }
示例#5
0
        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]);
        }
示例#6
0
        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);
        }
示例#7
0
 public virtual ISheetBuilder DataContent <T>(IEnumerable <T> data, IExcelReportConfiguration configuration)
     where T : class
 {
     return(base.DataContentInternal(data, configuration));
 }
示例#8
0
        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);
            }
        }