积极答复者
导出功能不能用

问题
答案
-
您好,首先您的代码无需调用DownFile(HttpResponse response, string filename, string fullpath)方法即可下载。
其次,DownFile(HttpResponse response, string filename, string fullpath)方法中有错误,您把断点设置到DownFile的catch里就能看到错误,也因为这个错误导致fs.Close();代码没有执行,也就是说刚创建的文件将一直被占用。所以当您再点击按钮时会出现您贴出的被占用的错误。- 已标记为答案 张烨 2009年9月27日 15:19
全部回复
-
private void Export(Page page, DataTable tab, string filename)
{
HttpResponse httpresponse = page.Response;
DataGrid datagrid = new DataGrid();
datagrid.DataSource = tab.DefaultView;
datagrid.AllowPaging = false;
datagrid.HeaderStyle.BackColor = Color.White;
datagrid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center;
datagrid.HeaderStyle.Font.Bold = false;
datagrid.DataBind();
httpresponse.AppendHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, Encoding.UTF8)); //filename="*.xls";
httpresponse.ContentEncoding = Encoding.GetEncoding("gb2312");
httpresponse.ContentType = "application/ms-excel";
StringWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
datagrid.RenderControl(hw);#region 根据登录用户信息选择导出Excel文件路径和文件名
string filepath = string.Empty;switch(Session["deptId"].ToString())
{
case "1":
{
filepath = page.Server.MapPath("~/Excel/销售") + "\\" + filename;
break;
}
case "2":
{
filepath = page.Server.MapPath("~/Excel/采购") + "\\" + filename;
break;
}
case "3":
{
filepath = page.Server.MapPath("~/Excel/仓储") + "\\" + filename;
break;
}
case "4":
{
filepath = page.Server.MapPath("~/Excel/账务") + "\\" + filename;
break;
}
case "5":
{
filepath = page.Server.MapPath("~/Excel/生产计划") + "\\" + filename;
break;
}
}
#endregionStreamWriter sw = File.CreateText(filepath);
sw.Write(tw.ToString());
sw.Close();DownFile(httpresponse, filename, filepath);
httpresponse.End();
}private bool DownFile(HttpResponse response, string filename, string fullpath)
{
try
{
response.ContentType = "application/octet-stream";response.AppendHeader("content-disposition", "attachment;filename=" +
HttpUtility.UrlEncode(filename, Encoding.UTF8) + ";charset=gb2312");
FileStream fs = File.OpenRead(fullpath);
long flen = fs.Length;
int size = 102400;//每100k同时下载数据
byte[] readdata = new byte[size];//指定缓冲区的大小if(size > flen)
{
size = Convert.ToInt32(flen);
}long fpos = 0;
bool isend = false;while(!isend)
{
if((fpos + size) > flen)
{
size = Convert.ToInt32(flen - fpos);
readdata = new byte[size];
isend = true;
}fs.Read(readdata, 0, size);//读入一个压缩块
response.BinaryWrite(readdata);
fpos += size;
}fs.Close();
File.Delete(fullpath);return true;
}
catch
{
return false;
}
}
这是DataTable导出Excel的完全方法。你提到的sw.Close()已调用
zy -
您好,首先您的代码无需调用DownFile(HttpResponse response, string filename, string fullpath)方法即可下载。
其次,DownFile(HttpResponse response, string filename, string fullpath)方法中有错误,您把断点设置到DownFile的catch里就能看到错误,也因为这个错误导致fs.Close();代码没有执行,也就是说刚创建的文件将一直被占用。所以当您再点击按钮时会出现您贴出的被占用的错误。- 已标记为答案 张烨 2009年9月27日 15:19
-
谢谢Jiyuan的回复。对你回复的内容,第一点的说法是错误的,如果不调用DownFile方法,的确可以导出Excel,但导出的Excel里是没有任何内容的;第二点的确是直接到Catch里了,但错误说明不太明白。出错的状态如下:在执行第二次While循环时,在response.BinaryWrite(readdata);这句报错。内容:Message = "指定的参数已超出有效值的范围。\r\n参数名: offset"。望指教。
zy
第一点:把StreamWriter sw = File.CreateText(filepath);
sw.Write(tw.ToString());
sw.Close();DownFile(httpresponse, filename, filepath);
都注释掉,然后改为:
Response.Write(tw);