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,可以把动态生成的内容当作文件来 ...
随机推荐
- 干货 | Elasticsearch Nested类型深入详解(转)
https://blog.csdn.net/laoyang360/article/details/82950393 0.概要在Elasticsearch实战场景中,我们或多或少会遇到嵌套文档的组合形式 ...
- 线程池(Linux实现)
讨论QQ群:135202158 本文技术参考了sourceforge项目c thread pool,链接:http://sourceforge.net/projects/cthpool/ 线程池如上一 ...
- jmeter结果分析(图形报表和聚合报告)
采用Jmeter测试工具对web系统作的负载测试,得出的响应报表,数据比较难懂,现作一具体说明.以下是在一次具体负载测试中得出的具体数值,测试线程设置情况为:线程数:200,等待时间(ramp-up) ...
- jQuery 动画用法
jQuery动画: <head> <meta charset="UTF-8"> <title>Title</title> <s ...
- 对HTTP和TCP的理解
1.TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上. ...
- RocketMQ消息发送的队列选择与容错策略
一个topic有多个队列,分散在不同的broker.producer在发送消息的时候,需要选择一个队列 producer发送消息全局时序图: 队列选择与容错策略结论: 在不开启容错的情况下,轮询队列进 ...
- mono for android读书笔记之硬件编程(转)
本章将会介绍: 传感器的API 加速器编程,设备的方向,近场检测 网络编程 蓝牙编程 上述的技术的应用场景很多,比如: 1.检测当前的网络是否可用,并提醒用户,检测当前的网络类型,比如Wifi.3G. ...
- html-css-js基本理解和简单总结
目录 一.对于网页的基本理解 1.网页是一种数据展示和信息交互的载体 2.网页组成部分 3.支撑一个网页的技术模块 二.html的理解和技术笔记 1.html理解 2.html技术笔记-html标签 ...
- java io 处理流,BufferdInputStream、BufferedWriter、BufferedReader
BufferdInputStream:读取helloworld.java helloworld.java: package io; public class HelloWorld { public s ...
- R语言改变大小写 toupper()和 tolower()函数
这些函数改变字符串的字符的大小写. 语法 toupper()和 tolower()函数的基本语法为: toupper(x) tolower(x) 以下是所使用的参数的说明: x - 向量输入. 示例 ...