2009-09-10 78 views
1

將gridview導出到Excel電子表格的最佳方式是什麼? This seems easy導出gridview數據

除了我的Gridview沒有導出屬性。什麼是最快的方法來做到這一點?

+0

這應該可能超過用戶 – 2009-09-10 18:02:49

+1

我不同意,如果他想以編程方式做。我認爲這是事實。 – 2009-09-10 18:13:52

+0

是布萊恩。我想以編程方式。 – Eric 2009-09-10 19:26:32

回答

1

在導出爲ex​​cel時將此代碼寫入btnexporttoExcel Click事件。

string attachment = "attachment; filename=Export.xls"; 

    Response.ClearContent(); 

    Response.AddHeader("content-disposition", attachment); 

    Response.ContentType = "application/ms-excel"; 

    StringWriter sw = new StringWriter(); 

    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    // Create a form to contain the grid 

    HtmlForm frm = new HtmlForm(); 

    gv.Parent.Controls.Add(frm); 

    frm.Attributes["runat"] = "server"; 

    frm.Controls.Add(gv); 

    frm.RenderControl(htw); 



    //GridView1.RenderControl(htw); 

    Response.Write(sw.ToString()); 

    Response.End(); 
0

This library for .net在我們的使用案例中工作得非常好。

該庫允許您使用XML生成Excel工作簿,它在C#中100%構建,並且不需要安裝Excel來生成文件。它公開了一個簡單的對象模型來生成XML工作簿。

沒有與GridView控件的內置集成,但是編寫通用適配器非常簡單,並且可以在其他項目中重用。

1

這裏可能有些東西,但是如果你想自己做,你可以編寫一些代碼,它們遍歷GridView.Rows集合,然後是GridViewRow.Cells集合。

從那裏建立一個CSV文件應該很容易,而且Excel可以讀取它沒有問題。

CSV文件只是包含引號內的值的文本文件,用逗號分隔。像這樣:

"value", "value", "value" 
"value", "value", "value" 

您可以彈出記事本打開並手動構建一個試用它。

-1
Private exportToExcel As Boolean = False 

Private Sub LoadInExcel() 
    Me.Response.ClearContent() 
    Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls") 
    Me.Response.ContentType = "application/ms-excel" 
    Dim sw1 As New IO.StringWriter 
    Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1) 
    GridView1.RenderControl(htw1) 
    Response.Write(sw1.ToString()) 
    Response.End() 
End Sub 

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control) 
    ' Confirms that an HtmlForm control is rendered for the specified ASP.NET 
    ' server control at run time. 
End Sub 

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
    If exportToExcel Then 
     LoadInExcel() 
    End If 

    MyBase.Render(writer) 
End Sub 

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click 
    exportToExcel = True 
End Sub 

您必須安裝excel並參考項目中的Office互操作庫。 地址:

進口Microsoft.Office.Core, 進口Microsoft.Office.Interop

上述該解決方案利用GridView和拉HTML出來。然後寫入excel。來自網格的html將包含樣式屬性,如填充顏色&。它也會使可排序的列標題看起來像鏈接。當我使用這個時,我寫了一個自定義解析器去除所有不需要的樣式,只給出原始數據。我將把這個任務交給你,因爲它是針對每個網格的。

即使內部沒有任何代碼,將重寫包括到VerifyRenderingInServerForm中也是非常重要的。

+0

我喜歡你要去的地方。但是,我不允許導入microsoft.office.core – Eric 2009-09-10 19:22:31

+0

我可以在哪裏獲取Microsoft Office文件? – Eric 2009-09-10 19:47:33

+0

@Eric - 您可以通過將Office安裝在同一臺計算機上來獲取它們。但是,應該指出的是,在服務器上運行Office通常不被認爲是最佳實踐。 – rjzii 2009-09-11 14:44:28

1

我已經做了好幾次了。 Excel有一個XML版本。它以.xml擴展名結尾,但您可以將文件的擴展名更改爲.xls,並且XML格式的文件將在Excel中打開。

這種方法最大的障礙是excel XML格式。我通常以我想要的大致格式在excel中創建一個excel文件。然後將Excel文件保存爲XML格式,然後在文本編輯器中打開它。

我通常從這個Excel示例頁面創建一個模板文件。然後,當我在Gridview中導出信息時,我只需要爲包含我計劃填充的單元格的部分創建xml,我只是預先添加並追加模板文件中已有的文本。

一旦你打開了格式化的Excel文件中的XML,你就會比較容易地找出所需要的XML。要理解的最難的部分是單元格引用格式化選項的方式,它們位於XML文件的頂部。

祝你好運,讓我知道,如果你需要進一步澄清。

編輯: 您只需要創建模板excel文件一次,只是爲了獲得所需的XML,你需要生成一個感覺。一旦你生成XML使用下面的代碼將其發送給用戶:

string fileName = "ExportedFile.xls"; 
Response.Clear(); 
Response.Buffer = true; 
Response.ContentType = "text/xml"; 
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName); 
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID); 
Response.End(); 



