陪你听风

.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>
 演示效果如下图:

     


  我们打开后的效果如下:

  

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

关于TNBLOG
TNBLOG,技术分享。技术交流:群号677373950
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