本文来自:http://www.cnblogs.com/hipo/archive/2012/03/13/2394019.html

一、关于下载

一般对下载权限有没有限制,或安全性要求不高的情况下,基于web的下载可以直接采用提供服务器文件路径的方式,浏览器端就可以下载。当然对于这种方式的弊端显而易见,用户可以获得下载文件在服务器端的绝对路径,下载的权限也没有办法进行控制。如果你的网站提供的下载有复杂的逻辑判断,那么这种方式就不能解决问题。

要解决这个问题,我们可以采用以文件流的方式提供下载。客户端发出下载请求,在服务器端收到请求后,找到后台相应的处理逻辑代码,首先验证请求是否符合下载条件,在做出相应的相应。若验证成功,将请求下载文件转化为文件流,传给浏览器;若不成功,直接拒绝下载。

在ASP.Net 中这个HTTP请求的后台处理逻辑,可用一般处理文件*.ashx。这个文件的抽象度没有.aspx那么高,相比之下比较原始,所以我们可以自定义处理逻辑。

下面来分析下ASP.Net MVC况下,关于安全下载的实现。ASP.Net MVC已经为我们做好封装,即FileResult ,但是FileResult是个抽象,而具体包括FilePathResult、FileStreamResult、FileContentResult三个之类,可向客户端传送文件(二进制形式),例如存在服务器磁盘word文档,或者存储在数据库中巨大数据等。只需要设置FileDownloadName属性,就可以达到添加HTTP报头的作用,在客户端出现下载对话框。当具体实现的时候,可以使用工厂模式

二、数据库导出Excel

1. POINPIO

目前,常用的数据库导出Excel的方法,是借助第三方的类库。第三类库中很重要的一个就是PIO,是Apache下一个开源项目,提供一个Java类库对Microsoft Office进行读写操作。当然,这里要介绍的不是PIO,而是.Net环境下,基于PIO的NPIO,可以理解为.Net POI。NPOI是微软开源社区CodePlex的一个开源项目,旨在提供.net平台上操作Office的服务。

点击这里参看NPOI的教程文档。

2. 在NPOI中包括了两个dll:Ionic.Zip.dll和NPOI.dll。

三、一个ASP.Net MVC 2.0下导出Excel并提供下载的例子

通过以下几步,建立一个项目:

1. 创建ASP.Net MVC 2.0项目SQLServer2Excel;

2. 添加对于NPOI类库的引用,包括Ionic.Zip.dll和NPOI.dll;

3.链接本地数据库Test,在web.config做如下配置:

   1: <connectionStrings>  
   2:    <add name="TestConnectionString" connectionString="Data Source=(local);Initial Catalog=Test;Integrated Security=True"
   3:      providerName="System.Data.SqlClient" />
   4:  </connectionStrings>

通过以上几步,我们已经建立了基本环境,下面我们来中点介绍下NPOI和FileResult的使用:

1.写NPOI导出方法,首先必须using命名空间NPOI.SS.UserModel和NPOI.HSSF.UserModel。在这个例子中,NPOI将输入DataSet对象,转化为Excel表格,并且保存了MemoryStream的内存流对象,这样做的好处:在提供下载的同时,不会在服务器端产生中间文件。

