Vamos abordar um assunto de muita utilidade para quem trabalha com desenvolvimento de sistemas, a geração de arquivos em Excel (.xls). Neste post vamos analisar a geração de arquivos .xls em ambiente web usando o GridView, uma forma prática e rápida de gerar relatórios simples. O método gerador recebe um DataTable com informações vindas de um banco de dados. Segue o código da classe geradora:
1: Imports System.IO
2: Imports System.Drawing
3: Imports System.Data
4: Imports System.Web
5: Imports System.Web.UI
6: Imports System.Web.UI.WebControls
7:
8: '''-----------------------------------------------------------------------------
9: '''
10: ''' Classe para geração de relatórios Excel. Utiliza o componente
11: ''' System.Web.UI.WebControls.GridView para geração do arquivo .xls.
12: '''
13: '''
14: '''
15: Public Class ExcelReport
16: '''
17: ''' Nome do arquivo Excel
18: '''
19: '''
20: Private _file As String
21:
22: '''
23: ''' Objeto GridView
24: '''
25: '''
26: Private gv As GridView
27:
28: '''
29: ''' Construtor, recebe o nome do arquivo .xls como parâmetro
30: '''
31: ''' String contendo o nome do arquivo .xls a ser gerado.
32: '''
33: Public Sub New(ByVal file As String)
34: Me._file = file
35: ' Cria o GridView
36: gv = New GridView()
37: ' Formatação do GridView para que a planilha fique "zebrada"
38: gv.HeaderStyle.ForeColor = Color.Black
39: gv.AlternatingRowStyle.BackColor = Color.Yellow
40: gv.RowStyle.BackColor = Color.White
41: End Sub
42:
43: '''
44: ''' Gera um arquivo Excel a partir de um DataTable.
45: '''
46: ''' Instância do objeto DataTable
47: '''
48: Public Sub DataTableToExcel(ByRef dt As DataTable)
49: If dt.Rows.Count < 65536 Then
50: Dim response As HttpResponse = HttpContext.Current.Response
51: response.Clear()
52: response.AddHeader("Content-Disposition", "attachment; filename=" + Me._file)
53: response.ContentType = "application/vnd.ms-excel"
54: Dim stringWrite As New StringWriter
55: Dim htmlWrite As New HtmlTextWriter(stringWrite)
56: gv.DataSource = dt
57:
58: gv.DataBind()
59: gv.RenderControl(htmlWrite)
60: response.Write(stringWrite.ToString)
61: response.End()
62: Else
63: ' se tiver mais que 65536 linhas, dispara a exception
64: Throw New Exception("Consulta deve conter menos que 65536 linhas")
65: End If
66: End Sub
67: End Class