本文来自: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<T>导出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. UESTC_In Galgame We Trust CDOJ 10

    As we all know, there are many interesting (H) games in kennethsnow’s computer. But he sets a passwo ...

  2. Single Number 解答

    Question Given an array of integers, every element appears twice except for one. Find that single on ...

  3. 一张图讲解为什么需要自己搭建自己的git服务以及搭建的途径

    图片信息量有点大.不废话上图 图中的一些链接: gitlab官方安装文档 https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/in ...

  4. Linux 下的php,nginx,mysql的安装

    yum -y install wget make vim install gcc gcc-c++ ncurses ncurses-devel autoconf libjpeg libjpeg-deve ...

  5. Funny Sheep(思维)

    Problem 1606 - Funny Sheep Time Limit: 1000MS   Memory Limit: 65536KB    Total Submit: 612  Accepted ...

  6. socketpair的使用

    socketpair函数概要例如以下:#include <sys/types.h>#include <sys/socket.h>int socketpair(int domai ...

  7. stagefright框架(六)-Audio Playback的流程

    到目前为止,我们都只着重在video处理的部分,对于audio却只字未提.这篇文章将会开始audio处理的流程. Stagefright中关于audio的部分是交由AudioPlayer来处理,它是在 ...

  8. WebApi 文件上传

    1. 注意给form表单加上enctype = "multipart/form-data" 属性,否则会导致Action的参数HttpPostedFileBase 对象接收不到文件 ...

  9. IOS总结 静变量static、全局变量extern、局部变量、实例变量

    1.静态变量 static 什么是静态变量:从面向对象的角度触发,当需要一个数据对象为整类而非某个对象服务,同时有力求不破坏类的封装性,既要求此成员隐藏在类的内部,有要求对外不可见的时候,就可以使用s ...

  10. (转)Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds

    仰天长啸 Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds... 当启动tomcat时候出现 S ...