【问题标题】:Asp.Net Export to Excel - Japanese CharactersAsp.Net 导出到 Excel - 日文字符
【发布时间】:2010-03-16 16:44:16
【问题描述】:

我目前正在为我的 ASP .NET 应用程序使用 Visual Studio 2008。我正在尝试通过 Response 对象将一些带有日文字符的报告导出到 Excel。当我尝试导出时,所有日文字符看起来都是乱码。它适用于汉字。这是我尝试过的:

我尝试安装日语语言包 / 编码为 UTF-8 / UTF-7 / Shift-JIS / 全球化 (Web.Config) .. 但没有运气。任何想法如何解决这个问题?谢谢!!

        string attachment = "attachment; filename=PerksPlusReport.xls";
        //Response.Clear();
        Response.ClearContent();
        Response.ClearHeaders();
 Response.AddHeader("content-disposition", attachment);
        //Response.Charset = "UTF-8";
 //Response.Charset = "UTF-7";
 //Response.Charset = "Shift_JIS";
        Response.ContentType = "application/vnd.ms-excel";
        StringWriter sw = new StringWriter();
        HtmlTextWriter htw = new HtmlTextWriter(sw);

        // Create a form to contain the grid
        HtmlForm frm = new HtmlForm();
        ReportGridView.Parent.Controls.Add(frm);
        frm.Attributes["runat"] = "server";
        GridView GridView2 = new GridView();

        ReportView reportDetails = GetReportDetails();
        GridView2.DataSource = GetReportResults(this.ReportId.Value, reportDetails.Sql);

        GridView2.DataBind();
        PrepareGridViewForExport(GridView2);
        frm.Controls.Add(GridView2);
        frm.RenderControl(htw);

        string fileContents = sw.ToString();
        int startSpot = fileContents.IndexOf("<table");
        fileContents = fileContents.Substring(startSpot);
        int endSpot = fileContents.IndexOf("</table>");
        fileContents = fileContents.Substring(0, endSpot + 8);

        try
        {
            // Replace all &lt; and &gt; with < and >
            fileContents = fileContents.Replace("&lt;", "<");
            fileContents = fileContents.Replace("&gt;", ">");
            fileContents = fileContents.Replace("€", "&euro;");

            string RegularExpression = @"<a[^>]*>([^<]*)</a>";
            Regex regex = new Regex(RegularExpression);

            //If match found .. uses the delegate function to replace the whole content with the filtered values 
            if (regex.IsMatch(fileContents))
            {
                regex.Replace(fileContents, delegate (Match m){return fileContents.Replace(m.Captures[0].Value, m.Groups[1].Value);});
            }
        }
        catch (Exception ex2)
        {
            Response.Write(ex2.ToString());
        }

 Response.Write(fileContents);
        Response.End();

