将List下载到本地保存为Excel
2024-10-11 08:22:28
直接附上代码
/// <summary>
/// 将List保存为Excel
/// </summary>
/// <typeparam name="T">保存的类类型</typeparam>
/// <param name="lt">需要保存的源数据</param>
/// <param name="fileName">保存的文件名称</param>
/// <param name="fields">对应于类的字段名称</param>
/// <param name="titles">对应于Excel的列名</param>
public static void Save<T>(List<T> lt, string fileName, string[] fields, string[] titles)
{
if (lt == null || lt.Count == )
{
throw new ArgumentNullException("数据为空");
} var sb = new StringBuilder();
PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
const string next = "\t"; foreach (var title in titles)
{
sb.Append(title).Append(next);
} var propertys = new List<PropertyInfo>(); foreach (var field in fields)
{
foreach (PropertyInfo prop in props)
{
if (prop.Name.Equals(field))
{
propertys.Add(prop);
break;
}
}
} sb.Append(Environment.NewLine); foreach (T item in lt)
{
foreach (var property in propertys)
{
object value = property.GetValue(item, null); if (property.PropertyType.BaseType == typeof(Enum))
{
sb.Append(GPMSKernel.Unility.Enums.GetEnumDescription(value));
}
else if (property.PropertyType == typeof(Boolean))
{
if ((bool)value)
{
sb.Append("是");
}
else
{
sb.Append("否");
}
}
else
{
sb.Append(value);
} sb.Append(next);
} sb.Append(Environment.NewLine);
} fileName = string.Format("{0}_{1}.xls", DateTime.Now.ToString("yyMMddHHmmss"), fileName);
HttpContext.Current.Response.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, Encoding.UTF8));
HttpContext.Current.Response.BinaryWrite(Encoding.UTF8.GetBytes(sb.ToString()));
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
}
此方法是把List从Web服务器上下载到本地并保存为Excel的,其中lt是要保存的数据源,fileName是对应的文件名,可以直接写为要保存的类名,
fields对应于要保存的类的字段名,这个一定要正确,否则无法在类里找到该字段,titles是要保存的文件里面的列名,fields和titles必须一一对应,个数要相等。
保存之前有做特殊处理,比如如果要保存的类里面有枚举的话,直接保存到Excel里会变成英文的,这一般不是用户想看到的,那么需要在枚举的每个值前面标注[Description("***")],
GPMSKernel.Unility.Enums.GetEnumDescription可以获得枚举的Description值;如果是布尔值的话,直接保存就变成了"True"或"False"了,我把这种转换成了"是"或"否";如果要保存的类里面还有特殊的类,那么需要在这特殊的类里面重写ToString方法,保存的时候将会按照该ToString方法保存....
最新文章
- foreach DataTable或Table时要略过第一行。
- threading event
- Dapper使用方法:dapper-dot-net/Tests/Tests.cs解析(1)方法:TestMultiMapWithConstructor
- Python_爬虫1
- PHP之关闭网页错误提示
- [转]HTML5 classList API
- VS 制作安装包小窥
- 【js数据结构】可逐次添加叶子的二叉树(非最优二叉树)
- 整理下git常用命令
- Jquery.ajax dataType参数
- Selenium 工作原理
- ES5中文分词(IK)
- python爬虫之git的团队协作
- 019_Mac实用的图像备份工具
- python接口自动化测试十七:使用bs4框架进行简单的爬虫
- FutureTask源码解析
- kubespray -- 快速部署高可用k8s集群 + 扩容节点 scale.yaml
- 算法笔记_232:提取拼音首字母(Java)
- charles 在mac下 抓取 https包
- js根据数组对象中某个元素合并数组