/// <summary>
 /// Configure excel author
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="title">excel document title</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasTitle(this IExcelConfiguration configuration, string title)
 {
     return(configuration.HasExcelSetting(setting =>
     {
         setting.Title = title;
     }));
 }
 /// <summary>
 /// Configure excel author
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="category">excel document category</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasCategory(this IExcelConfiguration configuration, string category)
 {
     return(configuration.HasExcelSetting(setting =>
     {
         setting.Category = category;
     }));
 }
 /// <summary>
 /// Configure excel author
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="author">excel document author name</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasAuthor(this IExcelConfiguration configuration, string author)
 {
     return(configuration.HasExcelSetting(setting =>
     {
         setting.Author = author;
     }));
 }
 /// <summary>
 /// Configure excel author
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="company">excel document company</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasCompany(this IExcelConfiguration configuration, string company)
 {
     return(configuration.HasExcelSetting(setting =>
     {
         setting.Company = company;
     }));
 }
 /// <summary>
 /// Configure excel author
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="subject">excel document subject</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasSubject(this IExcelConfiguration configuration, string subject)
 {
     return(configuration.HasExcelSetting(setting =>
     {
         setting.Subject = subject;
     }));
 }
 /// <summary>
 /// Configure excel author
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="description">excel document description</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasDescription(this IExcelConfiguration configuration, string description)
 {
     return(configuration.HasExcelSetting(setting =>
     {
         setting.Description = description;
     }));
 }
 /// <summary>
 /// Sheet Configuration
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="sheetIndex">sheetIndex</param>
 /// <param name="sheetName">sheetName</param>
 /// <param name="startRowIndex">startRowIndex</param>
 /// <param name="enableAutoColumnWidth">enable auto column width if true otherwise false</param>
 /// <param name="endRowIndex">endRowIndex, set this if you wanna control where to end(included)</param>
 /// <returns>current excel configuration<see cref="IExcelConfiguration"/></returns>
 public static IExcelConfiguration HasSheetConfiguration(this IExcelConfiguration configuration, int sheetIndex, string sheetName, int startRowIndex,
                                                         bool enableAutoColumnWidth, int?endRowIndex = null) => configuration.HasSheetSetting(config =>
 {
     config.SheetName              = sheetName;
     config.StartRowIndex          = startRowIndex;
     config.AutoColumnWidthEnabled = enableAutoColumnWidth;
     config.EndRowIndex            = endRowIndex;
 }, sheetIndex);
        /// <summary>
        ///     Generic extension method yielding objects of specified type from the ExcelWorksheet
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="worksheet"></param>
        /// <param name="onCaught"></param>
        /// <param name="configurationAction"></param>
        /// <returns></returns>
        public static IEnumerable <T> AsEnumerable <T>(this ExcelWorksheet worksheet, OnCaught <T> onCaught = null, Action <IExcelConfiguration <T> > configurationAction = null) where T : class, new()
        {
            IExcelConfiguration <T> configuration = DefaultExcelConfiguration <T> .Instance;

            configurationAction?.Invoke(configuration);

            return(worksheet.AsExcelTable(configuration.HasHeaderRow).AsEnumerable(onCaught, configurationAction));
        }
