博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Magcodes.WeiChat——通过CsvFileResult以及DataAnnotations实现导出CSV文件
阅读量:6860 次
发布时间:2019-06-26

本文共 7031 字,大约阅读时间需要 23 分钟。

我们先来看看效果图:

从上图中可以看出,导出的文件中列名与表格名称保持一致,并且忽略了某些字段。

相关代码实现

我们来看相关代码:

页面代码:

@using (Html.BeginForm("Index", @Request.RequestContext.RouteData.GetRequiredString("controller"), FormMethod.Get))                    {                        
@Html.TextBox("q", ViewBag.q as string, new { @placeholder = "请输入关键字", @class = "input-sm form-control" })
@*
*@
@Html.DropDownList("UserGroups", null, htmlAttributes: new { @class = "input-sm form-control" })
 移动分组
 全量同步
 切换视图
@*
*@
}

控制器代码:

// GET: WeiChat_User        public async Task
Index(string q, int pageIndex = 1, int pageSize = 10, ExportTypes exportType = ExportTypes.None) { var syncHelper = new SyncHelper(); //同步微信用户组 await syncHelper.Sync(WeiChat_SyncTypes.Sync_WeiChat_User, TenantId, true, UserId); var queryable = db.WeiChat_Users.AsQueryable(); if (!string.IsNullOrWhiteSpace(q)) { //请替换为相应的搜索逻辑 queryable = queryable.Where(p => p.NickName.Contains(q) || p.City.Contains(q) || p.Country.Contains(q) || p.Province.Contains(q) || p.Remark.Contains(q)); } queryable = queryable.OrderByDescending(p => p.SubscribeTime); switch (exportType) { case Helpers.ExportTypes.Csv: return Csv(queryable.ToList()); //case Helpers.ExportTypes.Excel: // return Excel(queryable.ToList()); } var pagedList = new PagedList
( await queryable .Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync(), pageIndex, pageSize, await queryable.CountAsync()); var myGroups = db.WeiChat_UserGroups.Where(p => p.TenantId == TenantId).ToList(); foreach (var item in pagedList) { item.UserGroup = myGroups.FirstOrDefault(p => p.GroupId == item.GroupId); } ViewBag.UserGroups = new SelectList(myGroups, "GroupId", "Name"); return View(pagedList); }

注意上述代码中的Csv方法,通过该方法可以将当前List导出为CSV。而且支持查询结果导出。

CSV方法封装在TenantBaseController<TEntry>中,具体实现如下:

///         /// 导出CSV        ///         ///         /// 
public ActionResult Csv(IEnumerable
data) { return new CsvFileResult
(data); }

CsvFileResult<T>代码如下:

///     /// 导出CSV格式文件    ///     /// 
实体数据类型
//http://joshclose.github.io/CsvHelper/ public class CsvFileResult
: FileResult where T : class { private IEnumerable
_data; public CsvFileResult(IEnumerable
data) : base("text/csv") { this.FileDownloadName = string.Format("{0}.csv",DateTime.Now.ToString("yyyyMMddHHmmss")); _data = data; } protected override void WriteFile(HttpResponseBase response) { var outPutStream = response.OutputStream; using (var streamWriter = new StreamWriter(outPutStream, System.Text.Encoding.UTF8)) using (var writer = new CsvWriter(streamWriter)) { writer.WriteHeader
(); foreach (var item in _data) { writer.WriteRecord(item); } streamWriter.Flush(); response.Flush(); } } }

这里使用到了CsvHelper。框架对CsvHelper进行了修改,以支持Display特性以及ExportIgnore特性。

ExportIgnoreAttribute

导出时忽略此属性

DisplayAttribute

指定本地化显示的字符串,这里使用其Name属性作为导出内容的字段友好名称

如前面导出内容所示,WeiChat_User定义如下:

///     /// 微信用户信息    ///     public class WeiChat_User : ITenantId    {        ///         /// 用户的标识,对当前公众号唯一        ///         [Key]        [Display(Name = "OpenId")]        public string OpenId { get; set; }        ///         /// 用户是否订阅该公众号标识        ///         [Display(Name = "是否订阅")]        public bool Subscribe { get; set; }        ///         /// 用户的昵称        ///         [Display(Name = "昵称")]        public string NickName { get; set; }        ///         /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知        ///         [Display(Name = "性别")]        public WeChatSexTypes Sex { get; set; }        ///         /// 用户所在城市        ///         [Display(Name = "所在城市")]        public string City { get; set; }        ///         /// 用户所在国家        ///         [Display(Name = "所在国家")]        public string Country { get; set; }        ///         /// 用户所在省份        ///         [Display(Name = "所在省份")]        public string Province { get; set; }        ///         /// 用户的语言,简体中文为zh_CN        ///         [Display(Name = "语言")]        public string Language { get; set; }        ///         /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。        ///         [Display(Name = "头像")]        public string HeadImgUrl { get; set; }        ///         /// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间        ///         [Display(Name = "关注时间")]        public DateTime SubscribeTime { get; set; }        ///         /// 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)        ///         [Display(Name = "UnionId")]        public string UnionId { get; set; }        ///         /// 公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注        ///         [Display(Name = "备注")]        public string Remark { get; set; }        ///         /// 用户所在的分组ID        ///         [Display(Name = "分组Id")]        public int? GroupId { get; set; }        ///         /// 所在用户组        ///         [Display(Name = "所在用户组")]        [NotMapped]        [ExportIgnore]        public WeiChat_UserGroup UserGroup { get; set; }        ///         /// 是否允许测试        ///         [Display(Name = "测试用户")]        [ExportIgnore]        public bool AllowTest { get; set; }        [ExportIgnore]        public int TenantId { get; set; }}

注意:字段“UserGroup”,“AllowTest”,“TenantId“将在导出时被忽略,同时导出字段名使用Display特性中的Name属性。

总结:通过封装CsvFileResult可以极大的简化导出CSV的编码工作,只需要在Action中return Csv(queryable.ToList())即可。再结合数据特性配套使用,极大的提高了导出内容与格式的灵活性。

转载地址:http://vuayl.baihongyu.com/

你可能感兴趣的文章
我的博客园的CSS和html设置
查看>>
数论基础(维诺格拉多夫著,裘光明译) 勘误
查看>>
vue-cookies的使用
查看>>
Code Signal_练习题_Make Array Consecutive2
查看>>
双向循环链表 初始化 插入 删除
查看>>
C#设计模式:职责链模式(Chain of Responsibility)
查看>>
Knockout.js随手记(2)
查看>>
条件注释判断IE浏览器
查看>>
Hibernate,删除对象时错误。
查看>>
C#中Cookies的读取
查看>>
冬季养生进补20招
查看>>
20179311《网络攻防实践》第四周作业
查看>>
《thinking in Java》第三章 控制程序流程
查看>>
《游戏引擎架构》笔记一
查看>>
pythoy-生成器
查看>>
Redis 分布式锁进化史
查看>>
Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
查看>>
Codeforces Round #547 (Div. 3) D
查看>>
kali linux fuzz工具集简述
查看>>
20165324 前四周总结反思
查看>>