ASP .NET - Gerando arquivos DOC dinamicamente
Que tal gerar arquivos no formato .DOC sem precisar de nenhum componente instalado e nenhuma referência a arquivos externos no seu projeto ?
Pois neste artigo eu vou mostrar uma forma de gerar arquivos no formato .doc em uma aplicação ASP .NET em tempo de execução usando somente os recursos da ASP .NET.
O projeto é bem simples e vai usar o recurso do LINQ to SQL para se mapear a tabela Customer do banco de dados Northwind.mdf e assim exibir uma relação de clientes em um componente Dropdownlist em uma página ASP.NET.
Após selecionar um cliente do dropdownlist e clicar no botão de comando será gerado um arquivo doc contendo uma tabela com alguns dados do cliente e um texto com os dados selecionados.
Para seguir o exemplo deste artigo você via precisar do Visual Web Developer 2008 Express(VWD) e do SQL Server 2005 Express Edition.
Abra o VWD e crie um novo web site no menu File-> New Web Site usando o template ASP .NET Web site e a linguagem Visual Basic com o nome de geraDoc;
A seguir vamos incluir um novo projeto a partir do menu File->Add New Project e na janela Add New Project selecione o template Class Library e informe o nome Entities e clique em OK;
Agora clique com o botão direito do mouse sobre o projeto Entities e selecione Add New Item;
A seguir selecione o template LINQ to SQL classes e informe o nome Customer.dbml e clique em Add;
Agora abra a janela DataBase Explorer e selecione a conexão com o banco de dados Northwind.mdf;
Selecione a tabela Customers e a arraste para a área vazia do descritor LINQ to SQL de forma que seja gerada a entidade Customer a partir da tabela Customers;
Neste momento a estrutura do projeto exibida na janela Solution Explorer deverá ser a seguinte:
Clique com o botão direito do mouse sobre o projeto ASP .NET e selecione Add Reference e a seguir na aba Projects selecione o projeto Entities e clique em OK;
Agora vamos definir o leiaute da página Default.aspx incluindo uma tabela no menu Table->Insert Table com 4 linhas e duas colunas;
Inclua um componente DropDownList com o ID igual a ddlClientes e um controle Button com o ID igual a btnGerar conforme o leiaute abaixo:
Antes de prosseguir selecione o controle DropDownList e na janela de propriedades defina as propriedades DataTextField e DataValueFIeld conforme abaixo:
Agora vamos usar o LINQ to SQL para preencher o controle dropdownlist - ddlClientes - para isso no evento Load da página vamos incluir o código abaixo:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Not IsPostBack Then ' Vinculando diretamente um objeto LINQ. ddlClientes.DataSource = GetClientes() ddlClientes.DataBind() End If End Sub |
A rotina GetClientes() deve ser definida conforme o código a seguir:
Public Shared Function GetClientes() As List(Of Entities.Customer) Using contexto As New CustomerDataContext Return contexto.Customers.ToList End Using End Function |
Neste código estamos criando uma instância do DataContext - CustomerDataContext - e, retornando uma lista de entidades do tipo Customer;
Para encerrar vamos criar o código no evento Click do botão de comando conforme abaixo:
Protected Sub btnGerar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnGerar.Click 'usa o datacontext Dim dc As New CustomerDataContext 'defina uma consulta LINQ para selecionar os dados Dim cliente = (From c In dc.Customers _ Where c.CustomerID = ddlClientes.SelectedValue _ Select c.CustomerID, c.ContactName, c.Country, c.City, c.Phone).Single HttpContext.Current.Response.Clear() HttpContext.Current.Response.Charset = "" HttpContext.Current.Response.ContentType = "application/msword" Dim strNomeArquivo As String = "DocumentoGerado1" & ".doc" HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=" & strNomeArquivo ) Dim strHTMLContent As StringBuilder = New StringBuilder() strHTMLContent.Append("<h1 title='Heading' align='Center' style='font-family: verdana; font -size: 80 % ; color: black'> <u>Documento - Word - tabela</u> </h1>".ToString()) strHTMLContent.Append("<br>".ToString()) strHTMLContent.Append("<table align='Center'>".ToString()) strHTMLContent.Append("<tr>".ToString()) strHTMLContent.Append("<td style='width:100px; background:# 99CCE0'><b>Nome </b> </td>".ToString()) strHTMLContent.Append("<td style='width:100px; background:# 99CCE0'><b>Cidade </b> </td>".ToString()) strHTMLContent.Append("<td style='width:100px; background:# 99CCE0'><b>Pais </b> </td>".ToString()) strHTMLContent.Append("<td style='width:100px; background:# 99CCE0'><b>Fone </b> </td>".ToString()) strHTMLContent.Append("</tr>".ToString()) ' primeira linha de dados - a tabela strHTMLContent.Append("<tr>".ToString()) strHTMLContent.Append("<td style='width:100px'>" & cliente.ContactName & " </td>".ToString()) strHTMLContent.Append("<td style='width:100px'>" & cliente.City & " </td>".ToString()) strHTMLContent.Append("<td style='width:100px'>" & cliente.Country & "</td>".ToString()) strHTMLContent.Append("<td style='width:100px'>" & cliente.Phone & "</td>".ToString()) strHTMLContent.Append("</tr>".ToString()) strHTMLContent.Append("</table>".ToString()) strHTMLContent.Append("<br><br>".ToString()) '' segunda linha de dados: o texto strHTMLContent.Append("<b> " & cliente.ContactName & "</b>" & " vem por meio desta declarar que ".ToString()) strHTMLContent.Append(" reside em <b>" & cliente.City & "</b> - <b>" & cliente.Country & "</b>".ToString()) strHTMLContent.Append(" telefone : <b>" & cliente.Phone & "</b>".ToString()) strHTMLContent.Append("<br><br>".ToString()) strHTMLContent.Append("</table>".ToString()) strHTMLContent.Append("<br><br>".ToString()) strHTMLContent.Append("<p align='Center'> Documento Word gerado dinamicamente </p> ".ToString()) HttpContext.Current.Response.Write(strHTMLContent) HttpContext.Current.Response.[End]() HttpContext.Current.Response.Flush() End Sub |
Executando o web site a página Default.aspx apresentará os clientes exibidos no dropdownlist. Após selecionar um item e clicar no botão Gerar Arquivo DOC será apresentado uma janela com a opção de abrir, salvar ou cancelar. Clique em Abrir para abrir o arquivo doc gerado;
O arquivo .doc será apresentado conforme a figura abaixo. Nele temos uma tabela e um texto montados com os dados do cliente em tempo de execução;
Com isso acabamos de gerar um arquivo doc de forma dinâmica sem fazer referências aos objetos do Word.
Pegue o arquivo completo aqui: geraDoc.zip
Eu sei é apenas ASP .NET e Office , mas eu gosto...
Referências:
José Carlos Macoratti