Exemple #9
0
        /// <summary>
        ///     Generic extension method yielding objects of specified type from table.
        /// </summary>
        /// <remarks>
        ///     Exceptions are not catched. It works on all or nothing basis.
        ///     Only primitives and enums are supported as property.
        ///     Currently supports only tables with header.
        /// </remarks>
        /// <typeparam name="T">Type to map to. Type should be a class and should have parameterless constructor.</typeparam>
        /// <param name="table">Table object to fetch</param>
        /// <param name="onCaught"></param>
        /// <param name="configurationAction"></param>
        /// <returns>An enumerable of the generating type</returns>
        public static IEnumerable <T> AsEnumerable <T>(this ExcelTable table, OnCaught <T> onCaught = null, Action <IExcelConfiguration <T> > configurationAction = null) where T : class, new()
        {
            IExcelConfiguration <T> configuration = DefaultExcelConfiguration <T> .Instance;

            configurationAction?.Invoke(configuration);

            List <KeyValuePair <int, PropertyInfo> > mapping = PrepareMappings <T>(table);

            ExcelAddress bounds = table.GetDataBounds();

            // Parse table
            for (int row = bounds.Start.Row; row <= bounds.End.Row; row++)
            {
                var item = (T)Activator.CreateInstance(typeof(T));

                foreach (KeyValuePair <int, PropertyInfo> map in mapping)
                {
                    object cell = table.WorkSheet.Cells[row, map.Key + table.Address.Start.Column].Value;

                    PropertyInfo property = map.Value;

                    try
                    {
                        TrySetProperty(item, property, cell);
                    }
                    catch (Exception ex)
                    {
                        if (!configuration.SkipCastingErrors)
                        {
                            var exceptionArgs = new ExcelTableExceptionArgs
                            {
                                ColumnName   = table.Columns[map.Key].Name,
                                ExpectedType = property.PropertyType,
                                PropertyName = property.Name,
                                CellValue    = cell,
                                CellAddress  = new ExcelCellAddress(row, map.Key + table.Address.Start.Column)
                            };

                            throw new ExcelTableConvertException($"The expected type of '{exceptionArgs.PropertyName}' property is '{exceptionArgs.ExpectedType.Name}', but the cell [{exceptionArgs.CellAddress.Address}] contains an invalid value.",
                                                                 ex, exceptionArgs
                                                                 );
                        }
                    }
                }

                onCaught?.Invoke(item, row);

                // TODO:
                if (!configuration.SkipValidationErrors)
                {
                    // Validate parsed object according to data annotations
                    item.Validate(row);
                }

                yield return(item);
            }
        }
Exemple #10
0
        /// <summary>
        ///     Adds a column mapping.  If no column mappings are specified all public properties will be used
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="worksheet"></param>
        /// <param name="map"></param>
        /// <param name="columnHeader"></param>
        /// <param name="configurationAction"></param>
        /// <returns></returns>
        public static WorksheetWrapper <T> WithColumn <T>(this WorksheetWrapper <T> worksheet, Func <T, object> map,
                                                          string columnHeader, Action <IExcelConfiguration <T> > configurationAction = null)
        {
            IExcelConfiguration <T> configuration = DefaultExcelConfiguration <T> .Instance;

            configurationAction?.Invoke(configuration);

            worksheet.Columns.Add(new WorksheetColumn <T>
            {
                Map             = map,
                ConfigureHeader = configuration.ConfigureHeader,
                ConfigureColumn = configuration.ConfigureColumn,
                Header          = columnHeader,
                ConfigureCell   = configuration.ConfigureCell
            });
            return(worksheet);
        }
Exemple #11
0
        /// <summary>
        ///     Generates an Excel worksheet from a list
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="rows"></param>
        /// <param name="name"></param>
        /// <param name="configurationAction"></param>
        /// <returns></returns>
        public static WorksheetWrapper <T> ToWorksheet <T>(this IEnumerable <T> rows, string name, Action <IExcelConfiguration <T> > configurationAction = null)
        {
            IExcelConfiguration <T> configuration = DefaultExcelConfiguration <T> .Instance;

            configurationAction?.Invoke(configuration);

            var worksheet = new WorksheetWrapper <T>
            {
                Name               = name,
                Package            = new ExcelPackage(),
                Rows               = rows,
                Columns            = new List <WorksheetColumn <T> >(),
                ConfigureHeader    = configuration.ConfigureHeader,
                ConfigureColumn    = configuration.ConfigureColumn,
                ConfigureHeaderRow = configuration.ConfigureHeaderRow,
                ConfigureCell      = configuration.ConfigureCell
            };

            return(worksheet);
        }