这里采用的是以基于Column和Row的方式解析Dataset对象的。

   1: using System;
   2: using System.Collections.Generic;
   3: using System.Linq;
   4: using System.Web;
   5: using System.IO;
   6: using NPOI.SS.UserModel;
   7: using NPOI.HSSF.UserModel;
   8: using System.Data;
   9:  
  10: namespace SQLServer2Excel.Models
  11: {
  12:     public class ExportTool
  13:     {
  14:         /// <summary>
  15:         /// 将DataSet数据集转换HSSFworkbook对象,并保存为Stream流
  16:         /// </summary>
  17:         /// <param name="ds"></param>
  18:         /// <returns>返回数据流Stream对象</returns>
  19:         public static MemoryStream ExportDatasetToExcel(DataSet ds)
  20:         {
  21:             try
  22:             {
  23:                 //文件流对象
  24:                  MemoryStream stream = new MemoryStream();
  25:  
  26:                 //打开Excel对象
  27:                 HSSFWorkbook workbook = new HSSFWorkbook();
  28:  
  29:                 //Excel的Sheet对象
  30:                 NPOI.SS.UserModel.Sheet sheet = workbook.CreateSheet("sheet1");
  31:  
  32:                 //set date format
  33:                 CellStyle cellStyleDate = workbook.CreateCellStyle();
  34:                 DataFormat format = workbook.CreateDataFormat();
  35:                 cellStyleDate.DataFormat = format.GetFormat("yyyy年m月d日");
  36:  
  37:                 //使用NPOI操作Excel表
  38:                 NPOI.SS.UserModel.Row row = sheet.CreateRow(0);
  39:                 int count = 0;
  40:                 for (int i = 0; i < ds.Tables[0].Columns.Count; i++) //生成sheet第一行列名 
  41:                 {
  42:                     NPOI.SS.UserModel.Cell cell = row.CreateCell(count++);
  43:                     cell.SetCellValue(ds.Tables[0].Columns[i].Caption);
  44:                 }
  45:                 //将数据导入到excel表中
  46:                 for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  47:                 {
  48:                     NPOI.SS.UserModel.Row rows = sheet.CreateRow(i + 1);
  49:                     count = 0;
  50:                     for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
  51:                     {
  52:                         NPOI.SS.UserModel.Cell cell = rows.CreateCell(count++);
  53:                         Type type = ds.Tables[0].Rows[i][j].GetType();
  54:                         if (type == typeof(int) || type == typeof(Int16)
  55:                             || type == typeof(Int32) || type == typeof(Int64))
  56:                         {
  57:                             cell.SetCellValue((int)ds.Tables[0].Rows[i][j]);
  58:                         }
  59:                         else
  60:                         {
  61:                             if (type == typeof(float) || type == typeof(double) || type == typeof(Double))
  62:                             {
  63:                                 cell.SetCellValue((Double)ds.Tables[0].Rows[i][j]);
  64:                             }
  65:                             else
  66:                             {
  67:                                 if (type == typeof(DateTime))
  68:                                 {
  69:                                     cell.SetCellValue(((DateTime)ds.Tables[0].Rows[i][j]).ToString("yyyy-MM-dd HH:mm"));
  70:                                 }
  71:                                 else
  72:                                 {
  73:                                     if (type == typeof(bool) || type == typeof(Boolean))
  74:                                     {
  75:                                         cell.SetCellValue((bool)ds.Tables[0].Rows[i][j]);
  76:                                     }
  77:                                     else
  78:                                     {
  79:                                         cell.SetCellValue(ds.Tables[0].Rows[i][j].ToString());
  80:                                     }
  81:                                 }
  82:                             }
  83:                         }
  84:                     }
  85:                 }
  86:  
  87:                 //保存excel文档
  88:                 sheet.ForceFormulaRecalculation = true;
  89:  
  90:                 workbook.Write(stream);
  91:                 workbook.Dispose();
  92:  
  93:                 return stream;
  94:             }
  95:             catch
  96:             {
  97:                 return new MemoryStream();
  98:             }
  99:         }
 100:     }
 101: }

2. FileResult的使用,这里实际上用到的是其之类FileStreamResult。

   1: public FileResult DownloadFile()
   2:         {
   3:             DataSet ds = Person.GetPersonDataSet(new DataSet());
   4:  
   5:             MemoryStream stream = ExportTool.ExportDatasetToExcel(ds);
   6:             stream.Seek(0, SeekOrigin.Begin);
   7:  
   8:             return File(stream, "application/vnd.ms-excel", "spreadsheet1.xls");
   9:         }
这里说明一下两点: a. 第6行代码的作用:如果没有这行代码,可能保存的数据大小为0kb,这是因为调整下输出流的开始位置;
                         b.第8行File()方法,此方法的各种重载方法,可以返回FileResult的之类对象。在这里第二参数“application/vnd.ms-                            excel”代表Excel文件,第三个参数给定文件名。
最终效果图:

