zoukankan      html  css  js  c++  java
  • .NetCore实现Execl导入数据处理(EppLus、NPOI)

    1、Excel .xls 和 .xlsx 有什么区别?

    区别如下:
    1、文件格式不同。.xls 是一个特有的二进制格式,其核心结构是复合文档类型的结构,而.xlsx 的核心结构是 XML 类型的结构,
       采用的是基于 XML 的压缩方式,使其占用的空间更小。.xlsx 中最后一个 x 的意义就在于此。             
    2、版本不同。.xls是excel2003及以前版本生成的文件格式,而.xlsx是excel2007及以后版本生成的文件格式。
    3、兼容性不同。.xlsx格式是向下兼容的,可兼容.xls格式。
    

    2、一号种子选手(EppLus)

      EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组件,
      在导出Excel的时候不需要电脑上安装office,官网为:http://epplus.codeplex.com/。
      基本上Excel上的各种功能(例如图表、VBA、数据透视表、加密、数据验证等)Epplus都能实现,
      它的一个缺点就是不支持导出2003版的Excel,也就是.XLS文件。
    

    2.1 EppLus实现

    (1)添加包 EPPlus (注意:EPPlus.Core已弃用)
    (2)Execl导入数据使用EPPlus处理实例:
        /// <summary>
        /// 获取Exel批量用户数据(EppLus)
        /// </summary>
        /// <param name="context"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public List<BatchUsersReq> GetBatchUsersData(HttpContext context,out string msg)
        {
            msg = "数据处理成功";
            // 获取上传文件后缀
            var extension = Path.GetExtension(context.Request.Form.Files[0].FileName).ToUpper();
            if(!extension.Contains("XLSX"))
            {
                msg = "文件格式不正确,只支持XLSX文件";
                return null;
            }
            // 限制单次只能上传5M
            float fileSize = context.Request.Form.Files[0].Length / 1024 / 1024;
            if(fileSize > 5)
            {
                msg = "文件大小超过限制";
                return null;
            }
            try 
            {
                Stream stream = context.Request.Form.Files[0].OpenReadStream();
                using (var package = new ExcelPackage(stream))
                {
                    // 获取Exel指定工作簿,"Sheet1"也可以用索引代替
                    ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];
                    // 获取数据行数
                    int RowNum = worksheet.Dimension.Rows;
                    // 待处理数据存储列表
                    List<BatchUsersReq> usersData = new List<BatchUsersReq>();
                    // 获取每行数据
                    for (int row = 1; row <= RowNum; row++)
                    {
                        usersData.Add(new BatchUsersReq
                        {
                            // 获取每列数据
                            Account = worksheet.Cells[row, 1].Value.ToString(),
                            Password = worksheet.Cells[row, 2].Value.ToString(),
                            Name = worksheet.Cells[row, 3].Value.ToString(),
                            Sex = worksheet.Cells[row, 4].Value.ToString(),
                            UserRole = worksheet.Cells[row, 5].Value.ToString()
                        });
                    }
                    return usersData;
                }
            }
            catch(Exception e)
            {
                msg = "数据异常";
            }
            return null;
        }
    

    3、二号种子选手(NPOI)

      NPOI是一个开源项目,可以读/写xls,doc,ppt文件,有着广泛的应用。NPIO官网地址:http://npoi.codeplex.com/
      使用NPOI能够帮助开发者在没有安装微软Office的情况下读写Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。
      NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况 下对Word/Excel文档进行读写操作。
    

    3.1 NPOI实现

      (1)添加包 DotNetCore.NPOI
      (2)Execl导入数据使用EPPlus处理实例:
            /// <summary>
        /// 获取Execl批量用户数据 NPOI
        /// </summary>
        /// <param name="file">execl</param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public List<BatchUsersReq> GetBatchUsersData(IFormFile file,out string msg)
        {
            msg = "数据处理成功";
            // 获取上传文件后缀
            string ext = Path.GetExtension(file.FileName).ToLower();
            if(!ext.Contains("xls") && !ext.Contains("xlsx"))
            {
                msg = "文件有误,只支持上传XLS、XLSX文件";
                return null;
            }
            // 限制单次只能上传5M
            float fileSize = file.Length / 1024 / 1024;
            if (fileSize > 5)
            {
                msg = "文件大小超过限制";
                return null;
            }
            try
            {
                // 文件流处理
                MemoryStream ms = new MemoryStream();
                file.CopyTo(ms);
                ms.Seek(0, SeekOrigin.Begin);
                // 根据Excel版本进行处理
                IWorkbook workbook = ext == ".xls" ? (IWorkbook)new HSSFWorkbook(ms) : new XSSFWorkbook(ms);
                // 获取Excel第一张工作簿
                ISheet sheet = workbook.GetSheetAt(0);
                // 获取数据行数
                int num = sheet.LastRowNum;
                // 待处理用户数据
                List<BatchUsersReq> users = new List<BatchUsersReq>();
                for (int i = 1; i <= num; i++)
                {
                    // 获取指定行数据
                    IRow row = sheet.GetRow(i);
                    BatchUsersReq user = new BatchUsersReq();
                    // 获取指定列数据
                    user.Account = row.GetCell(0).ToString();
                    user.Password = row.GetCell(1).ToString();
                    user.Name = row.GetCell(2).ToString();
                    user.Sex = row.GetCell(3).ToString();
                    user.UserRole = row.GetCell(4).ToString();
                    users.Add(user);
                }
                return users;
            }
            catch(Exception e)
            {
                msg = "数据处理出错";
            }
            return null;
        }
    

    4、踩坑心得

       在使用一个库之前一定要多了解全面,多几个库对比然后选择符合自己需求的。
       我刚开始参考的EppLus博文里面并没有说Epplus不支持.xls,IF判断逻辑也是两种都支持。
       而我恰巧是上传的.xls格式,导致代码在读取工作簿的时候就报错,我以为是文件流的问题导致读取不到所以折腾了很久。
       后来百度知道了Epplus不支持.xls,于是机智的我的直接手动把.xls改成了.xlsx。(哭唧唧) 
       结果当然还是不行,于是我又几番百度了解到了NPOI……
  • 相关阅读:
    Codeforces Round #710 (Div. 3)
    Codeforces Round #708(Unrated on Div. 2)
    [JSOI2014]学生选课(二分+2-SAT)
    Educational Codeforces Round 103 (Rated for Div. 2)爆炸记
    AtCoder Beginner Contest 190
    GPU服务器centos7.4下安装jupyter后调用py文件以及调用失败的解决办法
    关于在centos7.4原来python2.7.5更新到python3.6或更高版本时注意事项
    Selenium初步应用
    CentOS利用docker安装MySQL5.7
    CentOS 常用命令
  • 原文地址:https://www.cnblogs.com/hzpeng/p/13441431.html
Copyright © 2011-2022 走看看