问题描述
导出代码HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=a.xls");HttpContext.Current.Response.Charset="UTF-8";HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.UTF7;HttpContext.Current.Response.ContentType="application/ms-excel";GridView1.EnableViewState=false;System.IO.StringWritertw=newSystem.IO.StringWriter();System.Web.UI.HtmlTextWriterhw=newSystem.Web.UI.HtmlTextWriter(tw);GridView1.RenderControl(hw);HttpContext.Current.Response.Write(tw.ToString());HttpContext.Current.Response.End();
用excel2003时候一切正常用excel2007/2010打开则提示"您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致。打开文件前请验证文件没有损坏且来源可信。是否立即打开该文件?"选“是”后提示“单元格数据太大”确认后打开的Excel文件是类似乱码的一长串字符串代码如“+ADw-tableid+AD0AIg-tb1+ACI-style+AD0AIg-width:800px....”
解决方案
解决方案二:
试试这个,在某个项目中用过privatevoidCreateExcel(DataTabledt,stringfileName){HttpResponseresp;resp=Page.Response;resp.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");resp.AppendHeader("Content-Disposition","attachment;filename="+fileName);stringcolHeaders="",ls_item="";////定义表对象与行对象,同时用DataSet对其值进行初始化//DataTabledt=ds.Tables[0];DataRow[]myRow=dt.Select();//可以类似dt.Select("id>10")之形式达到数据筛选目的inti=0;intcl=dt.Columns.Count;//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符for(i=0;i<cl;i++){if(i==(cl-1))//最后一列,加n{colHeaders+=dt.Columns[i].Caption.ToString()+"n";}else{colHeaders+=dt.Columns[i].Caption.ToString()+"t";}}resp.Write(colHeaders);//向HTTP输出流中写入取得的数据信息//逐行处理数据foreach(DataRowrowinmyRow){//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据for(i=0;i<cl;i++){if(i==(cl-1))//最后一列,加n{ls_item+=row[i].ToString()+"n";}else{ls_item+=row[i].ToString()+"t";}}resp.Write(ls_item);ls_item="";}resp.End();}
解决方案三:
Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");Response.ContentType="application/vnd.xls";System.IO.StringWriteroStringWriter=newSystem.IO.StringWriter();打开excel模板赋值
解决方案四:
这个群27102713有一个现成的代码,只需要定义参数传入DataTable就可以生成xml很简单
解决方案五:
publicvoidCreateExcel(DataSetds,stringtypeid,stringFileName){HttpResponseresp;resp=Page.Response;resp.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");resp.AppendHeader("Content-Disposition","attachment;filename="+FileName);stringcolHeaders="",ls_item="";inti=0;//定义表对象与行对像,同时用DataSet对其值进行初始化DataTabledt=ds.Tables[0];DataRow[]myRow=dt.Select("");//typeid=="1"时导出为Excel格式文件;typeid=="2"时导出为XML格式文件if(typeid=="1"){//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符for(i=0;i<dt.Columns.Count-1;i++){colHeaders+=dt.Columns[i].Caption.ToString()+"t";//colHeaders+=dt.Columns[i].Caption.ToString()+"n";}colHeaders+=dt.Columns[i].Caption.ToString()+"n";//向HTTP输出流中写入取得的数据信息resp.Write(colHeaders);//逐行处理数据foreach(DataRowrowinmyRow){//在当前行中,逐列获得数据,数据之间以t分割,结束时加回车符nfor(i=0;i<dt.Columns.Count-1;i++){ls_item+=row[i].ToString()+"t";//ls_item+=row[i].ToString()+"n";}ls_item+=row[i].ToString()+"n";//当前行数据写入HTTP输出流,并且置空ls_item以便下行数据resp.Write(ls_item);ls_item="";}}else{if(typeid=="2"){//从DataSet中直接导出XML数据并且写到HTTP输出流中resp.Write(ds.GetXml());}}//写缓冲区中的数据到HTTP头文件中resp.End();}
解决方案六:
用office2003跟2007和2010的HttpContext.Current.Response.ContentType="application/ms-excel";这段代码不一样的吧~
解决方案七:
哪天你去一个公司面试不让用GW,不让用dataset,咋搞?
解决方案八:
我也遇到了同样的问题,期待大大来解决!!!!!!!!
解决方案九:
我给顶顶,我导出到excel的代码很简单,但是个人认为还是比较不错,就是用office2007打不开,郁闷protectedvoidButton8_Click(objectsender,EventArgse)//导出excel按钮{//Export("application/ms-excel","供暖asp.xls");stringstyle="<style>td{mso-number-format:"\@";}</style>";//防止导出excel时将以0开头的全数字数据的0去掉GridViewgridview=newGridView();gridview.DataSource=dst;gridview.DataBind();//绑定当前数据源Response.Clear();Response.Buffer=true;Response.Charset="GB2312";Response.AddHeader("content-disposition","attachment;filename=focusfires.xls");Response.ContentType="application/ms-excel";Response.ContentEncoding=System.Text.Encoding.UTF7;//Response.AppendHeader("Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(FileName,Encoding.UTF8).ToString());//Response.ContentType=FileType;this.EnableViewState=false;//StringWritertw=newStringWriter();//HtmlTextWriterhw=newHtmlTextWriter(tw);//GridView1.RenderControl(hw);System.IO.StringWriteroStringWriter=newSystem.IO.StringWriter();System.Web.UI.HtmlTextWriteroHtmlTextWriter=newSystem.Web.UI.HtmlTextWriter(oStringWriter);gridview.RenderControl(oHtmlTextWriter);Response.Write(style);Response.Write(oStringWriter.ToString());Response.End();}
解决方案十:
我最近也搞过一个导出,用2007打开时也会报,不过还是可以打开的,也没乱码。///<summary>///导出记录///</summary>///<paramname="sender"></param>///<paramname="e"></param>protectedvoidButton1_Click(objectsender,EventArgse){stringsql="selectc.UserIDas'用户名',a.UserNameas'姓名',b.SchoolNameas'学校',b.ZhuanYeas'专业',c.Sdateas'访问日期',c.CallPageas'页面地址',a.Emailas'用户邮箱',a.Telephoneas'用户联系号码'fromXTGL_UserVisitDetailsascleftjoinXTGL_UserInfoasaonc.UserID=a.UserIDleftjoinStudent_Infoasbonc.UserID=b.UserIDwhere1=1"+OutSql;OutSql="";DataTabledt=DataAccess.GetDataTable(sql);stringpath=PubMethod.GetPath("70");try{ExportExcelStream(dt,HttpUtility.HtmlDecode(path+"用户访问明细.xls"));PubMethod.DownloadFile(Page,"用户访问明细",path+"用户访问明细.xls",".xls");}catch(Exception){PubMethod.ShowMessage(Page,"数据导出出错");}}///<summary>///保存DataTable数据到filepath文件中///</summary>///<paramname="table">数据源</param>///<paramname="filepath">文件</param>publicvoidExportExcelStream(DataTabletable,stringfilepath){StringWriterstringWriter=newStringWriter();HtmlTextWriterhtmlWriter=newHtmlTextWriter(stringWriter);System.Web.UI.WebControls.DataGridexcel=newSystem.Web.UI.WebControls.DataGrid();excel.DataSource=table.DefaultView;//输出DataTable的内容excel.DataBind();excel.RenderControl(htmlWriter);stringfilestr=filepath;intpos=filestr.LastIndexOf("\");stringfile=filestr.Substring(0,pos);if(!Directory.Exists(file)){Directory.CreateDirectory(file);}System.IO.StreamWritersw=newStreamWriter(filestr);try{sw.Write(stringWriter.ToString());}catch(Exception){PubMethod.ShowMessage(Page,"数据导出出错");}sw.Close();}
写的比较麻烦,因为需求问题。
解决方案十一:
stringstyle=@"<style>.text{mso-number-format:@}</script>";//导入到excel时,保存表里数字列中前面存在的0.Response.Clear();Response.Charset="GB2312";Response.ContentEncoding=Encoding.UTF8;Response.AppendHeader("Content-Disposition","attachment;filename="+HttpUtility.UrlEncode(FileName,Encoding.UTF8).ToString());Response.ContentType=FileType;this.EnableViewState=false;this.GridView1.AllowPaging=false;System.Globalization.CultureInfomyCItrad=newSystem.Globalization.CultureInfo("ZH-CN",true);StringWritersw=newStringWriter();HtmlTextWriterhtw=newHtmlTextWriter(sw);this.GridView1.RenderControl(htw);Response.Write(style);Response.Write(sw.ToString());//Response.Write(dt.ToString());Response.End();请高手检查下我的代码,用2007打开后,汉字为乱码,求解
解决方案十二:
Response.Charset="UTF-8";Response.ContentEncoding=Encoding.UTF8;这个一定要对应,否则有时候就是乱码!
解决方案十三:
Response.Charset="UTF-8";Response.ContentEncoding=Encoding.UTF8;
解决方案十四:
Response.Charset="GB2312";Response.ContentEncoding=System.Text.Encoding.UTF8;Response.Write("<metahttp-equiv=Content-Typecontent=text/html;charset=UTF-8>");加上红颜色的这句话就好了
解决方案十五:
其实很简单,我刚遇到了这个问题:把HttpContext.Current.Response.ContentEncoding=System.Text.Encoding.UTF7;
改为:Response.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");
即可
解决方案:
Spire.Office2.1.1絕對好使
解决方案:
下面这个Insus.NET已在无数据的专案中使用,暂时还没有发现用户说导出的Excel打不开或乱码等情况:
解决方案:
引用14楼的回复:
其实很简单,我刚遇到了这个问题:把C#codeHttpContext.Current.Response.ContentEncoding=System.Text.Encoding.UTF7;改为:C#codeResponse.ContentEncoding=System.Text.Encoding.GetEncoding("GB2312");即可
顶,其实就是编码的问题