ASP.Net数据导出Excel的几种方法

方法一 通过GridView(简评:方法比较简单,但是只适合生成格式简单的Excel,且无法保留VBA代码),页面无刷新

aspx.cs部分

代码如下:

using System; 
using System.Collections; 
using System.Configuration; 
using System.Data; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Text; 

public partial class DataPage_NationDataShow : System.Web.UI.Page 

private Data_Link link = new Data_Link(); 
private string sql; 

protected void Page_Load(object sender, EventArgs e) 

Ajax.Utility.RegisterTypeForAjax(typeof(DataPage_NationDataShow)); 


protected void btnExcel_Click(object sender, EventArgs e) 

string strExcelName = "MyExcel"; 
strExcelName = strExcelName.Replace(@"/", ""); 

Data_Link link = new Data_Link(); 
string strSQL = this.hidParam.Value; 
DataSet ds = new DataSet(); 
ds = link.D_DataSet_Return(strSQL);//获得想要放入Excel的数据 

gvExcel.Visible = true; 
gvExcel.DataSource = null; 
gvExcel.DataMember = ds.Tables[0].TableName; 
gvExcel.DataSource = ds.Tables[0]; 
gvExcel.DataBind(); 

ExportToExcel(this.Page, gvExcel, strExcelName); 


protected void gvExcel_RowDataBound(object sender, GridViewRowEventArgs e) 
{ } 
public override void VerifyRenderingInServerForm(Control control) 
{ } 

///  
/// 工具方法,Excel出力(解决乱码问题) 
///
 
/// 调用页面 
/// Excel数据 
/// 文件名 
public void ExportToExcel(System.Web.UI.Page page, GridView excel, string fileName) 

try 

foreach (GridViewRow row in excel.Rows) 

for (int i = 0; i < row.Cells.Count; i++) 

excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow; 


excel.Font.Size = 10; 
excel.AlternatingRowStyle.BackColor = System.Drawing.Color.LightCyan; 
excel.RowStyle.Height = 25; 

page.Response.AppendHeader("Content-Disposition", "attachment;filename=" + fileName); 
page.Response.Charset = "utf-8"; 
page.Response.ContentType = "application/vnd.ms-excel"; 
page.Response.Write(""); 
excel.Page.EnableViewState = false; 
excel.Visible = true; 
excel.HeaderStyle.Reset(); 
excel.AlternatingRowStyle.Reset(); 

System.IO.StringWriter oStringWriter = new System.IO.StringWriter(); 
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
excel.RenderControl(oHtmlTextWriter); 
page.Response.Write(oStringWriter.ToString()); 
page.Response.End(); 

excel.DataSource = null; 
excel.Visible = false; 

catch (Exception e) 




}

aspx部分
复制代码代码如下:

 
 
 
 
 
 
 

在刚才的aspx.cs代码中
复制代码代码如下:

foreach (GridViewRow row in excel.Rows) 

for (int i = 0; i < row.Cells.Count; i++) 

excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow; 

}

这部分是给表头添加样式。

 

有时候为了便于浏览,需要给交叉行添加样式,简单点的可以用下面这种:

复制代码代码如下:

excel.AlternatingRowStyle.BackColor = System.Drawing.Color.LightCyan;

但是细看一下会发现它把一整行的样式都改变了,包括后面那些没有用到的列。

 

ASP.Net数据导出Excel的几种方法_第1张图片

解决办法是有,不过比较繁琐,就是修改每个单元格的样式。

复制代码代码如下:

int rowCount = excel.Rows.Count; 
int colCount = excel.HeaderRow.Cells.Count; 

for (int i = 0; i < rowCount; i++) 

for(int j=0;j
excel.Rows[i].Cells[j].BackColor = System.Drawing.Color.LightCyan; 

}

方法二 通过DataGrid(与方法一基本相同),页面无刷新

 

aspx.cs部分

复制代码代码如下:

public override void VerifyRenderingInServerForm(Control control) 
{} 

///  
/// エクセル出力イベント 
///
 
///  
///  
private void ExcelBut_Click(object sender, System.EventArgs e) 

DataGrid dgExcel = new DataGrid(); 

try 

DataSet ds = getExcelData(this.PageParams.Value);//出力データを取得する 

if(ds.Tables[0].Rows.Count>0) 

//エクセルへデータを投入する 
string execlName= "MyExcel"; 
Encoding encodingType=System.Text.Encoding.UTF8; 
dgExcel.DataMember=ds.Tables[0].TableName; 
dgExcel.DataSource=ds.Tables[0]; 

Response.Buffer = true; 
Response.Charset = "utf-8"; 
Response.AppendHeader("Content-Disposition", "attachment;filename=" + execlName+ ".xls"); 
Response.ContentEncoding = encodingType; 
Response.ContentType = "application/ms-excel"; 
StringWriter oStringWriter = new StringWriter(); 
HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter); 
dgExcel.DataBind(); 
dgExcel.Visible = true; 
dgExcel.RenderControl(oHtmlTextWriter); 
Response.Write(oStringWriter.ToString()); 
Response.Flush(); 
Response.Close(); 
dgExcel.DataSource = null; 
dgExcel.Visible = false; 

