做导出一直遇到个问题就是不能用ajax实现一步导出文档,即导出加下载。今天突然想到可以分开来做就上网搜了下,发现一篇比较不错的文章(http://www.cnblogs.com/zj0208/p/5961181.html),先摘录下来。

问题说明:Ajax是无法实现文件传输的,本文只是模拟了Ajax不刷新页面就可以请求并返回数据的效果。实质上还是通过提交form表单来返回文件流的输出。

分步实现逻辑:

  1. ajax请求服务器,访问数据库,根据查询到的数据生成一个数据文件,返回前台一个json对象(可放置生成成功标记,文件路径等信息)。
  2. ajax success回调函数部分,根据返回的json对象,调用手写的js下载文件的方法,实现页面无刷新下载文件。

贴上部分代码供参考:

js代码:

1. js写一个动态创建并提交form表单的方法,依赖于jQuery插件。

// 文件下载
jQuery.download = function (url, method, filedir, filename) {
jQuery('<form action="' + url + '" method="' + (method || 'post') + '">' + // action请求路径及推送方法
'<input type="text" name="filedir" value="' + filedir + '"/>' + // 文件路径
'<input type="text" name="filename" value="' + filename + '"/>' + // 文件名称
'</form>')
.appendTo('body').submit().remove();
};

2. 查询数据,输出到文件,保存到服务器,并调用download方法实现下载

  //ajax交互导出文档并获取文档路径及预下载文件名,返回格式{\"result\":\"success\",\"filePath\":\"\",\"fileName\":\"\"}
function DownFilesAjax(url, prams, downurl) {
showLoading(true);//调用加载动画http://spin.js.org/
$.ajax({
type: 'POST',
dataType: 'json',
async: false,
url: url,// 生成文件,保存在服务器
data: prams,
success: function (data) {
if (data.result == "success") {
$.download(downurl, 'post', data.filePath, data.fileName); // 下载文件
showLoading(false);//隐藏加载动画http://spin.js.org/
} else {
alert("数据导出失败!");
showLoading(false);
}
},
error: function (XMLHttpRequest, textStatus, e) {
//console.log("oilDetection.js method exportOilDetection" + e);
alert("数据传输发生错误,请联系管理员!");
showLoading(false);
}
});
}

附上spin加载动画调用js及其容器的遮罩样式。

调用js:

 var opts = {
lines: , // 花瓣数目
length: , // 花瓣长度
width: , // 花瓣宽度
radius: , // 花瓣距中心半径
corners: , // 花瓣圆滑度 (0-1)
rotate: , // 花瓣旋转角度
direction: , // 花瓣旋转方向 1: 顺时针, -1: 逆时针
color: '#fff', // 花瓣颜色
speed: , // 花瓣旋转速度
trail: , // 花瓣旋转时的拖影(百分比)
shadow: false, // 花瓣是否显示阴影
hwaccel: false, //spinner 是否启用硬件加速及高速旋转
className: 'spinner', // spinner css 样式名称 easyui里用这个类样式,若引用了easyui.css务必换个类名,其他前端框架未知
zIndex: 2e9, // spinner的z轴 (默认是2000000000)
top: '50%', // spinner 相对父容器Top定位 单位 px
left: '50%'// spinner 相对父容器Left定位 单位 px
};
var spinner = new Spinner(opts);
//显示与隐藏加载动画
function showLoading(result) {
var spinContainer = document.getElementById("foo");
if (result) {
var target = $(spinContainer).get();
spinner.spin(target);
spinContainer.style.height = document.documentElement.clientHeight + "px";
$(spinContainer).show();
} else {
spinner.spin();
$(spinContainer).hide();
}
}

遮罩样式:

 #foo {
position: fixed;
left: ;
top: ;
_position: absolute;
width: %;
background: #;
opacity: 0.5;
filter: alpha(opacity=);
z-index: ;
display:none;
}

以下一般处理程序中的相关代码。

