2014-07-03 180 views
0

我有一個帶有malty控件和網格視圖的頁面。警告:將GridView導出到Excel文件

我想將gridview數據導出爲ex​​cel文件。我使用這個類。

public class GridViewExportUtil 
{ 

public static void Export(string fileName, GridView gv) 
{ 
    HttpContext.Current.Response.Clear(); 
    HttpContext.Current.Response.AddHeader(
     "content-disposition", string.Format("attachment; filename={0}", fileName)); 
    HttpContext.Current.Response.ContentType = "application/ms-excel"; 

    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.Flush(); 
      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); 
     } 
    } 
} 

}

我的GridView有特殊的格式,我使用波斯語。

當我使用這個類,它是出口的GridView到Excel,但

myproblem是:當打開Excel文件,我得到錯誤「是在不同的格式由文件擴展名指定」。打開文件時,波斯文字難以辨認。

回答

0

通過在導出函數的輸出的頭部分加入一些造型,併爲從右到左對齊選項它插在水平的聲明所稱。

例如,如果你正在使用你的項目C#:

private string AddExcelStyling() 
{ 

StringBuilder sb = new StringBuilder(); 

sb.Append("<html xmlns:o='urn:schemas-microsoft-com:office:office'\n" + 

"xmlns:x='urn:schemas-microsoft-com:office:excel'\n" + 

"xmlns='http://www.w3.org/TR/REC-html40'>\n" + 

"<head>\n"); 

sb.Append("<style>\n"); 

sb.Append("@page"); 

sb.Append("mso-page-orientation:landscape;}\n"); 

sb.Append("</style>\n"); 

sb.Append("<!--[if gte mso 9]><xml>\n"); 

sb.Append("<x:ExcelWorkbook>\n"); 

sb.Append("<x:ExcelWorksheets>\n"); 

sb.Append("<x:ExcelWorksheet>\n"); 

sb.Append("<x:Name>Sheet Name</x:Name>\n"); 

sb.Append("<x:WorksheetOptions>\n"); 

sb.Append("<x:Print>\n"); 

sb.Append("<x:HorizontalResolution>600</x:HorizontalResolution\n"); 

sb.Append("<x:VerticalResolution>600</x:VerticalResolution\n"); 

sb.Append("</x:Print>\n"); 

sb.Append("<x:Selected/>\n"); 

sb.Append("<x:DisplayRightToLeft/>\n"); 

sb.Append("<x:DoNotDisplayGridlines/>\n"); 

sb.Append("</x:WorksheetOptions>\n"); 

sb.Append("</x:ExcelWorksheet>\n"); 

sb.Append("</x:ExcelWorksheets>\n"); 

sb.Append("</x:ExcelWorkbook>\n"); 

sb.Append("</xml><![endif]-->\n"); 

sb.Append("</head>\n"); 

sb.Append("<body>\n"); 

return sb.ToString(); 

}

請參閱此鏈接:http://forums.asp.net/p/1445619/3358464.aspx