public static void ExportToExcel(Stream outputStream) 
{ 
    XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default); 

    //ExcelHeaderString and ExcelStylesString are from the template 
    xmlSink.WriteRaw(ExcelHeaderString); 
    xmlSink.WriteRaw(ExcelStylesString); 

    //write your elements here 
    xmlSink.WriteElement("YourElements"); 

    //ExcelFooterString is from the template 
    xmlSink.WriteRaw(ExcelFooterString); 
} 
+0

我的問題是,我必須在每臺機器上都這麼做嗎?我必須在每臺機器上創建一個excel文件。這是應用程序將在公司範圍內使用。 – Eric 2009-09-10 19:39:04

+0

我以爲你會將它編入包含GridView的代碼中。我對你的陳述有些困惑。你正在創建一個基於Web的應用程序或桌面應用程序嗎? – Chris 2009-09-10 19:42:17

+0

是的。那是對的。我將嘗試對此進行編程。這是一個基於網絡的應用程序。我可能是一個迷茫的人。但你說過你必須通常在Excel中創建一個excel文件。我必須在每臺使用此應用程序的計算機上都這樣做? – Eric 2009-09-10 19:50:59

0

我用CarlosAg.ExcelXmlWriterlink

我經歷了所有GridViewsHeaderCells然後通過所有行。唯一的一點是,如果你允許分頁和你已經超過一個頁面,你必須設置每頁爲高值(我設置爲10000000),然後DataBindGridView一次做你的工作。之後設置舊的PageSize值。如果有人知道更好的解決方案,歡迎您。

編輯:try/catch語句是有因爲某種原因,它是不可能的檢查控制類型,然後轉換爲標籤或LinkButton ==> control.GetType()

這是我的代碼。

public static Workbook CreateWorkbook(GridView gridView) 
    { 
     int pageSize = gridView.PageSize; 
     gridView.PageSize = 10000000; 
     gridView.DataBind(); 

     Workbook workbook = new Workbook(); 
     Worksheet sheet = workbook.Worksheets.Add("Export"); 

     WorksheetStyle style = workbook.Styles.Add("headerStyle"); 
     style.Font.Bold = true; 
     style = workbook.Styles.Add("defaultStyle"); 
     style.Alignment.WrapText = true; 
     style = workbook.Styles.Add("infoStyle"); 
     style.Font.Color = "Red"; 
     style.Font.Bold = true; 

     sheet.Table.Rows.Add(new WorksheetRow()); 

     WorksheetRow headerRow = new WorksheetRow(); 
     foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells) 
     { 
      if (!string.IsNullOrEmpty(cell.Text)) 
       headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle"); 
      else 
       foreach (Control control in cell.Controls) 
       { 
        LinkButton linkButton = new LinkButton(); 
        try 
        { 
         linkButton = (LinkButton)control; 
        } 
        catch { } 

        if (!string.IsNullOrEmpty(linkButton.Text)) 
         headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle"); 
        else 
        { 
         Label label = new Label(); 
         try 
         { 
          label = (Label)control; 
         } 
         catch { } 
         if (!string.IsNullOrEmpty(label.Text)) 
          headerRow.Cells.Add(label.Text, DataType.String, "headerStyle"); 
        } 
       } 
     } 

     sheet.Table.Rows.Add(headerRow); 

     foreach (GridViewRow row in gridView.Rows) 
     { 
      WorksheetRow wrow = new WorksheetRow(); 
      foreach (TableCell cell in row.Cells) 
      { 
       foreach (Control control in cell.Controls) 
       { 
        if (control.GetType() == typeof(Label)) 
        { 
         wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle"); 
        } 
       } 
      } 
      sheet.Table.Rows.Add(wrow); 
     } 

     gridView.PageSize = pageSize; 

     return workbook; 
    } 
0

此方法直接轉換爲Excel格式,無需在服務器上安裝XML或使用XML。

 Protected Sub ExportToExcel() 

     Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1") 
     If Not gv1 Is Nothing Then 
      Response.ClearHeaders() 
      Response.ClearContent() 

      ' Set the content type to Excel 
      Response.ContentType = "application/vnd.ms-excel" 

      ' make it open the save as dialog 
      Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls") 

      'Turn off the view state 
      Me.EnableViewState = False 

      'Remove the charset from the Content-Type header 
      Response.Charset = String.Empty 

      Dim myTextWriter As New System.IO.StringWriter 
      Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter) 
      Dim frm As HtmlForm = New HtmlForm() 
      Controls.Add(frm) 
      frm.Controls.Add(gv1) 

      'Get the HTML for the control 
      frm.RenderControl(myHtmlTextWriter) 

      'Write the HTML to the browser 
      Response.Write(myTextWriter.ToString()) 
      'End the response 
      Response.End() 
     End If 
    End Sub 

Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control 
    If root.ID = id Then 
     Return root 
    End If 
    Dim c As Control 
    For Each c In root.Controls 
     Dim t As Control = FindControlRecursive(c, id) 
     If Not t Is Nothing Then 
      Return t 
     End If 
    Next 
    Return Nothing 
End Function