Jump to content

[Resolvido] Exportação de 2 datagridview para o mesmo ficheiro excel


sergiotmcardoso
 Share

Recommended Posts

Olá Pessoal,

Preciso duma pequena ajuda, não sei se esta é a melhor forma de fazer o que quero, senão for, agradeço que digam outra então 🙂

O que tenho é a Datagridview4 que preencho primeiro com determinados dados, depois passo-os para excel, em seguida apago esses dados preencho com outros e passo novamente para dentro do excel que também tem os dados anteriores.

Basicamente preciso de no mesmo excel preencher informação de 2 datagrids, a forma de o conseguir fazer é através deste código que arranjei aqui pelo forum, e fiz uma pequena alteração

Private Sub excel_orcamento()
 ' Exporta e abre o Microsoft Excel
 ExportToExcel2(Me.DataGridView4, xlsOption2.xlsOpen)
 ' Exporta e grava o ficheiro na localização indicada
 'ExportToExcel2(Me.DataGridView4, xlsOption2.xlsSaveAs2, "C:\DISCO2\DESENVOLVIMENTO\orcamento.xls")
 'ExportToExcel3(Me.DataGridView5, xlsOption3.xlsOpen)
End Sub
' Criar uma nova instância do Excel
Dim objExcelApp2 As New Excel.Application
Enum xlsOption2
 xlsSaveAs
 xlsOpen
End Enum
''' <summary>
''' Exporta a informação de uma DataGridView para o Microsoft Excel
''' </summary>
''' <param name="dgvName">DataGridView4</param>
''' <param name="option">Save</param>
''' <param name="filename">C:\DISCO2\DESENVOLVIMENTO\orcamento.xls</param>
Public Sub ExportToExcel2(ByVal dgvName As DataGridView, ByVal [option] As xlsOption2, Optional ByVal fileName As String = "")
 Dim objExcelApp2 As New Excel.Application()
 Dim objExcelBook2 As Excel.Workbook
 Dim objExcelSheet2 As Excel.Worksheet
 Try
	 ' Se foi seleccionada a opção xlsSaveAs e não foi indicado ficheiro
	 If [option] = xlsOption2.xlsSaveAs And fileName = String.Empty Then
		 MessageBox.Show("É necessário indicar um nome para o ficheiro")
		 Exit Sub
	 End If
	 ' Altera o tipo/localização para Inglês. Existe incompatibilidade
	 ' entre algumas versões de Excel vs Sistema Operativo
	 Dim oldCI As CultureInfo = CurrentThread.CurrentCulture
	 CurrentThread.CurrentCulture = New CultureInfo("en-US")
	 ' Adiciona um workbook e activa a worksheet actual
	 objExcelBook2 = objExcelApp2.Workbooks.Open("C:\DISCO2\DESENVOLVIMENTO\orcamento.xls")
	 objExcelSheet2 = CType(objExcelBook2.Worksheets(1), Excel.Worksheet)
	 ' Ciclo nos cabeçalhos para escrever os títulos a bold/negrito
	 Dim dgvColumnIndex As Int16 = 2
	 For Each col As DataGridViewColumn In dgvName.Columns
		 'AQUI SE DEFINE EM QUE LINHA COMEÇA A SER ESCRITO O CABEÇALHO NO EXCEL
		 objExcelSheet2.Cells(5, dgvColumnIndex) = col.HeaderText
		 objExcelSheet2.Cells(2, dgvColumnIndex).Font.Bold = True
		 dgvColumnIndex += 1
	 Next
	 ' Ciclo nas linhas/células
	 'AQUI SE DEFINE EM QUE LINHA COMEÇAM A SER ESCRITOS OS VALORES DO DATAGRIDVIEW
	 Dim dgvRowIndex As Integer = 6
	 For Each row As DataGridViewRow In dgvName.Rows
		 'COLUNA ONDE COMEÇAM A SER INTRODUZIDOS OS VALORES DO DATAGRIDVIEW
		 Dim dgvCellIndex As Integer = 2
		 For Each cell As DataGridViewCell In row.Cells
			 objExcelSheet2.Cells(dgvRowIndex, dgvCellIndex) = cell.Value
			 'ESPAÇO ENTRE COLUNAS
			 dgvCellIndex += 1
		 Next
		 'ESPAÇO ENTRE LINHAS
		 dgvRowIndex += 1
	 Next
	 ' Ajusta o largura das colunas automaticamente
	 objExcelSheet2.Columns.AutoFit()

	 ' ****************************************************************************************************************
	 ' ****************************************************************************************************************
	 DataGridView4.Rows.Clear()
	 'Este sub vai carregar a datagridview4 com dados
	 ler_listadespesa()
	 ' Ciclo nos cabeçalhos para escrever os títulos a bold/negrito
	 Dim dgvColumnIndex2 As Int16 = 5
	 For Each col As DataGridViewColumn In dgvName.Columns
		 'AQUI SE DEFINE EM QUE LINHA COMEÇA A SER ESCRITO O CABEÇALHO NO EXCEL
		 objExcelSheet2.Cells(5, dgvColumnIndex2) = col.HeaderText
		 objExcelSheet2.Cells(2, dgvColumnIndex2).Font.Bold = True
		 dgvColumnIndex2 += 1
	 Next
	 ' Ciclo nas linhas/células
	 'AQUI SE DEFINE EM QUE LINHA COMEÇAM A SER ESCRITOS OS VALORES DO DATAGRIDVIEW
	 Dim dgvRowIndex2 As Integer = 6
	 For Each row As DataGridViewRow In dgvName.Rows
		 'COLUNA ONDE COMEÇAM A SER INTRODUZIDOS OS VALORES DO DATAGRIDVIEW
		 Dim dgvCellIndex2 As Integer = 5
		 For Each cell As DataGridViewCell In row.Cells
			 objExcelSheet2.Cells(dgvRowIndex, dgvCellIndex2) = cell.Value
			 'ESPAÇO ENTRE COLUNAS
			 dgvCellIndex2 += 1
		 Next
		 'ESPAÇO ENTRE LINHAS
		 dgvRowIndex2 += 1
	 Next
	 ' Ajusta o largura das colunas automaticamente
	 objExcelSheet2.Columns.AutoFit()
	 ' ****************************************************************************************************************
	 ' ****************************************************************************************************************

	 ' Caso a opção seja gravar (xlsSaveAs) grava o ficheiro e fecha
	 ' o Workbook/Excel. Caso contrário (xlsOpen) abre o Excel
	 If [option] = xlsOption2.xlsSaveAs Then
		 'objExcelBook2.SaveAs(fileName)
		 objExcelBook2.Save()
		 objExcelBook2.Close()
		 objExcelApp2.Quit()
		 MessageBox.Show("Ficheiro exportado com sucesso para: " & fileName)
	 Else
		 objExcelApp2.Visible = True
	 End If
	 ' Altera a tipo/localização para actual
	 CurrentThread.CurrentCulture = oldCI
 Catch ex As Exception
	 MessageBox.Show("Erro não identificado. Mensagem original:" & vbNewLine + ex.Message)
 Finally
	 objExcelSheet2 = Nothing
	 objExcelBook2 = Nothing
	 objExcelApp2 = Nothing
	 ' O GC(garbage collector) recolhe a memória não usada pelo sistema.
	 ' O método Collect() força a recolha e a opção WaitForPendingFinalizers
	 ' espera até estar completo. Desta forma o EXCEL.EXE não fica no
	 ' Task Manager(gestor tarefas) ocupando memória desnecessariamente
	 ' (devem ser chamados duas vezes para maior garantia)
	 GC.Collect()
	 GC.WaitForPendingFinalizers()
	 GC.Collect()
	 GC.WaitForPendingFinalizers()
 End Try
