为什么把gridView里的某些列导出时出现乱码?而把全部的数据导出又不会出现这种情况呢?

解决方案 »

  1.   

    你的代码怎么写的?1、由datagrid生成 public void ToExcel(System.Web.UI.Control ctl)   
      { 
       HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls"); 
       HttpContext.Current.Response.Charset ="UTF-8";     
       HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.Default; 
       HttpContext.Current.Response.ContentType ="application/ms-excel";//image/JPEG;text/HTML;image/GIF;vnd.ms-excel/msword 
       ctl.Page.EnableViewState =false;    
       System.IO.StringWriter  tw = new System.IO.StringWriter() ; 
       System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw); 
       ctl.RenderControl(hw); 
       HttpContext.Current.Response.Write(tw.ToString()); 
       HttpContext.Current.Response.End(); 
      } 
     
    用法:ToExcel(datagrid1); 
     2、这个用dataview public void OutputExcel(DataView dv,string str) 

       // 
       // TODO: 在此处添加构造函数逻辑 
       // 
                               //dv为要输出到Excel的数据,str为标题名称 
       GC.Collect(); 
       Application excel;// = new Application(); 
       int rowIndex=4; 
       int colIndex=1; 
     
       _Workbook xBk; 
       _Worksheet xSt; 
     
       excel= new ApplicationClass(); 
       
       xBk = excel.Workbooks.Add(true); 
        
       xSt = (_Worksheet)xBk.ActiveSheet; 
     
       // 
       //取得标题 
       // 
       foreach(DataColumn col in dv.Table.Columns) 
       { 
        colIndex++; 
        excel.Cells[4,colIndex] = col.ColumnName; 
        xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐 
       } 
     
       // 
       //取得表格中的数据 
       // 
       foreach(DataRowView row in dv) 
       { 
        rowIndex ++; 
        colIndex = 1; 
        foreach(DataColumn col in dv.Table.Columns) 
        { 
         colIndex ++; 
         if(col.DataType == System.Type.GetType("System.DateTime")) 
         { 
          excel.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd"); 
          xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐 
         } 
         else 
          if(col.DataType == System.Type.GetType("System.String")) 
         { 
          excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString(); 
          xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐 
         } 
         else 
         { 
          excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString(); 
         } 
        } 
       } 
       // 
       //加载一个合计行 
       // 
       int rowSum = rowIndex + 1; 
       int colSum = 2; 
       excel.Cells[rowSum,2] = "合计"; 
       xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter; 
       // 
       //设置选中的部分的颜色 
       // 
       xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select(); 
       xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种 
       // 
       //取得整个报表的标题 
       // 
       excel.Cells[2,2] = str; 
       // 
       //设置整个报表的标题格式 
       // 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true; 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22; 
       // 
       //设置报表表格为最适应宽度 
       // 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select(); 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit(); 
       // 
       //设置整个报表的标题为跨列居中 
       // 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select(); 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection; 
       // 
       //绘制边框 
       // 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1; 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//设置左边线加粗 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//设置上边线加粗 
       xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//设置右边线加粗 
       xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//设置下边线加粗 
       // 
       //显示效果 
       // 
       excel.Visible=true; 
     
       //xSt.Export(Server.MapPath(".")+"\\"+this.xlfile.Text+".xls",SheetExportActionEnum.ssExportActionNone,Microsoft.Office.Interop.OWC.SheetExportFormat.ssExportHTML); 
       xBk.SaveCopyAs(Server.MapPath(".")+"\\"+this.xlfile.Text+".xls"); 
     
       ds = null; 
                xBk.Close(false, null,null); 
        
                excel.Quit(); 
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk); 
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); 
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); 
                xBk = null; 
                excel = null; 
       xSt = null; 
                GC.Collect(); 
       string path = Server.MapPath(this.xlfile.Text+".xls"); 
     
       System.IO.FileInfo file = new System.IO.FileInfo(path); 
       Response.Clear(); 
       Response.Charset="GB2312"; 
       Response.ContentEncoding=System.Text.Encoding.UTF8; 
       // 添加头信息,为"文件下载/另存为"对话框指定默认文件名 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name)); 
       // 添加头信息,指定文件大小,让浏览器能够显示下载进度 
       Response.AddHeader("Content-Length", file.Length.ToString()); 
        
       // 指定返回的是一个不能被客户端读取的流,必须被下载 
       Response.ContentType = "application/ms-excel"; 
        
       // 把文件流发送到客户端 
       Response.WriteFile(file.FullName); 
       // 停止页面的执行 
       
       Response.End(); 

      

  2.   

    你的代码怎么写的?1、由datagrid生成 public void ToExcel(System.Web.UI.Control ctl)   
      { 
       HttpContext.Current.Response.AppendHeader("Content-Disposition","attachment;filename=Excel.xls"); 
       HttpContext.Current.Response.Charset ="UTF-8";     
       HttpContext.Current.Response.ContentEncoding =System.Text.Encoding.Default; 
       HttpContext.Current.Response.ContentType ="application/ms-excel";//image/JPEG;text/HTML;image/GIF;vnd.ms-excel/msword 
       ctl.Page.EnableViewState =false;    
       System.IO.StringWriter  tw = new System.IO.StringWriter() ; 
       System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter (tw); 
       ctl.RenderControl(hw); 
       HttpContext.Current.Response.Write(tw.ToString()); 
       HttpContext.Current.Response.End(); 
      } 
     
    用法:ToExcel(datagrid1); 
     2、这个用dataview public void OutputExcel(DataView dv,string str) 

       // 
       // TODO: 在此处添加构造函数逻辑 
       // 
                               //dv为要输出到Excel的数据,str为标题名称 
       GC.Collect(); 
       Application excel;// = new Application(); 
       int rowIndex=4; 
       int colIndex=1; 
     
       _Workbook xBk; 
       _Worksheet xSt; 
     
       excel= new ApplicationClass(); 
       
       xBk = excel.Workbooks.Add(true); 
        
       xSt = (_Worksheet)xBk.ActiveSheet; 
     
       // 
       //取得标题 
       // 
       foreach(DataColumn col in dv.Table.Columns) 
       { 
        colIndex++; 
        excel.Cells[4,colIndex] = col.ColumnName; 
        xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐 
       } 
     
       // 
       //取得表格中的数据 
       // 
       foreach(DataRowView row in dv) 
       { 
        rowIndex ++; 
        colIndex = 1; 
        foreach(DataColumn col in dv.Table.Columns) 
        { 
         colIndex ++; 
         if(col.DataType == System.Type.GetType("System.DateTime")) 
         { 
          excel.Cells[rowIndex,colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd"); 
          xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐 
         } 
         else 
          if(col.DataType == System.Type.GetType("System.String")) 
         { 
          excel.Cells[rowIndex,colIndex] = "'"+row[col.ColumnName].ToString(); 
          xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐 
         } 
         else 
         { 
          excel.Cells[rowIndex,colIndex] = row[col.ColumnName].ToString(); 
         } 
        } 
       } 
       // 
       //加载一个合计行 
       // 
       int rowSum = rowIndex + 1; 
       int colSum = 2; 
       excel.Cells[rowSum,2] = "合计"; 
       xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment = XlHAlign.xlHAlignCenter; 
       // 
       //设置选中的部分的颜色 
       // 
       xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select(); 
       xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex = 19;//设置为浅黄色,共计有56种 
       // 
       //取得整个报表的标题 
       // 
       excel.Cells[2,2] = str; 
       // 
       //设置整个报表的标题格式 
       // 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true; 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22; 
       // 
       //设置报表表格为最适应宽度 
       // 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select(); 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit(); 
       // 
       //设置整个报表的标题为跨列居中 
       // 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select(); 
       xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment = XlHAlign.xlHAlignCenterAcrossSelection; 
       // 
       //绘制边框 
       // 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle = 1; 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick;//设置左边线加粗 
       xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight = XlBorderWeight.xlThick;//设置上边线加粗 
       xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick;//设置右边线加粗 
       xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight = XlBorderWeight.xlThick;//设置下边线加粗 
       // 
       //显示效果 
       // 
       excel.Visible=true; 
     
       //xSt.Export(Server.MapPath(".")+"\\"+this.xlfile.Text+".xls",SheetExportActionEnum.ssExportActionNone,Microsoft.Office.Interop.OWC.SheetExportFormat.ssExportHTML); 
       xBk.SaveCopyAs(Server.MapPath(".")+"\\"+this.xlfile.Text+".xls"); 
     
       ds = null; 
                xBk.Close(false, null,null); 
        
                excel.Quit(); 
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk); 
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); 
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); 
                xBk = null; 
                excel = null; 
       xSt = null; 
                GC.Collect(); 
       string path = Server.MapPath(this.xlfile.Text+".xls"); 
     
       System.IO.FileInfo file = new System.IO.FileInfo(path); 
       Response.Clear(); 
       Response.Charset="GB2312"; 
       Response.ContentEncoding=System.Text.Encoding.UTF8; 
       // 添加头信息,为"文件下载/另存为"对话框指定默认文件名 
       Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name)); 
       // 添加头信息,指定文件大小,让浏览器能够显示下载进度 
       Response.AddHeader("Content-Length", file.Length.ToString()); 
        
       // 指定返回的是一个不能被客户端读取的流,必须被下载 
       Response.ContentType = "application/ms-excel"; 
        
       // 把文件流发送到客户端 
       Response.WriteFile(file.FullName); 
       // 停止页面的执行 
       
       Response.End(); 

      

  3.   


        protected void Button1_Click(object sender, EventArgs e)
        {
            GridView gridView = this.GridView1;
            if (gridView.Rows.Count == 0)
            {           Response.Write("<script>alert('没有数据可导出!')</script>");
                return;
            }
            //决定输出的列
            if (this.CbStudentID.Checked != true)
                gridView.Columns[0].Visible = false;
            if (this.CbStudentName.Checked != true)
                gridView.Columns[1].Visible = false;
            if (this.CbSex.Checked != true)
                gridView.Columns[2].Visible = false;
            if (this.CbBirth.Checked != true)
                gridView.Columns[3].Visible = false;
            if (this.CbESystem.Checked != true)
                gridView.Columns[4].Visible = false;
            if (this.CbGrade.Checked != true)
                gridView.Columns[5].Visible = false;
            if (this.CbDepartmentName.Checked != true)
                gridView.Columns[6].Visible = false;
            if (this.CbMajorName.Checked != true)
                gridView.Columns[7].Visible = false;
            if (this.CbClassName.Checked != true)
                gridView.Columns[8].Visible = false;
                    DeExcel( "学生信息表", gridView);    }
     public override void VerifyRenderingInServerForm(Control control)
        {
           
        }    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {            e.Row.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@;");        }    } private void DeExcel(string fileName,GridView gridView)
        {
                    Response.Clear ();
            Response.Buffer = true;
            Response.Charset = "GB2312";
            Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode(fileName .ToString (), System.Text.Encoding.UTF8) + ".xls\""); 
            Response.ContentEncoding = System.Text.Encoding.UTF8;
            Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
            StringWriter oStringWriter = new StringWriter();
            HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
            gridView.RenderControl(oHtmlTextWriter);
            Response.Output.Write(oStringWriter.ToString());
            Response.Flush();
            Response.End();
        }
      

  4.   

    设置你的Response.ContentEncoder = System.Text.Encoding.GetEncoding("gb2312")
      

  5.   

    // 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
        Response.ContentEncoding = System.Text.Encoding.UTF7;
      

  6.   

    http://dotnet.aspx.cc/article/700bd3fa-a17f-41dc-b258-0dc572625700/read.aspx
      

  7.   

    得了!!给分啦!!
    private void DeExcel(string fileName,GridView gridView)
        {
                    Response.Clear ();
            Response.Buffer = true;
            Response.Charset = "GB2312";
            Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + System.Web.HttpUtility.UrlEncode(fileName .ToString (), System.Text.Encoding.UTF8) + ".xls\""); 
            Response.ContentEncoding = System.Text.Encoding.UTF7;
            Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
            StringWriter oStringWriter = new StringWriter();
            HtmlTextWriter oHtmlTextWriter = new HtmlTextWriter(oStringWriter);
            gridView.RenderControl(oHtmlTextWriter);
            Response.Output.Write(oStringWriter.ToString());
            Response.Flush();
            Response.End();
        }