Asp.net mvc 4 在Asp.NETMVC中集中导出到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

我正在MVC项目中执行导出到csv功能。目前,如果我在每个页面上编写代码,它就会正常工作。但我希望避免代码重复,集中执行导出功能

这是我的控制器代码

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();让我们