Response.Charset = "utf-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode("帐户往来汇总表.xls", System.Text.Encoding.UTF8).ToString());
Response.ContentType = "application/ms-excel";
//将表格内容作为Excel输出
this.EnableViewState = false;
StringWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
GetTable(Table1);
this.Table1.RenderControl(hw);
System.Text.StringBuilder sbContent = new System.Text.StringBuilder();
sbContent.Append("<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n</head>\r\n<body>\r\n");
sbContent.Append(tw.ToString());
sbContent.Append("</body></html>");
Response.Write(sbContent.ToString());
Response.End();
15 个解决方案
#1
IE拦截了
#2
那怎么办 该怎么解决
#3
利用Html方式导出Excel很通用,但是你的方法太简单了,导出的时候页面不好看,更要注意的是导出图片的时候就不行了,我建议你最好用Com组件导出Excel,当然如果只是文字数据就无所谓了。
再就是你说下载页面时只闪了一下,意思是弹出了 文件下载对话框,很快就自动关闭了?要是那样,肯定是浏览器设置的原因,可能像楼上说的被拦截了,或者其它的。
给你一个我写的Html导出Excel的方法,你可以修改下:
/// <summary>
/// 将控件中内容导出到Excel中
/// </summary>
/// <param name="ctr">控件名称</param>
/// <param name="stylestring">样式列表</param>
public static void ExportToExcel(System.Web.UI.Control ctr,string stylestring)
{
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + "" + System.DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls");
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Default;
HttpContext.Current.Response.ContentType = "application/ms-excel/ms-word";
ctr.Page.EnableViewState = true;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
ctr.RenderControl(hw);
HttpContext.Current.Response.Write(string.Format(@"<html xmlns:x='urn:schemas-microsoft-com:office:excel'><head>
<!--[if gte mso 9]>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>工作表1</x:Name>
<x:WorksheetOptions>
<x:Print>
<x:ValidPrinterInfo />
<x:PaperSizeIndex>9</x:PaperSizeIndex>
</x:Print>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
<![endif]-->
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>{0}</head><body>", stylestring));
HttpContext.Current.Response.Write(tw.ToString());
HttpContext.Current.Response.Write("</body></html>");
System.Web.HttpContext.Current.Response.End();
}
调用方法:
string stylestring = @"<style>.tddetailaa{font-size:10pt;}
@page
{margin:.98in .2in .98in .2in;
mso-header-margin:.51in;
mso-footer-margin:.51in;}
br
{mso-data-placement:same-cell;}
</style>";
ExportToExcel(control, stylestring);//control就是你要导出数据的控件,stylestring是样式表
#4
如果你想考虑一下利用Com组件导出Excel的话,我这有写好的直接可以用的方法。
#5
建议使用NPOI组件,很好用的!目前做的项目都是用的NPOI
#6
我第一次做这个东西,
要把这个图片导入到excel中,要实现点击页面按钮显示这一种
#7
#8
把Response.End();注释后就可以
#9
要导出里面带图片的话,就用Com组件导出Excel的形式,你从网上搜下有一些这方面的介绍,我在给你发一份我自己的方法。
先添加相关的引用,直接在 添加引用里就能找到这些dll:
//导入Com组件
using Microsoft.Office.Core;
//添加引用
using Excel = Microsoft.Office.Interop.Excel;
导出方法:
#region ExportData
/// <summary>
/// 导出数据到Excel(包括图片)
/// </summary>
private void ExportData()
{
object missing = System.Reflection.Missing.Value;
// 定义一个Excel应用程序
Excel.Application excel = new Excel.Application();
if (excel == null)
{
return;
}
Excel.Workbooks workbooks = excel.Workbooks;
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
Excel.Range range = null;
worksheet.Cells[1, 1] = "导出的Excel数据"; //标题
range = (Excel.Range)worksheet.Cells[1, 1];
range.Font.Bold = true;// 字体加粗
range.Font.Size = 18; // 设置字体大小
//range.Interior.Color = 160; // 根据索引设置颜色
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;// 设置文本居中
range = (Excel.Range)worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 13]);// 选择区域(标题区域)
range.Select();// 选中区域
range.Merge(false);// 合并单元格
range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin;
// 添加图片
range = (Excel.Range)worksheet.get_Range("A20", missing);// 获取区域
range.Select();// 选中区域
// 声明一个Pictures对象,用来保存图片
Excel.Pictures pics = (Excel.Pictures)worksheet.Pictures(missing);
// 插入图片
pics.Insert(Server.MapPath("Images/Excel图片.jpg"), missing);// 在选中区域插入图片
// 输出表头
worksheet.Cells[3, 1] = "列名称1";
worksheet.Cells[3, 2] = "列名称2";
worksheet.Cells[3, 3] = "列名称3";
worksheet.Cells[3, 4] = "列名称4";
worksheet.Cells[3, 5] = "列名称5";
worksheet.Cells[3, 6] = "列名称6";
worksheet.Cells[3, 7] = "列名称7";
worksheet.Cells[3, 8] = "列名称8";
worksheet.Cells[3, 9] = "列名称9";
worksheet.Cells[3, 10] = "列名称10";
worksheet.Cells[3, 11] = "列名称11";
worksheet.Cells[3, 12] = "列名称12";
worksheet.Cells[3, 13] = "列名称13";
// 输出内容
//int flag = 3;
//foreach (var w in list)
//{
// flag += 1;
// worksheet.Cells[flag, 1] = w.One;
// worksheet.Cells[flag, 2] = w.Two;
// worksheet.Cells[flag, 3] = w.Three;
// worksheet.Cells[flag, 4] = w.Four;
// worksheet.Cells[flag, 5] = w.Five;
// worksheet.Cells[flag, 6] = w.Six;
// worksheet.Cells[flag, 7] = w.Seven;
// worksheet.Cells[flag, 8] = w.Eight;
// worksheet.Cells[flag, 9] = w.Nine;
// worksheet.Cells[flag, 10] = w.Ten;
// worksheet.Cells[flag, 11] = w.Eleven;
// worksheet.Cells[flag, 12] = w.Twelve;
// worksheet.Cells[flag, 13] = w.Thirteen;
//}
string fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xls";
string filePath = Server.MapPath("Files/") + fileName;
try
{
workbook.Saved = true;
workbook.SaveCopyAs(filePath);
}
catch (Exception ex)
{
throw (ex);
}
// 必须关闭释放所引用的COM对象,关闭Excel进程,否则会占用服务器资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
workbook.Close(false, false, missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
// 强制垃圾回收
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
// 提供下载
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
if (file.Exists)
{
System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
file.Delete();
Response.Clear();
Response.Charset = "UTF-8";
// 添加头信息,为"文件下载/另存为"对话框指定默认文件名
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));
// 指定文件类型
Response.ContentType = "Application/ms-excel";
// 把文件流发送到客户端
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
// 停止该页的执行
Response.End();
}
else
{
Response.Write("<script>alert('文件不存在!')</script>");
Response.End();
}
}
#endregion
里面的 输出内容,自己绑定要读取的数据就行。
#10
你注释了终止页的执行,你也没有指定导出内容的Length,那样页面的一些其它的内容不也就导出来了0 0,晕!
#11
最起码要加这句Response.AddHeader("Content-Length", file.Length.ToString());指定一下输出内容的长度。我弱弱的感觉,你对导出Excel方式的原理不够理解,不会从网上找了一个方法自己没研究一下就改改用的吧!
#12
是啊 就是在网上搜的方法
#13
下次使用的时候最好自己也研究一下,起码把一些基本原理搞明白了,这对你帮助会很大的。
弱弱的问句!可以结贴给分了吧!我都分享给你这么多了!
#14
好的 谢谢
#15
客气了~~大家一起成长
#1
IE拦截了
#2
那怎么办 该怎么解决
#3
利用Html方式导出Excel很通用,但是你的方法太简单了,导出的时候页面不好看,更要注意的是导出图片的时候就不行了,我建议你最好用Com组件导出Excel,当然如果只是文字数据就无所谓了。
再就是你说下载页面时只闪了一下,意思是弹出了 文件下载对话框,很快就自动关闭了?要是那样,肯定是浏览器设置的原因,可能像楼上说的被拦截了,或者其它的。
给你一个我写的Html导出Excel的方法,你可以修改下:
/// <summary>
/// 将控件中内容导出到Excel中
/// </summary>
/// <param name="ctr">控件名称</param>
/// <param name="stylestring">样式列表</param>
public static void ExportToExcel(System.Web.UI.Control ctr,string stylestring)
{
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + "" + System.DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls");
HttpContext.Current.Response.Charset = "";
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Default;
HttpContext.Current.Response.ContentType = "application/ms-excel/ms-word";
ctr.Page.EnableViewState = true;
System.IO.StringWriter tw = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
ctr.RenderControl(hw);
HttpContext.Current.Response.Write(string.Format(@"<html xmlns:x='urn:schemas-microsoft-com:office:excel'><head>
<!--[if gte mso 9]>
<xml>
<x:ExcelWorkbook>
<x:ExcelWorksheets>
<x:ExcelWorksheet>
<x:Name>工作表1</x:Name>
<x:WorksheetOptions>
<x:Print>
<x:ValidPrinterInfo />
<x:PaperSizeIndex>9</x:PaperSizeIndex>
</x:Print>
</x:WorksheetOptions>
</x:ExcelWorksheet>
</x:ExcelWorksheets>
</x:ExcelWorkbook>
</xml>
<![endif]-->
<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>{0}</head><body>", stylestring));
HttpContext.Current.Response.Write(tw.ToString());
HttpContext.Current.Response.Write("</body></html>");
System.Web.HttpContext.Current.Response.End();
}
调用方法:
string stylestring = @"<style>.tddetailaa{font-size:10pt;}
@page
{margin:.98in .2in .98in .2in;
mso-header-margin:.51in;
mso-footer-margin:.51in;}
br
{mso-data-placement:same-cell;}
</style>";
ExportToExcel(control, stylestring);//control就是你要导出数据的控件,stylestring是样式表
#4
如果你想考虑一下利用Com组件导出Excel的话,我这有写好的直接可以用的方法。
#5
建议使用NPOI组件,很好用的!目前做的项目都是用的NPOI
#6
我第一次做这个东西,
要把这个图片导入到excel中,要实现点击页面按钮显示这一种
#7
#8
把Response.End();注释后就可以
#9
要导出里面带图片的话,就用Com组件导出Excel的形式,你从网上搜下有一些这方面的介绍,我在给你发一份我自己的方法。
先添加相关的引用,直接在 添加引用里就能找到这些dll:
//导入Com组件
using Microsoft.Office.Core;
//添加引用
using Excel = Microsoft.Office.Interop.Excel;
导出方法:
#region ExportData
/// <summary>
/// 导出数据到Excel(包括图片)
/// </summary>
private void ExportData()
{
object missing = System.Reflection.Missing.Value;
// 定义一个Excel应用程序
Excel.Application excel = new Excel.Application();
if (excel == null)
{
return;
}
Excel.Workbooks workbooks = excel.Workbooks;
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];
Excel.Range range = null;
worksheet.Cells[1, 1] = "导出的Excel数据"; //标题
range = (Excel.Range)worksheet.Cells[1, 1];
range.Font.Bold = true;// 字体加粗
range.Font.Size = 18; // 设置字体大小
//range.Interior.Color = 160; // 根据索引设置颜色
range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;// 设置文本居中
range = (Excel.Range)worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[1, 13]);// 选择区域(标题区域)
range.Select();// 选中区域
range.Merge(false);// 合并单元格
range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight = Excel.XlBorderWeight.xlThin;
// 添加图片
range = (Excel.Range)worksheet.get_Range("A20", missing);// 获取区域
range.Select();// 选中区域
// 声明一个Pictures对象,用来保存图片
Excel.Pictures pics = (Excel.Pictures)worksheet.Pictures(missing);
// 插入图片
pics.Insert(Server.MapPath("Images/Excel图片.jpg"), missing);// 在选中区域插入图片
// 输出表头
worksheet.Cells[3, 1] = "列名称1";
worksheet.Cells[3, 2] = "列名称2";
worksheet.Cells[3, 3] = "列名称3";
worksheet.Cells[3, 4] = "列名称4";
worksheet.Cells[3, 5] = "列名称5";
worksheet.Cells[3, 6] = "列名称6";
worksheet.Cells[3, 7] = "列名称7";
worksheet.Cells[3, 8] = "列名称8";
worksheet.Cells[3, 9] = "列名称9";
worksheet.Cells[3, 10] = "列名称10";
worksheet.Cells[3, 11] = "列名称11";
worksheet.Cells[3, 12] = "列名称12";
worksheet.Cells[3, 13] = "列名称13";
// 输出内容
//int flag = 3;
//foreach (var w in list)
//{
// flag += 1;
// worksheet.Cells[flag, 1] = w.One;
// worksheet.Cells[flag, 2] = w.Two;
// worksheet.Cells[flag, 3] = w.Three;
// worksheet.Cells[flag, 4] = w.Four;
// worksheet.Cells[flag, 5] = w.Five;
// worksheet.Cells[flag, 6] = w.Six;
// worksheet.Cells[flag, 7] = w.Seven;
// worksheet.Cells[flag, 8] = w.Eight;
// worksheet.Cells[flag, 9] = w.Nine;
// worksheet.Cells[flag, 10] = w.Ten;
// worksheet.Cells[flag, 11] = w.Eleven;
// worksheet.Cells[flag, 12] = w.Twelve;
// worksheet.Cells[flag, 13] = w.Thirteen;
//}
string fileName = DateTime.Now.ToString("yyyyMMddhhmmssfff") + ".xls";
string filePath = Server.MapPath("Files/") + fileName;
try
{
workbook.Saved = true;
workbook.SaveCopyAs(filePath);
}
catch (Exception ex)
{
throw (ex);
}
// 必须关闭释放所引用的COM对象,关闭Excel进程,否则会占用服务器资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
workbook.Close(false, false, missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
workbooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
excel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
// 强制垃圾回收
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
// 提供下载
System.IO.FileInfo file = new System.IO.FileInfo(filePath);
if (file.Exists)
{
System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
fs.Close();
file.Delete();
Response.Clear();
Response.Charset = "UTF-8";
// 添加头信息,为"文件下载/另存为"对话框指定默认文件名
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(file.Name, System.Text.Encoding.UTF8));
// 指定文件类型
Response.ContentType = "Application/ms-excel";
// 把文件流发送到客户端
Response.OutputStream.Write(buffer, 0, buffer.Length);
Response.Flush();
// 停止该页的执行
Response.End();
}
else
{
Response.Write("<script>alert('文件不存在!')</script>");
Response.End();
}
}
#endregion
里面的 输出内容,自己绑定要读取的数据就行。
#10
你注释了终止页的执行,你也没有指定导出内容的Length,那样页面的一些其它的内容不也就导出来了0 0,晕!
#11
最起码要加这句Response.AddHeader("Content-Length", file.Length.ToString());指定一下输出内容的长度。我弱弱的感觉,你对导出Excel方式的原理不够理解,不会从网上找了一个方法自己没研究一下就改改用的吧!
#12
是啊 就是在网上搜的方法
#13
下次使用的时候最好自己也研究一下,起码把一些基本原理搞明白了,这对你帮助会很大的。
弱弱的问句!可以结贴给分了吧!我都分享给你这么多了!
#14
好的 谢谢
#15
客气了~~大家一起成长