asp.net生成Excel并导出下载五种实现方法

有关Excel下载的文章网上想必有很多,利用闲暇时间整理了一些有Excel下载方法的文章,接下来介绍五种实现Excel下载的方法,感兴趣的朋友可以了解下,或许对你学习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 {
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 {
excel.HeaderRow.Cells[i].BackColor = System.Drawing.Color.Yellow;
}
}

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

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

复制代码 代码如下:

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

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

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

复制代码 代码如下:

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

for (int i = 0; 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 {
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 {
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 {
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();
}
}

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

以上就是asp.net生成Excel并导出下载五种实现方法的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » ASP编程