开发工具与关键技术:VS2015,ASP.NET MVC
撰写时间:2019年5月16日
这里的NPOI导出数据用到的是SQL数据库,先引用数据库,接着实例化数据模型。
先说明一下这个逻辑关系
- 想要导出数据,那必须要先找到数据,用lingq语句查询数据
- 把数据转化为对象列表格式
- 创建工作簿(Excel)
- 为工作簿创建工作表并命名
- 创建表头
- 创建列并赋值
- 创建数据行
- 为工作簿命名
- 将Execl表格转化为流并输出,创建文件流
- 把文件写入流
- 输出之前调用Seek(偏移量,游标位置) 把0位置指定为开始位置(开始导出数据的位置)
- 把表格以文件的格式返回
以上就是大概的逻辑思路,写代码前想把逻辑关系理清了,那写代码的思路就会清晰很多。
下面用一个例子来说明。
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流导出代码。
效果图: