ASP.NET生成Excel并下载
实现生成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;
}
}
}
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;
}
}
}