ASP.Net MVC中数据库数据导出Excel,供HTTP下载的更多相关文章

  1. ASP.Net MVC中数据库数据导出Excel,供HTTP下载(转)

    转自http://www.cnblogs.com/hipo/archive/2012/03/13/2394019.html 一.关于下载 一般对下载权限有没有限制,或安全性要求不高的情况下,基于web ...

  2. asp.net mvc 中使用NPOI导出excel

    版本信息:NPOI1.2.5(2.0以上的版本很多方法不清楚) 明确三点: path: mvc 部署网站的时候,我们肯定要拷贝的一个文件夹就mvc的UI层,有点可以肯定的是,你部署网站的路径不一定都是 ...

  3. 转:ASP.NET MVC 将IList&lt;T&gt;导出Excel文档的泛型类

    /// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...

  4. 【asp.net】将GridView数据导出Excel

    概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...

  5. 将页面中表格数据导出excel格式的文件(vue)

    近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...

  6. Asp.net网页中DataGridView数据导出到Excel

    经过上网找资料,终于找到一种可以直接将GridView中数据导出到Excel文件的方法,归纳方法如下: 1. 注:其中的字符集格式若改为“GB2312”,导出的部分数据可能为乱码: 导出之前需要关闭分 ...

  7. ASP.NET中数据库数据导入Excel并打印(2)

    大家可能觉得上面的代码比较复杂,因为上面对于对打印要求比较高的应用,是十分有效的.如果只是单单对数据进行导出,还可以使用简单的格式,比如使用以下的代码:      Private Sub Page_L ...

  8. ASP.Net MVC利用NPOI导入导出Excel

    因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// <s ...

  9. SSM数据库数据导出excel

    首先,这是我对自己的需求而使用的逻辑,若有可以完美的地方方便告诉下小白. apache的poi MAVEN <dependency> <groupId>org.apache.p ...

随机推荐

  1. u3d_Shader_effects笔记5 第二章 通过UV,进行纹理移动

    1.前面心情 公司最近打包,像我等小弟闲着,看代码容易困,没事偷着学shader,不过还是要多交流才行. 2.本文参考 这次参考比较多:由texture uv延伸问题多,主要是不明白变量定义: htt ...

  2. iOS之UI--指示器HUD的创建和设置

    指示器的创建和设置 渐变动画 描述: 使用label就能制作指示器,原理:就是让label以动画的形式慢慢显示和消失 最好是半透明的 指示器有时候也被称为:HUD,遮盖,蒙版 思路步骤: 1.先在st ...

  3. Java Day 05

    数组第二种定义 数组-遍历 数组操作的核心思想就是对角标的操作: 数组-求最值 1.循环 比较 排序 选择排序 把原始数组分割成了两个数组,至少有一个是有序的 冒泡排序 相邻元素比较 位置置换代码提取 ...

  4. 【转】 android 4.4 Step Counter Sensor计步器的使用

    原文网址:http://blog.csdn.net/aikongmeng/article/details/40457233 版权声明:本文为博主原创文章,未经博主允许不得转载. Android 官方参 ...

  5. 【我所認知的BIOS】—&amp;gt;ADU.exe

    [我所認知的BIOS]—>ADU.exe By LightSeed 2009-5-12 1.概要 在學習的過程中,肯定會要用不少的工具,作為底層的engineer那麼用的工具大多是DOS下.在D ...

  6. Lucene.Net 2.3.1开发介绍 —— 简介

    原文:Lucene.Net 2.3.1开发介绍 -- 简介 Lucene.Net是Lucene在dot net平台上的移植版本.它的功能与Lucene一样,都是用来提供一组API,让我们能快速开发自己 ...

  7. NET Core控制反转(IoC)

    ASP.NET Core中的依赖注入(1):控制反转(IoC)   ASP.NET Core在启动以及后续针对每个请求的处理过程中的各个环节都需要相应的组件提供相应的服务,为了方便对这些组件进行定制, ...

  8. 用Mockito测试SpringMVC+Hibernate

    用Mockito测试SpringMVC+Hibernate 译自:Spring 4 MVC+Hibernate 4+MySQL+Maven integration + Testing example ...

  9. 4.Git基础-查看提交历史

    1.查看提交历史 --  git log  使用 git log 可以查看到所有的提交(commit)历史. 1. $ git log 列出所有commit,最新的commit在最上面.会显示每个提交 ...

  10. Win10 设置窗口背景色

    Win10 的窗口背景色不能像Win7那样通过修改Windows的"窗口"配置来生效,只能是通过修改注册表的信息来修改Win10的窗口色. 1. 通过注册表来修改默认的窗口背景色( ...