在做.NET项目时,会经常遇到要导出文件的问题,如将DataGrid中的数据导出到excel、word文件等,经常使用的是Office中的OWC组件,这个组件提供的功能很强大,在一般的项目中都可以满足当前的需要。但是这个功能强大的组件使用起来却不是很方便,不但有版本的问题,而且代码量也相对比较大,现在简单介绍一下利用Respone对象和相关的IO实现导出excel/word等文件的方法。
1.Respone对象及相关的IO介绍
System.IO.StringWriter SW = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter HTW=new System.Web.UI.HtmlTextWriter(SW); Page.RenderControl(HTW); //Page为要导出的对象,当前是Page,如果是DataGrid,DataList等都可以 Response.Buffer=true; Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "Response.ContentType"; //Response.ContentType是输出流的 HTTP MIME 类型 //Response.ContentType --- word文件 //application/vnd.ms-excel --- excel文件 Response.Charset="utf-8"; Response.ContentEncoding=System.Text.Encoding.GetEncoding("utf-8"); Response.AddHeader("Content-Disposition", "attachment;filename=XXX.doc"); //attachment --- 作为附件下载 //inline --- 在线打开 //filename如过是中文,则可以用HttpUtility.UrlEncode(fileName,System.Text.Encoding.UTF8)进行编码,以解决文件名乱码的问题 Response.Write(SW.ToString()); Response.Flush(); Response.Close(); |
2.实现方法
列出.net实现导出Word、Exce格式文件调用的具体方法,代码如下:
/**//// <summary>
/// 将Web控件导出
/// </summary>
/// <param name="source">控件实例</param>
/// <param name="type">类型:Excel或Word</param>
public void ExpertControl(System.Web.UI.Control source, DocumentType type)
{
//设置Http的头信息,编码格式
if (type == DocumentType.Excel)
{
//Excel
Response.AppendHeader("Content-Disposition","attachment;filename=result.xls");
Response.ContentType = "application/ms-excel";
}
else if (type == DocumentType.Word)
{
//Word
Response.AppendHeader("Content-Disposition","attachment;filename=result.doc");
Response.ContentType = "application/ms-word";
}
Response.Charset = "UTF-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;
//关闭控件的视图状态
source.Page.EnableViewState =false;
//初始化HtmlWriter
System.IO.StringWriter writer = new System.IO.StringWriter() ;
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(writer);
source.RenderControl(htmlWriter);
//输出
Response.Write(writer.ToString());
Response.End();
}
//文档类型
public enum DocumentType
{
Word,
Excel
}
调用方法:
ExpertControl(this, DocumentType.Word);
这是将整个页面导出为Word
//this可以为具体的控件如datagrid/dataList或page表示当前页,DocumentType为导出的文件格式(Excel/word)
注意:当为datagrid或dataList控件时,在导出Excel/word文件时,必须把控件的分页、排序属性去除并重新绑定,否则将出现
"类型“DataGridLinkButton”的控件“DataGrid1__ctl14__ctl1”必须放在具有 runat=server 的窗体标记内。"错误!