我正在尝试将数据集导出到 excel 2007,我无法使用用于在内容类型中使用 mime 类型导出的正常代码,如下所示“Response.ContentType =”application/ms-excel“;”
如果我对 xls 使用 mime 类型,当我尝试导出时,我会收到警告,由于客户端的原因,我不会出现此错误,因此我开始使用 EPPlus,但现在我遇到了预期错误,例如“ArgumentNullException 未处理”用户代码”。当我调试时,我注意到 btnExportClick 方法中的变量 ds 为空,我认为错误在哪里,但我不明白在哪里,这是完整的代码:
namespace PortalFornecedores
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.BindGrid();
}
}
public void BindGrid()
{
using (DataSet ds = new DataSet())
{
ds.ReadXml(Server.MapPath("~/Customers.xml"));
GridFornecedor.DataSource = ds;
GridFornecedor.DataBind();
}
}
public void btnExportClick(object sender, EventArgs e)
{
DataTable ds = GridFornecedor.DataSource as DataTable;
ExportExcel(ds);
}
public void ExportExcel(DataTable ds)
{
using (ExcelPackage pck = new ExcelPackage())
{
//Create the worksheet
ExcelWorksheet ws = pck.Workbook.Worksheets.Add("SearchReport");
//Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
ws.Cells["A1"].LoadFromDataTable(ds, true);
//prepare the range for the column headers
string cellRange = "A1:" + Convert.ToChar('A' + ds.Columns.Count - 1) + 1;
//Format the header for columns
using (ExcelRange rng = ws.Cells[cellRange])
{
rng.Style.WrapText = false;
rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
rng.Style.Font.Bold = true;
rng.Style.Fill.PatternType = ExcelFillStyle.Solid; //Set Pattern for the background to Solid
rng.Style.Fill.BackgroundColor.SetColor(Color.Gray);
rng.Style.Font.Color.SetColor(Color.White);
}
//prepare the range for the rows
string rowsCellRange = "A2:" + Convert.ToChar('A' + ds.Columns.Count - 1) + ds.Rows.Count * ds.Columns.Count;
//Format the rows
using (ExcelRange rng = ws.Cells[rowsCellRange])
{
rng.Style.WrapText = false;
rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left;
}
//Read the Excel file in a byte array
Byte[] fileBytes = pck.GetAsByteArray();
//Clear the response
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.Cookies.Clear();
//Add the header & other information
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.CacheControl = "private";
Response.Charset = System.Text.UTF8Encoding.UTF8.WebName;
Response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
Response.AppendHeader("Content-Length", fileBytes.Length.ToString());
Response.AppendHeader("Pragma", "cache");
Response.AppendHeader("Expires", "60");
Response.AppendHeader("Content-Disposition",
"attachment; " +
"filename=\"ExcelReport.xlsx\"; " +
"size=" + fileBytes.Length.ToString() + "; " +
"creation-date=" + DateTime.Now.ToString("R") + "; " +
"modification-date=" + DateTime.Now.ToString("R") + "; " +
"read-date=" + DateTime.Now.ToString("R"));
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
//Write it back to the client
Response.BinaryWrite(fileBytes);
Response.End();
}
}
public override void VerifyRenderingInServerForm(Control control)
{
/* Confirms that an HtmlForm control is rendered for the specified ASP.NET
server control at run time. */`enter code here`
}
}
夫妇的事情。这并不是真正的 epplus 问题,而是更一般的网络问题。
首先,您在此处将网格数据源设置为数据集:
using (DataSet ds = new DataSet())
{
ds.ReadXml(Server.MapPath("~/Customers.xml"));
GridFornecedor.DataSource = ds;
但稍后会在这里转换为数据表:
DataTable ds = GridFornecedor.DataSource as DataTable;
当您应该首先转换为数据集然后获取其表集合的第一个表时。
但这仍然无法解决问题,因为您有一个类级别的对象,该对象不会在回发中保留。您需要使用会话或视图状态变量,如下所示:
public void BindGrid()
{
using (DataSet ds = new DataSet())
{
ds.ReadXml(Server.MapPath("~/Customers.xml"));
GridFornecedor.DataSource = ds;
GridFornecedor.DataBind();
ViewState["GridDataSource"] = ds;
}
}
public void btnExportClick(object sender, EventArgs e)
{
//DataTable ds = GridFornecedor.DataSource as DataTable;
var ds = ViewState["GridDataSource"] as DataSet;
var dt = ds.Tables[0];
ExportExcel(dt);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)