.NET mvc Excel的导入导出解析
电脑版发表于:2019/11/30 12:15
“为什么越靠北方地区的人性格越直接?”“天寒地冻的,谁有时间跟你磨叽?”

今天我们讲解的内容是关于在mvc框架里对Excel表的导入,导出操作
1,导入:上传一个Excel文件-->读取Excel内容-->入库
思路:我们进行导入操作,前台先表单上传一个excel文件,然后把路径传到后台读取内容,存在新建的文件夹temp里
第一步:前台上传文件代码如下:
<form method="post" action="~/npoi/read" enctype="multipart/form-data" style="width:600px;"> <input type="file" name="username" /> <input type="submit" value="上传导入" /> </form>
第二步:后台通过文件流读取内容,判断数据类型,然后存入新建的文件夹temp里,代码如下:
//进行导入操作
public void Read()
{
//判断是否有数据
if(Request.Files.Count>0)
{
string filename = Request.Files[0].FileName;
string prex = filename.Substring(filename.LastIndexOf(".") + 1);
if(prex.ToLower()=="xls")
{
//截取后缀,并且命名为随机不重复
string url = Server.MapPath("~/temp/" + Guid.NewGuid().ToString().Replace("-", "") + ".xls");
Request.Files[0].SaveAs(url);
FileStream fileStream = new FileStream(url, FileMode.Open);
//通过文件流打开excel表格
HSSFWorkbook workbook = new HSSFWorkbook(fileStream);
//读取excel表格下某一张表
HSSFSheet sheet = workbook.GetSheet("Sheet1") as HSSFSheet;
for (int i = 0; i <= sheet.LastRowNum; i++)
{
HSSFRow row = sheet.GetRow(i) as HSSFRow;
string number = "";
//判断值类型
if (row.GetCell(0).CellType == NPOI.SS.UserModel.CellType.STRING)
{
number = row.GetCell(0).StringCellValue;
}
if (row.GetCell(0).CellType == NPOI.SS.UserModel.CellType.NUMERIC)
{
number = row.GetCell(0).NumericCellValue + "";
}
string name = row.GetCell(1).StringCellValue;
Response.Write(number + ":" + name + "<br/>");
}
Response.End();
}
}
} 我们打开temp文件,会发现已经存入了一个excel文件,打开就是我们上传的文件内容,如下图

2,导出:查询数据库-->动态创建Excel 填充数据-->下载到客户端
思路:我们进行导出操作,后台创建Excel,设置表格样式,填充数据,通过前台访问此方法,下载到客户端
后台代码如下:
//进行导出操作
public void Down()
{
//动态创建一个excel工作表
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个表
HSSFSheet sheet = workbook.CreateSheet("重庆富婆通讯录") as HSSFSheet;
//设置表头标题
#region 公司说明
HSSFRow head = sheet.CreateRow(0) as HSSFRow;
HSSFCell headcell = head.CreateCell(0) as HSSFCell;
//设置行高
head.Height = 290 * 3;
//设置列宽
for (int i = 0; i < 5; i++)
{
sheet.SetColumnWidth(i, 255 * 12);
}
//合并单元格
sheet.AddMergedRegion(new NPOI.SS.Util.Region(0, 0, 0, 4));
//得到列样式
HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;
//垂直居中
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
//水平居中
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
//得到字体的样式
HSSFFont font = workbook.CreateFont() as HSSFFont;
font.Boldweight = 800;
//设置字体颜色
font.Color = HSSFColor.ORANGE.index;
font.FontHeight = 30 * 13;
headcell.CellStyle = cellStyle;
cellStyle.SetFont(font);
cellStyle.WrapText = true; //让\n起作用
headcell.SetCellValue("重庆富婆通讯有限公司\ntel:1858848");
#endregion
//创建行
HSSFRow row = sheet.CreateRow(1) as HSSFRow;
//创建列
row.CreateCell(0).SetCellValue("姓名");
row.CreateCell(1).SetCellValue("年龄");
row.CreateCell(2).SetCellValue("财产");
row.CreateCell(3).SetCellValue("电话");
row.CreateCell(4).SetCellValue("微信");
Random random = new Random();
//从第二行开始写入数据
for (int i = 2; i < 10; i++)
{
//创建行
HSSFRow rows = sheet.CreateRow(i) as HSSFRow;
//创建列
rows.CreateCell(0).SetCellValue("艾美" + i);
rows.CreateCell(1).SetCellValue(Convert.ToInt32("18") + i);
rows.CreateCell(2).SetCellValue(random.Next(1000, 10000) + "万元");
rows.CreateCell(3).SetCellValue(Convert.ToInt32("5487") + i);
rows.CreateCell(4).SetCellValue("不公布");
}
//创建一个储存流
MemoryStream memoryStream = new MemoryStream();
workbook.Write(memoryStream);
//执行创建生成命令
Response.AddHeader("Content-Disposition", "attachment; filename=重庆富婆通讯录.xls");
//把对象通过内存流转换为字节数组,然后把字节数组通过response传递到前台
Response.BinaryWrite(memoryStream.ToArray());
}前台代码如下:
<div style="margin-top:20px;"> <button><a href="/npoi/down">导出创建Excel</a></button> </div>
演示效果如下图:

