Como Exportar Dados num DataGrid num ASP. NET WebForm para Microsoft Excel

Resumo

Utilize este guia passo a passo para preencher um controlo do servidor Web DataGrid num WebForm ASP.NET e, em seguida, exportar os conteúdos do DataGrid para o Microsoft Excel.

Técnicas

Este artigo descreve duas técnicas para exportar os dados no DataGrid:

  • Utilizar o Tipo MIME do Excel (ou Tipo de Conteúdo)

    Com o código do lado do servidor, pode vincular o DataGrid aos seus dados e ter os dados abertos no Excel num computador cliente. Para tal, defina o ContentType para application/vnd.ms-excel. Após o cliente receber o novo fluxo, os dados são apresentados no Excel como se os conteúdos estivessem abertos como uma nova página no browser.

  • Utilizar a Automatização do Excel

    Com o código do lado do cliente, pode extrair o HTML do DataGrid e, em seguida, Automatizar o Excel para apresentar o HTML num novo livro. Com a Automatização do Excel, os dados aparecem sempre fora do browser numa janela de aplicação do Excel. Uma vantagem da automatização é que pode controlar através de programação o Excel se quiser modificar o livro após a exportação dos dados. No entanto, uma vez que o Excel não está marcado como seguro para scripting, os seus clientes têm de aplicar definições de segurança no browser que permitem a automatização.

