• NPOI读写Excel组件封装Excel导入导出组件


      后台管理系统多数情况会与Excel打交道,常见的就是Excel的导入导出,对于Excel的操作往往是繁琐且容易出错的,对于后台系统的导入导出交互过程往往是固定的,对于这部分操作,我们可以抽离出公共组件,供所有系统使用,本文采用NPOI操作Excel组件封装导入导出Excel功能组件,项目地址:https://github.com/kuangqifu/CK.Sprite.Excel

    特性说明

    围绕自定义模板操作Excel

     导入导出都围绕自定义模板进行控制,模板可以定义字段名称、字段类型、字段长度、是否必填等,组件自动根据模板生成或者验证导入的Excel,模板定义如下:

    public class ExcelTemplate
        {
            /// <summary>
            /// 字段名称
            /// </summary>
            public string Field { get; set; }
    
            /// <summary>
            /// 列称
            /// </summary>
            public string Name { get; set; }
    
            /// <summary>
            /// 字段类型
            /// </summary>
            public EFieldType FieldType { get; set; }
    
            /// <summary>
            /// 列宽(显示多少个字符)
            /// </summary>
            public int CellLength { get; set; }
    
            /// <summary>
            /// Excel下拉值(如果是数据字典,读取数据字典内容)
            /// </summary>
            public List<string> DictionaryItems { get; set; }
    
            /// <summary>
            /// 导出模版备注
            /// </summary>
            public string ExportComments { get; set; }
    
            /// <summary>
            /// 导入 是否必填
            /// </summary>
            public bool IsRequred { get; set; }
    
            /// <summary>
            /// 导入 验证类型
            /// </summary>
            public EValidateType ValidateType { get; set; }
    
            /// <summary>
            /// 导入 验证类型为String时,验证长度,为Regular,为正则表达式
            /// </summary>
            public string ValidateValue { get; set; }
        }

    多表头支持

     导出数据时,对于有一些复杂数据,可能需要合并表头,组件支持自定义复杂表头,自定义表头需要计算好字段占用的行列信息

    public class MultiHeaderInfo
        {
            public string Name { get; set; }
            public int ColSpan { get; set; } = 1;
            public int RowSpan { get; set; } = 1;
        }

    导入常规验证

      在模板中可以定义字段的约束信息,比如字段类型、长度、验证表达式等,在导入的时候,组件自动验证对应字段是否满足约束。

    导入自定义验证

      对于一些业务,常规验证不能满足情况时,组件可以允许用户传入验证委托函数,自定义验证逻辑。

    导入错误生成错误Excel

      导入Excel出错时,组件输出一个错误Excel,包括导入统计信息,导入出错行的原始数据,出错的行号,出错行的具体出错信息,如:

     自动生成导入模板

      可根据Excel模板配置信息,生成导入数据所需的模板,不需要每一个业务单独事先生成导入需要的静态Excel模板信息

    导出数据格式支持

      支持List<T>Datatable数据导出

    关于多表头说明:

      多表头导出的Header信息参数为List<List<MultiHeaderInfo>>类型,MultiHeaderInfo为具体Header列定义信息,参数意义:多个Header组成一行信息,有多行Header信息。

    使用时,需要用户做一定的计算,排在前面的行如果rowspan大于1,则后面的行的列索引标识已经使用,后面的行需要排除前面的表头占用了的列信息,有些绕口,代码参见如下代码:

    if (multiHeaderInfos != null && multiHeaderInfos.Count > 0) // 复杂表头合并等
                        {
                            List<int>[] usedCellIndexs = new List<int>[multiHeaderInfos.Count];
                            for (var i = 0; i < multiHeaderInfos.Count; i++)
                            {
                                usedCellIndexs[i] = new List<int>();
                            }
                            for (var i = 0; i < multiHeaderInfos.Count; i++)
                            {
                                var colIndex = 0;
                                var headerRow = sheet.CreateRow(i);
                                var headStyle = workbook.CreateCellStyle();
                                headStyle.Alignment = HorizontalAlignment.Center;
                                headStyle.VerticalAlignment = VerticalAlignment.Center;
                                var font = workbook.CreateFont();
                                font.FontHeightInPoints = 10;
                                font.IsBold = true;
                                headStyle.SetFont(font);
                                foreach (var multiHeaderInfo in multiHeaderInfos[i])
                                {
                                    while (true) // 找未使用的第一个单元格
                                    {
                                        if (!usedCellIndexs[i].Contains(colIndex))
                                        {
                                            break;
                                        }
                                        colIndex++;
                                    }
                                    headerRow.CreateCell(colIndex).SetCellValue(multiHeaderInfo.Name);
                                    var oldColIndex = colIndex;
                                    if (multiHeaderInfo.ColSpan > 1 || multiHeaderInfo.RowSpan > 1)
                                    {
                                        sheet.AddMergedRegion(new CellRangeAddress(i, i + multiHeaderInfo.RowSpan - 1, colIndex, colIndex + multiHeaderInfo.ColSpan - 1));
                                        if (multiHeaderInfo.RowSpan > 1)
                                        {
                                            for (var j = 1; j < multiHeaderInfo.RowSpan; j++)
                                            {
                                                for (var k = colIndex; k < colIndex + multiHeaderInfo.ColSpan; k++)
                                                {
                                                    usedCellIndexs[i + j].Add(k);
                                                }
                                            }
                                        }
                                        colIndex = colIndex + multiHeaderInfo.ColSpan;
                                    }
                                    else
                                    {
                                        colIndex++;
                                    }
                                    headerRow.GetCell(oldColIndex).CellStyle = headStyle;
                                }
                            }
                            rowIndex = multiHeaderInfos.Count;
                        }

      

    可以不用NPOI,用其他读写Excel组件逻辑基本上是一致的,欢迎使用,有问题及时交流,其他代码细节根据特性介绍参考项目源码。

  • 相关阅读:
    UVA 11859
    [OpenGL]OpenGL坐标系和坐标变换
    树状数组
    编程算法
    乞讨 间隔[a,b]在见面p^k*q*^m(k&gt;m)中数号码
    解析Android的 消息传递机制Handler
    Atitit.故障排除系列---php 计划网站数据库错误排除过程
    Remove Element
    [Angular Directive] Write a Structural Directive in Angular 2
    [Compose] 18. Maintaining structure whilst asyncing
  • 原文地址:https://www.cnblogs.com/spritekuang/p/13816740.html
Copyright © 2020-2023  润新知