Exemple #12
0
        /// <summary>
        ///     Starts new worksheet on same Excel package
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="K"></typeparam>
        /// <param name="previousSheet"></param>
        /// <param name="rows"></param>
        /// <param name="name"></param>
        /// <param name="configurationAction"></param>
        /// <returns></returns>
        public static WorksheetWrapper <T> NextWorksheet <T, K>(this WorksheetWrapper <K> previousSheet, IEnumerable <T> rows, string name, Action <IExcelConfiguration <T> > configurationAction = null)
        {
            previousSheet.AppendWorksheet();

            IExcelConfiguration <T> configuration = DefaultExcelConfiguration <T> .Instance;

            configurationAction?.Invoke(configuration);

            var worksheet = new WorksheetWrapper <T>
            {
                Name               = name,
                Package            = previousSheet.Package,
                Rows               = rows,
                Columns            = new List <WorksheetColumn <T> >(),
                ConfigureHeader    = configuration.ConfigureHeader ?? previousSheet.ConfigureHeader,
                ConfigureColumn    = configuration.ConfigureColumn ?? previousSheet.ConfigureColumn,
                ConfigureHeaderRow = configuration.ConfigureHeaderRow ?? previousSheet.ConfigureHeaderRow,
                ConfigureCell      = configuration.ConfigureCell
            };

            return(worksheet);
        }
 public void Configure(IExcelConfiguration <Notice> noticeSetting)
 {
     noticeSetting
     .HasAuthor("WeihanLi")
     .HasTitle("WeihanLi.Npoi test")
     .HasSheetSetting(setting =>
     {
         setting.SheetName = "NoticeList";
         setting.AutoColumnWidthEnabled = true;
     })
     ;
     noticeSetting.Property(_ => _.Id)
     .HasColumnIndex(0);
     noticeSetting.Property(_ => _.Title)
     .HasColumnIndex(1);
     noticeSetting.Property(_ => _.Content)
     .HasColumnIndex(2);
     noticeSetting.Property(_ => _.Publisher)
     .HasColumnIndex(3);
     noticeSetting.Property(_ => _.PublishedAt)
     .HasColumnIndex(4)
     .HasColumnOutputFormatter(x => x.ToStandardTimeString());
 }
Exemple #14
0
 /// <summary>
 /// property configuration
 /// </summary>
 /// <typeparam name="TEntity">TEntity</typeparam>
 /// <param name="excelConfiguration">excelConfiguration</param>
 /// <param name="propertyName">propertyName</param>
 /// <returns>PropertyConfiguration</returns>
 public static IPropertyConfiguration <TEntity, string> Property <TEntity>(
     this IExcelConfiguration <TEntity> excelConfiguration, string propertyName) =>
 excelConfiguration.Property <string>(propertyName);
Exemple #15
0
 /// <summary>
 ///     Sheet Configuration
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="sheetIndex">sheetIndex</param>
 /// <param name="sheetName">sheetName</param>
 /// <param name="startRowIndex">startRowIndex</param>
 /// <returns>current excel configuration</returns>
 public static IExcelConfiguration HasSheetConfiguration(this IExcelConfiguration configuration, int sheetIndex,
                                                         string sheetName, int startRowIndex) => configuration.HasSheetSetting(config =>
 {
     config.SheetName     = sheetName;
     config.StartRowIndex = startRowIndex;
 }, sheetIndex);
Exemple #16
0
 /// <summary>
 /// Sheet Configuration
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="sheetIndex">sheetIndex</param>
 /// <param name="sheetName">sheetName</param>
 /// <param name="startRowIndex">startRowIndex</param>
 /// <returns>current excel configuration</returns>
 public static IExcelConfiguration HasSheetConfiguration(this IExcelConfiguration configuration, int sheetIndex,
                                                         string sheetName, int startRowIndex) => configuration.HasSheetConfiguration(sheetIndex, sheetName, startRowIndex, false);
Exemple #17
0
 /// <summary>
 /// Sheet Configuration
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="sheetIndex">sheetIndex</param>
 /// <param name="sheetName">sheetName</param>
 /// <param name="enableAutoColumnWidth">enable auto column width if true otherwise false</param>
 /// <returns>current excel configuration</returns>
 public static IExcelConfiguration HasSheetConfiguration(this IExcelConfiguration configuration, int sheetIndex,
                                                         string sheetName, bool enableAutoColumnWidth) => configuration.HasSheetConfiguration(sheetIndex, sheetName, 1, enableAutoColumnWidth);