else 

Response.Write(""); 


catch(Exception ex) 

Response.Write(""); 

}

aspx部分
复制代码代码如下:

 
 
 
 
 
 
 

方法三 以XML形式的Excel方式(可以设置丰富的样式,并可以有多个sheet,但需要模版。速度很快,但生成的文件较大,且无法保留VBA代码)

 

具体方法:把模版以 XML Document形式另存为A.xml。然后参照A.xml中的内容即可

复制代码代码如下:
 
private void ExcelBut_Click(object sender, System.EventArgs e) 

DataSet ds = new DataSet(); 
string ExcelFileName = ""; 
DataRow dr=[------列名信息-------]; 
try 

ExcelFileName = Path.Combine(Request.PhysicalApplicationPath + "/ExcelFile", "MyExcel.xls"); 

//获取Excel需要的数据 
ds = [------获得数据-------]; 
if (ds.Tables.Count == 0) 

Response.Write(""); 
return; 

int sheetNum = ds.Tables.Count / 2; 
StreamWriter writer = new StreamWriter(ExcelFileName, false); 

//Styles标签前面的信息相当于'头信息',不需要改变 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine("writer.WriteLine("xmlns:o=\"urn:schemas-microsoft-com:office:office\""); 
writer.WriteLine("xmlns:x=\"urn:schemas-microsoft-com:office:excel\""); 
writer.WriteLine("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\""); 
writer.WriteLine("xmlns:html=\"http://www.w3.org/TR/REC-html40\">"); 
writer.WriteLine(""); 
writer.WriteLine("Automated Report Generator Example"); 
writer.WriteLine(string.Format("{0}T{1}Z", DateTime.Now.ToString("yyyy-mm-dd"), DateTime.Now.ToString("HH:MM:SS"))); 
writer.WriteLine(" 51aspx.com"); 
writer.WriteLine(" 11.6408"); 
writer.WriteLine("
"); 
writer.WriteLine(""); 
writer.WriteLine("6195"); 
writer.WriteLine(" 18495"); 
writer.WriteLine(" 525"); 
writer.WriteLine(" 4260"); 
writer.WriteLine(" "); 
writer.WriteLine(" True"); 
writer.WriteLine(" False"); 
writer.WriteLine("
"); 

//通过 ss:ID 和 ss:Name相当于html中style的类 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine("
"); 

//Sheet操作 
writer.WriteLine(""); 
writer.WriteLine(" "); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 

for (int num = sheetNum - 1; num >= 0; num = num - 1) 

// 考課表間有3行的空行 
if (num != sheetNum - 1) 

writer.WriteLine(""); 
writer.WriteLine("
"); 
writer.WriteLine(""); 
writer.WriteLine("
"); 
writer.WriteLine(""); 
writer.WriteLine("
"); 


// 列名 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg002"] + ""); 
writer.WriteLine("" + dr["Msg003"] + ""); 
writer.WriteLine("" + dr["Msg004"] + ""); 
writer.WriteLine("
"); 

// 详细数据 
for (int i = 0; i < ds.Tables[2 * num].Rows.Count; i++) 

writer.WriteLine(""); 
writer.WriteLine("" + ds.Tables[2 * num].Rows[i]["EvalLevel1Name"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num].Rows[i]["EvalLevel2Code"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num].Rows[i]["EvalLevel2Name"].ToString() + ""); 
writer.WriteLine("
"); 


writer.WriteLine("
"); 
writer.WriteLine("
"); 

// 其他Sheet操作 
for (int num = sheetNum - 1; num >= 0; num--) 

writer.WriteLine(""); 
writer.WriteLine(" "); 
writer.WriteLine(" "); 
writer.WriteLine("カキキイロテンスウツ" + dr["Msg031"] + ""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine("
"); 
writer.WriteLine(" "); 
writer.WriteLine("カキキイロテンスウツ" + dr["Msg032"] + ""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 

writer.WriteLine("
"); 

// 列名 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg001"] + ""); 
writer.WriteLine("" + dr["Msg002"] + ""); 
writer.WriteLine("" + dr["Msg003"] + ""); 
writer.WriteLine("
"); 
int SheetN = ds.Tables[2 * num].Rows.Count; 

//详细数据 
for (int i = 0; i < SheetN; i++) 

writer.WriteLine(""); 
writer.WriteLine("" + ds.Tables[2 * num].Rows[i]["EvalLevel1Code"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num].Rows[i]["EvalLevel1Name"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num].Rows[i]["EvalLevel2Code"].ToString() + ""); 
writer.WriteLine(" "); 
writer.WriteLine("
"); 

writer.WriteLine(""); 
writer.WriteLine("
"); 
writer.WriteLine(""); 
writer.WriteLine("
"); 

//列名 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg011"] + ""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg012"] + ""); 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg013"] + ""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg014"] + ""); 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg015"] + ""); 
writer.WriteLine(""); 
writer.WriteLine("
"); 
writer.WriteLine(""); 
writer.WriteLine("" + dr["Msg016"] + ""); 
writer.WriteLine("" + dr["Msg017"] + ""); 
writer.WriteLine("" + dr["Msg018"] + ""); 
writer.WriteLine("" + dr["Msg019"] + ""); 

writer.WriteLine("
"); 
int DateLen = ds.Tables[2 * num + 1].Rows.Count; 
string EmployeeManagement = ""; 

for (int i = 0; i < DateLen; i++) 

writer.WriteLine(""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EmployeeManagementID"].ToString() + ""); 
if (!EmployeeManagement.Equals(ds.Tables[2 * num + 1].Rows[i]["EmployeeManagementID"].ToString())) 

writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EmployeeCode"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EmployeeName"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["BefEmployeeName2"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EmployeeName2"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel1Code"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel1Name"].ToString() + ""); 
EmployeeManagement = ds.Tables[2 * num + 1].Rows[i]["EmployeeManagementID"].ToString(); 

else 

writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 
writer.WriteLine(""); 

writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel2Code"].ToString() + ""); 
writer.WriteLine("" + ds.Tables[2 * num + 1].Rows[i]["EvalLevel2Name"].ToString() + ""); 
writer.WriteLine("
"); 

writer.WriteLine("
"); 
writer.WriteLine("
"); 


writer.WriteLine("
"); 
writer.Close(); 

FileDownload(ExcelFileName); 

catch (System.Exception ex) 



finally 

Response.End(); 


public void FileDownload(FullFileName) 

FileInfo DownloadFile = new FileInfo(FullFileName); 
Response.Clear(); 
Response.ClearHeaders(); 
Response.Buffer = true; 
Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(MyFile".xls"))); 
Response.ContentType = "application/ms-excel;charset=UTF-8";//DownloadFile.FullNameoctet-stream 
Response.ContentEncoding = System.Text.Encoding.GetEncoding("shift-jis"); 
Response.AppendHeader("Content-Length", DownloadFile.Length.ToString()); 
Response.WriteFile(FullFileName); 
Response.Flush(); 

if (File.Exists(FullFileName)) 

File.Delete(FullFileName); 

}

方法四 用微软的COM组件操作Excel。虽然可以很方便的操作单元格,并且能保留VBA代码,它相当于直接打开一个EXCEL进程。

 

当初这个COM组件式给WinForm准备的,但在Web端有很多东西的支持不尽人意,例如无法用组件中的方法关闭Excel对象,

只能通过强制关闭Excel进程的方式(这其中还有很多问题,例如只能关闭当前打开的这个Excel的进程,否则会把其他用户的Excel进程关闭)。在这里不推荐

方法五 用流的方式,把内容以Table的格式向Excel中放数据 好处是 可以生成格式丰富复杂的Excel,页面无刷新

aspx部分

复制代码代码如下:


aspx.cs部分
复制代码代码如下:

//内容很好理解,只需当成Table来拼字符串即可 
private string getExcelContent() 

StringBuilder sb = new StringBuilder(); 

sb.Append(""); 
sb.Append(""); 
sb.Append(""); 
sb.Append(""); 
sb.Append(""); 
sb.Append(""); 
sb.Append("
标题
号码名字
"); 
return sb.ToString(); 


private void hidExport_Click(object sender, System.EventArgs e) 

string content = getExcelContent(); 
string css = ".firstTR td{color:blue;width:100px;}.secondTR td{color:blue;width:100px;}"; 
string filename = "Test.xls"; 

CommonTool.ExportToExcel(filename, content ,css); 
}

工具类CommonTool
复制代码代码如下:

public class CommonTool 

///  
/// 以流的形式,可以设置很丰富复杂的样式 
///
 
/// Excel中内容(Table格式) 
/// 文件名 
/// 样式内容 
public static void ExportToExcel(string filename, string content,string cssText) 

var res = HttpContext.Current.Response; 
content = String.Format("{1}",cssText,content); 

res.Clear(); 
res.Buffer = true; 
res.Charset = "UTF-8"; 
res.AddHeader("Content-Disposition", "attachment; filename=" + filename); 
res.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8"); 
res.ContentType = "application/ms-excel;charset=UTF-8"; 
res.Write(content); 
res.Flush(); 
res.End(); 

}

这种方法比较灵活,而且可以通过选择器来添加样式,相当不错。缺点就是需要将数据转换成字符串。

转载于:https://www.cnblogs.com/net-study/p/4335525.html

你可能感兴趣的:(ASP.Net数据导出Excel的几种方法)