gpt4 book ai didi

c# - 将 Grid.MVC 数据导出到 Excel

转载 作者:太空狗 更新时间:2023-10-29 21:49:22 29 4
gpt4 key购买 nike

我需要将 Grid.MVC 中的数据导出到 Excel。我使用了此链接中的解决方案。

http://www.codeproject.com/Articles/325103/MVC-Grid-to-Excel-file-download?msg=5161340#xx5161340xx

它正在工作,但我有 2 个问题。首先它在 chrome 中工作,但在 IE 中不工作。它在 IE 中给我一个错误(无法读取文件)。第二个问题是当我过滤网格时,Excel 中导出的数据仍然显示所有数据而不是过滤后的数据。

如果这不是一个好的解决方案,请提供将 Grid.MVC 数据导出到 excel 的示例。

最佳答案

这是一个服务器端解决方案

在这种情况下,客户端组件并不重要。您通过导出的任何数据,它会将其导出到 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;
}
}

关于c# - 将 Grid.MVC 数据导出到 Excel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33745517/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com