开发者社区> 橘子红了呐> 正文

[转] Asp.Net 导出 Excel 数据的9种方案

简介:
+关注继续查看

湛刚 de BLOG 原文地址 Asp.Net 导出 Excel 数据的9种方案

简介

Excel 的强大之处在于它不仅仅只能打开Excel格式的文档,它还能打开CSV格式、Tab格式、website table 等多钟格式的文档。它具备自动识别行号,字符,格式化数字等功能,例如:如果你在Excel 单元格中输入数字 "123456789012" 会自动转化为"1.23457E+11"。

背景介绍

正因为Excel的强大和易用,大家都喜欢将数据导出为 Excel 备用。这里我会介绍一系列通过Asp.Net导出Excel数据的方法。将导出文件存储到服务器并提供地址给客户端下载,或重定向到文件下载页面:当 Response时,数据列以 "\t" 分隔,行以"\n"分隔。好了,现在给大家展示这是怎么做的。

使用代码导出

方案1:导出全部HTML 数据到 Excel

这种方法是将Html中的所有文档内容,包括按钮,表格,图片等所有页面内容导出为 Excel

1
2
3
4
5
6
7
Response.Clear();    
Response.Buffer = true;    
Response.AppendHeader("Content-Disposition","attachment;filename="+DateTime.
Now.ToString("yyyyMMdd")+".xls");          
Response.ContentEncoding = System.Text.Encoding.UTF8;  
Response.ContentType = ""application/ms-excel";  
this.EnableViewState = false;

 

这里我们使用了Page的"ContentType" 属性,它默认为"text/Html",输出到客户端即为Html。如果我们将它改为"ms-excel",页面将输出Excel格式的内容,客户端就可以下载并存储它了。
页面property 还包括:image/JPEG, text/HTML, image/GIF and vnd.ms-excel/msword.

方案2:从DataGrid导出数据到Excel

尽管上面的方法能帮你导出Excel数据,但它导出了所有的HTML内容,包括按钮、图片等,这并不是我们所需要的。通常,我们仅仅需要导出DataGrid中的数据。

1
2
3
4
5
6
7
8
9
10
11
12
System.Web.UI.Control ctl=this.DataGrid1;
//DataGrid1 (you created in the windowForm)
HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls");
HttpContext.Current.Response.Charset ="UTF-8";    
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Default;
HttpContext.Current.Response.ContentType = "application/ms-excel";
ctl.Page.EnableViewState =false;   
System.IO.StringWriter  tw = new System.IO.StringWriter() ;
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
ctl.RenderControl(hw);
HttpContext.Current.Response.Write(tw.ToString());
HttpContext.Current.Response.End();

 

如果你有多个包含DataGrid 并需导出数据的页面,我们可以封装方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
public void DGToExcel(System.Web.UI.Control ctl)  
{
   HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls");
   HttpContext.Current.Response.Charset ="UTF-8";    
   HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
   HttpContext.Current.Response.ContentType ="application/ms-excel";
   ctl.Page.EnableViewState =false;   
   System.IO.StringWriter  tw = new System.IO.StringWriter() ;
   System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw);
   ctl.RenderControl(hw);
   HttpContext.Current.Response.Write(tw.ToString());
   HttpContext.Current.Response.End();
}

调用方法:DGToExcel(datagrid1);

 

方案3:自动导出Excel数据

使用此方法,你需要 下载免费的.NET组件 ,并使用如下代码(部分)导出数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private void button1_Click(object sender, EventArgs e)
{
    System.Data.OleDb.OleDbConnection oleDbConnection1 = new System.Data.OleDb.OleDbConnection();
    oleDbConnection1.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\..\..\Database\demo.mdb";
 
    System.Data.OleDb.OleDbCommand oleDbCommand1 = new System.Data.OleDb.OleDbCommand();
    oleDbCommand1.CommandText = "select * from parts";
    oleDbCommand1.Connection = oleDbConnection1;
 
    System.Data.OleDb.OleDbCommand oleDbCommand2 = new System.Data.OleDb.OleDbCommand();
    oleDbCommand2.CommandText = "select * from country";
    oleDbCommand2.Connection = oleDbConnection1;
  
   Spire.DataExport.Delegates.DataParamsEventHandler(this.cellExport3_GetDataParams);
 
    oleDbConnection1.Open();
    try
    {
        cellExport3.SaveToFile();
    }
    finally
    {
        oleDbConnection1.Close();
    }
}
 
