实现生成Excel文件,并下载的功能,代码:
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Xml;
using
System.Xml.Xsl;
using
System.Web;
using
System.Data;
using
System.IO;
namespace
Web.Common
{
public
class
ExcelDownLoad
{
///
<summary>
///
的数据源的数据
///
</summary>
///
<param name="dt">
数据源
</param>
///
<param name="fileName">
输出文件名
</param>
public
static
void
Export(DataTable dt,
string
fileName)
{
DataSet dsExport
=
new
DataSet(
"
Export
"
);
DataTable dtExport
=
dt.Copy();
dtExport.TableName
=
"
Values
"
;
dsExport.Tables.Add(dtExport);
string
[] headers
=
new
string
[dtExport.Columns.Count];
string
[] fields
=
new
string
[dtExport.Columns.Count];
for
(
int
i
=
0
; i
<
dtExport.Columns.Count; i
++
)
{
headers[i]
=
String.IsNullOrEmpty(dtExport.Columns[i].Caption)
?
dtExport.Columns[i].ColumnName : dtExport.Columns[i].Caption;
fields[i]
=
ReplaceSpecialChars(dtExport.Columns[i].ColumnName);
}
Export(dsExport, headers, fields, fileName, Encoding.GetEncoding(
"
GB2312
"
));
}
///
<summary>
///
导出的数据源的数据
///
</summary>
///
<param name="ds">
数据源
</param>
///
<param name="fields">
导出的字段数组
</param>
///
<param name="fileName">
输出文件名
</param>
///
<param name="encoding">
编码
</param>
private
static
void
Export(DataSet ds,
string
[] headers,
string
[] fields,
string
fileName, Encoding encoding)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Buffer
=
true
;
HttpContext.Current.Response.ContentType
=
"
text/csv
"
;
HttpContext.Current.Response.AddHeader(
"
content-disposition
"
, String.Format(
"
attachment;filename={0}.{1}
"
, HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8),
"
csv
"
).Replace(
"
+
"
,
"
%20
"
));
HttpContext.Current.Response.ContentEncoding
=
encoding;
MemoryStream stream
=
new
MemoryStream();
XmlTextWriter writer
=
new
XmlTextWriter(stream, encoding);
CreateStylesheet(writer, headers, fields);
writer.Flush();
stream.Seek(
0
, SeekOrigin.Begin);
XmlDataDocument xmlDoc
=
new
XmlDataDocument(ds);
XslCompiledTransform xslTran
=
new
XslCompiledTransform();
xslTran.Load(
new
XmlTextReader(stream));
System.IO.StringWriter sw
=
new
System.IO.StringWriter();
xslTran.Transform(xmlDoc,
null
, sw);
HttpContext.Current.Response.Write(sw.ToString());
sw.Close();
writer.Close();
stream.Close();
HttpContext.Current.Response.End();
}
///
<summary>
///
动态生成XSL,并写入XML流
///
</summary>
///
<param name="writer">
XML流
</param>
///
<param name="headers">
表头数组
</param>
///
<param name="fields">
字段数组
</param>
///
<param name="exportFormat">
导出文件的格式
</param>
private
static
void
CreateStylesheet(XmlTextWriter writer,
string
[] headers,
string
[] fields)
{
string
ns
=
"
http://www.w3.org/1999/XSL/Transform
"
;
writer.Formatting
=
Formatting.Indented;
writer.WriteStartDocument();
writer.WriteStartElement(
"
xsl
"
,
"
stylesheet
"
, ns);
writer.WriteAttributeString(
"
version
"
,
"
1.0
"
);
writer.WriteStartElement(
"
xsl:output
"
);
writer.WriteAttributeString(
"
method
"
,
"
text
"
);
writer.WriteAttributeString(
"
version
"
,
"
4.0
"
);
writer.WriteEndElement();
//
xsl-template
writer.WriteStartElement(
"
xsl:template
"
);
writer.WriteAttributeString(
"
match
"
,
"
/
"
);
//
xsl:value-of for headers
for
(
int
i
=
0
; i
<
headers.Length; i
++
)
{
writer.WriteString(
"
\
""
);
writer.WriteStartElement(
"
xsl:value-of
"
);
writer.WriteAttributeString(
"
select
"
,
"
'
"
+
headers[i]
+
"
'
"
);
writer.WriteEndElement();
//
xsl:value-of
writer.WriteString(
"
\
""
);
if
(i
!=
fields.Length
-
1
) writer.WriteString(
"
,
"
);
}
//
xsl:for-each
writer.WriteStartElement(
"
xsl:for-each
"
);
writer.WriteAttributeString(
"
select
"
,
"
Export/Values
"
);
writer.WriteString(
"
\r\n
"
);
//
xsl:value-of for data fields
for
(
int
i
=
0
; i
<
fields.Length; i
++
)
{
writer.WriteString(
"
\
""
);
writer.WriteStartElement(
"
xsl:value-of
"
);
writer.WriteAttributeString(
"
select
"
, fields[i]);
writer.WriteEndElement();
//
xsl:value-of
writer.WriteString(
"
\
""
);
if
(i
!=
fields.Length
-
1
) writer.WriteString(
"
,
"
);
}
writer.WriteEndElement();
//
xsl:for-each
writer.WriteEndElement();
//
xsl-template
writer.WriteEndElement();
//
xsl:stylesheet
}
///
<summary>
///
替换特殊字符
///
</summary>
///
<param name="input">
字符串
</param>
///
<returns></returns>
public
static
string
ReplaceSpecialChars(
string
input)
{
//
space -> _x0020_
//
% -> _x0025_
//
# -> _x0023_
//
& -> _x0026_
//
/ -> _x002F_
if
(
!
String.IsNullOrEmpty(input))
{
input
=
input.Replace(
"
"
,
"
_x0020_
"
)
.Replace(
"
%
"
,
"
_x0025_
"
)
.Replace(
"
#
"
,
"
_x0023_
"
)
.Replace(
"
&
"
,
"
_x0026_
"
)
.Replace(
"
/
"
,
"
_x002F_
"
);
}
return
input;
}
}
}