Изменение экспорта в Excel

Пример серверного расширения, позволяющего вмешаться в процесс экспорта представления в Excel.

namespace ExcelExportServerExtension
{
	public class ExcelExportServerExtension : WebClientExtension (1)
	{
        private readonly IServiceProvider _serviceProvider;

		public ExcelExportServerExtension(IServiceProvider serviceProvider) (2)
			: base(serviceProvider)
		{
            this._serviceProvider = serviceProvider;
		}

		#region Свойства

		public override string ExtensionName => Assembly.GetAssembly(typeof(ExcelExportServerExtension)).GetName().Name; (3)

		public override Version ExtensionVersion => new Version(FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).FileVersion); (4)

		#endregion Свойства

		#region Обработчики событий

        public override void InitializeContainer(ContainerBuilder containerBuilder) (5)
        {
			containerBuilder.RegisterType<ExcelExportExampleService>()
                .As<IExcelExportService>()
                .SingleInstance(); (6)
        }

		#endregion Обработчики событий
    }
}
1 Задаём описание расширения для WebClient, которое задано в текущей сборке.
2 Создаём новый экземпляр класса.
3 Получаем название расширения.
4 Получаем версию расширения.
5 Регистрируем типы в IoC контейнере.
6 Регистрируем тип ExcelExportExampleService как реализацию интерфейса IExcelExportService в containerBuilder.
Затем настраиваем собственные параметры экспорта:
namespace ExcelExportServerExtension.ExcelExport (1)
{
    public class ExcelExportExampleService : ExcelExportService
    {
        private readonly Color oddRowColor = Color.LightBlue; (2)

        protected override void ApplyWorkbookSettings(XLWorkbook workbook) (3)
        {
            foreach (var worksheet in workbook.Worksheets)
            {
                for (var i = 1; i < worksheet.RangeUsed().RowCount(); i += 2) (4)
                {
                    var row = worksheet.RangeUsed().Row(i);
                    row.Style.Fill.BackgroundColor = XLColor.FromColor(oddRowColor);
                }
            }
        }

        protected override string GetGridRowParamValueAsString(object paramValue) (5)
        {
            if (paramValue is DateTime dateTime) (6)
            {
                return dateTime.ToLongDateString();
            }

            return base.GetGridRowParamValueAsString(paramValue);
        }

        protected override IEnumerable<GridColumn> GetGridColumns(GridViewModel viewModel) =>
            viewModel.Columns.Select(gridColumn => CreateGridColumnModel(gridColumn, viewModel))
                .OrderBy(column => column.UserColumn?.Order ?? 0)
                .Select(column => column.GridColumn); (7)

        private static GridColumnModel CreateGridColumnModel(GridColumn gridColumn, GridViewModel viewModel) => new GridColumnModel
        {
            GridColumn = gridColumn,
            UserColumn = viewModel.GridUserSettings
                .GetColumnsForCurrentPresentation()
                .FirstOrDefault(x => x.Name == gridColumn.Name)
        };
    }
}
1 Описание класса, реализующего свой экспорт в Excel.
2 Изменяем цвет нечётных строк.
3 Модифицирует документ Excel.
4 Меняем фоновый цвет нечётных строк в таблице.
5 Получаем строковое значение ячейки таблицы.
6 Для ячейки типа DateTime устанавливаем длинный формат.
7 Получаем все колонки из грида и сортируем их по параметру Order.

Проверка примера

  1. Откройте папку в Веб-клиенте Docsvision.

  2. Нажмите кнопку "Экспортировать в Excel".

  3. Загрузится документ в формате .xlsx, содержащий выгрузку представления со всеми колонками и выделенными цветом нечетными строками.