我正在尝试通过按钮调用方法,但问题是我需要在按下按钮时传递DateSet,因为它将在方法中使用。因此,我创建了一个自定义按钮类,它将DataSet传递给方法。此方法将从DataSet中的表创建一个excel文档。
直接在Page_Load中调用此方法时,它工作正常,但我想在单击“导出到Excel”时创建Excel文档。问题是DataSet“set”似乎没有通过click事件正确传递。我猜问题是Button Class。
anyoe知道如何解决这个问题吗?在通往createExcel方法的过程中,DataSet似乎丢失了。
我在方法的第一个for循环上得到错误:“对象引用没有设置为对象的实例”(在dataset.Tables.Count上)。
protected void Page_Load(object sender, EventArgs e)
{
DataTable table1 = new DataTable();
table1.Columns.Add("Table1_Col1");
table1.Columns.Add("Table1_Col2");
table1.Rows.Add("Table1_Row1_Item1", "Table1_Row1_Item2");
table1.Rows.Add("Table1_Row2_Item1", "Table1_Row1_Item2");
DataTable table2 = new DataTable();
table2.Columns.Add("Table2_Col1");
table2.Columns.Add("Table2_Col2");
table2.Rows.Add("Table2_Row1_Item1", "Table1_Row1_Item2");
table2.Rows.Add("Table2_Row2_Item1", "Table1_Row1_Item2");
DataSet set = new DataSet();
set.Tables.Add(table1);
set.Tables.Add(table2);
Response.Write(set.GetXml());
MyButton btnExcel = new MyButton();
btnExcel.DsDataSet = set;
btnExcel.ID = "excel";
btnExcel.Text = "Export to Excel";
btnExcel.Click += new EventHandler(this.Button1Click);
form1.Controls.Add(btnExcel);
}
protected void Button1Click(object sender, EventArgs args)
{
DataSet ds = (sender as DataSet);
createExcel(ds);
}
protected void createExcel(DataSet dataset)
{
//Print using Ofice InterOp
Excel.Application excel = new Excel.Application();
var workbook = (Excel._Workbook)(excel.Workbooks.Add(Missing.Value));
// Object reference not set to an instance of an object
for (var i = 0; i < dataset.Tables.Count; i++)
{
if (workbook.Sheets.Count <= i)
{
workbook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
}
//NOTE: Excel numbering goes from 1 to n
var currentSheet = (Excel._Worksheet)workbook.Sheets[i + 1];
for (var y = 0; y < dataset.Tables[i].Rows.Count; y++)
{
for (var x = 0; x < dataset.Tables[i].Rows[y].ItemArray.Count(); x++)
{
currentSheet.Cells[y + 1, x + 1] = dataset.Tables[i].Rows[y].ItemArray[x];
}
}
}
string outfile = @"C:\Windows\SysWOW64\config\systemprofile\Desktop\EXCEL_TEST.xlsx";
workbook.SaveAs(outfile, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing);
workbook.Close();
excel.Quit();
}
}
public class MyButton : Button
{
private DataSet m_DsDataSet;
public DataSet DsDataSet
{
get { return m_DsDataSet; }
set { m_DsDataSet = value; }
}
}
答案 0 :(得分:0)
该行的异常结果:
DataSet ds = (sender as DataSet);
参数sender
是Page
个对象,而不是DataSet
,这会导致ds
被赋予空值。
在您的代码中,set
是一个局部变量。最简单的解决方案是将set
提升为Page
的字段,以便在调用Button1Click
时将其放在范围内。这可以这样做:
DataSet set; // set is a field of the class, rather than a local variable
protected void Page_Load(object sender, EventArgs e)
{
DataTable table1 = new DataTable();
** Lines removed **
this.set = new DataSet(); // set should be an instance variable
set.Tables.Add(table1);
set.Tables.Add(table2);
** Lines removed **
}
protected void Button1Click(object sender, EventArgs args)
{
DataSet ds = this.set;
createExcel(ds);
}
页面加载时,在Page_Load
之前调用 Button1Click
。在上面的代码中,Page_Load
将set
初始化为所需的数据集。调用Button1Click
时,只需引用set
即可获取已初始化的DataSet
实例。因此,没有必要将数据集明确地作为参数传递给Button1Click
。