【发布时间】:2019-01-15 23:16:31
【问题描述】:
我正在按照以下示例将数据从表/存储过程导出到 Excel。 https://www.c-sharpcorner.com/UploadFile/rahul4_saxena/how-to-export-multiple-data-tables-to-multiple-worksheets-in/
唯一的区别是,因为我有一个 Angular/MVC 项目,所以我在课堂上使用了这段代码。在方法“Export_To_Excel()”中,有 响应。清除();和其他响应方法。但我收到错误消息,“当前上下文中不存在响应。”所以我尝试更改为完全合格的参考: HttpContext.Current.Response 或 System.Web.HttpContext.Current.Response 但现在我得到错误,“对象引用未设置为对象的实例”
请指导怎么办?这是我在cs文件中的完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using ClosedXML.Excel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MyProject.DAL
{
public class CreateWorkBook
{
private DataTable getAllEmployeesList()
{
using (SqlConnection con = Connection.GetConnection())
{
using (SqlCommand cmd = new SqlCommand(@"SELECT * FROM Employee ORDER BY ID;"))
{
using (SqlDataAdapter da = new SqlDataAdapter())
{
DataTable dt = new DataTable();
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
da.SelectCommand = cmd;
da.Fill(dt);
return dt;
}
}
}
}
private DataTable getAllEmployeesOrderList()
{
using (SqlConnection con = Connection.GetConnection())
{
using (SqlCommand cmd = new SqlCommand("SELECT * FROM OrderDetails ORDER BY Order_ID;"))
{
using (SqlDataAdapter da = new SqlDataAdapter())
{
DataTable dt = new DataTable();
cmd.CommandType = CommandType.Text;
cmd.Connection = con;
da.SelectCommand = cmd;
da.Fill(dt);
return dt;
}
}
}
}
public DataSet getDataSetExportToExcel()
{
DataSet ds = new DataSet();
DataTable dtEmp = new DataTable("Employee");
dtEmp = getAllEmployeesList();
DataTable dtEmpOrder = new DataTable("Order List");
dtEmpOrder = getAllEmployeesOrderList();
ds.Tables.Add(dtEmp);
ds.Tables.Add(dtEmpOrder);
return ds;
}
public string SetToExport(string channel, string assets )
{
string status = Export_To_Excel();
return "success";
}
protected string Export_To_Excel()
{
try
{
DataSet ds = getDataSetExportToExcel();
using (XLWorkbook wb = new XLWorkbook())
{
wb.Worksheets.Add(ds);
wb.Style.Alignment.Horizontal = XLAlignmentHorizontalValues.Center;
wb.Style.Font.Bold = true;
// Error here –
//An object reference not set to an instance of Object
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer = true;
System.Web.HttpContext.Current.Response.Charset = "";
System.Web.HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename= SubmissionForm.xlsx");
using (MemoryStream MyMemoryStream = new MemoryStream())
{
wb.SaveAs(MyMemoryStream);
MyMemoryStream.WriteTo(System.Web.HttpContext.Current.Response.OutputStream);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.End();
}
}
return "success";
}
catch (Exception e)
{
throw e;
//return "Export to Excel failed";
}
}
}
}
【问题讨论】:
-
Response只会在网络请求的上下文中填充,你是如何调用你的代码的? -
我会把它分成几个步骤。创建 Excel 的部分应该只返回一个表示文件内容的字节数组。它不应该关心文件的去向——流式传输到 Web 客户端、保存到文件等。您的网页调用该代码,获取字节数组,并将其流式传输到客户端。
标签: c# excel reference httpcontext system.web