C# NPOI流导出数据到Excel

开发工具与关键技术:VS2015,ASP.NET MVC

撰写时间:2019年5月16日

这里的NPOI导出数据用到的是SQL数据库,先引用数据库,接着实例化数据模型。
在这里插入图片描述
先说明一下这个逻辑关系

  1. 想要导出数据,那必须要先找到数据,用lingq语句查询数据
  2. 把数据转化为对象列表格式
  3. 创建工作簿(Excel)
  4. 为工作簿创建工作表并命名
  5. 创建表头
  6. 创建列并赋值
  7. 创建数据行
  8. 为工作簿命名
  9. 将Execl表格转化为流并输出,创建文件流
  10. 把文件写入流
  11. 输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置(开始导出数据的位置)
  12. 把表格以文件的格式返回

以上就是大概的逻辑思路,写代码前想把逻辑关系理清了,那写代码的思路就会清晰很多。

下面用一个例子来说明。

 public ActionResult ExportToExcel()
        {
            var dbTab = from tbHeroSame in myModel.A01_HeroSame
                        join tbHeroType in myModel.A02_HeroType on tbHeroSame.HeroSameID equals tbHeroType.HeroSameID
                        join tbHeroSkill in myModel.A03_HeroSkill on tbHeroType.HeroSkillID equals tbHeroSkill.HeroSkillID
                        join tbHeroMoney in myModel.A06_HeroMoney on tbHeroType.HeroMoneyID equals tbHeroMoney.HeroMoneyID
                        join tbHeroGold in myModel.A07_HeroGold on tbHeroType.HeroGoldID equals tbHeroGold.HeroGoldID
                        join tbHeroCapability in myModel.A04_HeroCapability on tbHeroType.HeroCapabilityID equals
                        tbHeroCapability.HeroCapabilityID
                        join tbHeroBattle in myModel.A05_HeroBattle on tbHeroType.HeroBattleID equals tbHeroBattle.HeroBattleID
                        orderby tbHeroType.HeroTypeID descending
                        select new HeroData
                        {
                            HeroSameID = tbHeroSame.HeroSameID,//英雄阵营ID
                            HeroSame = tbHeroSame.HeroSame,//英雄阵营
                            HeroTypeID = tbHeroType.HeroTypeID,//英雄类型ID
                            HeroTitle = tbHeroType.HeroTitle,//英雄昵称
                            HeroName = tbHeroType.HeroName,//英雄姓名
                            HeroSkillID = tbHeroSkill.HeroSkillID,//英雄技能ID
                            PassiveSkill = tbHeroSkill.PassiveSkill,//英雄被动技能
                            SkillQ = tbHeroSkill.skillQ,//英雄技能Q
                            SkillW = tbHeroSkill.skillW,//英雄技能W
                            SkillE = tbHeroSkill.skillE,//英雄技能E
                            SkillR = tbHeroSkill.skillR,//英雄技能R
                            HeroMoneyID = tbHeroMoney.HeroMoneyID,//点券ID
                            HeroMoney = tbHeroMoney.HeroMoney.ToString(),//点券
                            HeroGoldID = tbHeroGold.HeroGoldID,//金币ID
                            HeroGold = tbHeroGold.HeroGold.ToString(),//金币
                            HeroCapabilityID = tbHeroCapability.HeroCapabilityID,//伤害类型ID
                            HeroCapability = tbHeroCapability.HeroCapability,//伤害类型
                            HeroBattleID = tbHeroBattle.HeroBattleID,//攻击方式ID
                            HeroBattle = tbHeroBattle.HeroBattle,//攻击方式
                            HeroAddTime = tbHeroType.HeroAddTime.ToString()
                        };

            //将查询出来的数据转化为对象列表的格式
            List<HeroData> liatHero = dbTab.ToList();
            //创建工作簿
            HSSFWorkbook excelBook = new HSSFWorkbook();
            //为工作簿创建工作表并命名
            NPOI.SS.UserModel.ISheet sheet1 = excelBook.CreateSheet("LOL英雄数据");
            //创建表头
            NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0);//先创建一行用来放表头
            //创建7列并赋值
            row1.CreateCell(0).SetCellValue("英雄昵称");//第0行,第0列
            row1.CreateCell(1).SetCellValue("英雄名字");//第0行,第1列
            row1.CreateCell(2).SetCellValue("被动技能");//第0行,第2列
            row1.CreateCell(3).SetCellValue("技能Q");//第0行,第3列
            row1.CreateCell(4).SetCellValue("技能W");//第0行,第4列
            row1.CreateCell(5).SetCellValue("技能E");//第0行,第5列
            row1.CreateCell(6).SetCellValue("技能R");//第0行,第6列

            //创建数据行
            for (int i = 0; i < dbTab.Count(); i++)
            {
                //创建行
                NPOI.SS.UserModel.IRow rowTemp = sheet1.CreateRow(i + 1);//因为第一行已经被表头占用了,所以要+1
                rowTemp.CreateCell(0).SetCellValue(liatHero[i].HeroTitle);
                rowTemp.CreateCell(1).SetCellValue(liatHero[i].HeroName);
                rowTemp.CreateCell(2).SetCellValue(liatHero[i].PassiveSkill);
                rowTemp.CreateCell(3).SetCellValue(liatHero[i].SkillQ);
                rowTemp.CreateCell(4).SetCellValue(liatHero[i].SkillW);
                rowTemp.CreateCell(5).SetCellValue(liatHero[i].SkillE);
                rowTemp.CreateCell(6).SetCellValue(liatHero[i].SkillR);
            }
            //命名文件名
            var fileName = "LOL英雄数据" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss-ffff") + ".xls";
            //将Excel表格转化为流,输出
            //创建文件流
            MemoryStream bookStream = new MemoryStream();
            //文件写入流(向流中写入字节序列)
            excelBook.Write(bookStream);
            //输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置
            bookStream.Seek(0, SeekOrigin.Begin);
            return File(bookStream, "application/vnd.ms-excel", fileName);
        }

以上就是在控制器这边的完整的NPOI流导出代码。

效果图:
在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页