private void cellExport3_GetDataParams
(object sender, Spire.DataExport.EventArgs.DataParamsEventArgs e)
{
    if ((e.Sheet == 0) && (e.Col == 6))
    {
        e.FormatText = (sender as Spire.DataExport.XLS.WorkSheet).ExportCell.DataFormats.Currency;
    }
}

 

点击这里下载完整示例代码

执行上面的代码,你将得到:

此方案导出的Excel文件可以直接在Excel 2010 中打开、编辑和修改。虽然一些特定的功能不可用,但它能够被Excel 2010使用。

 

方案4:从DataSet导出Excel数据

依照上面都的方法,我么能很容易的导出DataSet数据到Excel,我们只需要在页面Response 时将DataSet 表中的数据组装为"ms-excel" 格式的数据,并通过Http发送出去。

注:ds 代表Dataset,用它来填充DataTable,文件名包含后缀,例如:excel2006.xls。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  void CreateExcel(DataSet ds,string FileName) 
{
 HttpResponse resp;
 resp = Page.Response;
 resp.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
 resp.AppendHeader("Content-Disposition""attachment;filename="+FileName);   
 string colHeaders= "", ls_item="";  
 // Define table object and row object,
 // and at the same time use DataSet initialize value.
 DataTable dt=ds.Tables[0];
 DataRow[] myRow=dt.Select();//dt.Select("id>10")
 Data Filer can be used as: dt.Select("id>10")
        int i=0;
        int cl=dt.Columns.Count;
 //Get column titles of each DataTable and divided by "t". Press "enter" after the last column title.
 for(i=0;i<cl;i++) colheaders+="dt.Columns[i].Caption.ToString()+"t";"
    for(i="0;i<cl;i++)" if(i="=(cl-1))//(last" +="dt.Columns[i].Caption.ToString()"
    ls_item+="row[i].ToString()+"t";" />

 

 

方案5:从DataView导出Excel数据

如果你想导出不规则的行和列到Excel,你可以使用一下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
public void OutputExcel(DataView dv,string str)
{
   //dv presents data which will be exported to Excel,
str is the name of title
   GC.Collect();
   Application excel;// = new Application();
   int rowIndex=4;
   int colIndex=1;
   _Workbook xBk;
   _Worksheet xSt;
   excel= new ApplicationClass();  
   xBk = excel.Workbooks.Add(true);  
   xSt = (_Worksheet)xBk.ActiveSheet;
   //
   // Acquire Title
   //
   foreach(DataColumn col in dv.Table.Columns)
   {
    colIndex++;
    excel.Cells[4,colIndex] = col.ColumnName;
    xSt.get_Range(excel.Cells[4,colIndex],excel.Cells
    [4,colIndex]).HorizontalAlignment
    = XlVAlign.xlVAlignCenter;//Set title format as middle
   }
 
   //
   //Obtain data from table
   //
   foreach(DataRowView row in dv)
   {
    rowIndex ++;
    colIndex = 1;
    foreach(DataColumn col in dv.Table.Columns)
    {
     colIndex ++;
     if(col.DataType == System.Type.GetType("System.DateTime"))
     {
      excel.Cells[rowIndex,colIndex]
    = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");
      xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells
    [rowIndex,colIndex]).HorizontalAlignment
    = XlVAlign.xlVAlignCenter;// Set the style as middle
     }
     else
      if(col.DataType == System.Type.GetType("System.String"))
     {
      excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString();
      xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells
    [rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;
     // Set the style as middle
     }
     else
     {
      excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString();
     }
    }
   }
   //
   //load a Aggregate line
   //
   int rowSum = rowIndex + 1;
   int colSum = 2;
   excel.Cells[rowSum,2] = " Aggregate ";
   xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment
    = XlHAlign.xlHAlignCenter;
   //
   //Set color for the selected content
   //
   xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select();
   xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells
    [rowSum,colIndex]).Interior.ColorIndex
    = 19;//more than 50 types of color for you to choose
   //
   //obtain title of the whole excelsheet
   //
   excel.Cells[2,2] = str;
   //
   //Set title format for the whole excelsheet
   //
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;
   //
   //Set fittest width
   //
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();
   //
   //Set the tile as Cross and Middle
   //
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();
   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment
    = XlHAlign.xlHAlignCenterAcrossSelection;
   //
   //Draw borders
   //
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1;
   xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders
   [XlBordersIndex.xlEdgeLeft].Weight
    = XlBorderWeight.xlThick;// Set left line as bold
   xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders
[XlBordersIndex.xlEdgeTop].Weight
= XlBorderWeight.xlThick;// Set upper line as bold
   xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders
[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//Set right line as bold
   xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders
[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//Set bottom line as bold
   //
   //Display effect
   //
   excel.Visible=true;
   //xSt.Export(Server.MapPath(".")+");
   xBk.SaveCopyAs(Server.MapPath(".")+"");
   ds = null;
   xBk.Close()

 

两种 WinForms 导出Excel 数据的解决方案

方案6:

 View Code

 

方案7:

 View Code

 

方案8 (from Cipherlad):

使用DataSet 的GetXml方法,并且使用XSLT将XML转化为标准的Excel格式,你可以使用不同样式模版对应不容版本的Excel,甚至可以用于导出其它文档。

 

方案9 (from Sergelp):

使用 OOXML 格式的开源库:http://simpleooxml.codeplex.com/

这是一个非常便捷的库,它包含多种格式、字体、颜色订制,你也不需要安装Excel软件,你可以在服务端创建Excel,然后实现下载,如下代码所示:

复制代码
Dim ms As MemoryStream = ArticleDAL.GetStreamFromDataSet()
Response.Clear()
Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", strFile))
Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
ms.WriteTo(Response.OutputStream)
Response.End()
复制代码

 

没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。








  本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/5795586.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
18665 0
EasyUI----DataGrid 导出 Excel
<div class="markdown_views"> <p>最近做的安防项目有个功能,需要把DataGrid中的数据导出,下面通过代码一步一步的介绍; <br> 首先在js中写一个扩展类,主要的功能是把DataGrid中的数据转换成Excel的XML格式</p> <pre class="prettyprint"><code class=" hljs scilab"><
1992 0
Thinkphp5.0 PHPExcel 数据表格导出导入
1、先在github里面下载PHPexcel这个类库 或者通过以下链接下载PHPexcel类库。 http://www.php.cn/xiazai/leiku/1491 2、解压之后把它复制到extend里面 控制器代码如下: /** * Created by PhpStorm.
1878 0
c# 导出数据到Excel模板
最近在做一个发邮件的功能,客户要求需要导出一个Excel附件,并给了附件的格式, eg: Last Name 姓 First Name 名 Chinese Characters汉字书写(仅大陆人填写)               实现方式有两种: 一、使用Microsoft.
1283 0
Web程序导出Excel文档
版权声明:欢迎评论和转载,转载请注明来源。 https://blog.csdn.net/zy332719794/article/details/8938475         今天接到一个任务,把数据库里面的数据导出到Excel文档。
680 0
Asp.net MVC 3 开发简单的企业系统开篇--数据库
本来准备自己做一个单独的系统(Asp.net MVC 3 开发一个简单的企业网站系统)玩一玩,没想到引来了大家的关注,令我非常激动啊,在这里非常感谢支持鼓励我的朋友们、园友们,谢谢您们。 虽然是要做一个简单的网站系统来练习一个主流的框架的使用,好让我自己更加熟悉自己的缺陷,看到大家的热情。
728 0
3402
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载