Asp.net mvc 4 在Asp.NETMVC中集中导出到CSV文件
我正在MVC项目中执行导出到csv功能。目前,如果我在每个页面上编写代码,它就会正常工作。但我希望避免代码重复,集中执行导出功能 这是我的控制器代码Asp.net mvc 4 在Asp.NETMVC中集中导出到CSV文件,asp.net-mvc-4,telerik-mvc,export-to-csv,Asp.net Mvc 4,Telerik Mvc,Export To Csv,我正在MVC项目中执行导出到csv功能。目前,如果我在每个页面上编写代码,它就会正常工作。但我希望避免代码重复,集中执行导出功能 这是我的控制器代码 public ActionResult Export(string filterBy) { GridState gs = new GridState(); gs.Filter = filterBy; gs.Page = 1; gs.Siz
public ActionResult Export(string filterBy)
{
GridState gs = new GridState();
gs.Filter = filterBy;
gs.Page = 1;
gs.Size = int.MaxValue;
IEnumerable cities = City.GetAll().AsEnumerable().AsQueryable().ToGridModel(gs).Data;
MemoryStream output = new MemoryStream();
StreamWriter writer = new StreamWriter(output, Encoding.UTF8);
writer.Write("Country Name,");
writer.Write("State Name,");
writer.Write("City Name,");
writer.Write("City STD Code,");
writer.Write("Is Display");
writer.WriteLine();
foreach (CityViewModel city in cities)
{
writer.Write(city.CountryName);
writer.Write(",");
writer.Write("\"");
writer.Write(city.StateName);
writer.Write("\"");
writer.Write(",");
writer.Write("\"");
writer.Write(city.City.Name);
writer.Write("\"");
writer.Write(",");
writer.Write(city.City.STDCode);
writer.Write("\"");
writer.Write(",");
writer.Write(city.City.IsDisplay);
writer.WriteLine();
}
writer.Flush();
output.Position = 0;
return File(output, "text/comma-separated-values", "city.csv");
}
我的看法是:
@model Telerik.Web.Mvc.GridModel<QuexstERP.BusinessCore.BusinessEntities.SysAdmin.CityViewModel>
@using Telerik.Web.Mvc.UI
@{
ViewBag.Title = "City List";
}
@(Html.Telerik().Grid(Model.Data)
.Name("Grid")
.DataKeys(keys => keys.Add(c => c.City.Id))
.ToolBar(commands => commands.Insert().ButtonType(GridButtonType.Image).ImageHtmlAttributes(new { style = "margin-left:0", title = "Add" }))
.ToolBar(commands => commands
.Custom()
.HtmlAttributes(new { id = "TestFilter", onclick = "command_onClick(this)" })
.Text("Export to csv")
.Action("Export", "City", new { filterBy = "~" }))
.DataBinding(dataBinding =>
dataBinding.Server()
.Select("Select", "City", new { GridButtonType.Text })
.Insert("Create", "City", new { GridButtonType.Text })
.Update("Save", "City", new { GridButtonType.Text })
.Delete("Delete", "City", new { GridButtonType.Text }))
.Columns(columns =>
{
columns.Command(commands =>
{
commands.Custom("Edit").Action("Edit", "City").ImageHtmlAttributes(new { @class = "t-edit" }).ButtonType(GridButtonType.Image).HtmlAttributes(new { title = "Edit", @class = "RightAlign" });
}).Width(40).Title("Edit").Visible(OperationHelper.EditOperation);
columns.Command(commands =>
{
commands.Delete().ButtonType(GridButtonType.Image).HtmlAttributes(new { title = "Delete", @class = "RightAlign" });
}).Width(40).Title("Delete").Visible(OperationHelper.DeleteOperation);
columns.Bound(p => p.CountryName).Width(200).Title("Country");
columns.Bound(p => p.StateName).Width(200).Title("State");
columns.Bound(p => p.City.Name).Width(310).Title("City");
columns.Bound(p => p.City.STDCode).Width(200).Title("STD Code");
columns.Bound(p => p.City.IsDisplay).Width(110).Title("IsDisplay");
})
.Pageable()
.Scrollable()
.Sortable()
.Filterable()
.Resizable(command => command.Columns(true))
)
@section HeadContent {
<script type="text/javascript">
function command_onClick(e) {
var grid = $('#Grid').data('tGrid');
var $cmd = $('#TestFilter');
// Get its 'href' attribute - the URL where it would navigate to
var href = $cmd.attr('href');
// Update the 'filter' parameter with the grids' current filtering state
href = href.replace(/filterBy=(.*)/, 'filterBy=' + (grid.filterBy || '~'));
// Update the 'order' parameter with the grids' current ordering state
href = href.replace(/orderBy=([^&]*)/, 'orderBy=' + (grid.orderBy || '~'));
// Update the 'page' parameter with the grids' current page
href = href.replace(/page=([^&]*)/, 'page=' + grid.currentPage);
// Update the 'href' attribute
$cmd.attr('href', href);
}
</script>
}
@model Telerik.Web.Mvc.GridModel
@使用Telerik.Web.Mvc.UI
@{
ViewBag.Title=“城市列表”;
}
@(Html.Telerik().Grid(Model.Data)
.名称(“网格”)
.DataKeys(keys=>keys.Add(c=>c.City.Id))
.ToolBar(commands=>commands.Insert().ButtonType(GridButtonType.Image).ImageHtmlAttributes(新的{style=“margin left:0”,title=“Add”}))
.ToolBar(命令=>命令
.Custom()
.HtmlAttributes(新的{id=“TestFilter”,onclick=“command\u onclick(this)”})
.Text(“导出到csv”)
.行动(“出口”,“城市”,新{filterBy=“~”}))
.DataBinding(数据绑定=>
dataBinding.Server()
.Select(“选择”、“城市”,新建{GridButtonType.Text})
.Insert(“创建”、“城市”,新建{GridButtonType.Text})
.Update(“保存”、“城市”,新的{GridButtonType.Text})
.Delete(“Delete”,“City”,new{gridbuttonype.Text}))
.列(列=>
{
columns.Command(commands=>
{
commands.Custom(“Edit”).Action(“Edit”、“City”).ImageHtmlAttributes(新的{@class=“t-Edit”}).ButtonType(GridButtonType.Image).HtmlAttributes(新的{title=“Edit”,@class=“RightAlign”});
}).宽度(40).标题(“编辑”).可见(OperationHelper.EditOperation);
columns.Command(commands=>
{
commands.Delete();
}).宽度(40).标题(“删除”).可见(OperationHelper.DeleteOperation);
columns.Bound(p=>p.CountryName).宽度(200).标题(“国家”);
columns.Bound(p=>p.StateName).Width(200).Title(“State”);
columns.Bound(p=>p.City.Name).Width(310.Title)(“City”);
columns.Bound(p=>p.City.STDCode).宽度(200).标题(“标准代码”);
columns.Bound(p=>p.City.IsDisplay).宽度(110).标题(“IsDisplay”);
})
.Pageable()
.Scrollable()
.Sortable()
.可过滤()
.reshable(command=>command.Columns(true))
)
@章节标题内容{
功能命令\u onClick(e){
var grid=$('#grid')。数据('tGrid');
var$cmd=$(“#测试过滤器”);
//获取其“href”属性-它将导航到的URL
var href=$cmd.attr('href');
//使用网格的当前过滤状态更新“filter”参数
href=href.replace(/filterBy=(.*)/,'filterBy='+(grid.filterBy | |'~);
//使用网格的当前排序状态更新“order”参数
href=href.replace(/orderBy=([^&]*)/,'orderBy='+(grid.orderBy | |'~');
//使用网格的当前页面更新“页面”参数
href=href.replace(/page=([^&]*)/,“page=”+grid.currentPage);
//更新“href”属性
$cmd.attr('href',href);
}
}
我想集中导出到CSV。我的项目中的许多表单(如state、country和country)都具有导出功能。是否可以编写一个泛型类并向其传递参数。而导出到csv是集中完成的???我们通过将数据源绑定到控制器方法中的GridView实现了类似的功能,例如
var data = GetSomeData();
var grid = new GridView { DataSource = data };
grid.DataBind();
Response.ClearContent();
Response.AddHeader("content-disposition", "attachment; filename=MyExcel.xls");
Response.ContentType = "application/vnd.ms-excel";
var sw = new StringWriter();
var htw = new HtmlTextWriter(sw);
grid.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
这样,您就可以在GridView上设置相关的数据源,并在输出流中返回网格数据的转储。经过一点重构,我们能够使其通用化,现在我们所有的UI网格都使用它导出到Excel/CSV。仅供参考。不要将数据绑定到网格,然后将其导出到excel。它会给你 您试图打开的文件的格式与 由文件扩展名指定 尝试打开Excel时出错 我已经为上述问题做了这个解决方案
public static void ExportToExcel(IEnumerable<dynamic> data, string sheetName)
{
XLWorkbook wb = new XLWorkbook();
var ws = wb.Worksheets.Add(sheetName);
ws.Cell(2, 1).InsertTable(data);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
HttpContext.Current.Response.AddHeader("content-disposition", String.Format(@"attachment;filename={0}.xlsx",sheetName.Replace(" ","_")));
using (MemoryStream memoryStream = new MemoryStream())
{
wb.SaveAs(memoryStream);
memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
memoryStream.Close();
}
HttpContext.Current.Response.End();
}
publicstaticvoidexporttoexcel(IEnumerable数据,stringsheetname)
{
xl工作簿wb=新的xl工作簿();
var ws=wb.Worksheets.Add(sheetName);
ws.Cell(2,1).InsertTable(数据);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType=“application/vnd.openxmlformats officedocument.spreadsheetml.sheet”;
HttpContext.Current.Response.AddHeader(“内容处置”,String.Format(@“附件;文件名={0}.xlsx”,sheetName.Replace(“,”));
使用(MemoryStream MemoryStream=new MemoryStream())
{
wb.SaveAs(内存流);
memoryStream.WriteTo(HttpContext.Current.Response.OutputStream);
memoryStream.Close();
}
HttpContext.Current.Response.End();
}
它动态地获取数据。使用,以便无错误,并且导出到Excel功能是应用程序的核心
希望这对某人有帮助。:) 对。我们在一个MVC4项目中使用了它。我们在15+列的网格上使用它。我们没有看到任何问题。你说的数据标记是什么意思?city.CountryName city.StateName正确显示,但不是city.city.Name不显示。我们使用LINQ语句定义数据转储中需要的确切列,例如var data=myDataService.GetData()。选择(o=>new{Col1=o.ID,Col2=o.Address})。ToList();让我们