tnblog
首页
视频
资源
登录

.NET mvc Excel的导入导出解析

6905人阅读 2019/11/30 12:15 总访问:403584 评论:0 收藏:0 手机
分类: .NET MVC

“为什么越靠北方地区的人性格越直接?”“天寒地冻的,谁有时间跟你磨叽?”


 今天我们讲解的内容是关于在mvc框架里对Excel表的导入,导出操作

  1,导入:上传一个Excel文件-->读取Excel内容-->入库

 思路:我们进行导入操作,前台先表单上传一个excel文件,然后把路径传到后台读取内容,存在新建的文件夹temp里

  第一步:前台上传文件代码如下:

  1. <form method="post" action="~/npoi/read" enctype="multipart/form-data" style="width:600px;">
  2.     <input type="file" name="username" />
  3.     <input type="submit" value="上传导入" />
  4. </form>

 第二步:后台通过文件流读取内容,判断数据类型,然后存入新建的文件夹temp里,代码如下:

  1. //进行导入操作
  2.         public void Read()
  3.         {
  4.             //判断是否有数据
  5.             if(Request.Files.Count>0)
  6.             {
  7.                 string filename = Request.Files[0].FileName;
  8.                 string prex = filename.Substring(filename.LastIndexOf(".") + 1);
  9.                 if(prex.ToLower()=="xls")
  10.                 {
  11.                     //截取后缀,并且命名为随机不重复
  12.                     string url = Server.MapPath("~/temp/" + Guid.NewGuid().ToString().Replace("-""") + ".xls");
  13.                     Request.Files[0].SaveAs(url);
  14.                     FileStream fileStream = new FileStream(url, FileMode.Open);
  15.                     //通过文件流打开excel表格
  16.                     HSSFWorkbook workbook = new HSSFWorkbook(fileStream);
  17.                     //读取excel表格下某一张表
  18.                     HSSFSheet sheet = workbook.GetSheet("Sheet1"as HSSFSheet;
  19.                     for (int i = 0; i <= sheet.LastRowNum; i++)
  20.                     {
  21.                         HSSFRow row = sheet.GetRow(i) as HSSFRow;
  22.                         string number = "";
  23.                         //判断值类型
  24.                         if (row.GetCell(0).CellType == NPOI.SS.UserModel.CellType.STRING)
  25.                         {
  26.                             number = row.GetCell(0).StringCellValue;
  27.                         }
  28.                         if (row.GetCell(0).CellType == NPOI.SS.UserModel.CellType.NUMERIC)
  29.                         {
  30.                             number = row.GetCell(0).NumericCellValue + "";
  31.                         }
  32.                         string name = row.GetCell(1).StringCellValue;
  33.                         Response.Write(number + ":" + name + "<br/>");
  34.                     }
  35.                     Response.End();
  36.                 }
  37.             }
  38.         }

  我们打开temp文件,会发现已经存入了一个excel文件,打开就是我们上传的文件内容,如下图

  


   2,导出:查询数据库-->动态创建Excel 填充数据-->下载到客户端

  思路:我们进行导出操作,后台创建Excel,设置表格样式,填充数据,通过前台访问此方法,下载到客户端

  后台代码如下:

  1.  //进行导出操作
  2.             public void Down()
  3.            {
  4.             //动态创建一个excel工作表
  5.             HSSFWorkbook workbook = new HSSFWorkbook();
  6.             //创建一个表
  7.             HSSFSheet sheet = workbook.CreateSheet("重庆富婆通讯录"as HSSFSheet;
  8.             //设置表头标题
  9.             #region 公司说明
  10.             HSSFRow head = sheet.CreateRow(0as HSSFRow;
  11.             HSSFCell headcell = head.CreateCell(0as HSSFCell;
  12.             //设置行高
  13.             head.Height = 290 * 3;
  14.             //设置列宽
  15.             for (int i = 0; i < 5; i++)
  16.             {
  17.                 sheet.SetColumnWidth(i, 255 * 12);
  18.             }
  19.             //合并单元格
  20.             sheet.AddMergedRegion(new NPOI.SS.Util.Region(0004));
  21.             //得到列样式
  22.             HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;
  23.             //垂直居中
  24.             cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
  25.             //水平居中
  26.             cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
  27.             //得到字体的样式
  28.             HSSFFont font = workbook.CreateFont() as HSSFFont;
  29.             font.Boldweight = 800;
  30.             //设置字体颜色
  31.             font.Color = HSSFColor.ORANGE.index;
  32.             font.FontHeight = 30 * 13;
  33.             headcell.CellStyle = cellStyle;
  34.             cellStyle.SetFont(font);
  35.             cellStyle.WrapText = true//让\n起作用
  36.             headcell.SetCellValue("重庆富婆通讯有限公司\ntel:1858848");
  37.             #endregion
  38.             //创建行
  39.             HSSFRow row = sheet.CreateRow(1as HSSFRow;
  40.             //创建列
  41.             row.CreateCell(0).SetCellValue("姓名");
  42.             row.CreateCell(1).SetCellValue("年龄");
  43.             row.CreateCell(2).SetCellValue("财产");
  44.             row.CreateCell(3).SetCellValue("电话");
  45.             row.CreateCell(4).SetCellValue("微信");
  46.             Random random = new Random();
  47.             //从第二行开始写入数据
  48.             for (int i = 2; i < 10; i++)
  49.             {
  50.                 //创建行
  51.                 HSSFRow rows = sheet.CreateRow(i) as HSSFRow;
  52.                 //创建列
  53.                 rows.CreateCell(0).SetCellValue("艾美" + i);
  54.                 rows.CreateCell(1).SetCellValue(Convert.ToInt32("18") + i);
  55.                 rows.CreateCell(2).SetCellValue(random.Next(100010000) + "万元");
  56.                 rows.CreateCell(3).SetCellValue(Convert.ToInt32("5487") + i);
  57.                 rows.CreateCell(4).SetCellValue("不公布");
  58.             }
  59.             //创建一个储存流
  60.             MemoryStream memoryStream = new MemoryStream();
  61.             workbook.Write(memoryStream);
  62.             //执行创建生成命令
  63.             Response.AddHeader("Content-Disposition""attachment; filename=重庆富婆通讯录.xls");
  64.             //把对象通过内存流转换为字节数组,然后把字节数组通过response传递到前台
  65.             Response.BinaryWrite(memoryStream.ToArray());
  66.         }

   前台代码如下:

  1. <div style="margin-top:20px;">
  2.     <button><a href="/npoi/down">导出创建Excel</a></button>
  3. </div>

演示效果如下图:


  

  点击导出创建Excel这样它就会下载到客户端了,当然也可以自己添加的数据效果哦。


  最后我们做一个小练习,就是后台创建一个excel表格,然后下载查看.

  需求效果图如下:

  


  首先创建这样感觉不是太难,就是调表格的样式有点麻烦。下面我们一起解析它是怎样生成的。

  步骤1:像上面的导出操作一致,也是创建表格,然后我们需要控制行高和列宽等。代码如下:

   

  1.  public void inform()
  2.         {
  3.             //动态创建一个excel工作表
  4.             HSSFWorkbook workbook = new HSSFWorkbook();
  5.             //创建一个表
  6.             HSSFSheet sheet = workbook.CreateSheet("阿里工作信息表"as HSSFSheet;
  7.             //创建行(三行的工作表)
  8.             HSSFRow row1 = sheet.CreateRow(0as HSSFRow;
  9.             //设置行高
  10.             row1.Height = 350 * 3;
  11.             HSSFRow row2 = sheet.CreateRow(1as HSSFRow;
  12.             row2.Height = 250 * 3;
  13.             HSSFRow row3 = sheet.CreateRow(2as HSSFRow;
  14.             row3.Height = 250 * 3;
  15.             //八列的工作表
  16.             //设置前四列的宽度
  17.             for (int i = 0; i < 4; i++)
  18.             {
  19.                 row1.CreateCell(i);
  20.                 row2.CreateCell(i);
  21.                 row3.CreateCell(i);
  22.                 //设置每列的宽度
  23.                 sheet.SetColumnWidth(i, 800 * 3);
  24.             }
  25.             //设置后四列的宽度
  26.             for (int i = 4; i < 8; i++)
  27.             {
  28.                 row1.CreateCell(i);
  29.                 row2.CreateCell(i);
  30.                 row3.CreateCell(i);
  31.                 //设置每列的宽度
  32.                 sheet.SetColumnWidth(i, 1500 * 3);
  33.             }
  34.             //合并前四列
  35.             for (int i = 0; i < 4; i++)
  36.             {
  37.                 //合并单元格
  38.                 sheet.AddMergedRegion(new NPOI.SS.Util.Region(0, i, 2, i));
  39.             }
  40.             //合并第一行的5列到8列
  41.             sheet.AddMergedRegion(new NPOI.SS.Util.Region(0407));
  42.             //合并第5列2到3行
  43.             sheet.AddMergedRegion(new NPOI.SS.Util.Region(1424));
  44.             //合并第6列2到3行
  45.             sheet.AddMergedRegion(new NPOI.SS.Util.Region(1525));
  46.             //合并第二行的7到8列
  47.             sheet.AddMergedRegion(new NPOI.SS.Util.Region(1617));
  48.             //得到列样式
  49.             HSSFCellStyle cellStyle = workbook.CreateCellStyle() as HSSFCellStyle;
  50.             //水平垂直居中样式
  51.             cellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
  52.             //垂直居中
  53.             cellStyle.VerticalAlignment = NPOI.SS.UserModel.VerticalAlignment.CENTER;
  54.             //得到字体的样式
  55.             HSSFFont font = workbook.CreateFont() as HSSFFont;
  56.             font.Boldweight = 800;   //字体加粗
  57.             //设置字体颜色
  58.             // font.Color = HSSFColor.ORANGE.index;
  59.            // font.FontHeight = 30 * 13;
  60.             cellStyle.SetFont(font);
  61.             //给每行或者每列添加应有的数据
  62.             row1.GetCell(0).SetCellValue("编码");
  63.             row1.GetCell(0).CellStyle = cellStyle;
  64.             row1.GetCell(1).SetCellValue("月度");
  65.             row1.GetCell(1).CellStyle = cellStyle;
  66.             row1.GetCell(2).SetCellValue("工资");
  67.             row1.GetCell(2).CellStyle = cellStyle;
  68.             row1.GetCell(3).SetCellValue("绩效");
  69.             row1.GetCell(3).CellStyle = cellStyle;
  70.             row1.GetCell(4).SetCellValue("8月经营性指标");
  71.             row1.GetCell(4).CellStyle = cellStyle;
  72.             row2.GetCell(4).SetCellValue("在职人数");
  73.             row2.GetCell(4).CellStyle = cellStyle;
  74.             row2.GetCell(5).SetCellValue("新增人数");
  75.             row2.GetCell(5).CellStyle = cellStyle;
  76.             row2.GetCell(6).SetCellValue("实际销售为准");
  77.             row2.GetCell(6).CellStyle = cellStyle;
  78.             row3.GetCell(6).SetCellValue("人力");
  79.             row3.GetCell(6).CellStyle = cellStyle;
  80.             row3.GetCell(7).SetCellValue("出单率");
  81.             row3.GetCell(7).CellStyle = cellStyle;
  82.             //测试数据
  83.             //从第四行开始写入数据]
  84.             Random random = new Random();
  85.             for (int i = 3; i < 10; i++)
  86.             {
  87.                 //创建行
  88.                 HSSFRow rows = sheet.CreateRow(i) as HSSFRow;
  89.                 //创建列
  90.                 rows.CreateCell(0).SetCellValue("艾美" + i);
  91.                 rows.CreateCell(1).SetCellValue(Convert.ToInt32("18") + i);
  92.                 rows.CreateCell(2).SetCellValue(random.Next(100010000) + "万元");
  93.                 rows.CreateCell(3).SetCellValue(Convert.ToInt32("5487") + i);
  94.                 rows.CreateCell(4).SetCellValue("不公布");
  95.                 rows.CreateCell(5).SetCellValue("xx" + i);
  96.                 rows.CreateCell(6).SetCellValue("zz" + i);
  97.                 rows.CreateCell(7).SetCellValue("cc" + i);
  98.             }
  99.             //创建一个储存流
  100.             MemoryStream memoryStream = new MemoryStream();
  101.             workbook.Write(memoryStream);
  102.             //执行创建生成的命令
  103.             Response.AddHeader("Content-Disposition""attachment; filename=阿里工作信息表.xls");
  104.             //把对象通过内存流转换为字节数组,然后把字节数组通过response传递到前台
  105.             Response.BinaryWrite(memoryStream.ToArray());
  106.         }
  1.  前台也是通过a标签访问此方法得到数据并下载.代码如下:
  1.  <div style="margin-top:40px;">
  2.     <button><a href="/npoi/inform">导出生成阿里工作表</a></button>
  3.  </div>
  1.  演示效果如下图:

     


  我们打开后的效果如下:

  

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

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request[&quot;imgBase&quot;]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///&lt;summary&gt; ///转全角的函数(SBCcase) ///&lt;/summary&gt; ///&lt;paramname=&quot;input&quot;&gt;任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...

asp.net主动推送百度seo

虽然可以使用百度提供的js自动推送,但是估计度娘还是希望主动推送一点。哈哈^_^,女孩子嘛大多都喜欢被动一点。publicclass...
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
13
文章
64
粉丝
20
评论
30
MUI框架页面间的传值指针
XingDy姐 : 不错哦
MUI框架页面间的传值指针
剑轩 : 接口的真实地址可以用xx/yy什么的代替哦,真实地址还是隐藏一下好
.NET EF 用户按钮权限
YOU : 可以,在写文章的时候,有需要写代码的地方,可以选择编辑器上的代...
.NET EF 用户按钮权限
剑轩 : 哈哈哈哈,你这个追女生的逻辑
EF三种模式解析
剑轩 : 好文采!
重要sql语句和linq,lamdba分组条件查询语句
剑轩 : 开头那句诗句写得很好哇!
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术