将查询到的数据导出到Excel终结版

2023-12-09 17:39

本文主要是介绍将查询到的数据导出到Excel终结版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    吐槽

      最近新项目需要用到导出数据到Excel,试了试之前写的一篇博文,但是感觉那个不太好,主要原因是没能实现样式控制,今天我们就来介绍一种新的导出Excel方法,而且这种方法很轻量级,它利用xml生成,然后加不同后缀进行导出不同格式的文件。

    正文

 1.前台实现(这里直接使用submit将参数post到后台即可。)

 function download() {$('form').submit();}

2.控制器实现

return new XmlExcelResult<MemberMessageListDto>(list, "会籍公海");

 3.帮助类实现

  >>ExportingField.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Cloud.Arch.Utility.Excel
{[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]public class ExportingField : System.Attribute{public bool isExport;public string exportTitle;/// <summary>/// execl格式串/// </summary>public ExeclFiledType execlType;public ExportingField() { }public ExportingField(bool isexport, string exporttitle){isExport = isexport;exportTitle = exporttitle;}public ExportingField(bool isexport, string exporttitle, ExeclFiledType execltype){isExport = isexport;exportTitle = exporttitle;execlType = execltype;}}public enum ExeclFiledType{/// <summary>/// execl单元格的文本/// </summary>String = 10,/// <summary>/// execl单元格的货币格式/// </summary>Number = 20}
}

>>XMLExcelResult.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.Mvc;namespace Cloud.Arch.Utility.Excel
{/// <summary> /// 提供将泛型集合数据导出Excel文档。 要转换的类型的属性必须用ExportingField声明 才能识别/// </summary> /// <typeparam name="T"></typeparam> public class XmlExcelResult<T> : ActionResult where T : new(){public XmlExcelResult(IList<T> entity, string fileName){this.Entity = entity;DateTime time = DateTime.Now;this.FileName = string.Format("{0}{1}", fileName,time.ToString("yyMMddhhmmss"));}public XmlExcelResult(IList<T> entity){this.Entity = entity;DateTime time = DateTime.Now;this.FileName = string.Format("{0}_{1}_{2}_{3}",time.Month, time.Day, time.Hour, time.Minute);}public IList<T> Entity{get;set;}public string FileName{get;set;}public override void ExecuteResult(ControllerContext context){if (Entity == null){new EmptyResult().ExecuteResult(context);return;}SetResponse(context);}/// <summary> /// 设置并向客户端发送请求响应。 /// </summary> /// <param name="context"></param> private void SetResponse(ControllerContext context){StringBuilder sBuilder = ConvertEntity();byte[] bytestr = Encoding.UTF8.GetBytes(sBuilder.ToString());context.HttpContext.Response.Clear();context.HttpContext.Response.ClearContent();context.HttpContext.Response.Buffer = true;context.HttpContext.Response.Charset = "GB2312";context.HttpContext.Response.ContentEncoding = System.Text.Encoding.UTF8;context.HttpContext.Response.ContentType = "text/xml";context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + FileName + ".xls");context.HttpContext.Response.AddHeader("Content-Length", bytestr.Length.ToString());context.HttpContext.Response.Write(sBuilder);context.HttpContext.Response.Flush();context.HttpContext.Response.End();}/// <summary> /// 把泛型集合转换成组合Excel表格的字符串。 /// </summary> /// <returns></returns> private StringBuilder ConvertEntity(){StringBuilder sb = new StringBuilder();sb.Append(@"<?xml version='1.0'?>
<?mso-application progid='Excel.Sheet'?>
<Workbookxmlns='urn:schemas-microsoft-com:office:spreadsheet'xmlns:o='urn:schemas-microsoft-com:office:office'xmlns:x='urn:schemas-microsoft-com:office:excel'xmlns:ss='urn:schemas-microsoft-com:office:spreadsheet'xmlns:html='http://www.w3.org/TR/REC-html40'><DocumentProperties xmlns='urn:schemas-microsoft-com:office:office'><Author>Darl McBride</Author><LastAuthor>Bill Gates</LastAuthor><Created>2007-03-15T23:04:04Z</Created><Company>SCO Group, Inc.</Company><Version>11.8036</Version></DocumentProperties><ExcelWorkbook xmlns='urn:schemas-microsoft-com:office:excel'><WindowHeight>6795</WindowHeight><WindowWidth>8460</WindowWidth><WindowTopX>120</WindowTopX><WindowTopY>15</WindowTopY><ProtectStructure>False</ProtectStructure><ProtectWindows>False</ProtectWindows></ExcelWorkbook><Styles><Style ss:ID='Default' ss:Name='Normal'><Alignment ss:Vertical='Bottom' /><Borders /><Font /><Interior /><NumberFormat /><Protection /></Style><Style ss:ID='s1' ss:Name='s1'><Borders><Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders></Style><Style ss:ID='header' ss:Name='Header'><Font ss:FontName='宋体' x:CharSet='134' ss:Size='11' ss:Color='#FFFFFF'/><Alignment ss:Horizontal='Center' ss:Vertical='Center'/> <Interior ss:Color='#0070C0' ss:Pattern='Solid'/> <Borders><Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders></Style>
<Style ss:ID='Number'><Borders><Border ss:Position='Bottom' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Left' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Right' ss:LineStyle='Continuous' ss:Weight='1'/><Border ss:Position='Top' ss:LineStyle='Continuous' ss:Weight='1'/></Borders><NumberFormat ss:Format='&quot;¥&quot;#,##0;&quot;¥&quot;\-#,##0'/></Style></Styles><Worksheet ss:Name='Sheet1'><Table x:FullColumns='1' x:FullRows='1'>
");AddTableHead(sb);AddTableBody(sb);sb.Append(@"</Table> <WorksheetOptions xmlns='urn:schemas-microsoft-com:office:excel'><Print><ValidPrinterInfo /><HorizontalResolution>600</HorizontalResolution><VerticalResolution>600</VerticalResolution></Print><Selected /><Panes><Pane><Number>3</Number><ActiveRow>5</ActiveRow><ActiveCol>1</ActiveCol></Pane></Panes><ProtectObjects>False</ProtectObjects><ProtectScenarios>False</ProtectScenarios></WorksheetOptions></Worksheet></Workbook>");return sb;}/// <summary> /// 根据IList泛型集合中 用ExportingField特性标示的属性值来组合Excel表格。 /// </summary> /// <param name="sb"></param> private void AddTableBody(StringBuilder sb){if (Entity == null || Entity.Count <= 0){return;}PropertyDescriptorCollection properties = FindProperties();if (properties.Count <= 0){return;}string content = string.Empty;for (int i = 0; i < Entity.Count; i++){Type t = Entity[i].GetType();PropertyInfo[] fields = t.GetProperties();sb.Append("<Row ss:AutoFitHeight='0' ss:Height='20'>\n");for (int j = 0; j < fields.Length; j++){string sign = string.Empty;ExportingField[] arrDesc = (ExportingField[])fields[j].GetCustomAttributes(typeof(ExportingField), false);object obj = null;if (arrDesc != null && arrDesc.Length != 0 && arrDesc[0].isExport){ExeclFiledType eft = arrDesc[0].execlType;string execlTypeStr = (int)eft == 0 ? "s1" : eft.ToString();string execlDataTypeStr = (int)eft == 0 ? "String" : eft.ToString();sb.Append("<Cell ss:StyleID='" + execlTypeStr + "'>\n<Data ss:Type='" + execlDataTypeStr + "'>");obj = fields[j].GetValue(Entity[i], null);content = obj == null ? string.Empty : obj.ToString();//var arr = content.Split("<br/>".ToCharArray());var arr = Regex.Split(content, "<br/>", RegexOptions.IgnoreCase);if (arr != null && arr.Length > 0){foreach (var s in arr){if (!string.IsNullOrWhiteSpace(s)){sb.Append("<![CDATA[");sb.Append(s);sb.Append("]]>");sb.Append("<br/>");}}}sb.Append("</Data>\n</Cell>");}}sb.Append("</Row>\n");}}/// <summary> /// 根据指定类型T的所有根用ExportingField特性标示的属性值来组合Excel表头。 /// </summary> /// <param name="sb"></param> private void AddTableHead(StringBuilder sb){Type t = typeof(T);PropertyInfo[] fields = t.GetProperties();StringBuilder sheader = new StringBuilder();//存储标题行信息sheader.Append("<Row ss:AutoFitHeight='0' ss:Height='20'>\n");string content = string.Empty;for (int j = 0; j < fields.Length; j++){string sign = string.Empty;ExportingField[] arrDesc = (ExportingField[])fields[j].GetCustomAttributes(typeof(ExportingField), false);object obj = null;if (arrDesc != null && arrDesc.Length != 0 && arrDesc[0].isExport){sb.Append("<Column ss:Width='100'/>");sheader.Append("<Cell  ss:StyleID='header'>\n<Data ss:Type='String'>");obj = arrDesc[0].exportTitle;content = obj == null ? string.Empty : obj.ToString();//  var arr = content.Split("<br/>".ToCharArray());var arr = Regex.Split(content, "<br/>", RegexOptions.IgnoreCase);if (arr != null && arr.Length > 0){foreach (var s in arr){if (!string.IsNullOrWhiteSpace(s)){sheader.Append("<![CDATA[");sheader.Append(s);sheader.Append("]]>");sheader.Append("<br/>");}}}sheader.Append("</Data>\n</Cell>\n");}}sheader.Append("</Row>");sb.Append(sheader.ToString());}/// <summary> /// 返回指定类型T的属性集合。 /// </summary> /// <returns></returns> private static PropertyDescriptorCollection FindProperties(){return TypeDescriptor.GetProperties(typeof(T));}/// <summary>/// 获取枚举类型的描述信息/// </summary>/// <param name="obj"></param>/// <returns></returns>public static ExportingField GetDescription(object obj){string objName = obj.ToString();Type t = obj.GetType();FieldInfo[] fields = t.GetFields();ExportingField[] arrDesc = (ExportingField[])fields[0].GetCustomAttributes(typeof(ExportingField), false);return arrDesc == null || arrDesc.Length == 0 ? new ExportingField(false, string.Empty) : arrDesc[0];}}
}

 导出效果如下:

如何要更改样式的话,可以通过调整文件样式,然后导出为xml格式,然后把程序里面的xml替换掉就OK了。具体自己可以试试~

这篇关于将查询到的数据导出到Excel终结版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/474551

相关文章

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

浅谈mysql的sql_mode可能会限制你的查询

《浅谈mysql的sql_mode可能会限制你的查询》本文主要介绍了浅谈mysql的sql_mode可能会限制你的查询,这个问题主要说明的是,我们写的sql查询语句违背了聚合函数groupby的规则... 目录场景:问题描述原因分析:解决方案:第一种:修改后,只有当前生效,若是mysql服务重启,就会失效;