Exemple #18
0
            public void Configure(IExcelConfiguration <TestEntity> setting)
            {
                // ExcelSetting
                setting.HasAuthor("WeihanLi")
                .HasTitle("WeihanLi.Npoi test")
                .HasDescription("WeihanLi.Npoi test")
                .HasSubject("WeihanLi.Npoi test");

                setting.HasSheetSetting(config =>
                {
                    config.StartRowIndex          = 1;
                    config.SheetName              = "SystemSettingsList";
                    config.AutoColumnWidthEnabled = true;

                    config.RowAction = row =>
                    {
                        if (row.RowNum == 0)
                        {
                            var style       = row.Sheet.Workbook.CreateCellStyle();
                            style.Alignment = HorizontalAlignment.Center;
                            var font        = row.Sheet.Workbook.CreateFont();
                            font.FontName   = "JetBrains Mono";
                            font.IsBold     = true;
                            font.FontHeight = 200;
                            style.SetFont(font);
                            row.Cells.ForEach(c => c.CellStyle = style);
                        }
                    };
                });

                // setting.HasFilter(0, 1).HasFreezePane(0, 1, 2, 1);

                setting.Property(_ => _.SettingId)
                .HasColumnIndex(0);

                setting.Property(_ => _.SettingName)
                .HasColumnTitle("SettingName")
                .HasColumnIndex(1);

                setting.Property(_ => _.DisplayName)
                .HasOutputFormatter((entity, displayName) => $"AAA_{entity?.SettingName}_{displayName}")
                .HasInputFormatter((entity, originVal) => originVal?.Split(new[] { '_' })[2])
                .HasColumnTitle("DisplayName")
                .HasColumnIndex(2);

                setting.Property(_ => _.SettingValue)
                .HasColumnTitle("SettingValue")
                .HasColumnIndex(3);

                setting.Property(_ => _.CreatedTime)
                .HasColumnTitle("CreatedTime")
                .HasColumnIndex(4)
                .HasColumnWidth(10)
                .HasColumnFormatter("yyyy-MM-dd HH:mm:ss");

                setting.Property(_ => _.CreatedBy)
                .HasColumnInputFormatter(x => x += "_test")
                .HasColumnIndex(4)
                .HasColumnTitle("CreatedBy");

                setting.Property(x => x.Enabled)
                .HasColumnInputFormatter(val => "Enabled".EqualsIgnoreCase(val))
                .HasColumnOutputFormatter(v => v ? "Enabled" : "Disabled");

                setting.Property("HiddenProp")
                .HasOutputFormatter((entity, val) => $"HiddenProp_{entity?.PKID}");

                setting.Property(_ => _.PKID).Ignored();
                setting.Property(_ => _.UpdatedBy).Ignored();
                setting.Property(_ => _.UpdatedTime).Ignored();
            }
 /// <summary>
 /// 初始化
 /// </summary>
 /// <param name="configuration">Excel配置</param>
 public abstract void Init(IExcelConfiguration <TEntity> configuration);
Exemple #20
0
 /// <summary>
 ///     Sheet Configuration
 /// </summary>
 /// <param name="configuration">excel configuration</param>
 /// <param name="sheetIndex">sheetIndex</param>
 /// <param name="sheetName">sheetName</param>
 /// <param name="enableAutoColumnWidth">enable auto column width if true otherwise false</param>
 /// <returns>current excel configuration</returns>
 public static IExcelConfiguration HasSheetConfiguration(this IExcelConfiguration configuration, int sheetIndex,
                                                         string sheetName, bool enableAutoColumnWidth) => configuration.HasSheetSetting(config =>
 {
     config.SheetName = sheetName;
     config.AutoColumnWidthEnabled = enableAutoColumnWidth;
 }, sheetIndex);