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;
        }
    }
}

你可能感兴趣的:(asp.net)