zoukankan      html  css  js  c++  java
  • C# Excel导入导出

    目录

    1. 介绍:描述第三方类库NPOI以及Excel结构

    2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图、NOPI以及C#代码

    3. Excel导出:介绍C#如何调用NPOI进行Excel导出,包含:流程图、NOPI以、C#代码以及代码分析

    4. 源码下载:展示运行图及源码下载 

    1. 介绍

    1.1 第三方类库:NPOI

    说明:NPOI是POI项目的.NET 版本,可用于Excel、Word的读写操作。

    优点:不用装Office环境。

    下载地址:http://npoi.codeplex.com/releases

    1.2 Excel结构介绍

    工作簿(Workbook):每个Excel文件可理解为一个工作簿。

    工作表(Sheet):一个工作簿(Workbook)可以包含多个工作表。

    行(row):一个工作表(Sheet)可以包含多个行。

    2. Excel导入

    2.1 操作流程

    2.2 NPOI操作代码

    说明:把Excel文件转换为List<T>

    步骤:

    ①读取Excel文件并以此初始化一个工作簿(Workbook);

    ②从工作簿上获取一个工作表(Sheet);默认为工作薄的第一个工作表;

    ③遍历工作表所有的行(row);默认从第二行开始遍历,第一行(序号0)为单元格头部;

    ④遍历行的每一个单元格(cell),根据一定的规律赋值给对象的属性。

    代码:

    2.3 C#逻辑操作代码

    说明:对Excel转换后的List<T>进行后续操作;如:检测有效性、持久化存储等等

    步骤:

    ①调用2.2代码,把Excel文件转换为List<T>。

    ②对List<T>进行有效性检测:必填项是否为空、是否有重复记录等等。

    ③对List<T>进行持久化存储操作。如:存储到数据库。

    ④返回操作结果。

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    public void ImportExcel(HttpContext context)
    {
        StringBuilder errorMsg = new StringBuilder(); // 错误信息
        try
        {
     
            #region 1.获取Excel文件并转换为一个List集合
     
            // 1.1存放Excel文件到本地服务器
            HttpPostedFile filePost = context.Request.Files["filed"]; // 获取上传的文件
            string filePath = ExcelHelper.SaveExcelFile(filePost); // 保存文件并获取文件路径
     
            // 单元格抬头
            // key:实体对象属性名称,可通过反射获取值
            // value:属性对应的中文注解
            Dictionary<string, string> cellheader = new Dictionary<string, string> {
                { "Name", "姓名" },
                { "Age", "年龄" },
                { "GenderName", "性别" },
                { "TranscriptsEn.ChineseScores", "语文成绩" },
                { "TranscriptsEn.MathScores", "数学成绩" },
            };
     
            // 1.2解析文件,存放到一个List集合里
            List<UserEntity> enlist = ExcelHelper.ExcelToEntityList<UserEntity>(cellheader, filePath, out errorMsg);
     
            #endregion
     
            #region 2.对List集合进行有效性校验
     
            #region 2.1检测必填项是否必填
     
            for (int i = 0; i < enlist.Count; i++)
            {
                UserEntity en = enlist[i];
                string errorMsgStr = "第" + (i + 1) + "行数据检测异常:";
                bool isHaveNoInputValue = false; // 是否含有未输入项
                if (string.IsNullOrEmpty(en.Name))
                {
                    errorMsgStr += "姓名列不能为空;";
                    isHaveNoInputValue = true;
                }
                if (isHaveNoInputValue) // 若必填项有值未填
                {
                    en.IsExcelVaildateOK = false;
                    errorMsg.AppendLine(errorMsgStr);
                }
            }
     
            #endregion
     
            #region 2.2检测Excel中是否有重复对象
     
            for (int i = 0; i < enlist.Count; i++)
            {
                UserEntity enA = enlist[i];
                if (enA.IsExcelVaildateOK == false) // 上面验证不通过,不进行此步验证
                {
                    continue;
                }
     
                for (int j = i + 1; j < enlist.Count; j++)
                {
                    UserEntity enB = enlist[j];
                    // 判断必填列是否全部重复
                    if (enA.Name == enB.Name)
                    {
                        enA.IsExcelVaildateOK = false;
                        enB.IsExcelVaildateOK = false;
                        errorMsg.AppendLine("第" + (i + 1) + "行与第" + (j + 1) + "行的必填列重复了");
                    }
                }
            }
     
            #endregion
     
            // TODO:其他检测
     
            #endregion
     
            // 3.TODO:对List集合持久化存储操作。如:存储到数据库
             
            // 4.返回操作结果
            bool isSuccess = false;
            if (errorMsg.Length == 0)
            {
                isSuccess = true; // 若错误信息成都为空,表示无错误信息
            }
            var rs = new { success = isSuccess,  msg = errorMsg.ToString(), data = enlist };
            System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
            context.Response.ContentType = "text/plain";
            context.Response.Write(js.Serialize(rs)); // 返回Json格式的内容
        }
        catch (Exception ex)
        {
         throw ex;
        }
    }

      

    3. Excel导出

    3.1 导出流程

    3.2 NPOI操作代码

    说明:把List<T>转换为Excel

    步骤:

    ①创建一个工作簿(Workbook);

    ②在工作簿上创建一个工作表(Sheet);

    ③在工作表上创建第一行(row),第一行为列头,依次写入cellHeard的值(做为列名)。

    ④循环遍历List<T>集合,每循环一遍创建一个行(row),然后根据cellHeard的键(属性名称)依次从List<T>中的实体对象取值存放到单元格内。

    代码:

    3.3 C#逻辑操作代码

    说明:对Excel转换后的List<T>进行后续操作;如:检测有效性、持久化存储等等

    步骤:

    ①获取List<T>集合。

    ②调用3.2,将List<T>转换为Excel文件。

    ③服务器存储Excel文件并返回下载链接。

    代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    public void ExportExcel(HttpContext context)
    {
        try
        {
            // 1.获取数据集合
            List<UserEntity> enlist = new List<UserEntity>() {
                new UserEntity{Name="刘一",Age=22,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=80,MathScores=90}},
                new UserEntity{Name="陈二",Age=23,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=81,MathScores=91} },
                new UserEntity{Name="张三",Age=24,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=82,MathScores=92} },
                new UserEntity{Name="李四",Age=25,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=83,MathScores=93} },
                new UserEntity{Name="王五",Age=26,Gender="Male",TranscriptsEn=new TranscriptsEntity{ChineseScores=84,MathScores=94} },
            };
     
            // 2.设置单元格抬头
            // key:实体对象属性名称,可通过反射获取值
            // value:Excel列的名称
            Dictionary<string, string> cellheader = new Dictionary<string, string> {
                { "Name", "姓名" },
                { "Age", "年龄" },
                { "GenderName", "性别" },
                { "TranscriptsEn.ChineseScores", "语文成绩" },
                { "TranscriptsEn.MathScores", "数学成绩" },
            };
     
            // 3.进行Excel转换操作,并返回转换的文件下载链接
            string urlPath = ExcelHelper.EntityListToExcel2003(cellheader, enlist, "学生成绩");
            System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();
            context.Response.ContentType = "text/plain";
            context.Response.Write(js.Serialize(urlPath)); // 返回Json格式的内容
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    3.4 代码分析

    核心代码主要是cellheader与List<T>之间的映射关系:

    4. 源码下载

    4.1 运行图

  • 相关阅读:
    SharePoint 2013 图文开发系列之自定义字段
    SharePoint 2013 图文开发系列之Visual Studio 创建母版页
    SharePoint 2013 图文开发系列之代码定义列表
    SharePoint 2013 图文开发系列之计时器任务
    SharePoint 2013 图文开发系列之应用程序页
    SharePoint 2013 图文开发系列之事件接收器
    SharePoint 2013 图文开发系列之可视化WebPart
    SharePoint 2013 图文开发系列之WebPart
    SharePoint 2013 对二进制大型对象(BLOB)进行爬网
    SharePoint 2013 状态机工作流之日常报销示例
  • 原文地址:https://www.cnblogs.com/MuNet/p/6688171.html
Copyright © 2011-2022 走看看