Passo a Passo

  1. Inicia o Visual Studio .NET. No menu Ficheiro, aponte para Novo e, em seguida, clique em Projeto.

  2. No painel Tipos de Projeto, clique em Projetos do Visual Basic. Em Modelos, clique em ASP.NET aplicação Web. Indique o nome ExcelExport da aplicação e, em seguida, clique em OK.

    O WebForm1 aparece na vista Estrutura.

  3. No Explorador de Soluções, clique com o botão direito do rato em WebForm1.aspx e, em seguida, clique em Rename (Nome). Altere o nome do ficheiro para Bottom.aspx.

  4. No menu Ver, clique em Origem HTML para adicionar o seguinte DataGrid entre o botão

    e
    etiquetas:

    <asp:datagrid id="DataGrid1" runat="server" GridLines="Vertical" CellPadding="3" BackColor="White"
    BorderColor="#999999" BorderWidth="1px" BorderStyle="None" Width="100%" Height="100%" Font-Size="X-Small"
    Font-Names="Verdana">
    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#008A8C"></SelectedItemStyle>
    <AlternatingItemStyle BackColor="Gainsboro"></AlternatingItemStyle>
    <ItemStyle BorderWidth="2px" ForeColor="Black" BorderStyle="Solid" BorderColor="Black" BackColor="#EEEEEE"></ItemStyle>
    <HeaderStyle Font-Bold="True" HorizontalAlign="Center" BorderWidth="2px" ForeColor="White" BorderStyle="Solid"
    BorderColor="Black" BackColor="#000084"></HeaderStyle>
    <FooterStyle ForeColor="Black" BackColor="#CCCCCC"></FooterStyle>
    <PagerStyle HorizontalAlign="Center" ForeColor="Black" BackColor="#999999" Mode="NumericPages"></PagerStyle>
    </asp:datagrid>
    
    
  5. No menu Ver, clique em Estrutura para regressar à vista de estrutura.

    O DataGrid é apresentado no WebForm.

  6. No menu Ver, clique em Código para apresentar o código por trás do Formulário Web. Adicione o seguinte código ao organizador Page_Load evento:

    Nota Tem de alterar o nome de utilizador de ID <> de Utilizador e palavra-passe=<palavra-passe> forte para os valores corretos antes de executar este código. Certifique-se de que a conta de utilizador tem as permissões corretas para efetuar esta operação na base de dados.

    ' Create a connection and open it.
    Dim objConn As New System.Data.SqlClient.SqlConnection("User ID=<username>;Password=<strong password>;Initial Catalog=Northwind;Data Source=SQLServer;")
    objConn.Open()
    
    Dim strSQL As String
    Dim objDataset As New DataSet()
    Dim objAdapter As New System.Data.SqlClient.SqlDataAdapter()
    
    ' Get all the customers from the USA.
    strSQL = "Select * from customers where country='USA'"
    objAdapter.SelectCommand = New System.Data.SqlClient.SqlCommand(strSQL, objConn)
    ' Fill the dataset.
    objAdapter.Fill(objDataset)
    ' Create a new view.
    Dim oView As New DataView(objDataset.Tables(0))
    ' Set up the data grid and bind the data.
    DataGrid1.DataSource = oView
    DataGrid1.DataBind()
    
    ' Verify if the page is to be displayed in Excel.
    If Request.QueryString("bExcel") = "1" Then
        ' Set the content type to Excel.
        Response.ContentType = "application/vnd.ms-excel"
        ' Remove the charset from the Content-Type header.
        Response.Charset = ""
        ' Turn off the view state.
        Me.EnableViewState = False
    
    Dim tw As New System.IO.StringWriter()
        Dim hw As New System.Web.UI.HtmlTextWriter(tw)
    
    ' Get the HTML for the control.
        DataGrid1.RenderControl(hw)
        ' Write the HTML back to the browser.
        Response.Write(tw.ToString())
        ' End the response.
        Response.End()
    End If
    
    

    NOTA Substitua o SQLServer no código pelo nome da sua SQL Server. Se não tiver acesso a um SQL Server que contém a base de dados de exemplo da Northwind, modifique a cadeia de ligação para utilizar a base de dados da Northwind de exemplo do Microsoft Access 2002:

    provider=microsoft.jet.oledb.4.0; origem de dados=C:\Program Files\Microsoft Office\Office10\Samples\Northwind.mdb

    Se selecionar este método, modifique o código especificado para utilizar o espaço de nomes OleDbClient em vez do espaço de nomes SqlClient.

  7. No menu Projeto, clique em Adicionar Página HTML. Dar um nome à página Top.htm, em seguida, clique em Abrir.

    Top.htm aparece na vista Estrutura.

  8. No menu Ver, clique em Origem HTML. Substitua os conteúdos da janela de origem HTML pelo seguinte código:

    <html>
    <script language="vbscript">
      Sub Button1_onclick        
    
    Select Case Select1.selectedIndex
    
    Case 0' Use Automation.
          Dim sHTML
          sHTML = window.parent.frames("bottom").document.forms(0).children("DataGrid1").outerhtml
          Dim oXL, oBook
          Set oXL = CreateObject("Excel.Application")
          Set oBook = oXL.Workbooks.Add
          oBook.HTMLProject.HTMLProjectItems("Sheet1").Text = sHTML
          oBook.HTMLProject.RefreshDocument
          oXL.Visible = true
          oXL.UserControl = true
    
    Case 1' Use MIME Type (In a New Window).
          window.open("bottom.aspx?bExcel=1")
    
    Case 2' Use MIME Type (In the Frame).
          window.parent.frames("bottom").navigate "bottom.aspx?bExcel=1"
      End Select
    End Sub
    </script>
    <body>
    Export to Excel Using:
    <SELECT id="Select1" size="1" name="Select1">
    <OPTION value="0" selected>Automation</OPTION>
    <OPTION value="1">MIME Type (In a New Window)</OPTION>
    <OPTION value="2">MIME Type (In the Frame)</OPTION>
    </SELECT>
    <INPUT id="Button1" type="button" value="Go!" name="Button1">
    </body>
    </html>
    
    
  9. No menu Projeto, clique em Adicionar Página HTML. Dar um nome à página Frameset.htm, em seguida, clique em Abrir.

    Frameset.htm aberta na vista Estrutura.

  10. No menu Ver, clique em Origem HTML. Substitua os conteúdos da janela de origem HTML pelo seguinte código:

    <html>
    <frameset rows="10%,90%">
    <frame noresize="0" scrolling="no" name="top" src="top.htm">
    <frame noresize="0" scrolling="yes" name="bottom" src="bottom.aspx">
    </frameset>
    </html>
    
    
  11. No Explorador de Soluções, clique com o botão direito do Frameset.htm em seguida, clique em Definir Como Página Inicial.

  12. No menu Criar, clique em Construir Solução.

Experimente!

  1. No menu Depurar, clique em Iniciar Sem Depuração para executar a aplicação.

    Quando o conjunto de molduras abrir no browser, o DataGrid na moldura inferior apresenta os dados da base de dados da Northwind.

  2. Na lista única, clique em Automatização e, em seguida, clique em Ir.

    Os conteúdos do DataGrid são apresentados fora do browser na janela da aplicação Microsoft Excel.

  3. Na lista de listas, clique em Tipo MIME (Numa Nova Janela) e, em seguida, clique em Ir.

    Os conteúdos da DataGrid são apresentados no Excel aloados numa nova janela do browser.

    NOTA Se receber um pedido para abrir ou guardar o ficheiro do Excel, clique em Abrir.

  4. Na lista única, clique em Tipo MIME (Na Moldura) e, em seguida, clique em Ir.

    Os conteúdos do DataGrid são apresentados na moldura inferior do conjunto de molduras no Excel aloado no browser.

    NOTA Se receber um pedido para abrir ou guardar o ficheiro do Excel, clique em Abrir.

Referências

Para obter informações adicionais, veja o artigo na Base de Dados de Conhecimento Microsoft:

296717 PRB: o Internet Explorer pede ao utilizador para abrir/guardar ficheiro do Office transmitido em fluxo a partir do ASP