MVC:在我的View到Excel文件中导出网格的内容?

时间:2015-02-26 16:30:34

标签: c# asp.net-mvc export-to-excel

我正在使用GridMVC将我的模型数据值加载到我视图中的一个漂亮网格中,并具有排序/过滤功能。网格在View:

上编码如此
<div class="assetList">
    @try
    {
        @Html.Grid(Model).Columns(columns =>
        {
            columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="/INV_Assets/Edit/@o.Id" class="btn btn-primary btn-sm noDecoration"><span class="glyphicon glyphicon-pencil"></span> @*Edit*@</a>).SetWidth(15);
            columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="/INV_Assets/Delete/@o.Id" class="btn btn-danger btn-sm noDecoration"><span class="glyphicon glyphicon-remove-circle"></span> @*Delete*@</a>).SetWidth(15);
            columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="#" class="btn btn-default btn-sm noDecoration verifyBtn" onclick="verifyAsset(@o.Id)"><span class="glyphicon glyphicon-ok"></span> @*View*@</a>).SetWidth(15);
            @*columns.Add().Encoded(false).Sanitized(false).RenderValueAs(o => @<a href="/INV_Assets/Details/@o.Id" class="btn btn-default btn-sm noDecoration"><span class="glyphicon glyphicon-eye-open"></span> @*View*</a>).SetWidth(15);*@
            columns.Add(o => o.Status.status_description).Titled("Status").RenderValueAs(o => o.Status.status_description).Sanitized(false).Encoded(false).Sortable(true).Filterable(true).SetWidth(20);
            columns.Add(o => o.Location.location_dept).Titled("Dept").RenderValueAs(o => o.Location.location_dept).SetWidth(20);
            columns.Add(o => o.Location.location_room).Titled("Room").RenderValueAs(o => o.Location.location_room).SetWidth(20);
            columns.Add(o => o.owner).Titled("Owner").RenderValueAs(o => o.owner).SetWidth(20);
            columns.Add(o => o.Type.type_description).Titled("Type").RenderValueAs(o => o.Type.type_description).SetWidth(20);
            columns.Add(o => o.Manufacturer.manufacturer_description).Titled("Manufacturer").RenderValueAs(o => o.Manufacturer.manufacturer_description).SetWidth(20);
            columns.Add(o => o.Model.model_description).Titled("Model").RenderValueAs(o => o.Model.model_description).SetWidth(20);
            columns.Add(o => o.Vendor.vendor_name).Titled("Vendor").RenderValueAs(o => o.Vendor.vendor_name).SetWidth(20);
            columns.Add(o => o.description).Titled("Desc").RenderValueAs(o => o.description).SetWidth(20);
            columns.Add(o => o.asset_tag_number).Titled("Asset Tag #").RenderValueAs(o => o.asset_tag_number).SetWidth(20);
            columns.Add(o => o.serial_number).Titled("Serial #").RenderValueAs(o => o.serial_number).SetWidth(20);
            columns.Add(o => o.ip_address).Titled("IP Addr").RenderValueAs(o => o.ip_address).SetWidth(20);
            columns.Add(o => o.mac_address).Titled("Mac Addr").RenderValueAs(o => o.mac_address).SetWidth(20);
            columns.Add(o => o.po_number).Titled("PO #").RenderValueAs(o => o.po_number).SetWidth(20);
            columns.Add(o => o.invoice_number).Titled("Inv. #").RenderValueAs(o => Convert.ToString(o.invoice_number)).SetWidth(20);
            columns.Add(o => o.cost).Titled("Cost").RenderValueAs(o => "$" + Convert.ToString(o.cost)).SetWidth(20);
            columns.Add(o => o.note).Titled("Note").RenderValueAs(o => o.note).SetWidth(20);
            columns.Add(o => o.acquired_date).Titled("Acq. Date").RenderValueAs(o => Convert.ToString(o.acquired_date)).SetWidth(20);
            columns.Add(o => o.disposed_date).Titled("Disp. Date").RenderValueAs(o => Convert.ToString(o.disposed_date)).SetWidth(20);
            columns.Add(o => o.verified_date).Titled("Ver. Date").RenderValueAs(o => Convert.ToString(o.verified_date)).SetWidth(20);
            columns.Add(o => o.created_date).Titled("Crtd. Date").RenderValueAs(o => Convert.ToString(o.created_date)).SetWidth(20);
            columns.Add(o => o.created_by).Titled("By").RenderValueAs(o => o.created_by).SetWidth(20);
            columns.Add(o => o.modified_date).Titled("Mod. Date").RenderValueAs(o => Convert.ToString(o.modified_date)).SetWidth(20);
            columns.Add(o => o.modified_by).Titled("By").RenderValueAs(o => o.modified_by).SetWidth(20);
        }).WithPaging(10).Sortable().Filterable().WithMultipleFilters();
    }
    catch (NullReferenceException ex)
    {
        return;
    }
</div>

使用我当前的数据,当我过滤显示唯一Asset [Status] Available(1条记录)时,HTML呈现(仅针对数据行,而不是数据行)列标题/过滤器功能)是这样的:

    <tbody>
                        <tr class="grid-row ">
