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 ...
 
随机推荐
- 打包发布到Tomcat
			
idea: file-->project structure --> Artifacts --> 点+号 web application exploded from m ...
 - sql存储过程调用示例
			
1.配置文件: <connectionStrings> <add name="constr" connectionString="data source ...
 - MSSQL 表修复语句
			
一早发现C盘爆满了,查询了下发现是mssql下面占用了几十G的log以及mdmp文件 一般发现这种文件就是代表着数据库出问题了. 检查数据库,发现某个数据库有问题,(回想起来前天做了一个操作,可能有问 ...
 - EasyUI在window中使用kindeditor 4.1.10在IE9中不能回显、获得焦点编辑的问题
			
描述 :kindeditor4.1.10版本是当前最新的版本,在浏览器兼容性和功能方面都是值得一赞的,在开发中能方便快捷的满足一些开发需求. 问题 : 问题总是有的. 在使用过程中,遇到EasyU ...
 - fread,fwrite
 - 20175213吕正宏  MyCP(课下任务,必做)
			
一.任务详情: 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件( ...
 - R语言-图形辅助
			
1.画底纹格子 grid()函数 > plot(rnorm(100)) > grid() #画底纹格子 > grid(nx=NA, ny=8, #画水平底纹,横坐标无分隔,纵坐 ...
 - KCF:High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析(一)。分享与转发请注明出处-作者:行于此路
			
High-Speed Tracking with Kernelized Correlation Filters 的翻译与分析 基于核相关滤波器的高速目标跟踪方法,简称KCF 写在前面,之所以对这篇文章 ...
 - MFC列表控件更改一行的字体颜色
			
参考自(http://blog.csdn.net/ribut9225/article/details/6720639) 1.首先从CListCtrl 继承一个类,命名为CListCtrlCl 在头文件 ...
 - 一些常用的 std 类型
			
[std::allocator] 标准库中包含一个名为allocator的类,允许我们将分配和初始化分离.使用allocator通常会提供更好的性能和更灵活的内存管理能力. 标准库allocator类 ...