ASP.NET通過流方式導出EXCEL並且單元格換行
關鍵是EXCEL單元格換行,折騰了好久,終於出來了,呵呵,做個記錄
.cs源代碼

using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace ExportExcel
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
if ( ! IsPostBack)
{
this .GridView1.DataSource = CreateDataSource();
this .GridView1.DataBind();
}
}
public override void VerifyRenderingInServerForm(Control control)
{ }
protected void Button1_Click( object sender, EventArgs e)
{
// 設置文件名
string fileName = DateTime.Now.ToString( " yyyyMMddHHmmss " );
// HTTP請求內容
System.Web.HttpContext curContext = System.Web.HttpContext.Current;
// 輸出文件流
System.IO.StringWriter strWriter = null ;
// 服務端控件輸出流
System.Web.UI.HtmlTextWriter htmlWriter = null ;
// 清空當前 Response
HttpContext.Current.Response.Clear();
// 設置緩沖方式輸出
HttpContext.Current.Response.Buffer = true ;
// 添加HTTP標頭到輸出流
HttpContext.Current.Response.AddHeader( " content-disposition " , string .Format( " attachment; filename={0}.xls " , fileName));
curContext.Response.ContentType = " application/vnd.ms-excel " ; // 設置輸出文件類型為xls文件
/* *如果要輸出doc文件,請用下面這段代碼* */
// HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.doc", fileName));
// curContext.Response.ContentType = "application/ms-word"; // 設置輸出文件類型為word文件
// 設置編碼方式
curContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding( " GB2312 " );
curContext.Response.Charset = "" ;
// 導出文件
strWriter = new System.IO.StringWriter();
htmlWriter = new System.Web.UI.HtmlTextWriter(strWriter);
htmlWriter.Write( " 測試標題1 " );
// 返回客戶端
GridView1.RenderControl(htmlWriter);
// 設置換行 <br/>是html的換行樣式替換成<br style='mso-data-placement:same-cell;'/> EXCEL換行
curContext.Response.Write(strWriter.ToString().Replace( " <br/> " , " <br style='mso-data-placement:same-cell;'/> " ));
curContext.Response.End();
}
System.Data.DataView CreateDataSource()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add( new System.Data.DataColumn( " 測試1 " ));
dt.Columns.Add( new System.Data.DataColumn( " 測試2 " ));
dt.Columns.Add( new System.Data.DataColumn( " 測試3 " ));
dt.Columns.Add( new System.Data.DataColumn( " 測試4 " ));
dt.Columns.Add( new System.Data.DataColumn( " 測試5 " ));
dt.Columns.Add( new System.Data.DataColumn( " 測試6 " ));
for ( int i = 0 ; i < 5 ; i ++ )
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[ 0 ] = " 編號 " + i.ToString();
dr[ 1 ] = " 換行測試: " + i.ToString() + " <br/> " + " 第二行開始 " + i.ToString() + " <br/> " + " 第三行開始 " + i.ToString() + " <br/> " + " 第四行開始 " + i.ToString() + " <br/> " + " 第五行開始 " + i.ToString();
dr[ 2 ] = " 測試: " + i.ToString();
dr[ 3 ] = " 測試: " + i.ToString();
dr[ 4 ] = " 測試: " + i.ToString();
dr[ 5 ] = " 測試: " + i.ToString();
dt.Rows.Add(dr);
}
System.Data.DataView dv = new System.Data.DataView(dt);
return dv;
}
}
}
.aspx源

<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
< html xmlns ="http://www.w3.org/1999/xhtml" >
< head runat ="server" >
< title ></ title >
</ head >
< body >
< form id ="form1" runat ="server" >
< div >
< asp:GridView ID ="GridView1" runat ="server" AutoGenerateColumns ="false" >
< Columns >
< asp:BoundField HtmlEncode ="false" DataField ="測試1" HeaderText ="測試字段" />
< asp:BoundField HtmlEncode ="false" DataField ="測試2" HeaderText ="測試字段" />
< asp:BoundField HtmlEncode ="false" DataField ="測試3" HeaderText ="測試字段" />
< asp:BoundField HtmlEncode ="false" DataField ="測試4" HeaderText ="測試字段" />
< asp:BoundField HtmlEncode ="false" DataField ="測試5" HeaderText ="測試字段" />
< asp:BoundField HtmlEncode ="false" DataField ="測試6" HeaderText ="測試字段" />
</ Columns >
</ asp:GridView >
< asp:Button ID ="Button1" runat ="server" onclick ="Button1_Click" Text ="導出" />
< br />
</ div >
</ form >
</ body >
</ html >
===================================================
用2個循環。一個用於行,一用於列。。
int row = ds.Tables[k].Rows.Count;
int column = ds.Tables[k].Columns.Count;
for (int i = 0; i < row; i++)
{
for (int j = 1; j < column-1; j++)
{
myExcel.Cells[ 5 + i, 1 + j] = "" + ds.Tables[k].Rows[j].ToString();//行的起始位置
}
}
===================================================
起始不用2樓那么麻煩。
你去宏觀看,可以看到Alt+Enter是用char(10)來表示。
也就是說,我們插入的時候只要插入個ASC碼對應的字符進去就可以了。
char(10)這是C語言才能用的類型轉換,Asp里面就直接(char)10.
列如 stirng str="aaaaaaaaa"+(char)10+"bbbbbbbbbbb"導成Excel后 會在單元格里面自動換行。相當於Alt+Enter