博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#写csv文件
阅读量:5221 次
发布时间:2019-06-14

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

1、在项目中经常需要把报表下载为csv格式的文件,如何在C#中写csv文件,以下为一个简化的例子,不使用任何控件,旨在说明用法。

前端view

下载结果

2、创建一个MVC项目(Intranet Application),项目结构如下

3、各部分代码:

3.1、定义实体

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace MvcDownLoadCsv.Models{    public class Person    {        public string Name { get; set; }        public string Code { get; set; }        public string Department { get; set; }    }}
View Code

3.2、定义共用方法,将object数据转换为HtmlString,

using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace MvcDownLoadCsv.Extensions{    public static class DataTypeExtensions    {        public static HtmlString ToHtmlCsv(this object o)        {            if (o == null) return new HtmlString("");            var s = o.ToString();            if (s.Length == 0) return new HtmlString(s);            s = s.Replace("\"", "\"\"");            HtmlString hs = new HtmlString(s.ToString());            return new HtmlString(string.Concat("\"", s, "\""));        }    }}
View Code

3.3、定义公用方法,把Model数据转换为csv格式文件

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using System.Text;using System.IO;using System.Text.RegularExpressions;namespace MvcDownLoadCsv{    public class CsvDownloadResult : ActionResult    {        public CsvDownloadResult(string name, object model)        {            this.name = name;            this.model = model;        }        private string name;        private object model;        public override void ExecuteResult(ControllerContext context)        {            context.HttpContext.Response.Clear();            context.HttpContext.Response.AddHeader("content-disposition", string.Format("attachment; filename=My.{0}.csv", name));            context.HttpContext.Response.ContentEncoding = Encoding.GetEncoding(1252);// Use ANSI encoding            context.HttpContext.Response.ContentType = "application/vnd.ms-excel";            var csv = "";            using (StringWriter sw = new StringWriter())            {                var viewResult = ViewEngines.Engines.FindPartialView(context, name + "Csv");                var viewContext = new ViewContext(context, viewResult.View, new ViewDataDictionary(model), new TempDataDictionary(), sw);                viewResult.View.Render(viewContext, sw);                csv = sw.GetStringBuilder().ToString();                csv = Regex.Replace(csv, "\r\n[ ]+\r\n[ ]+", "\r\n");                csv = Regex.Replace(csv, ",\r\n[ ]*", ",");            }            context.HttpContext.Response.Write(csv);            context.HttpContext.Response.End();        }    }}
View Code

此例子中context最后为:

\Person Report\"\r\n\r\n\"Name\",\"Person Code\",\"Person Department\",\r\n\"a\" ,\"1\" ,\"Developer\" ,\r\n\"b\" ,\"2\" ,\"Test\" ,\r\n\"c\" ,\"3\" ,\"HR\" ,\r\n"

\r是回车,英文是Carriage return,表示使光标下移一格

\n是换行,英文是New line,表示使光标到行首

\r\n表示回车换行

 

3.4、定义csv文件格式

@using MvcDownLoadCsv.Extensions@model List
"Person Report"@if (Model.Count == 0){
"No Person find."
}else{
"Name","Person Code","Person Department",
foreach (var item in Model) { @item.Name.ToHtmlCsv()
,
@item.Code.ToHtmlCsv()
,
@item.Department.ToHtmlCsv()
,
}}
View Code

3.5、后台方法,构造数据,定义响应前端下载的方法

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Mvc;using MvcDownLoadCsv.Models;namespace MvcDownLoadCsv.Controllers{    public class HomeController : Controller    {        public ActionResult Index()        {            ViewBag.Message = "Welcome to ASP.NET MVC!";                       return View(GetPerson());        }        public ActionResult About()        {            return View();        }        public List
GetPerson() { List
lst = new List
() { new Person() { Name = "a", Code = "1", Department = "Developer" }, new Person() { Name = "b", Code = "2", Department = "Test" }, new Person() { Name = "c", Code = "3", Department = "HR" } }; return lst; } [HttpPost] public ActionResult DownloadCsv() { //Person为定义报表格式的cshtml文件名称, GetPerson()返回的是报表数据 return new CsvDownloadResult("Person", GetPerson()); } } }
View Code

3.6、前端页面view

@model List
@{ ViewBag.Title = "Home Page";}

@ViewBag.Message

To learn more about ASP.NET MVC visit http://asp.net/mvc.

@if (Model.Count > 0) {
download
copy
}
@{ foreach (var item in Model) {
} }
Name Code Department
@item.Name @item.Code @item.Department
View Code

转载于:https://www.cnblogs.com/xiaochun126/p/4729918.html

你可能感兴趣的文章