我正在使用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
模型中包含所有内容并将其导出为:
我不喜欢的是,此当前方法导出整个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}}的建议吗?