导出文档:

  public void ExportALLNianDuGongZuo(HttpContext context)
{
string result = string.Empty;
string Name = DateTime.Now.Year + "导出的文件" + ".xls";//下载文档名
try
{
#region 导出过程
DataTable dt = new DataTable();
DataColumn dc = null;
dc = dt.Columns.Add("序号", Type.GetType("System.Int32"));
dc.AutoIncrement = true;//自动增加
dc.AutoIncrementSeed = ;//起始为1
dc.AutoIncrementStep = ;//步长为1
dc.AllowDBNull = false;//
dc = dt.Columns.Add("col1", Type.GetType("System.String"));
dc = dt.Columns.Add("col2", Type.GetType("System.String"));
dc = dt.Columns.Add("col3", Type.GetType("System.String"));
dc = dt.Columns.Add("col4", Type.GetType("System.String"));
dc = dt.Columns.Add("col5", Type.GetType("System.String")); IList<object> list = object.FindAll(@"IsEnable=1", "GOrder, PaiXu", null, , );//数据列表
foreach (var item in list)
{
DataRow newRow;
newRow = dt.NewRow();
newRow["col1"] = item.Name;
newRow["col2"] = item.Ext3;
newRow["col3"] = item.XieZuoDeptName;
newRow["col4"] = item.Ext2;
newRow["col5"] = IsShangHui.Trim();
dt.Rows.Add(newRow);
}
MemoryStream ms = new MemoryStream();
string Path = context.Server.MapPath("~/UploadFile/" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls");//文件保存地址
string templatePath = context.Server.MapPath("~/UploadFile/模版.xls");//所用模版地址
ms = NPOIExcelHelper.DataTableToExcel(dt, templatePath, );//详见NPOI导出execl
using (FileStream fs = new FileStream(Path, FileMode.Create, FileAccess.Write))
{
byte[] data = ms.ToArray();
fs.Write(data, , data.Length);
fs.Flush();
}
#endregion
result = "{\"result\":\"success\",\"filePath\":\"" + ReplaceString(Path) + "\",\"fileName\":\"" + Name + "\"}";
}
catch (Exception ex)
{
result = "{\"result\":\"fail\"}";
Unionstars.Trace.Log.WriteLine("导出发生错误:【" + ex + "】");
}
context.Response.ContentType = "application/Json";
context.Response.Write(result);
context.Response.End();
}

ajax无法传输文件,另新建web页面用来下载即可。

下载文档页面后台代码(前台删得只剩第一句即可):

  protected void Page_Load(object sender, EventArgs e)
{
string fileName = Request["filename"];//下载文档名
string filePath = Request["filedir"];
FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
String userAgent = System.Web.HttpContext.Current.Request.UserAgent;
//判断是否为ie10以下及ie11浏览器
if (userAgent.Contains("MSIE") || userAgent.Contains("rv:11"))
{
fileName = System.Web.HttpUtility.UrlEncode(fileName);
}
Response.AddHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", fileName));
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
Response.End();
}

终极方法,哈哈哈,留到最后

 
    function download(url, downLoadFileRename) {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
xhr.responseType = "blob"; // 返回类型blob
// 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
xhr.onload = function () {
// 请求完成
if (this.status === ) {
// 返回200
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
reader.onload = function (e) {
// 转换完成,创建一个a标签用于下载
var a = document.createElement('a');
a.download = downLoadFileRename;
a.href = e.target.result;
$("body").append(a); // 修复firefox中无法触发click
a.click();
$(a).remove();
}
}
};
// 发送ajax请求
xhr.send()
}
 
 

ajax实现文档导出及下载的更多相关文章

  1. 懒得写文档,swagger文档导出来不香吗

    导航 前言 离线文档 1 保存为html 2 导出成pdf文档 3 导出成Word文档 参考 前言   早前笔者曾经写过一篇文章<研发团队,请管好你的API文档>.团队协作中,开发文档的重 ...

  2. 【资源】108个大数据文档PDF开放下载-整理后打包下载

                  本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html        本博客其他.NET开源项目文章目录:h ...

  3. NVelocity介绍,NVelocity中文手册文档及实例下载

    NVelocity是什么velocity英音:[vi'lɔsiti]美音:[və'lɑsətɪ]近在做一个项目,客户要求有网站模板功能,能够自主编辑网站的风格,因为这个系统是为政府部门做子站系统,举个 ...

  4. 将Swagger2文档导出为HTML或markdown等格式离线阅读

    网上有很多<使用swagger2构建API文档>的文章,该文档是一个在线文档,需要使用HTTP访问.但是在我们日常使用swagger接口文档的时候,有的时候需要接口文档离线访问,如将文档导 ...

  5. word 文档导出 (freemaker+jacob)--java开发

    工作中终于遇到了 需要导出word文旦的需求了.由于以前没有操作过,所以就先百度下了,基本上是:博客园,简书,CDSN,这几大机构的相关帖子比较多,然后花了2周时间 才初步弄懂.  学习顺序: 第一阶 ...

  6. vs2012 MSDN帮助文档离线包下载安装方法

    vs2012安装文件 自带的 MSDN帮助文档不全, 需要自己手动添加需要的离线文档包, 具体方法如下 1. 打开 vs2012 2. 按 ctrl + alt + F1 打开帮助文档管理器 3. 在 ...

  7. 上传文件到 Sharepoint 的文档库中和下载 Sharepoint 的文档库的文件到客户端

    文件操作应用场景: 如果你的.NET项目是运行在SharePoint服务器上的,你可以直接使用SharePoint服务器端对象模型,用SPFileCollection.Add方法 http://msd ...

  8. 手写OOXML文档——导出xlsx格式表格文档

    一.准备工作: 2个js库,另外把样式文件抽离出来 require('file-saver'); import JSZip from 'jszip' import {stylesData,theme1 ...

  9. Mysql、Oracle、SQLServer等数据库参考文档免费分享下载

    场景 MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统 ...

随机推荐

  1. Spring-boot在windows上安装CLI(Command Line Interface)的步骤!

    首先去下载安装包,我这里整了一个zip包,一个tar包,下载地址:https://github.com/zhangyawei117/Spring-boot-CLI.git 下载完了之后,把zip包解压 ...

  2. Unity自动生成AnimatorController

    上一篇写了如何自动切割动画,这一篇写如何自动生成AnimatorController. 之前网上查了很多资料,看的一直很蒙,看不懂是怎么回事的,这里我先给大家明确几个概念: 画的不好,大家将就着看,写 ...

  3. 洛谷P1746 离开中山路

    https://www.luogu.org/problemnew/show/P1746 思路:用广搜从起点开始,遍历所有可达的点,再往下遍历直到到达终点,所以能保证得到的结果一定是最优解 #inclu ...

  4. spring filter lister servlet

    https://blog.csdn.net/nacey5201/article/details/8547772 https://blog.csdn.net/xwl617756974/article/d ...

  5. 在windows下golang安装zmq3小记

    备忘这个 安装 TDM-GCChttp://tdm-gcc.tdragon.net/download 设置环境变量set C_INCLUDE_PATH=d:\DevTools\Zmq\ZeroMQ 3 ...

  6. scrapy的入门使用(二)

    1. scrapy实现翻页请求 找到下一页的url地址 构造url地址的请求,传递给引擎 1.1 实现翻页请求 使用方法 在获取到url地址之后,可以通过scrapy.Request(url,call ...

  7. 在 npm 中使用 ES6 module

    node 从 v8.5.0起 支持了 ES6 module. 只需保存文件名为 .mjs ,并通过一个option 可以开启执行,如 node --experimental-modules index ...

  8. 避免docker异常重启容器挂掉的解决方法

    Docker 升级或者重启容器不会被停掉然后重启的解决方法 在/etc/systemd/system/multi-user.target.wants/docker.service文件下添加配置 注意: ...

  9. linux 最为常用的命令

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 cat /proc/cpuinfo 显示CPU info的信息 ...

  10. git忽视修改的文件

    对于tracked文件来说,使用.gitignore是不行的.但是git提供了新的方法. 使用命令 git update-index --assume-unchanged <files>, ...