在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. iOS 基础之NSArray数组去重

    1.面试题 现在有一个数组arr1,它里面存储的字符串分别为@“zhangsan”@“lisi”@“wangwu”@“lisi”@“zhangsan”,请将它去重后赋值给可变数组arr2输出为:@“z ...

  2. Linux之Ubuntu切换root su -

    当在Ubuntu系统从普通用户切换到root用户时,总是会报错,提示错误信息.这时因为我们还没有给系统中的root用户设置密码,我们给Ubuntu系统中的root用户设置一个密码就可以实现普通用户和管 ...

  3. 【性能测试】:关于loadrunner11录制Chrome浏览器脚本的方法

    有些web端的程序只能通过chrome访问,如果用lr11录制的话,会抓不到包, 现在教一种方法,可以抓到包的,主体思路就是设置代理,让报文流量绕道走一下 一,在LR中的设置: 从菜单Tools-Re ...

  4. ZigZag编码

    ZigZag编码 在网络传输和数据存储场景中,需要对数据进行压缩.数据压缩的算法非常多,但大部分的数据压缩算法的原理是通过某种编码方式不存储数据中的0比特位,因此0比特位越多,数据压缩的效果越好.Zi ...

  5. ContentProvider和Cursor以及CursorAdapter三者之间内部链接实现原理 解析

    最近 在学习Android3.0中推出的 Loader 机制,其中CursorLoader 这个加载器说是可以实时监测数据和更新数据,为了一探究竟,就连带的将 ContentProvider和Curs ...

  6. Mac 10.12安装Windows远程桌面工具Microsoft Remote Desktop

    说明:之前Office自带的Windows远程桌面工具虽然简便,但是保存的服务器列表有限.而这个微软推出的自家工具可以完美解决这些问题. 下载: (链接:https://pan.baidu.com/s ...

  7. mysql中对my.cnf进行说明

    my.cnf说明: #vim /etc/my.cnf以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略. [mysqld] port =  ...

  8. 谈谈数据库的ACID

    一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位. 准备工作:为了说明事务的ACID原理,我们使用银行账户及资金管理的案例进行分析. // 创建 ...

  9. ZendStudio操作技巧

    1.恢复窗口默认布局 点开菜单栏上的“windows”,出来的菜单中有个“Reset Perspective...”,点这个就行了

  10. Vue单文件模板实例

    AddItemComponent.vue <template> <div id="add-item-template"> <div class=&qu ...