.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>
演示效果如下图:
我们打开后的效果如下:
哈哈,感觉和原图还是有点差别,喜欢的朋友可以试下。好了本次分享就到这儿了