前幾天項目中有個地方需要將DataGrid的數據直接導入Excel里,以提供給用戶下載,在網上找了下,好像都是與下面代碼類似的實現:
程序代碼:
this.EnableViewState = false;
System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN",true);
System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.DataGrid1.RenderControl(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.End();
原理也就是把DataGrid的信息以流的形式寫到html輸出流的形式實現,自己嘗試下,好像可以。我裝的windowxp sp2版的,后來到同事的機器上去試,結果就出問題了,每次執行的時候,彈出那個【打開、保存、取消】的頁面,再一點,結果整個站點的頁面都關閉了,再到其他機器上去試,結果有的能正常下載,有的就不行,以前聽說過有這么個問題,好像也沒什么好的辦法解決。
后來考慮了下,何必不直接把寫到html流的信息直接寫到一個excel文件里面去讓客戶直接下載excel,于是稍微修改了下別人的源碼,直接生成Excel文件來讓客戶下載,演示源代碼如下:
WebForm4.aspx----Html部分:
程序代碼:
頁面上就一個DataGrid和一個按鈕,按鈕用來觸發將數據到Excel,后臺的其他代碼也就不弄上來了,下面是那個關鍵的按鈕事件
程序代碼:
private void Button1_Click(object sender, System.EventArgs e)
{
DataTable SourceTb = new DataTable();
DataColumn myDataColumn;
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "RowIndex"; //序 號
SourceTb.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "CheckUpManName"; //審批人
SourceTb.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "CheckUpIdeas"; //審批意見
SourceTb.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "CheckUpDate"; //審批時間
SourceTb.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "CheckUpRole"; //審批崗位
SourceTb.Columns.Add(myDataColumn);
myDataColumn = new DataColumn();
myDataColumn.DataType = System.Type.GetType("System.String");
myDataColumn.ColumnName = "HandleType"; //操作類型(1:提交| 9:駁回)
SourceTb.Columns.Add(myDataColumn);
DataRow myDataRow;
for(int i = 0;i < 30;i ++)
{
myDataRow = SourceTb.NewRow();
myDataRow["RowIndex"] = i.ToString();
myDataRow["CheckUpManName"] = "張三";
myDataRow["CheckUpIdeas"] = "同意";
myDataRow["CheckUpDate"] = "2006-03-20";
myDataRow["CheckUpRole"] = "物資部主任";
SourceTb.Rows.Add(myDataRow);
}
//綁定數據到DataGrid1
this.DataGrid1.DataSource = SourceTb.DefaultView;
this.DataGrid1.DataBind();
//將DataGrid1構成的html代碼寫進StringWriter
this.DataGrid1.Page.EnableViewState = false;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
this.DataGrid1.RenderControl(hw);
string HtmlInfo = tw.ToString().Trim();
string DocFileName = "審批信息.xls";
string FilePathName = Request.PhysicalPath;
FilePathName = FilePathName.Substring(0,FilePathName.LastIndexOf("\\"));
//得到Excel文件的物理地址
FilePathName = FilePathName +"\\" + DocFileName;
System.IO.File.Delete(FilePathName);
FileStream Fs = new FileStream(FilePathName, FileMode.Create);
BinaryWriter BWriter= new BinaryWriter(Fs,System.Text.Encoding.GetEncoding("GB18030"));
//將DataGrid的信息寫入Excel文件
BWriter.Write(HtmlInfo);
BWriter.Close();
Fs.Close();
}
好了,寫入信息到Excel文件成功了,至于說生成的Excel文件在哪里,大家一看就應該知道,要下載的話,也就是很簡單的< a href='Excel文件路徑' >文件下載< /a >咯。
