在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. Oauth2.0 整合springCloud的Zuul 解决关键BUG 报错信息:Principal must not be null

    不清楚Oauth2.0 的 可以查看我前几篇博文 2018.4.8 补充 我出现这个原因:是我在资源服务器使用了 如下图所示 Principal Oauth2.0 提供的获取用户信息的方法 使其找到相 ...

  2. Junit 测试exception

    有两种方法: 一.使用ExpectedException 仅在junit4.7以上支持.不仅可以测试捕获到某异常,也可以测试异常message. 使用例子如下: @Rule public Expect ...

  3. linux如何安装和启动mongdb

    1.下载安装包 下载地址: https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.9.tgz/dow ...

  4. Python PIL库学习笔记

    1.PIL简介 Python Imaging Library(缩写为PIL)(在新的版本中被称为Pillow)是Python编程语言的开源库,它增加了对打开,操作和保存许多不同图像文件格式的支持.它适 ...

  5. 基于Anaconda 安装 geatpy 和 tensorflow

    装了好久的第三方包终于成功了,暴风哭泣!!!总结一下 分两部分说: 一. 首先是在本地电脑windows系统下装: 首先安利一下这个包括各种 Genetic and Evolutionary Algo ...

  6. Docker 入门相关

    什么是Docker和容器 可能是把Docker的概念讲的最清楚的一篇文章 为什么要用Docker 相关网址 Window平台Docker下载 一些基本知识 Volume docker volume l ...

  7. 【Three.js】模型抗锯齿处理

    1.锯齿消除方法 three.js参考使用官方demo发现模型渲染有锯齿,这种情况在旋转视角时候就非常明显. 抗锯齿的方法,很简单,只需要配置render两个属性即可: renderer = new ...

  8. 从源码层面解析SpringIOC容器

    Spring IOC容器继承关系图 MessageSource支持消息国际化.ResouceLoader资源加载.BeanFactory创建Bean.ApplicationEventPublisher ...

  9. 在Windows Server 2008 R2(x64)上安装.NET Framework 4.5 兼谈.NET Framework 4.0 “在服务器核心角色上不受支持”含义

    完成了一个服务器文件监控系统,该系统的核心是一个Windows服务,需要安装在服务器上.由于是Visual Studio 2012开发,为了保证开发的Windows服务可以运行,必须在Windows服 ...

  10. window.name实现跨域

    在 http://www.cnblogs.com/zhuzhenwei918/p/6759459.html 这篇文章中,我提到了几种跨域的方式,这里主要讲解使用window.name实现跨域. 跨域就 ...