实现生成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;
        }
    }
}

转载于:https://www.cnblogs.com/jerryshi/archive/2009/01/21/1379682.html

ASP.NET生成Excel并下载相关推荐

  1. 【微信小程序】生成excel并下载 | 微信 | excel | 文件下载 |

    生成excel并下载 有一个需求就是通过微信云数据库导出数据到excel并且下载到本地.首先对这个任务进行分解. 一 通过云数据库读取数据生成excel 在前端页面index.wxml添加按钮,绑定函 ...

  2. phpexcel生成excel并下载

    Loader::import('PHPExcel.Classes.PHPExcel'); // tp5中只需将phpexcel文件放入extend文件夹中,即可采用该方法引入,需要先 use thin ...

  3. Asp.net生成Excel文件并下载(解决使用迅雷下载页面而不是文件的问题)

    这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 先试用Response.WriteFile的方法: FileInfo fi = new FileInfo(excelFile); ...

  4. 【原】Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.W ...

  5. java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    (一) 如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了: 怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅 ...

  6. Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...

    这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.W ...

  7. java动态生成excel_java动态生成excel打包下载

    @SuppressWarnings("unchecked")public String batchExport() throwsDBException{ @SuppressWarn ...

  8. 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...

    环境:mysql5.7.28 java8 Spring boot 2.2.4 mybatis-plus3.10 动态:根据需求,用户可以选择对应的字段生成excle模版 下载 poi 反射:poi是e ...

  9. java后台生成excel_Java后台生成Excel前台下载

    Java后台通过poi生成HSSFWorkbook 对生成HSSFWorkbook 类型处理 转为文件流通过response 返回到前台 HSSFWorkbook hw = null; try{ hw ...

  10. java通过poi生成excel并下载出现文件打不开、文件格式和文件扩展名无效问题的分析与解决

    需求描述: 需要完成这样一个功能:后台通过poi生成excle,前台点击按钮可直接下载. 代码逻辑(核心部分): 第一种: public String generatePlanExcel(@Reque ...

最新文章

  1. 力扣—— 三维形体投影面积
  2. 求n!(n的阶乘)和1!+2!+....n! (阶乘求和) ----C语言实现
  3. 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring
  4. 【unity基础系列】1、unity Texture Type设置为Advanced时纹理的格式列表
  5. Spyder 代码自动补全功能,代码提示
  6. html写界面,C++|Qt后台处理业务(后台登录例子JavaScript给Qt提供数据)
  7. redis+php微博,redis+php实现微博(三)微博列表功能详解
  8. matlab 倾斜矫正,matlab图像倾斜校正
  9. 南瓜电影将和腾讯合作 获海量视频版权授权
  10. openfire spark用户名问题续
  11. 免费的响应式bootstrap管理员后台界面主题 - Charisma
  12. 开源项目推荐ruoyi
  13. Unity Shader Alpha Blend 填坑记录
  14. 电脑中删掉的照片怎么恢复
  15. 【蓝牙系列】蓝牙5.4到底更新了什么(2)
  16. requests爬取视频片段并整合
  17. 我们为什么需要光纤配线架
  18. 从头开始做一个智能家居设备:硬件准备
  19. 安装客户端出现More information at://nsis.sf.net/nsis_error
  20. 飞飞cms添加广告html,飞飞影视cms-飞飞cms免费影视站程序

热门文章

  1. 管理感悟:掌握工作的决定权
  2. SPFA算法判断负环
  3. python中的time的时间戳_python中的时间time、datetime、str和时间戳
  4. 虚拟机linux 下安装及配置qt
  5. msf php脚本提权,[原创]WEB安全第六章 提权篇16 metasploit linux提权
  6. tableexport 文件格式和扩展名不匹配_让信息检索更有效率!百度有哪些你不知道的隐藏玩法?...
  7. html5植物生长,关于植物生长的知识
  8. android手机iPhone对比,安卓手机与苹果手机功能对比【详细介绍】
  9. java计算两点距离_Java 使用经度计算两点之间的距离?
  10. HSPA+系列之“下行增强F-DPCH +下行增强CELL_FACH