.ashx文件中输出文件的问题
想点击导出按钮,实现将数据导出为excel,于是做了一个.ashx文件(用于接收导出请求,并执行导出)
toexcel.ashx代码
这段代码如果在服务器按钮事件中写,则可以成功导出excel文件,但在这里
却只输出了一个页面,里面包含了ds1里的所有数据,外加一个“确定”按钮!
不知怎么回事,请指教!
toexcel.ashx代码
...
DataSet ds1 = Member.GetMembers();//获取要导出的数据
context.Response.Clear();
context.Response.Charset = "";
context.Response.ContentType = "application/vnd.ms-xls";
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
DataGrid dg = new DataGrid();
dg.DataSource = ds1;
dg.DataBind();
dg.RenderControl(htmlWrite);
context.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("abcdefg.xls"));
context.Response.Write(stringWrite.ToString());
context.Response.End();
这段代码如果在服务器按钮事件中写,则可以成功导出excel文件,但在这里
却只输出了一个页面,里面包含了ds1里的所有数据,外加一个“确定”按钮!
不知怎么回事,请指教!
...全文
请发表友善的回复…
发表回复
pingjing_82 2013-04-09
- 打赏
- 举报
我也正遇到这样的问题,有谁可以解决一下。
qfjzr 2012-07-13
- 打赏
- 举报
悲剧了!!
csdnfan 2011-11-24
- 打赏
- 举报
唉啊,遇到相同的问题可惜还没有找到答案,这个框架貌似是extjs
yuxh81 2010-08-13
- 打赏
- 举报
晕,要沉了
yuxh81 2010-08-12
- 打赏
- 举报
别沉了,自己顶!
yuxh81 2010-08-11
- 打赏
- 举报
没有哪位兄弟这样做过吗?
千万别沉了啊!
千万别沉了啊!
专爆菜鸟 2010-08-10
- 打赏
- 举报
正在研究如梦的下载的4个方法。
yuxh81 2010-08-10
- 打赏
- 举报
可是可以,不过我觉得应该可以不产生文件而直接输出下载
事实证明,如果不用ajax请求导出excel,而直接在页面的服务器事件中处理导出(不产生文件)是可以的!
wilensky 2010-08-10
- 打赏
- 举报
[Quote=引用 21 楼 yuxh81 的回复:]
引用 20 楼 glyphvectory 的回复:
lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
谢谢你,不然就沉了!
如果是这样的话,怎么监测用户已下载完成呢?
也就是说删除文件的时机问题。。。
这个似乎办不到吧!!!
[/Quote]
我做下载到出这类,都是建个temp文件夹,用户点击下载的时候,先看看有没有指定文件名的文件,没有则生成,有则直接下载,或者数据有更新了,生成覆盖再下载。
你可以搞个定时删除,夜里12点,不过存几个临时文件,也占不了多大地方
引用 20 楼 glyphvectory 的回复:
lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
谢谢你,不然就沉了!
如果是这样的话,怎么监测用户已下载完成呢?
也就是说删除文件的时机问题。。。
这个似乎办不到吧!!!
[/Quote]
我做下载到出这类,都是建个temp文件夹,用户点击下载的时候,先看看有没有指定文件名的文件,没有则生成,有则直接下载,或者数据有更新了,生成覆盖再下载。
你可以搞个定时删除,夜里12点,不过存几个临时文件,也占不了多大地方
yuxh81 2010-08-10
- 打赏
- 举报
[Quote=引用 20 楼 glyphvectory 的回复:]
lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
[/Quote]
谢谢你,不然就沉了!
如果是这样的话,怎么监测用户已下载完成呢?
也就是说删除文件的时机问题。。。
这个似乎办不到吧!!!
lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
[/Quote]
谢谢你,不然就沉了!
如果是这样的话,怎么监测用户已下载完成呢?
也就是说删除文件的时机问题。。。
这个似乎办不到吧!!!
GlyphVectory 2010-08-10
- 打赏
- 举报
lz你可以这样嘛。你先在服务器端生成excle,然后下载,下载后删除,
因为本地下载的提示框是js的进程阻涉。页面不刷新
因为本地下载的提示框是js的进程阻涉。页面不刷新
yuxh81 2010-08-09
- 打赏
- 举报
接收并处理ajax请求的页面statistics.ashx
下载方法,Tools.ToExcel(ds1, "Excel文件.xls");
<%@ WebHandler Language="C#" Class="statistics" %>
using System;
using System.Web;
using System.Data;
using Newtonsoft.Json;
using System.IO;
using System.Web.SessionState;
public class statistics : IHttpHandler,IRequiresSessionState {
public void ProcessRequest (HttpContext context) {
string opertype = context.Request.QueryString["opertype"];
SessionLogin login = context.Session["Login"] as SessionLogin;
//...
if (opertype == "contactrecordtoexcel") //导出到excel
{
if (login != null)
{
ContactRecordStatisticsOption thisOption = new ContactRecordStatisticsOption();
//-------------------获取查询参数执行查询,并导出Excel文件
//所属员工所在部门ID
string did = context.Request.QueryString["did"];
if (!string.IsNullOrEmpty(did)) { thisOption.Did.IsUsed = true; thisOption.Did.Value = did; }
else thisOption.Did.IsUsed = false;
//联系人姓名
string linkman = context.Request.QueryString["linkman"];
if (!string.IsNullOrEmpty(linkman)) { thisOption.Linkman.IsUsed = true; thisOption.Linkman.Value = linkman; }
else thisOption.Linkman.IsUsed = false;
//所属操作员ID
thisOption.Oid.IsUsed = true;
thisOption.Oid.Value = login.Id;
//所属企业用户ID
thisOption.Cid.IsUsed = true;
thisOption.Cid.Value = login.Cid;
//-----------------------导出逻辑
string[] columns = { "cname", "cfrom", "clevel", "industry", "recordtime" };
DataSet ds = Statistics.ContactRecord(thisOption);
DataSet ds1 = new DataSet();
ds1.Tables.Add(new DataTable());
for (int j = 0; j < columns.Length; j++)
{
LabelCustomize label = new LabelCustomize();
ds1.Tables[0].Columns.Add(label.GetLabel(1, "TB_CLIENT", columns[j]));
}
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
DataRow row = ds1.Tables[0].NewRow();
for (int j = 0; j < columns.Length; j++)
{
row[j] = ds.Tables[0].Rows[i][columns[j]];
}
ds1.Tables[0].Rows.Add(row);
}
//调用导出方法
Tools.ToExcel(ds1, "Excel文件.xls");
}
else
{
context.Response.Write("False");
}
}
}
public bool IsReusable {
get {
return false;
}
}
}
下载方法,Tools.ToExcel(ds1, "Excel文件.xls");
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.ContentType = "application/vnd.ms-xls";
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
DataGrid dg = new DataGrid();
dg.DataSource = ds;
dg.DataBind();
dg.RenderControl(htmlWrite);
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(fname));
HttpContext.Current.Response.Write(stringWrite.ToString());
HttpContext.Current.Response.End();
yuxh81 2010-08-09
- 打赏
- 举报
aspx页面之html部分:
<div style="float:left;width:100%;">
<div style="width:100%;float:left;">
<table style="width:100%;" class="form">
<tr>
<td style="text-align:left;">
<asp:Label ID="lblDepartment" runat="server" Text="所属部门"></asp:Label> <select id="selDepartment" style="width:125px;"></select>
<asp:Label ID="lblOwner1" runat="server" Text="所属员工"></asp:Label> <select id="selOwner" style="width:125px;"><option value="">[全部]</option></select>
<asp:Label ID="lblOperator1" runat="server" Text="我方人员"></asp:Label> <select id="selOperator" style="width:125px;"></select>
<asp:Label ID="lblLinkman1" runat="server" Text="联 系 人"></asp:Label> <input id="txtLinkman" type="text" style="width:120px;" />
</td>
</tr>
<tr>
<td style="text-align:left;">
<asp:Label ID="lblContactTime1" runat="server" Text="联系时间"></asp:Label> <select id="selContactTimeMode">
<option value="">[全部]</option>
<option value="today" selected="selected">今天</option>
<option value="thisweek">本周</option>
<option value="thismonth">本月</option>
<option value="thisquarter">本季度</option>
<option value="thisyear">本年</option>
</select>
<span>从</span>
<input id="txtContactTimeStart" type="text" style="width:100px;" />
<span>到</span>
<input id="txtContactTimeEnd" type="text" style="width:100px;" />
<asp:Label ID="lblNextContactTime1" runat="server" Text="下次联系"></asp:Label> <select id="selNextContactTimeMode">
<option value="">[全部]</option>
<option value="today" selected="selected">今天</option>
<option value="thisweek">本周</option>
<option value="thismonth">本月</option>
<option value="thisquarter">本季度</option>
<option value="thisyear">本年</option>
</select>
<span>从</span>
<input id="txtNextContactTimeStart" type="text" style="width:100px;" />
<span>到</span>
<input id="txtNextContactTimeEnd" type="text" style="width:100px;" />
</td>
</tr>
<tr>
<td style="text-align:left;">
<input id="rdoIsFactAll" type="radio" style="cursor:pointer;" name="isfact" checked="checked" />全部客户
<input id="rdoIsFactNo" type="radio" style="cursor:pointer;" name="isfact" />潜在客户
<input id="rdoIsFactYes" type="radio" style="cursor:pointer;" name="isfact" />事实客户
<input id="btnStatis" type="button" value=" 统 计 " class="button" />
</td>
</tr>
</table>
</div>
<div style="width:100%;float:left;">
<table style="width:100%; height:100%;">
<tr>
<td style="vertical-align:top;" colspan="2">
<table id="tbContactRecords" width="100%" class="data" style="margin-top:0px;">
<thead>
<tr>
<th style="width:15%;"><asp:Label ID="lblClientName" runat="server" Text="客户名称"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblLinkman" runat="server" Text="联 系 人"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblOperator" runat="server" Text="我方人员"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblContactTime" runat="server" Text="联系时间"></asp:Label></th>
<th style="width:25%;"><asp:Label ID="lblContent" runat="server" Text="联系内容"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblMode" runat="server" Text="联系方式"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblOwner" runat="server" Text="所属员工"></asp:Label></th>
<th style="width:10%;"><asp:Label ID="lblRecordTime" runat="server" Text="记录时间"></asp:Label></th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="8" style="text-align:center;">没有符合条件的联系记录!</td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr style="height:18px;">
<td style="text-align:left;">
共<label id="lblReCount" style="color: Red;"></label>条记录 第<label id="lblCurrPgIndex"
style="color: Red;"></label>/<label id="lblPgCount" style="color: Red;"></label>页
<a id="btnPrev" href="javascript:prevPage();" style="color:#0099dd;">上一页</a> <a id="btnNext" href="javascript:nextPage();" style="color:#0099dd;">
下一页</a>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</td>
<td style="text-align:right;">
<input id="btnExport" type="button" class="button" value=" 导 出 " onclick="toexcel($(this));" />
</td>
</tr>
</table>
</div>
</div>
yuxh81 2010-08-09
- 打赏
- 举报
以下是.aspx页面代码:
js部分:
js部分:
<script type="text/javascript">
//js获取页面url中的参数
var search=window.location.search;
var pList = getSearchAsArray(search);
//------查询逻辑
var p_did = "";
var p_linkman = "";
var p_operator = "";
var p_sid = "";
var p_contacttimestart = "";
var p_contacttimeend = "";
var p_nextcontacttimestart = "";
var p_nextcontacttimeend = "";
var p_isfact = "";
//设置查询参数
function set_parms()
{
p_did = $("#selDepartment").val();
//...
}
//获取查询结果记录总数
function getRecordCount(btn)
{
$("#tbContactRecords tbody tr").remove();
btn.attr("disabled","disabled");
$.ajax({
url:"../../Ajax/statistics.ashx?opertype=contactrecord&"+Math.random(),
type:"GET",
data:{did:p_did,linkman:p_linkman,operator:p_operator,sid:p_sid,contacttimestart:p_contacttimestart,contacttimeend:p_contacttimeend,
nextcontacttimestart:p_nextcontacttimestart,nextcontacttimeend:p_nextcontacttimeend,isfact:p_isfact},
beforeSend:function(){
var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center'><div class='info'>正在统计个数……</div></td></tr>");
$("#tbContactRecords").append($msg);
},
success:function(data)
{
btn.attr("disabled","");
currRecordCount = data;
//计算参数
currPageIndex = 1;
currPageCount = parseInt(currRecordCount / currPageSize);if (currRecordCount % currPageSize > 0) currPageCount += 1;//总页数
//首次自动触发
getpage($("#btnNext,#btnPrev,#btnPageTo,#btnNext1,#btnPrev1,#btnPageTo1"));
},
error:function(XMLHttpRequest,textStatus)
{
btn.attr("disabled","");
alert("请求错误:"+textStatus);
return false;
}
});
}
//------分页逻辑
var currRecordCount = 0; //总记录数
var currPageSize = 20; //页面记录数
var currPageCount = parseInt(currRecordCount / currPageSize);if (currRecordCount % currPageSize > 0) currPageCount += 1;//总页数
var currPageIndex = 1; //全局变量,当前页码,初始为第1页
var oldPageIndex; //分页前的页码,以方便查询失败时还原
//重新计算分页数据(由于页面大小或记录数改变)
function initPageData()
{
//重新计算总记录数、总页数
currPageIndex = 1;
currPageCount = parseInt(currRecordCount / currPageSize);
if (currRecordCount % currPageSize > 0) currPageCount += 1;
}
//下一页
function nextPage()
{
if(currPageIndex>=currPageCount) return;
oldPageIndex = currPageIndex;//备份页码
currPageIndex++;
getpage($("#btnNext,#btnNext1"));
}
//上一页
function prevPage()
{
if(currPageIndex<2) return;
oldPageIndex = currPageIndex;//备份页码
currPageIndex--;
getpage($("#btnPrev,#btnPrev1"));
}
//设置页面大小
function setPageSize(sel)
{
var n = parseInt(sel.val());
currPageSize = n;
initPageData();
getpage($("#btnNext,#btnPrev,#btnPageTo,#btnNext1,#btnPrev1,#btnPageTo1"));
}
//设置控件状态
function setstatus()
{
if(currRecordCount<=0)
{
var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center;'>没有符合条件的联系记录!</strong></td></tr>");
$("#tbContactRecords").append($msg);
currPageIndex=0;
}
if(currPageIndex<=1) $("#btnPrev,#btnPrev1").attr("disabled","disabled");
else $("#btnPrev,#btnPrev1").attr("disabled","");
if(currPageIndex>=currPageCount) $("#btnNext,#btnNext1").attr("disabled","disabled");
else $("#btnNext,#btnNext1").attr("disabled","");
$("#btnPageTo,#btnPageTo1").attr("disabled","");
//加载页面信息
$("#lblReCount,#lblReCount1").text(currRecordCount);
$("#lblCurrPgIndex,#lblCurrPgIndex1").text(currPageIndex);
$("#lblPgCount,#lblPgCount1").text(currPageCount);
$("#selPageSize,#selPageSize1").val(currPageSize);
}
//处理分页
function getpage(btn)
{
btn.attr("disabled","disabled");
//备份原来的数据
var $trList = $("#tbContactRecords tbody tr");
$("#tbContactRecords tbody tr").remove();
$.ajax({
url:"../../Ajax/statistics.ashx?opertype=contactrecordpaging&"+Math.random(),
data:{did:p_did,linkman:p_linkman,operator:p_operator,sid:p_sid,contacttimestart:p_contacttimestart,contacttimeend:p_contacttimeend,
nextcontacttimestart:p_nextcontacttimestart,nextcontacttimeend:p_nextcontacttimeend,isfact:p_isfact,pageIndex:currPageIndex,pageSize:currPageSize},
beforeSend:function(){
var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center'><div class='info'>正在加载……</div></td></tr>");
$("#tbContactRecords").append($msg);
},
success:function(data)
{
json=eval('('+data+')');
//加载数据
$("#tbContactRecords tbody tr").remove();
$.each(json,function(i,item){
var $tr = $("<tr onmousemove='$(this).addClass(\"MouseOver\");' onmouseout='$(this).removeClass(\"MouseOver\");'></tr>");//var $tr = $("<tr onmousemove='$(this).css(\"background-color\",\"#edf7fb\");' onmouseout='$(this).css(\"background-color\",\"#FFFFFF\");'></tr>");
var $td_clientname = $("<td>"+item['cname']+"</td>");
var $td_linkman = $("<td>"+item['linkman']+"</td>");
var $td_operator = $("<td>"+item['operator']+"</td>");
var $td_contacttime = $("<td>"+item['contacttime']+"</td>");
var $td_content = $("<td>"+item['content']+"</td>");
var $td_mode = $("<td>"+item['cmode']+"</td>");
var $td_owner = $("<td>"+item['rename']+"</td>");
var $td_recordtime = $("<td>"+item['recordtime']+"</td>");
$("#tbContactRecords tbody").append($tr);
$("#tbContactRecords tbody tr").eq(i).append($td_clientname).append($td_linkman).append($td_operator).append($td_contacttime).append($td_content).append($td_mode).append($td_owner).append($td_recordtime);
});
//设置分页控件状态
setstatus();
},
error:function(XMLHttpRequest,textStatus)
{
alert("请求错误:"+textStatus);
//还原数据
$("#tbContactRecords tbody tr").remove();
$("#tbContactRecords tbody").append($trList);
currPageIndex=oldPageIndex;
return false;
}
});
}
//------业务逻辑
//导出为excel
function toexcel(btn)
{
//$("#tbContactRecords tbody tr").remove();
var fname = "yuxh.xls";
var columns = "cname,recordtime";
//btn.attr("disabled","disabled");
$.ajax({
url:"../../Ajax/statistics.ashx?opertype=contactrecordtoexcel&"+Math.random(),
type:"GET",
data:{did:p_did,linkman:p_linkman,operator:p_operator,sid:p_sid,contacttimestart:p_contacttimestart,contacttimeend:p_contacttimeend,
nextcontacttimestart:p_nextcontacttimestart,nextcontacttimeend:p_nextcontacttimeend,isfact:p_isfact,toexcel_fname:fname,toexcel_columns:columns},
beforeSend:function(){
//var $msg=$("<tr><td id='td1' colspan='8' style='text-align: center'><div class='info'>正在导出,请稍候……</div></td></tr>");
//$("#tbContactRecords").append($msg);
},
success:function(data)
{
//alert(data);
},
error:function(XMLHttpRequest,textStatus)
{
btn.attr("disabled","");
alert("请求错误:"+textStatus);
return false;
}
});
}
$("#btnStatis").click(function(){
set_parms();
//执行查询
getRecordCount($(this));
});
});
</script>
SK_Aqi 2010-08-09
- 打赏
- 举报
使用ajax应该也可以
或许这里dg.RenderControl(htmlWrite);
不能导出,毕竟应该是页面呈现的控件才可以导吧
所以加之楼上的拼datatable方法结合你的方法实现吧
或许这里dg.RenderControl(htmlWrite);
不能导出,毕竟应该是页面呈现的控件才可以导吧
所以加之楼上的拼datatable方法结合你的方法实现吧
以专业开发人员为伍 2010-08-09
- 打赏
- 举报
[Quote=引用 1 楼 yuxh81 的回复:]
即,用ajax导出excel文件
[/Quote]
看不懂这是什么意思。给个浏览器端代码看看,什么叫做“用ajax导出excel文件”呢?
即,用ajax导出excel文件
[/Quote]
看不懂这是什么意思。给个浏览器端代码看看,什么叫做“用ajax导出excel文件”呢?
以专业开发人员为伍 2010-08-09
- 打赏
- 举报
[Quote=引用 12 楼 yuxh81 的回复:]
别误会了,我想用ajax导出数据(所以并不只是一个简单的下载链接,会有数据的查询及最后的输出下载)!
[/Quote]
ajax读取导出数据,可你的代码怎么跟“"attachment;filename”扯上关系的呢?你的ajax不就是要得到一段html代码吗?难道你的“ajax导出”跟文件发生了关系?
别误会了,我想用ajax导出数据(所以并不只是一个简单的下载链接,会有数据的查询及最后的输出下载)!
[/Quote]
ajax读取导出数据,可你的代码怎么跟“"attachment;filename”扯上关系的呢?你的ajax不就是要得到一段html代码吗?难道你的“ajax导出”跟文件发生了关系?
yuxh81 2010-08-09
- 打赏
- 举报
[Quote=引用 9 楼 kkbac 的回复:]
直接写一个aspx页面,之后把这个代码复制过去,之后做一个链接就可以了.
下载和ajax貌似是没啥联系的, 难道我out了.
[/Quote]
别误会了,我想用ajax导出数据(所以并不只是一个简单的下载链接,会有数据的查询及最后的输出下载)!
直接写一个aspx页面,之后把这个代码复制过去,之后做一个链接就可以了.
下载和ajax貌似是没啥联系的, 难道我out了.
[/Quote]
别误会了,我想用ajax导出数据(所以并不只是一个简单的下载链接,会有数据的查询及最后的输出下载)!
yuxh81 2010-08-09
- 打赏
- 举报
[Quote=引用 10 楼 zmcici 的回复:]
下载本来就不会刷新页面,不知你用AJAX的用意是什么
[/Quote]
用服务器的Button不会刷新吗?
对于导出功能,我并不是为了无刷新而去无刷新,因为我使用的ajax查询和分页
由于导出要再次查询,而查询条件均是js变更存放在前端
所以如果是服务器Button则无法获取这些查询条件,也就无法导出!
下载本来就不会刷新页面,不知你用AJAX的用意是什么
[/Quote]
用服务器的Button不会刷新吗?
对于导出功能,我并不是为了无刷新而去无刷新,因为我使用的ajax查询和分页
由于导出要再次查询,而查询条件均是js变更存放在前端
所以如果是服务器Button则无法获取这些查询条件,也就无法导出!
骑猪看海 2010-08-07
- 打赏
- 举报
下载本来就不会刷新页面,不知你用AJAX的用意是什么
加载更多回复(9)