在ASP.NET 中导出Execl 表格有很多方式,有利有弊,就是看自己怎么使用了;下面就是自己总结了几种导出Execl 方式的,仅供参考。

导出Execl 的原理都是一样的,其实都是将数据整合成table 或者list集合 传递给Execl 来呈现出来。

第一种导出方式:就是通过 dataTable 的形式 生成 execl ,原理呢 就是使用execl 组件生成execl 然后下载到本地,并返回一个路径出来,进行选择下载的位置;这样将会造成本地或者服务器上将会生成大量的文件,这个时候 我们就要执行一个清理的方法,将某一个时间段的文件清除掉;详见下面的代码

第一步:生成Execl 工具类

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Web; namespace H5UpdateImage.Common
{
public class ExportExcel
{
/// <summary>
/// 默认使用DataTable的列名
/// </summary>
/// <param name="dt"></param>
public static void ExportExcels(DataTable dt)
{
string result = "";
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "text/plain";
if (dt != null && dt.Rows.Count != )
{
var strArrayTitle = new string[dt.Columns.Count];
for (int i = ; i < dt.Columns.Count; i++)
{
strArrayTitle[i] = dt.Columns[i].ColumnName.Replace("_", "");
} string sWriteTotal = InitExcelData(dt, strArrayTitle);
string fileName = DateTime.Now.ToString("yyyyMMddHHmmsssss") + ".xls";
//将文件写入本地缓存目录,并且返回文件下载路径。D:\JSJ_Web\JSJWEBCRM\JSJWEBCRM\
string currentPath = System.AppDomain.CurrentDomain.BaseDirectory + "DownLoadFiles\\";
if (!Directory.Exists(currentPath))
{
Directory.CreateDirectory(currentPath);
}
#region //清理超过一天的文件
try
{
string[] files = System.IO.Directory.GetFiles(currentPath, "*.xls", System.IO.SearchOption.TopDirectoryOnly);
//获取该目录下的xls文件
foreach (var item in files)
{
var fi = new FileInfo(item);
if ((DateTime.Now - fi.LastWriteTime).TotalHours > )
{
File.Delete(item);
}
}
}
catch (Exception) { }
#endregion string filePath = currentPath + fileName;
File.WriteAllText(filePath, sWriteTotal, Encoding.UTF8);
result = "../../DownLoadFiles/" + fileName;
}
else
{
result = "提示:查询不到可以导出的数据,请修改查询条件";
} HttpContext.Current.Response.Write(result);
HttpContext.Current.Response.End();
} public static void ExportExcels( DataTable dt , string[] strArrayTitle )
{
string sWriteTotal = InitExcelData( dt , strArrayTitle );
HttpContext.Current.Response.Clear( );
HttpContext.Current.Response.Charset = "GB2312"; //HttpContext.Current.Response.ContentType = "text/plain";
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.ContentEncoding = Encoding.Default; string fileName = DateTime.Now.ToString( "yyyyMMddHHmmsssss" ) + ".xls";
HttpContext.Current.Response.AddHeader( "content-disposition" , "attachment; filename=" + fileName);
HttpContext.Current.Response.Write( sWriteTotal );
HttpContext.Current.Response.End( );
}
#region 初始化Excel数据
public static string InitExcelData( DataTable dt , string[] strArrayTitle )
{ //用于导出excel的HTML
StringBuilder sReturn = new StringBuilder( );
sReturn.Append( "<html><head><meta http-equiv=Content-Type content='text/html;charset=gb2312'><style>table td,th{vnd.ms-excel.numberformat:@;text-align: center;}</style></head><body><table border='1'>" ); sReturn.Append( "<tr>" );
for( int i = ; i < strArrayTitle.Length ; i++ )
{
sReturn.Append( "<td>" + strArrayTitle[i] + "</td>" );
}
sReturn.Append( "</tr>" ); if( dt != null && dt.Rows.Count > )
{
for( int j = ; j < dt.Rows.Count ; j++ )
{
sReturn.Append( "<tr>" );
for( int i = ; i < dt.Columns.Count ; i++ )
{
sReturn.Append( "<td>" + dt.Rows[j][i] + "</td>" );
} sReturn.Append( "</tr>" );
}
} sReturn.Append( "</table></body>" );
return sReturn.ToString( );
}
#endregion } /// <summary>
/// DataTable与实体类互相转换
/// </summary>
/// <typeparam name="T">实体类</typeparam>
public class ModelHandler<T> where T : new( )
{
#region DataTable转换成实体类 /// <summary>
/// 填充对象列表:用DataSet的第一个表填充实体类
/// </summary>
/// <param name="ds">DataSet</param>
/// <returns></returns>
public List<T> FillModel( DataSet ds )
{
if( ds == null || ds.Tables[] == null || ds.Tables[].Rows.Count == )
{
return null;
}
else
{
return FillModel( ds.Tables[] );
}
} /// <summary>
/// 填充对象列表:用DataSet的第index个表填充实体类
/// </summary>
public List<T> FillModel( DataSet ds , int index )
{
if( ds == null || ds.Tables.Count <= index || ds.Tables[index].Rows.Count == )
{
return null;
}
else
{
return FillModel( ds.Tables[index] );
}
} /// <summary>
/// 填充对象列表:用DataTable填充实体类
/// </summary>
public List<T> FillModel( DataTable dt )
{
if( dt == null || dt.Rows.Count == )
{
return null;
}
List<T> modelList = new List<T>( );
foreach( DataRow dr in dt.Rows )
{
//T model = (T)Activator.CreateInstance(typeof(T));
T model = new T( );
for( int i = ; i < dr.Table.Columns.Count ; i++ )
{
PropertyInfo propertyInfo = model.GetType( ).GetProperty( dr.Table.Columns[i].ColumnName );
if( propertyInfo != null && dr[i] != DBNull.Value )
propertyInfo.SetValue( model , dr[i] , null );
} modelList.Add( model );
}
return modelList;
} /// <summary>
/// 填充对象:用DataRow填充实体类
/// </summary>
public T FillModel( DataRow dr )
{
if( dr == null )
{
return default( T );
} //T model = (T)Activator.CreateInstance(typeof(T));
T model = new T( ); for( int i = ; i < dr.Table.Columns.Count ; i++ )
{
PropertyInfo propertyInfo = model.GetType( ).GetProperty( dr.Table.Columns[i].ColumnName );
if( propertyInfo != null && dr[i] != DBNull.Value )
propertyInfo.SetValue( model , dr[i] , null );
}
return model;
} #endregion #region 实体类转换成DataTable /// <summary>
/// 实体类转换成DataSet
/// </summary>
/// <param name="modelList">实体类列表</param>
/// <returns></returns>
public DataSet FillDataSet( List<T> modelList )
{
if( modelList == null || modelList.Count == )
{
return null;
}
else
{
DataSet ds = new DataSet( );
ds.Tables.Add( FillDataTable( modelList ) );
return ds;
}
} /// <summary>
/// 实体类转换成DataTable
/// </summary>
/// <param name="modelList">实体类列表</param>
/// <returns></returns>
public static DataTable FillDataTable( List<T> modelList )
{
if( modelList == null || modelList.Count == )
{
return null;
}
DataTable dt = CreateData( modelList[] ); foreach( T model in modelList )
{
DataRow dataRow = dt.NewRow( );
foreach( PropertyInfo propertyInfo in typeof( T ).GetProperties( ) )
{
dataRow[propertyInfo.Name] = propertyInfo.GetValue( model , null );
}
dt.Rows.Add( dataRow );
}
return dt;
} /// <summary>
/// 根据实体类得到表结构
/// </summary>
/// <param name="model">实体类</param>
/// <returns></returns>
private static DataTable CreateData( T model )
{
DataTable dataTable = new DataTable( typeof( T ).Name );
foreach( PropertyInfo propertyInfo in typeof( T ).GetProperties( ) )
{
dataTable.Columns.Add( new DataColumn( propertyInfo.Name , propertyInfo.PropertyType ) );
}
return dataTable;
} #endregion
}
}

第二步:编写控制器

 /// <summary>
/// 根据table 内容导出Execl
/// </summary>
public void ExportTable()
{
//ExportExcel.ExportExcels(GetTable()); var dt = this.GetTable(); ExportExcel.ExportExcels(dt); }

第三步:前端

    function ExportTable() {

        $.get('@Url.Action("ExportTable")', function (result) {

            if (result.indexOf("提示") == -) {
self.location.href = result;
} else {
alert(result)
}
})
}

这样就轻松搞定了,如果什么问题和建议及时与我沟通,我会及时更正的,相互学习,天天进步一点点

MVC 导出Execl 的总结几种方式 (一)的更多相关文章

  1. MVC 导出Execl 的总结几种方式 (二)

    接着上面的来,继续导出Execl 的功能 使用FileResult 方式直接可以生产Execl ,这样我们将会写大量处理后台的代码,个人感觉不好,只是展示出来,提供参考 第一步:编辑控制器 publi ...

  2. MVC 导出Execl 的总结几种方式 (四)

    这种方式我个人还是比较喜欢的,使用部分视图的方式,导出Execl 这样在编辑样式上也是很方便的 第一步: 编辑导出视图页 @using H5UpdateImage.Models; @{ Layout ...

  3. MVC 导出Execl 的总结几种方式 (三)

    第三种方式呢,就是借用第三方插件 NPOI 来实现Execl 导出 第一步:在NuGut包中下载NPOI 组件 第二步:编辑控制器代码 public FileResult ExcelNewKeyPro ...

  4. .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格

    一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...

  5. MVC验证10-到底用哪种方式实现客户端服务端双重异步验证

    原文:MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 本篇将通过一个案例来体验使用MVC的Ajax.BeginForm或jQuery来实现异步提交,并在客户端和服务端双双获得验证.希望能梳 ...

  6. spring mvc获取路径参数的几种方式 - 浅夏的个人空间 - 开源中国社区

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  7. mvc 导出execl

    mvc导出execl 必须是get方法才可以  也不能使用ajax function ComplaintsExport() { var serial = $("form").ser ...

  8. Spring MVC中forward请求转发2种方式(带参数)

    Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html  

  9. PHP导出excel文件的几种方式

    PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...

随机推荐

  1. robot framework学习笔记之二———变量

    Robot Framework的变量分为标量, 列表和字典, 分别使用语法格式 ${SCALAR}, @{LIST} 和 &{DICT} 来定义. 此外, 环境变量可以直接使用语法 %{ENV ...

  2. Ubuntu下实现socks代理转http代理

    代理(英语:Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接.一些网关.路由器等网络设备具备网络代理功能. ...

  3. 在Myeclipse中查看android源码就是这么easy

    在开发android 时不能查看源码必是很不爽的一件事,看过网上一些文章后(都是2.0以前的版本,跟我的2.2最新版本的配置是不一样的)不过还是给了我启示,通过配置终于可以在myeclipse中查看源 ...

  4. python中的字符串和编码

    了解编码之前首先说下这几个词的概率: 位.字节.字符.字符串 1.位(bit)也称为比特 这个其实很简单,因为计算机都是二进制存储数据,也就是0和1,一个0或者1就表示一位.这是计算机存储的最小单位. ...

  5. Spring注入方式(1)

    Spring支持3种依赖注入方式,分别为属性注入.构造器注入和工厂方法注入(很少使用,不推荐),下面分别对属性注入和构造器注入详细讲解. 1.常量注入 属性注入是通过setter方法注入Bean的属性 ...

  6. mysql工具——perror(mysql错误代码,查看错误号释义)

    mysql工具——perror(mysql查看错误代码,查看错误号释义) 关键词:mysql错误代码,mysql错误号,perror

  7. Keras2.2 predict和fit_generator的区别

    1.使用predict时,需设置batch_size 查看keras文档中,predict函数原型:predict(self, x, batch_size=32, verbose=0) 说明:只使用b ...

  8. lrzsz

    新搞的云服务器用SecureCRT不支持上传和下载,没有找到rz命令.记录一下如何安装rz/sz命令的方法. 一.工具说明 在SecureCRT这样的ssh登录软件里, 通过在Linux界面里输入rz ...

  9. 第1章—Spring之旅—简化Spring的java开发

    简化Spring的java开发 1.1简介 区别于EJB的特性 简化javaBean,为了降低java开发的复杂性,Spring采取了以下4种关键策略: 基于POJO的轻量级和最小入侵性编程 通过依赖 ...

  10. Java项目打包成exe的详细教程

    Java项目打包成exe的详细教程 把Java项目打包成exe共分为以下两步: 1. 利用Eclipse先把Java项目先打成jar包 2. 利用exe4j工具把jar包转成exe 这里以Java项目 ...