转自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文件,第三个参数给定文件名。
最终效果图:
 
 
分类: .Net

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

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

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

  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. 手机连上wifi热点后自动弹窗的功能

    使用buildroot编译bind DNS服务器 用buildroot来制作文件系统很方便,编译出来的文件系统是直接可用的,不用添加脚本等麻烦的工作,很多的库和app都可以直接添加到文件系统里边,如常 ...

  2. 如何找出component的注册路径

      SELECT DISTINCT REVERSE(LTRIM(SYS_CONNECT_BY_PATH(REVERSE(PORTAL_LABEL),                           ...

  3. Environment类,获取程序所在机器信息

    一.属性 CommandLine  获取该进程的命令行.CurrentDirectory 获取或设置当前工作目录的完全限定路径.ExitCode 获取或设置进程的退出代码.HasShutdownSta ...

  4. Asp.net MVC4 Knockoutjs BootStrap Ace NinJect Jqgrid sqlserver2008

    Asp.net MVC4 Knockoutjs  BootStrap Ace NinJect  Jqgrid sqlserver2008

  5. try 返回前执行fianlly

    try catch  finally 语句中 如果try中有返回语句,如果在fianlly代码块中有对这个值修改的话,并不影响其放回值 public class Test { public stati ...

  6. C++读入两个参数

    题目内容:编写程序计算两个整数的差. 输入描述:输入数据含有不超过50个整数对,每个整数队及每对整数的运算结果都不会超过231或-231. 输出描述:对于每次读入的一对整数,输出前者减去后者的差.每个 ...

  7. Remoting,OData Snippet Compiler等

    http://www.sliver.com/dotnet/SnippetCompiler/ [ASP.NET Web API教程]ASP.NET Web API系列教程目录 张逸 .Net Remot ...

  8. 限制<input>输入内容 只允许数字 或者 字母

    只能输入数字: 有回显 <input onkeyup="value=value.replace(/[^\d]/g,'')"> 只能输入数字:无回显 <input ...

  9. 開賣!下集 -- ASP.NET 4.5 專題實務(II)-範例應用與 4.5新功能【VB/C# 雙語法】

    開賣!下集 -- ASP.NET 4.5 專題實務(II)-範例應用與 4.5新功能[VB/C# 雙語法] 我.....作者都沒拿到書呢! 全台灣最專業的電腦書店 -- 天瓏書局 已經開賣了! 感謝天 ...

  10. 实战Django:简易博客Part1

    舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能 ...