Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Imports Microsoft.Office.Interop Imports System.Threading.Thread Imports System.Globalization Enum xlsOption xlsSaveAs xlsOpen End Enum ''' <summary> ''' Exporta a informao de uma datagridview para o Microsoft Excel ''' </summary> ''' <param name="dgvName">Nome da datagridview</param> ''' <param name="option">SaveAs ou Open</param> ''' <param name="fileName">Nome completo do ficheiro</param> Public Sub ExportToExcel(ByVal dgvName As DataGridView, ByVal [option] As xlsOption, Optional ByVal fileName As String = "") Dim objExcelApp As New Excel.Application() Dim objExcelBook As Excel.Workbook Dim objExcelSheet As Excel.Worksheet Try ' Verifica se foi seleccionada a opo xlsSaveAs e no foi indicado ficheiro If [option] = xlsOption.xlsSaveAs And fileName = String.Empty Then MessageBox.Show(" necessrio indicar um nome para o ficheiro a gravar ...") Exit Sub End If ' Altera o tipo/localizao para Ingls. Existe incompatibilidade ' entre algumas verses de Excel vs Sistema Operativo Dim oldCI As CultureInfo = CurrentThread.CurrentCulture CurrentThread.CurrentCulture = New CultureInfo("en-US") ' Adiciona um workbook e activa a worksheet corrente objExcelBook = objExcelApp.Workbooks.Add objExcelSheet = CType(objExcelBook.Worksheets(1), Excel.Worksheet) ' Ciclo nos cabealhos para escrever os ttulos a bold/negrito Dim dgvColumnIndex As Int16 = 1 For Each col As DataGridViewColumn In dgvName.Columns objExcelSheet.Cells(1, dgvColumnIndex) = col.HeaderText objExcelSheet.Cells(1, dgvColumnIndex).Font.Bold = True dgvColumnIndex += 1 Next ' Ciclo nas linhas/clulas Dim dgvRowIndex As Integer = 2 For Each row As DataGridViewRow In dgvName.Rows Dim dgvCellIndex As Integer = 1 For Each cell As DataGridViewCell In row.Cells objExcelSheet.Cells(dgvRowIndex, dgvCellIndex) = cell.Value dgvCellIndex += 1 Next dgvRowIndex += 1 Next
' Ajusta o largura das colunas automticamente objExcelSheet.Columns.AutoFit() ' Caso a opo seja gravar (xlsSaveAs) grava o ficheiro e fecha ' o Workbook/Excel. Caso contrrio (xlsOpen) abre o Excel If [option] = xlsOption.xlsSaveAs Then objExcelBook.SaveAs(fileName) objExcelBook.Close() objExcelApp.Quit() MessageBox.Show("Ficheiro exportado com sucesso para: " + fileName) Else objExcelApp.Visible = True End If ' Altera a tipo/localizao para actual CurrentThread.CurrentCulture = oldCI Catch ex As Exception MessageBox.Show("Erro no identificado. Mensagem original:" + vbNewLine + ex.Message) Finally objExcelSheet = Nothing objExcelBook = Nothing objExcelApp = Nothing ' O GC(garbage collector) recolhe a memria no usada pelo sistema. ' O mtodo Collect() fora a recolha e a opo WaitForPendingFinalizers ' espera at estar completo. Desta forma o EXCEL.EXE no fica no ' task manager(gestor tarefas) ocupando memria desnecessriamente GC.Collect() GC.WaitForPendingFinalizers() End Try End Sub Finalmente para utilizar no programa: ' Exporta e abre o Microsoft Excel ExportToExcel(Me.DataGridView1, xlsOption.xlsOpen) ' Exporta e grava o ficheiro na localizao indicada ExportToExcel(Me.DataGridView1, xlsOption.xlsSaveAs, "c:\meuFicheiroExcel.xls") O objectivo deste artigo mostrar como utilizar a automao do Excel atravs do VB.NET e alguns truques que facilitam e optimizam este processo. O exemplo de exportar uma DataGridView tambm muito util uma vez que um controlo bastante utilizado.