<td class="grid-cell" data-name=""><a href="/INV_Assets/Edit/5" class="btn btn-primary btn-sm noDecoration"><span class="glyphicon glyphicon-pencil"></span> </a></td>
<td class="grid-cell" data-name=""><a href="/INV_Assets/Delete/5" class="btn btn-danger btn-sm noDecoration"><span class="glyphicon glyphicon-remove-circle"></span> </a></td>
<td class="grid-cell" data-name=""><a href="#" class="btn btn-default btn-sm noDecoration verifyBtn" onclick="verifyAsset(5)"><span class="glyphicon glyphicon-ok"></span> </a></td>
<td class="grid-cell" data-name="Status.status_description">AVAILABLE</td>   
<td class="grid-cell" data-name="Location.location_dept">IT</td>
<td class="grid-cell" data-name="Location.location_room">Storage</td>
<td class="grid-cell" data-name="owner"></td>
<td class="grid-cell" data-name="Type.type_description">Desktop</td>
<td class="grid-cell" data-name="Manufacturer.manufacturer_description">Apple</td>
<td class="grid-cell" data-name="Model.model_description">A1396</td>
<td class="grid-cell" data-name="Vendor.vendor_name">Apple</td>
<td class="grid-cell" data-name="description">32GB iPad - 3rd Generation</td>
<td class="grid-cell" data-name="asset_tag_number">673158189254</td>
<td class="grid-cell" data-name="serial_number">HGT9823</td>
<td class="grid-cell" data-name="ip_address">10.10.159.73</td>
<td class="grid-cell" data-name="mac_address">10.10.92.48</td>
<td class="grid-cell" data-name="po_number">H423</td>
<td class="grid-cell" data-name="invoice_number">210</td>
<td class="grid-cell" data-name="cost">$22.50</td>
<td class="grid-cell" data-name="note"></td>
<td class="grid-cell" data-name="acquired_date">2/25/2015 8:37:08 AM</td>
<td class="grid-cell" data-name="disposed_date"></td>
<td class="grid-cell" data-name="verified_date">1/1/2015 12:00:00 PM</td>
<td class="grid-cell" data-name="created_date">2/25/2015 8:37:08 AM</td>
<td class="grid-cell" data-name="created_by">Admin</td>
<td class="grid-cell" data-name="modified_date"></td>
<td class="grid-cell" data-name="modified_by"></td>    
</tr></tbody>

我尝试做的是创建一个Export()功能,将指定字段的内容导出到Excel文件中。例如,我的最终网格可能只包含10个字段列,但模型本身有27个字段。我希望将所有字段都包含为复选框,并且对于每个选中的字段,将当前在网格中的特定字段导出到Excel文件。

我从几个例子拼凑了以下的控制器动作:

    public ActionResult Export()
    {
        GridView gv = new GridView();
        gv.DataSource = _db.INV_Assets.ToList();
        gv.DataBind();
        Response.ClearContent();
        Response.Buffer = true;
        Response.AddHeader("content-disposition", "attachment; filename=InventoryAssets-" + DateTime.Now + ".xls");
        Response.ContentType = "application/ms-excel";
        Response.Charset = "";
        StringWriter sw = new StringWriter();
        HtmlTextWriter htw = new HtmlTextWriter(sw);
        gv.RenderControl(htw);
        Response.Output.Write(sw.ToString());
        Response.Flush();
        Response.End();

        return RedirectToAction("Index", "Home");
    }

目前我的INV_Assets模型中包含所有内容并将其导出为:

ExportToExcel

我不喜欢的是,此当前方法导出整个INV_Assets表/模型,并导出模型,制造商,类型,位置,供应商和状态ID&# 39;而不是每个的Text值。此外,[asset_tag_number] 293548195023应该像2.93548E+11一样显示在文件中ExportUsingEPPlus(),但我认为这只是一个格式化问题。

任何人都可以提供有关如何改进/或更好地实现所需功能的见解或建议吗?


修改

使用Dawood的建议,我试图使用EPPlus。在我的视图中,我现在有一个ListBox,其中填充了我的所有模型属性和一个调用我的@Html.ListBox("PropertyList", typeof(InventoryTracker.Models.INV_Assets).GetProperties().Select(p => new SelectListItem { Text = p.Name, Value = p.Name, Selected = false }), new { @Id = "exportListBox" }) <a href="/Export/ExportUsingEPPlus" class="btn btn-default btn-sm noDecoration"><span class="glyphicon glyphicon-export"> Export - EPPlus</span></a> 控制器操作的链接:

    public ActionResult ExportUsingEPPlus()
    {

        //FileInfo newExcelFile = new FileInfo(output);
        ExcelPackage package = new ExcelPackage();
        var ws = package.Workbook.Worksheets.Add("TestExport");
        ws.Cells["A1"].Value = "Sample Export 1";


        var memoryStream = new MemoryStream();
        package.SaveAs(memoryStream);

        string fileName = "Exported-InventoryAssets-" + DateTime.Now + ".xlsx";
        string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";

        memoryStream.Position = 0;
        return File(memoryStream, contentType, fileName);

    }

在我的控制器中,我已经获得了一个测试Excel文件,使用EPPlus我拼凑的一些例子来生成:

ExportUsingEPPlus()

我现在需要的是将ListBox中的所有选定值传递给我的控制器操作,然后创建一个包含所选字段中所有数据的Excel导出。

有人可以提供有关如何将我的ListBox选择传递给控制器​​操作{{1}}的建议吗?

0 个答案:

没有答案