ASP.NET生成Excel并下载
实现生成Excel文件,并下载的功能,代码:
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并下载相关推荐
- 【微信小程序】生成excel并下载 | 微信 | excel | 文件下载 |
生成excel并下载 有一个需求就是通过微信云数据库导出数据到excel并且下载到本地.首先对这个任务进行分解. 一 通过云数据库读取数据生成excel 在前端页面index.wxml添加按钮,绑定函 ...
- phpexcel生成excel并下载
Loader::import('PHPExcel.Classes.PHPExcel'); // tp5中只需将phpexcel文件放入extend文件夹中,即可采用该方法引入,需要先 use thin ...
- Asp.net生成Excel文件并下载(解决使用迅雷下载页面而不是文件的问题)
这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 先试用Response.WriteFile的方法: FileInfo fi = new FileInfo(excelFile); ...
- 【原】Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...
这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.W ...
- java迅雷下载excel,Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...
(一) 如果在迅雷的下载对话框中点取消,则会使用IE的下载,这里的文件又是正确的了: 怀疑迅雷是根据下载对话框中的网址重新请求下载,与发起请求的页面已经无关,而IE又不会把ViewState信息传到迅 ...
- Asp.net生成Excel文件并下载(更新:解决使用迅雷下载页面而不是文件的问题)...
这里采用的是在服务端先生成Excel文件,然后利用文件地址下载的方法. 生成Excel文件的方法,见:[原].Net创建Excel文件(插入数据.修改格式.生成图表)的方法 先试用Response.W ...
- java动态生成excel_java动态生成excel打包下载
@SuppressWarnings("unchecked")public String batchExport() throwsDBException{ @SuppressWarn ...
- 根据excel列动态创建mysql表_根据数据库字段动态生成excel模版下载,上传模版获取数据存入数据库(poi 反射)...
环境:mysql5.7.28 java8 Spring boot 2.2.4 mybatis-plus3.10 动态:根据需求,用户可以选择对应的字段生成excle模版 下载 poi 反射:poi是e ...
- java后台生成excel_Java后台生成Excel前台下载
Java后台通过poi生成HSSFWorkbook 对生成HSSFWorkbook 类型处理 转为文件流通过response 返回到前台 HSSFWorkbook hw = null; try{ hw ...
- java通过poi生成excel并下载出现文件打不开、文件格式和文件扩展名无效问题的分析与解决
需求描述: 需要完成这样一个功能:后台通过poi生成excle,前台点击按钮可直接下载. 代码逻辑(核心部分): 第一种: public String generatePlanExcel(@Reque ...
最新文章
- 力扣—— 三维形体投影面积
- 求n!(n的阶乘)和1!+2!+....n! (阶乘求和) ----C语言实现
- 【第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛】Simone and Graph Coloring
- 【unity基础系列】1、unity Texture Type设置为Advanced时纹理的格式列表
- Spyder 代码自动补全功能,代码提示
- html写界面,C++|Qt后台处理业务(后台登录例子JavaScript给Qt提供数据)
- redis+php微博,redis+php实现微博(三)微博列表功能详解
- matlab 倾斜矫正,matlab图像倾斜校正
- 南瓜电影将和腾讯合作 获海量视频版权授权
- openfire spark用户名问题续
- 免费的响应式bootstrap管理员后台界面主题 - Charisma
- 开源项目推荐ruoyi
- Unity Shader Alpha Blend 填坑记录
- 电脑中删掉的照片怎么恢复
- 【蓝牙系列】蓝牙5.4到底更新了什么(2)
- requests爬取视频片段并整合
- 我们为什么需要光纤配线架
- 从头开始做一个智能家居设备:硬件准备
- 安装客户端出现More information at://nsis.sf.net/nsis_error
- 飞飞cms添加广告html,飞飞影视cms-飞飞cms免费影视站程序
热门文章
- 管理感悟:掌握工作的决定权
- SPFA算法判断负环
- python中的time的时间戳_python中的时间time、datetime、str和时间戳
- 虚拟机linux 下安装及配置qt
- msf php脚本提权,[原创]WEB安全第六章 提权篇16 metasploit linux提权
- tableexport 文件格式和扩展名不匹配_让信息检索更有效率!百度有哪些你不知道的隐藏玩法?...
- html5植物生长,关于植物生长的知识
- android手机iPhone对比,安卓手机与苹果手机功能对比【详细介绍】
- java计算两点距离_Java 使用经度计算两点之间的距离?
- HSPA+系列之“下行增强F-DPCH +下行增强CELL_FACH