博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[转] Asp.Net 导出 Excel 数据的9种方案
阅读量:6871 次
发布时间:2019-06-26

本文共 9421 字,大约阅读时间需要 31 分钟。

 原文地址 

简介

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数据

使用此方法,你需要  ,并使用如下代码(部分)导出数据:

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 格式的开源库:

这是一个非常便捷的库,它包含多种格式、字体、颜色订制,你也不需要安装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
,如需转载请自行联系原作者
你可能感兴趣的文章
meta name="viewport" content="width=device-width,initial-scale=1.0" 解释
查看>>
mshup总结
查看>>
舒服的颜色2
查看>>
Android 用户界面---通知(Notifications)概要
查看>>
linux下挂载U盘
查看>>
防SQL注入 记
查看>>
创业公司该不该被收购?(转)
查看>>
更改visio的默认线粗方法
查看>>
单例的使用总结
查看>>
PHP获取本周第一天和最后一天
查看>>
Razor练习4
查看>>
【OpenStack】OpenStack系列16之OpenStack镜像制作
查看>>
STL algorithm源代码:stl_algo.h
查看>>
VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs
查看>>
Linux下文件重命名、创建、删除、修改及保存文件
查看>>
判断IP是否为爬虫IP
查看>>
Linux 内核使用的 GNU C 扩展
查看>>
Android 之 用WebView显示网页
查看>>
go——搭建Win7下的Go开发环境
查看>>
ubuntu14.04 中国源
查看>>