End Sub

A questão é que funciona tudo bem, mas neste bloco de código que adicionei e meto em baixo, ele só me mete o cabeçalho da datagridview4. No entanto os valores anterior da datagrid foram preenchidos, no 2º preenchimento que seria neste código ele já não preenche, apenas coloca o cabeçalho.

	 ' ****************************************************************************************************************
	 ' ****************************************************************************************************************
	 DataGridView4.Rows.Clear()
	 'Este sub vai carregar a datagridview4 com dados
	 ler_listadespesa()
	 ' Ciclo nos cabeçalhos para escrever os títulos a bold/negrito
	 Dim dgvColumnIndex2 As Int16 = 5
	 For Each col As DataGridViewColumn In dgvName.Columns
		 'AQUI SE DEFINE EM QUE LINHA COMEÇA A SER ESCRITO O CABEÇALHO NO EXCEL
		 objExcelSheet2.Cells(5, dgvColumnIndex2) = col.HeaderText
		 objExcelSheet2.Cells(2, dgvColumnIndex2).Font.Bold = True
		 dgvColumnIndex2 += 1
	 Next
	 ' Ciclo nas linhas/células
	 'AQUI SE DEFINE EM QUE LINHA COMEÇAM A SER ESCRITOS OS VALORES DO DATAGRIDVIEW
	 Dim dgvRowIndex2 As Integer = 6
	 For Each row As DataGridViewRow In dgvName.Rows
		 'COLUNA ONDE COMEÇAM A SER INTRODUZIDOS OS VALORES DO DATAGRIDVIEW
		 Dim dgvCellIndex2 As Integer = 5
		 For Each cell As DataGridViewCell In row.Cells
			 objExcelSheet2.Cells(dgvRowIndex, dgvCellIndex2) = cell.Value
			 'ESPAÇO ENTRE COLUNAS
			 dgvCellIndex2 += 1
		 Next
		 'ESPAÇO ENTRE LINHAS
		 dgvRowIndex2 += 1
	 Next
	 ' Ajusta o largura das colunas automaticamente
	 objExcelSheet2.Columns.AutoFit()
	 ' ****************************************************************************************************************

Podem dar-me uma ajuda sff

Se existir outra forma mais simples de colocar informação de 2 datagridviews num ficheiro de excel, agradecia-me que indicassem

Obrigado

Edited by apocsantos
geshi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.