WCF系列_WCF影响客户端导出Excel文件的实现
需求:WCF搭建服务端提供导出并下载Excel文件接口,客户端使用ajax发起请求,浏览器直接下载Excel文件。
难点:WCF中并没有HttpContext对象,因此,服务端总是获取不到HttpContext.Current值。即HttpContext.Current=null。
使用WebFrom的方法已经不能实现需求了。
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(excelConfig.FileName, Encoding.UTF8));
HttpContext.Current..Response.BinaryWrite(...);
HttpContext.Current..Response.End();
方案:兼容模式下,使用WebOperationContext.Current.OutgoingResponse
public Stream DownloadFileFromWCF()
{
Stream fileStream = null;
try
{
DataTable dtExport = null; //要导出的数据源
#region 转换为流
string fileString = ToStringCSV(dtExport, ",", true);
fileString = ToStringXLS(dtExport, false);
// byte[] array = Encoding.ASCII.GetBytes(fileString);//中文乱码
byte[] array = System.Text.Encoding.UTF8.GetBytes(fileString);//中文乱码
array = System.Text.Encoding.Default.GetBytes(fileString);
MemoryStream stream = new MemoryStream(array);
fileStream = stream;
#endregion
//从硬盘文件读取数据源
//string fileFullPath = @"C:\Users\dell\Desktop\投注页相关接口.txt";
//fileStream = File.OpenRead(fileFullPath);
string saveFileName = "Test.xls";
//WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
//WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Encoding", "gzip");
//WebOperationContext.Current.OutgoingResponse.ContentType = "text/html; charset=utf-8";
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-Disposition", "attachment;filename=" + HttpUtility.UrlPathEncode(saveFileName));
}
catch (Exception ex)
{
}
return fileStream;
}
/// <summary>
/// dt转CSV格式文件字符串
/// </summary>
/// <param name="table"></param>
/// <param name="delimiter">分隔符=","</param>
/// <param name="includeHeader">是否包括数据表头</param>
/// <returns></returns>
private string ToStringCSV(DataTable dt, string delimiter, bool includeHeader)
{
var result = new StringBuilder();
if (includeHeader)
{
foreach (DataColumn column in dt.Columns)
{
result.Append(column.ColumnName);
result.Append(delimiter);
}
result.Remove(--result.Length, 0);
result.Append(Environment.NewLine);
}
string itemAsString = string.Empty;
foreach (DataRow row in dt.Rows)
{
foreach (object item in row.ItemArray)
{
itemAsString = string.Empty;
if (item is DBNull)
result.Append(delimiter);
else
{
itemAsString = item.ToString();
// Double up all embedded double quotes
itemAsString = itemAsString.Replace("\"", "\"\"");
// To keep things simple, always delimit with double-quotes
// so we don't have to determine in which cases they're necessary
// and which cases they're not.
itemAsString = "\"" + itemAsString + "\"";
result.Append(itemAsString + delimiter);
}
}
result.Remove(--result.Length, 0);
result.Append(Environment.NewLine);
}
return result.ToString();
}
/// <summary>
/// dt转XLS格式文件字符串
/// </summary>
/// <param name="dt"></param>
/// <param name="includeHeader"></param>
/// <returns></returns>
private string ToStringXLS(DataTable dt, bool includeHeader)
{
var result = new StringBuilder();
string delimiter = "";
if (includeHeader)
{
foreach (DataColumn dc in dt.Columns)
{
result.Append(delimiter + dc.ColumnName);
delimiter = "\t";
}
//result.Append("\n");
result.Append(Environment.NewLine);
}
foreach (DataRow dr in dt.Rows)
{
delimiter = "";
for (int i = 0; i < dt.Columns.Count; i++)
{
result.Append(delimiter + dr[i].ToString());
delimiter = "\t";
}
//result.Append("\n");
result.Append(Environment.NewLine);
}
return result.ToString();
}
WCF系列_WCF影响客户端导出Excel文件的实现的更多相关文章
- java导入、导出Excel文件
一.介绍 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际 ...
- jxl导出Excel文件
一.java项目实现读取Excel文件和导出Excel文件 实现读取和导出Excel文件的代码: package servlet; import java.io.FileInputStream; im ...
- JQGrid导出Excel文件
系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...
- EasyUI 如何结合JS导出Excel文件
出处:http://blog.csdn.net/jumtre/article/details/41119991 EasyUI 如何结合JS导出Excel文件 分类: 技术 Javascript jQu ...
- 如何使用JavaScript导入和导出Excel文件
本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. JavaScript是一个涵盖多种框架.直译式.可以轻松自定义客户端的脚本 ...
- ExtJS Grid导出excel文件
ExtJS Grid导出excel文件, 需下载POI:链接:http://pan.baidu.com/s/1i3lkPhF 密码:rqbg 1.将Grid表格数据连同表格列名传到后台 2.后台导出e ...
- PHP从数据库导出EXCEL文件
参考博客链接:http://www.cnblogs.com/huangcong/p/3687665.html 我的程序代码 原生导出Excel文件 <?phpheader('Content-ty ...
- PHP导出excel文件
现在教教你如何导入excel文件: 在我的文件储存里面有一个com文件夹的,将其解压放在ThinkPHP/Library/文件夹里面,然后就是写控制器啦!去调用这个插件: <?php names ...
- 【转】 (C#)利用Aspose.Cells组件导入导出excel文件
Aspose.Cells组件可以不依赖excel来导入导出excel文件: 导入: public static System.Data.DataTable ReadExcel(String strFi ...
随机推荐
- python3 摘抄
https://www.python.org/downloads/release/python-370/ python3.7.0 win10环境,选:Windows x86-64可执行安装程序. ht ...
- CUDA compiler driver nvcc 散点 part 2
● nvcc 编译流程图 ● sm 是向前兼容的,高的版本号是在低版本号的基础上添加了新功能得到的,同一 compute_XY 编译的 .cu 文件仅能向后 sm_ZW 的实 GPU 版本(Z > ...
- PHP简单的长文章分页教程 附源码
PHP简单的长文章分页教程 附源码.本文将content.txt里的内容分割成3页,这样浏览起来用户体验很好. 根据分页参数ipage,获取对应文章内容 include('page.class.php ...
- apache_php_mysql
软件下载 目前,Apache和PHP均未出现官方的64位版本. Apache 64位: http://www.blackdot.be/?inc=apache/binaries 这个安装文件我已经上传到 ...
- MVC人员管理系统
基本都要使用C控制器中的两个action来完成操作,一个用于从主界面跳转到新页面.同时将所需操作的数据传到新界面,另一个则对应新界面的按钮,用于完成操作.将数据传回主界面以及跳转回主界面.根据不同情况 ...
- 8. springboot logback 日志整合
在resources目录下,新建log/logback-spring.xml文件,内容如下: <?xml version="1.0" encoding="UTF-8 ...
- Django 中的JsonResponse 和 json区别
from django.http import JsonResponse JsonResponse 里面代码会加这一个响应头 kwargs.setdefault('content_type', 'ap ...
- python学习笔记---环境的安装,pip命令,数据类型,运算
1.进入python环境: python 2:py -2 python 3:py -3 2.退出python环境 exit()/quit()/ctrl+z+enter ctrl+z+enter没有尝试 ...
- pymysql -转自https://www.cnblogs.com/chenhaiming/p/9883349.html#undefined
PyMysql的几个重要方法 connect函数:连接数据库,根据连接的数据库类型不同,该函数的参数也不相同.connect函数返回Connection对象. cursor方法:获取操作数据库的Cur ...
- mongodb 多表查询
今天有一个业务涉及到mongodb的多表查询,大体记录下语句结构 db.table_a.aggregate([ {$lookup:{from:"table_b",localFiel ...