我需要将Grid.MVC中的数据导出到Excel。我在这个链接中使用了解决方案。
http://www.codeproject.com/Articles/325103/MVC-Grid-to-Excel-file-download?msg=5161340#xx5161340xx
它正在运作,但我有两个问题。首先它在Chrome中工作但它在IE中不起作用。它在IE中给我一个错误(文件无法读取)。第二个问题是当我过滤网格时,Excel中导出的数据仍然显示所有数据而不是过滤后的数据。
如果这不是一个好的解决方案,请提供我将Grid.MVC数据导出为excel的示例。
答案 0 :(得分:1)
这是服务器端解决方案
在这种情况下,客户端组件并不重要。您传递用于导出的任何数据,都会将其导出到excel文件并下载。当我想导出数据时,我使用最新的过滤器并检索显示的相同数据。
希望对您有帮助。
GridView
来显示我的数据。DataBase
或任何地方检索数据。DataView
仅帮助我过滤数据。ClosedXML
添加到您的项目中。使用以下NuGet
命令:Install-Package ClosedXML
aspx
<form id="form1" runat="server">
<div>
<asp:TextBox ID="TextBox1" runat="server" placeholder="Name or Family" ></asp:TextBox>
<asp:Button ID="ButtonFilter" runat="server" Text="Filter" OnClick="ButtonFilter_Click" />
<br />
<br />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
<br />
<br />
<asp:Button ID="ButtonExport" runat="server" Text="Export" OnClick="ButtonExport_Click" />
</div>
</form>
C#代码
private DataTable dt = new DataTable();
private DataView dv;
private void Page_Load(object sender, System.EventArgs e)
{
dt.Columns.Add("Id");
dt.Columns.Add("EmployeeName");
dt.Columns.Add("EmployeeFamily");
for (int i = 0; i < 10; i++)
{
var r1 = dt.NewRow();
r1["Id"] = i + 100;
r1["EmployeeName"] = "Name " + i.ToString();
r1["EmployeeFamily"] = "Family " + i.ToString();
dt.Rows.Add(r1);
}
dv = new DataView(dt);
GridView1.DataSource = dv;
GridView1.DataBind();
}
private MemoryStream GetStream(XLWorkbook excelWorkbook)
{
MemoryStream fs = new MemoryStream();
excelWorkbook.SaveAs(fs);
fs.Position = 0;
return fs;
}
protected void ButtonFilter_Click(object sender, EventArgs e)
{
dv.RowFilter = $"EmployeeName LIKE '%{TextBox1.Text}%' OR EmployeeFamily LIKE '%{TextBox1.Text}%'";
GridView1.DataSource = dv;
GridView1.DataBind();
}
protected void ButtonExport_Click(object sender, EventArgs e)
{
dv = new DataView(dt);
dv.RowFilter = $"EmployeeName LIKE '%{TextBox1.Text}%' OR EmployeeFamily LIKE '%{TextBox1.Text}%'";
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(dv.ToTable(), "Employees");
string myName = HttpContext.Current.Server.UrlEncode("Employees.xlsx");
MemoryStream stream = GetStream(wb);
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + myName);
HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.BinaryWrite(stream.ToArray());
HttpContext.Current.Response.End();
}
}
更新:GridMvc
版本
在此版本中,我使用了GridMvc
,但仍在服务器端制作Excel文件
ASPX
@model IList<GridMvcExportToExcel.Controllers.EmployeeModel>
@using GridMvc.Html
@{
ViewBag.Title = "Home Page";
}
<script type="text/javascript">
function exportToExcel() {
debugger;
var txtFilter = $('#txtFilter').val(); // get the textbox value
var url = 'http://localhost:54312/Home/ExportToExcel?txtFilter=' + txtFilter;
location.href = url; // redirect
return false; // cancel default redirect
};
</script>
<div>
@using (Html.BeginForm("Index", "Home"))
{
@Html.TextBox("txtFilter", "", new { id = "txtFilter" })
<button type="submit">Filter</button>
}
<br />
@Html.Grid(Model).Columns(c =>
{
c.Add(x=>x.Id).Titled ("Employee Id");
c.Add(x=>x.Name).Titled ("First Name").Filterable(false);
c.Add(x=>x.Family).Titled ("Last Name").Filterable(true);
}).WithPaging(50)
<input type="button" id="exportToExcel" value="Export to Excel" onclick="exportToExcel()" />
</div>
C#
public class EmployeeModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Family { get; set; }
}
public class HomeController : Controller
{
private IList<EmployeeModel> employees = new List<EmployeeModel>();
public HomeController()
{
for (int i = 0; i < 20; i++)
{
employees.Add(new EmployeeModel()
{
Id = i + 1,
Name = "Name " + (i + 1).ToString(),
Family = "Family " + (i + 1).ToString(),
});
}
}
public ActionResult Index(string txtFilter)
{
txtFilter = txtFilter ?? "";
var result = employees.Where(x => x.Name.Contains(txtFilter) || x.Family.Contains(txtFilter) || x.Id.ToString() == txtFilter);
return View(result.ToList());
}
public void ExportToExcel(string txtFilter)
{
txtFilter = txtFilter ?? "";
var result = employees.Where(x => x.Name.Contains(txtFilter) || x.Family.Contains(txtFilter) || x.Id.ToString() == txtFilter).ToList();
DataTable table = new DataTable();
using (var reader = ObjectReader.Create(result))
{
table.Load(reader);
}
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(table, "Employees");
string myName = HttpContext.Server.UrlEncode("Employees.xlsx");
MemoryStream stream = GetStream(wb);
HttpContext.Response.Clear();
HttpContext.Response.Buffer = true;
HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + myName);
HttpContext.Response.ContentType = "application/vnd.ms-excel";
HttpContext.Response.BinaryWrite(stream.ToArray());
HttpContext.Response.End();
}
}
private MemoryStream GetStream(XLWorkbook excelWorkbook)
{
MemoryStream fs = new MemoryStream();
excelWorkbook.SaveAs(fs);
fs.Position = 0;
return fs;
}
}
答案 1 :(得分:0)
我有一个适用于我的javascript / jquery解决方案。
当你使用grid.mvc时,它会向thead和tbody添加一些类,需要删除这些类,以便在生成的excel文件上进行正确的导出/可视化。我也在使用grid.mvc,并且这段代码导出为excel,如果这对您有用,请告诉我。
<script>
$("#btnExport").click(function (e) {
$('.grid-wrap').find('table').removeAttr('class');
$('.grid-header').removeAttr('class');
$('.grid-row').removeAttr('class');
$('.grid-cell').removeAttr('data-name');
$('.grid-cell').removeAttr('class');
window.open('data:application/vnd.ms-excel,' + $('.grid-wrap').html());
//MakeAnyFunctionToReloadThePageToGetTheClassesAgain();
e.preventDefault();
});
</script>
@Html.Grid(Model).Columns(columns =>
{
columns.Add(foo => foo.Date).Sortable(true).Filterable(true);
columns.Add(foo => foo.User).Sortable(true).Filterable(true);
columns.Add(foo => foo.Controller).Sortable(true).Filterable(true);
columns.Add(foo => foo.Action).Sortable(true).Filterable(true);
columns.Add(foo => foo.ActionType).Sortable(true).Filterable(true);
columns.Add(foo => foo.JsonObject).Sortable(true).Filterable(true);
}).WithMultipleFilters()
<button type="button" class="btn btn-danger" id="btnExport">export csv</button>
答案 2 :(得分:0)
您必须从url中获取参数。 然后在后端构建自己的服务,该服务获取参数并将其导出到excel
let params = new URLSearchParams(document.location.search);
let allParams = params.getAll('grid-filter');
答案 3 :(得分:0)
在响应中设置以下标头,它将以正确的类型下载
data:application / vnd.ms-excel