使用NPOI实现导出表格的操作
最终结果如图:
(此次为实验,使用系统的模板页就好,使用a标签进行实验)
点击a标签后如图:
实验如下:
创建一个新的MVC项目后找到引用
1)添加引用
先右键点击引用,找到“管理NuGet程序包”
弹出后,点左上角浏览,再在输入框输入NPOI,点击面板上的安装
安装完成后进入控制器,引入命名空间
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.IO;
最终代码如下(自己复制到里面然后改成想要的数据就好):
1.前台代码(就一个a标签,其他的都是系统index模板页原本就有的)
<a href="~/home/toexcel">导出Excel表</a>
2.控制器代码:
/// <summary>
/// 表头的样式
/// </summary>
/// <param name="workbook"></param>
/// <param name="sheet"></param>
public void CreateHeadStyle(HSSFWorkbook workbook, HSSFSheet sheet)
{
string ClasstID = "1999班";
//创建行
HSSFRow row = sheet.CreateRow(0) as HSSFRow;
//创建列
var cell0 = row.CreateCell(0);
var cell1 = row.CreateCell(1);
var cell2 = row.CreateCell(2);
cell0.SetCellValue("学生姓名");
cell1.SetCellValue("学生学号");
cell2.SetCellValue("性别");
//创建列的样式
HSSFCellStyle cstyle = workbook.CreateCellStyle() as HSSFCellStyle;
//设置垂直居中
cstyle.VerticalAlignment = VerticalAlignment.Center;
//设置水平居中
cstyle.Alignment = HorizontalAlignment.Center;
//合并单元格
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 2, 0, 0));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 2, 1, 1));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 2, 2, 2));
cell0.CellStyle = cstyle;
cell1.CellStyle = cstyle;
cell2.CellStyle = cstyle;
var cell3 = row.CreateCell(3);
cell3.SetCellValue(ClasstID);//班级ID
cstyle = workbook.CreateCellStyle() as HSSFCellStyle;
cstyle.VerticalAlignment = VerticalAlignment.Center;
cstyle.Alignment = HorizontalAlignment.Center;
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 3, 6));
cell3.CellStyle = cstyle;
//---------------------创建行------------------------
HSSFRow row1 = sheet.CreateRow(1) as HSSFRow;
var cell4 = row1.CreateCell(3);
var cell5 = row1.CreateCell(4);
cell4.SetCellValue("民族");
cell5.SetCellValue("政治面貌");
cstyle = workbook.CreateCellStyle() as HSSFCellStyle;
cstyle.VerticalAlignment = VerticalAlignment.Center;
cstyle.Alignment = HorizontalAlignment.Center;
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 2, 3, 3));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 2, 4, 4));
cell4.CellStyle = cstyle;
cell5.CellStyle = cstyle;
var cell6 = row1.CreateCell(5);
var cell7 = row1.CreateCell(6);
cell6.SetCellValue("学生专业");
cell7.SetCellValue("学生操行");
cstyle = workbook.CreateCellStyle() as HSSFCellStyle;
cstyle.VerticalAlignment = VerticalAlignment.Center;
cstyle.Alignment = HorizontalAlignment.Center;
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 2, 5, 5));
sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(1, 2, 6, 6));
cell6.CellStyle = cstyle;
cell7.CellStyle = cstyle;
}
/// <summary>
/// 导出excel表
/// </summary>
public void ToExcel()
{
string classname = "1999班";
//创建一个Excel表
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.CreateSheet(classname+"操行表现") as HSSFSheet;
CreateHeadStyle(workbook, sheet);
Response.AddHeader("Content-Disposition", "attachment;filename=学生操行表现.xls");//这个是指点击导出后的文件名字
LoveManagementDBEntities db = new LoveManagementDBEntities();
//查询数据库
//根据想要导出数据的学生做判断条件 意思是学生表学生的老师ID是1并且班级ID是3的学生才能被导出
//因为是做测试 所以给个死值用于理解
List<Student> elist = db.Student.Where(n=>n.TeacherID==1&&n.TbClassID==3).ToList();
//遍历集合
for (int i = 0; i < elist.Count; i++)//遍历符合条件的学生表数据
{
//创建行
HSSFRow row = sheet.CreateRow(i + 3) as HSSFRow;
//创建列
row.CreateCell(0).SetCellValue(elist[i].StuName);
row.CreateCell(1).SetCellValue(elist[i].StuNumber.ToString());
row.CreateCell(2).SetCellValue(elist[i].StuSex.ToString());
row.CreateCell(3).SetCellValue(elist[i].StuNation.ToString());
row.CreateCell(4).SetCellValue(elist[i].StuPolStatus.ToString());
row.CreateCell(5).SetCellValue(elist[i].Professional.ToString());
row.CreateCell(6).SetCellValue(elist[i].STuGrade.ToString());
}
//内存流
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
Response.BinaryWrite(ms.ToArray());
}
期间遇到的问题(你们也肯定会遇到):由于本次是测试,所以导出表格除了学生信息表是动态的其他的数据都是给的死值所以暂时就没有什么问题。但是把这些放到项目中后就会多一些带值的变量进行判断,然后才进行导出,这时候问题就来了。
比如我在期间遇到的问题:如果要把视图的值传到控制器进行内容显示,那么就会出现导出表格的时候找不到那个值,提示那个变量的值为null,但明明调试的时候整个流程都走完了,也能找到那个变量并且进行输出,但一旦走完后就报错。这个问题也困扰了我好久,后面才发现是一个原因导致的:
因为ToExcel()这个东西也是一个页面,还记得上面的a标签的跳转页面
<a href="~/home/toexcel">导出Excel表</a>:因为点击之后他也会转到ToExcel的页面进行代码解析然后导出表格,这个时候问题就来了,因为在跳转前的确是有变量的值的,但是跳转之后就没有了,所以一直报null值错误。所以需要拼接好你要传输的值放到a标签中才行。
如下图:当鼠标悬浮到a标签的时候就要把对应的值传进去,才能导致正常运行
如有问题,可联系作者~