做导出一直遇到个问题就是不能用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. canvas画布如何画图案例

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  2. Linux---设备文件名和挂载点

    分区: 1.分区: MBR   GPT 2.格式化  : 为了写入文件系统 3.设备文件名 4.什么是挂载点? 挂载点:使用已经存在的空目录作为挂载点 挂载: 必须分区: / (根分区) swap分区 ...

  3. Android端高性能图像分类解决方案

    由于公司业务需要,前段时间开始了解AI方面的东西,准备找一个在android端性能较高的前向计算框架,了解了tflite,百度的mdl和腾讯的ncnn,最终敲定ncnn,不失所望,效果很不错,基本达到 ...

  4. Linux如何挂载U盘

    1,以root用户登陆   先加载USB模块 modprobe usb-storage   用fdisk -l 看看U盘的设备   假如U盘是sda1 2,确定在 目录 /mnt 下建立了 文件夹 / ...

  5. AlphaGo原理浅析

    一.PolicyNetwork(走棋网络) 首先来讲一下走棋网络.我们都知道,围棋的棋盘上有19条纵横交错的线总共构成361个交叉点,状态空间非常大,是不可能用暴力穷举的方式来模拟下棋的.但是我们可以 ...

  6. java 幂等性(转)

    (转自)http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html 理解HTTP幂等性 基于HTTP协议的Web ...

  7. [译]使用explain API摆脱ElasticSearch集群RED苦恼(转)

    "哔...哔...哗",PagerDuty的报警通知又来了. 可能是因为你又遭遇了节点宕机, 或者服务器机架不可用, 或者整个ElasticSearch集群重启了. 不管哪种情况, ...

  8. 如何从本地远程访问虚拟机内的Mysql服务器?

    假设重装了操作系统,则本地的很多软件可能都需要重新安装,比如数据库.但是,假设我们把一些重要的软件安装在虚拟机当中,则在重装操作系统之前,数据库服务器可以和虚拟机一起进行备份.重装操作系统之后,原先的 ...

  9. Office Web addin 踩坑计:替换后台网站为MVC框架时遇到的问题

    Office Web Addin 模板程序的后台本质上是一个网站,你在调试的时候可以发现它的进程是一个32位的IE进程 所以可以把它替换成Asp.net的网站. 替换方法: 1.点击WordRevie ...

  10. 我的C#跨平台之旅(一):从 Hello World 开始

    创建一个“控制台应用程序”,目标框架为“.NET Framework 4.5”,并移除无关的文件及引用,仅保留对 “system.dll”的引用:其中工程文件中核心内容如下: 使用NuGet添加如下引 ...