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


    本文来自: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;

    1

    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文件,第三个参数给定文件名。
    最终效果图:2
  • 相关阅读:
    [LC] 939. Minimum Area Rectangle
    [LC] 1110. Delete Nodes And Return Forest
    [LC] 1057. Campus Bikes
    [LC] 528. Random Pick with Weight
    [LC] 341. Flatten Nested List Iterator
    oracle获取本月第一天和最后一天及Oracle trunc()函数的用法
    监控concurrent 正在执行的sql
    UTL_FILE 的用法
    查询EBS在线用户SQL(R12)
    ORACLE EBS BOM 展开(使用标准程序bompexpl.exploder_userexit展开)
  • 原文地址:https://www.cnblogs.com/zhouyunbaosujina/p/3535707.html
Copyright © 2020-2023  润新知