C# NPOI流导出数据到Excel

本文介绍如何使用NPOI库在ASP.NET MVC应用中从SQL数据库导出数据到Excel,包括数据查询、转换、创建工作簿、创建表头、列及数据行,并将Excel文件以流形式返回。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发工具与关键技术: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流导出代码。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值