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
目前,常用的数据库导出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.Models11: {12: public class ExportTool13: {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: try22: {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 format33: 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: else60: {61: if (type == typeof(float) || type == typeof(double) || type == typeof(Double))62: {63: cell.SetCellValue((Double)ds.Tables[0].Rows[i][j]);64: }65: else66: {67: if (type == typeof(DateTime))68: {69: cell.SetCellValue(((DateTime)ds.Tables[0].Rows[i][j]).ToString("yyyy-MM-dd HH:mm"));70: }71: else72: {73: if (type == typeof(bool) || type == typeof(Boolean))74: {75: cell.SetCellValue((bool)ds.Tables[0].Rows[i][j]);76: }77: else78: {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: catch96: {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下载(转)的更多相关文章
- ASP.Net MVC中数据库数据导出Excel,供HTTP下载
本文来自:http://www.cnblogs.com/hipo/archive/2012/03/13/2394019.html 一.关于下载 一般对下载权限有没有限制,或安全性要求不高的情况下,基于 ...
- asp.net mvc 中使用NPOI导出excel
版本信息:NPOI1.2.5(2.0以上的版本很多方法不清楚) 明确三点: path: mvc 部署网站的时候,我们肯定要拷贝的一个文件夹就mvc的UI层,有点可以肯定的是,你部署网站的路径不一定都是 ...
- 转:ASP.NET MVC 将IList<T>导出Excel文档的泛型类
/// <summary> /// 提供将泛型集合数据导出Excel文档. /// </summary> /// <typeparam name="T" ...
- 【asp.net】将GridView数据导出Excel
概要: 中午睡了一会,醒来的时候看到老师叫我去办公室,需求是这样的,把excel表中的每个同学,判断图片目录中是否有对应的照片(图片的名字用的学号或身份证号码) 没有对应图片的学生记录,存入自己的数据 ...
- 将页面中表格数据导出excel格式的文件(vue)
近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...
- Asp.net网页中DataGridView数据导出到Excel
经过上网找资料,终于找到一种可以直接将GridView中数据导出到Excel文件的方法,归纳方法如下: 1. 注:其中的字符集格式若改为“GB2312”,导出的部分数据可能为乱码: 导出之前需要关闭分 ...
- ASP.NET中数据库数据导入Excel并打印(2)
大家可能觉得上面的代码比较复杂,因为上面对于对打印要求比较高的应用,是十分有效的.如果只是单单对数据进行导出,还可以使用简单的格式,比如使用以下的代码: Private Sub Page_L ...
- ASP.Net MVC利用NPOI导入导出Excel
因近期项目遇到所以记录一下: 首先导出Excel: 首先引用NPOI包 http://pan.baidu.com/s/1i3Fosux (Action一定要用FileResult) /// <s ...
- SSM数据库数据导出excel
首先,这是我对自己的需求而使用的逻辑,若有可以完美的地方方便告诉下小白. apache的poi MAVEN <dependency> <groupId>org.apache.p ...
随机推荐
- 手机连上wifi热点后自动弹窗的功能
使用buildroot编译bind DNS服务器 用buildroot来制作文件系统很方便,编译出来的文件系统是直接可用的,不用添加脚本等麻烦的工作,很多的库和app都可以直接添加到文件系统里边,如常 ...
- 如何找出component的注册路径
SELECT DISTINCT REVERSE(LTRIM(SYS_CONNECT_BY_PATH(REVERSE(PORTAL_LABEL), ...
- Environment类,获取程序所在机器信息
一.属性 CommandLine 获取该进程的命令行.CurrentDirectory 获取或设置当前工作目录的完全限定路径.ExitCode 获取或设置进程的退出代码.HasShutdownSta ...
- Asp.net MVC4 Knockoutjs BootStrap Ace NinJect Jqgrid sqlserver2008
Asp.net MVC4 Knockoutjs BootStrap Ace NinJect Jqgrid sqlserver2008
- try 返回前执行fianlly
try catch finally 语句中 如果try中有返回语句,如果在fianlly代码块中有对这个值修改的话,并不影响其放回值 public class Test { public stati ...
- C++读入两个参数
题目内容:编写程序计算两个整数的差. 输入描述:输入数据含有不超过50个整数对,每个整数队及每对整数的运算结果都不会超过231或-231. 输出描述:对于每次读入的一对整数,输出前者减去后者的差.每个 ...
- Remoting,OData Snippet Compiler等
http://www.sliver.com/dotnet/SnippetCompiler/ [ASP.NET Web API教程]ASP.NET Web API系列教程目录 张逸 .Net Remot ...
- 限制<input>输入内容 只允许数字 或者 字母
只能输入数字: 有回显 <input onkeyup="value=value.replace(/[^\d]/g,'')"> 只能输入数字:无回显 <input ...
- 開賣!下集 -- ASP.NET 4.5 專題實務(II)-範例應用與 4.5新功能【VB/C# 雙語法】
開賣!下集 -- ASP.NET 4.5 專題實務(II)-範例應用與 4.5新功能[VB/C# 雙語法] 我.....作者都沒拿到書呢! 全台灣最專業的電腦書店 -- 天瓏書局 已經開賣了! 感謝天 ...
- 实战Django:简易博客Part1
舍得学习新技能的时候,通常不喜欢傻读书--捧着一本阐述该项技能的书籍,然后傻看,一路看下来,脑子里塞满了新的概念.知识点,头是越来越大,但技能却几乎没掌握半分. 多年来,舍得养成了用做实例来学习新技能 ...