【问题讨论】:

    标签: c# asp.net unicode export-to-excel


    【解决方案1】:

    这就是我的工作方式..

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.AddHeader("content-disposition", "attachment; filename=FileName.xls");
    Response.ContentEncoding = System.Text.Encoding.Unicode;
    Response.ContentType = "application/ms-excel";
    Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
    

    【讨论】:

    • 序言声明为我修复了它。
    【解决方案2】:

    您是否尝试过设置响应的 ContentEncoding 属性或显式设置内容编码 HTTP 标头?

    【讨论】:

      【解决方案3】:
      Response.ContentEncoding = System.Text.Encoding.Default;
      

      解决了我的问题。我也希望你的。

      【讨论】:

        【解决方案4】:

        只需添加以下 2 行。大多数时候我们忘记了导致所有挫败感的第二行。

        Response.ContentEncoding = System.Text.Encoding.Unicode;
        Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
        

        【讨论】:

          【解决方案5】:
          /*
          Here is fully functional class. Hope this will help someone
          For queries, contact amjad@qatar.net.qa
          */
          
          
          
          using System;
          using System.Data;
          using System.Configuration;
          using System.IO;
          using System.Web;
          using System.Web.Security;
          using System.Web.UI;
          using System.Web.UI.WebControls;
          using System.Web.UI.WebControls.WebParts;
          using System.Web.UI.HtmlControls;
          
          
          public class GridViewExportUtil
          {
          
              public static void Export(string fileName, GridView gv)
              {
                  HttpContext.Current.Response.Clear();
                  //HttpContext.Current.Response.ContentType = "application/ms-excel";
                  HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";
                  //HttpContext.Current.Response.ContentType = "text/html; charset=utf-8";
          
                  HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", fileName + ".xls"));
                  HttpContext.Current.Response.Charset = "";
                  HttpContext.Current.Response.Buffer = true;
                  HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.Unicode;
                  HttpContext.Current.Response.BinaryWrite(System.Text.Encoding.Unicode.GetPreamble());
          
                  //HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
                  //HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("iso-8859-2");
          
          
                  //This will allow you to set the Report Header and Report Title
                  //My file name format "ReportTitle_PatientID_PrescriptionNo_ReportDateTime"
                  string [] arrFileName = fileName.Replace(".xls","").Split('_');
                  string rptTitle = arrFileName[0] + " " + arrFileName[1];
                  string rptPatientID = arrFileName[2];
                  string rptSpecimen = arrFileName[3];
                  string rptDate = arrFileName[4] + " " + arrFileName[5];
          
                  /*Optional Header*/
                  //HttpContext.Current.Response.Write("DEPARTMENT OF PHARMACY - Pharmacy Prescription Details<br>");
                  //HttpContext.Current.Response.Write("Patient ID: " + rptPatientID + "<br>");
                  //HttpContext.Current.Response.Write("Prescription No: " + rptSpecimen + "<br>");
                  //HttpContext.Current.Response.Write("Report Date: " + rptDate);
                  //HttpContext.Current.Response.Write("<br><br>");
          
          
                  using (StringWriter sw = new StringWriter())
                  {
                      using (HtmlTextWriter htw = new HtmlTextWriter(sw))
                      {
                          //  Create a form to contain the grid
                          Table table = new Table();
          
                          //  add the header row to the table
                          if (gv.HeaderRow != null)
                          {
                              GridViewExportUtil.PrepareControlForExport(gv.HeaderRow);
                              table.Rows.Add(gv.HeaderRow);
                          }
          
                          //  add each of the data rows to the table
                          foreach (GridViewRow row in gv.Rows)
                          {
                              GridViewExportUtil.PrepareControlForExport(row);
                              table.Rows.Add(row);
                          }
          
                          //  add the footer row to the table
                          if (gv.FooterRow != null)
                          {
                              GridViewExportUtil.PrepareControlForExport(gv.FooterRow);
                              table.Rows.Add(gv.FooterRow);
                          }
          
                          //  render the table into the htmlwriter
                          table.RenderControl(htw);
          
                      }
          
                      //  render the htmlwriter into the response
                      HttpContext.Current.Response.Write(sw.ToString());
                      HttpContext.Current.Response.End();
                  }
          
          
              }
          
              /// <summary>
              /// Replace any of the contained controls with literals
              /// </summary>
              /// <param name="control"></param>
              private static void PrepareControlForExport(Control control)
              {
                  for (int i = 0; i < control.Controls.Count; i++)
                  {
                      Control current = control.Controls[i];
                      if (current is LinkButton)
                      {
                          control.Controls.Remove(current);
                          control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
                      }
                      else if (current is ImageButton)
                      {
                          control.Controls.Remove(current);
                          control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
                      }
                      else if (current is HyperLink)
                      {
                          control.Controls.Remove(current);
                          control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
                      }
                      else if (current is DropDownList)
                      {
                          control.Controls.Remove(current);
                          control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
                      }
                      else if (current is CheckBox)
                      {
                          control.Controls.Remove(current);
                          control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
                      }
          
                      if (current.HasControls())
                      {
                          GridViewExportUtil.PrepareControlForExport(current);
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多