MVC 导出Execl 的总结几种方式 (一)
在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 的总结几种方式 (一)的更多相关文章
- MVC 导出Execl 的总结几种方式 (二)
接着上面的来,继续导出Execl 的功能 使用FileResult 方式直接可以生产Execl ,这样我们将会写大量处理后台的代码,个人感觉不好,只是展示出来,提供参考 第一步:编辑控制器 publi ...
- MVC 导出Execl 的总结几种方式 (四)
这种方式我个人还是比较喜欢的,使用部分视图的方式,导出Execl 这样在编辑样式上也是很方便的 第一步: 编辑导出视图页 @using H5UpdateImage.Models; @{ Layout ...
- MVC 导出Execl 的总结几种方式 (三)
第三种方式呢,就是借用第三方插件 NPOI 来实现Execl 导出 第一步:在NuGut包中下载NPOI 组件 第二步:编辑控制器代码 public FileResult ExcelNewKeyPro ...
- .NET环境下导出Excel表格的两种方式和导入两种类型的Excel表格
一.导出Excel表格的两种方式,其中两种方式指的是导出XML数据类型的Excel(即保存的时候可以只需要修改扩展名为.xls)和真正的Excel这两种. using System; using Sy ...
- MVC验证10-到底用哪种方式实现客户端服务端双重异步验证
原文:MVC验证10-到底用哪种方式实现客户端服务端双重异步验证 本篇将通过一个案例来体验使用MVC的Ajax.BeginForm或jQuery来实现异步提交,并在客户端和服务端双双获得验证.希望能梳 ...
- spring mvc获取路径参数的几种方式 - 浅夏的个人空间 - 开源中国社区
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- mvc 导出execl
mvc导出execl 必须是get方法才可以 也不能使用ajax function ComplaintsExport() { var serial = $("form").ser ...
- Spring MVC中forward请求转发2种方式(带参数)
Spring MVC中forward请求转发2种方式(带参数) http://www.51gjie.com/javaweb/956.html
- PHP导出excel文件的几种方式
PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...
随机推荐
- 找到windows中的环境变量
我的电脑,右击--->属性---->高级系统设置---->高级----->环境变量
- nginx负载均衡之入门配置
先来简单了解一下什么是负载均衡,单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况.那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上 ...
- appium+python 存在多个类时,不用每次都初始化解决办法
appium+python写自动化测试用例时,为了代码的可维护性,分成不同的类是很常见的办法, 但是在运行时,每一个类都要初始化一次,即每次都会重启应用,这很麻烦,通过__new__可进行多个类之间的 ...
- server端获得到client端的IP地址的格式
使用telnet,ping或其他client连接server端时,server端获得的client端的ip地址取决于client端使用的时ipv4还是ipv6地址. 例: client IPv4地址: ...
- 用AndroidSDK中的Face Detector实现人脸识别
很多手机图片管理应用都开始集成人脸识别功能.一提到人脸识别,模式识别,滤波,BlahBlah 一堆复杂的技术名字戳入脑海中,立刻觉得这玩意儿没法碰,太玄乎了.其实Android SDK从1.0版本中( ...
- mono上部署web程序初体验
早就想体验一下mono,但一直琐事缠身.难得有时间,便在网上一通狂搜mono相关的资料. 如果想使用Apache服务器,只能使用mod_mono的方式,这里有详细的介绍.这种方式有点繁琐,需要安装一大 ...
- java service wrapper将java程序包装成系统服务(一)
一. 概述 使用java语言开发应用程序,在windows平台下,一般存在3种应用形式: 1. web应用.web应用多数打成war包在web容器(如tomcat,jetty等)中运行. 2. 桌面应 ...
- WPF中使用Grid来实现图层的效果
<Style x:Key="ScanButtonStyle" TargetType="{x:Type Button}"> <!--<Se ...
- npm安装过程中的win环境变量设置
我们要先配置npm的全局模块的存放路径以及cache的路径,例如我希望将以上两个文件夹放在NodeJS的主目录下,便在NodeJs下建立”node_global”及”node_cache”两个文件夹. ...
- 使用 DL4J 训练中文词向量
目录 使用 DL4J 训练中文词向量 1 预处理 2 训练 3 调用 附录 - maven 依赖 使用 DL4J 训练中文词向量 1 预处理 对中文语料的预处理,主要包括:分词.去停用词以及一些根据实 ...