点击导出创建Excel这样它就会下载到客户端了,当然也可以自己添加的数据效果哦。
最后我们做一个小练习,就是后台创建一个excel表格,然后下载查看.
需求效果图如下:

首先创建这样感觉不是太难,就是调表格的样式有点麻烦。下面我们一起解析它是怎样生成的。
步骤1:像上面的导出操作一致,也是创建表格,然后我们需要控制行高和列宽等。代码如下:
public void inform()
{
//动态创建一个excel工作表
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个表
HSSFSheet sheet = workbook.CreateSheet("阿里工作信息表") as HSSFSheet;
//创建行(三行的工作表)
HSSFRow row1 = sheet.CreateRow(0) as HSSFRow;
//设置行高
row1.Height = 350 * 3;
HSSFRow row2 = sheet.CreateRow(1) as HSSFRow;
row2.Height = 250 * 3;
HSSFRow row3 = sheet.CreateRow(2) as HSSFRow;
row3.Height = 250 * 3;
//八列的工作表
//设置前四列的宽度
for (int i = 0; i < 4; i++)
{
row1.CreateCell(i);
row2.CreateCell(i);
row3.CreateCell(i);
//设置每列的宽度
sheet.SetColumnWidth(i, 800 * 3);
}
//设置后四列的宽度
for (int i = 4; i < 8; i++)
{
row1.CreateCell(i);
row2.CreateCell(i);
row3.CreateCell(i);
//设置每列的宽度
sheet.SetColumnWidth(i, 1500 * 3);
}
//合并前四列
for (int i = 0; i < 4; i++)
{
//合并单元格
sheet.AddMergedRegion(new NPOI.SS.Util.Region(0, i, 2, i));
}
//合并第一行的5列到8列
sheet.AddMergedRegion(new NPOI.SS.Util.Region(0, 4, 0, 7));
//合并第5列2到3行
sheet.AddMergedRegion(new NPOI.SS.Util.Region(1, 4, 2, 4));
//合并第6列2到3行
sheet.AddMergedRegion(new NPOI.SS.Util.Region(1, 5, 2, 5));
//合并第二行的7到8列
sheet.AddMergedRegion(new NPOI.SS.Util.Region(1, 6, 1, 7));
//得到列样式
HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;
//水平垂直居中样式
cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
//垂直居中
cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
//得到字体的样式
HSSFFont font = workbook.CreateFont() as HSSFFont;
font.Boldweight = 800; //字体加粗
//设置字体颜色
// font.Color = HSSFColor.ORANGE.index;
// font.FontHeight = 30 * 13;
cellStyle.SetFont(font);
//给每行或者每列添加应有的数据
row1.GetCell(0).SetCellValue("编码");
row1.GetCell(0).CellStyle = cellStyle;
row1.GetCell(1).SetCellValue("月度");
row1.GetCell(1).CellStyle = cellStyle;
row1.GetCell(2).SetCellValue("工资");
row1.GetCell(2).CellStyle = cellStyle;
row1.GetCell(3).SetCellValue("绩效");
row1.GetCell(3).CellStyle = cellStyle;
row1.GetCell(4).SetCellValue("8月经营性指标");
row1.GetCell(4).CellStyle = cellStyle;
row2.GetCell(4).SetCellValue("在职人数");
row2.GetCell(4).CellStyle = cellStyle;
row2.GetCell(5).SetCellValue("新增人数");
row2.GetCell(5).CellStyle = cellStyle;
row2.GetCell(6).SetCellValue("实际销售为准");
row2.GetCell(6).CellStyle = cellStyle;
row3.GetCell(6).SetCellValue("人力");
row3.GetCell(6).CellStyle = cellStyle;
row3.GetCell(7).SetCellValue("出单率");
row3.GetCell(7).CellStyle = cellStyle;
//测试数据
//从第四行开始写入数据]
Random random = new Random();
for (int i = 3; i < 10; i++)
{
//创建行
HSSFRow rows = sheet.CreateRow(i) as HSSFRow;
//创建列
rows.CreateCell(0).SetCellValue("艾美" + i);
rows.CreateCell(1).SetCellValue(Convert.ToInt32("18") + i);
rows.CreateCell(2).SetCellValue(random.Next(1000, 10000) + "万元");
rows.CreateCell(3).SetCellValue(Convert.ToInt32("5487") + i);
rows.CreateCell(4).SetCellValue("不公布");
rows.CreateCell(5).SetCellValue("xx" + i);
rows.CreateCell(6).SetCellValue("zz" + i);
rows.CreateCell(7).SetCellValue("cc" + i);
}
//创建一个储存流
MemoryStream memoryStream = new MemoryStream();
workbook.Write(memoryStream);
//执行创建生成的命令
Response.AddHeader("Content-Disposition", "attachment; filename=阿里工作信息表.xls");
//把对象通过内存流转换为字节数组,然后把字节数组通过response传递到前台
Response.BinaryWrite(memoryStream.ToArray());
}前台也是通过a标签访问此方法得到数据并下载.代码如下:
<div style="margin-top:40px;"> <button><a href="/npoi/inform">导出生成阿里工作表</a></button> </div>
演示效果如下图:

我们打开后的效果如下:

哈哈,感觉和原图还是有点差别,喜欢的朋友可以试下。好了本次分享就到这儿了
