sergiotmcardoso Posted December 4, 2012 at 11:03 PM Report #485799 Posted December 4, 2012 at 11:03 PM (edited) 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 December 6, 2012 at 08:54 AM by apocsantos geshi
sergiotmcardoso Posted December 6, 2012 at 03:57 AM Author Report #485990 Posted December 6, 2012 at 03:57 AM Boas pessoal, Ninguém respondeu, mas obrigado na mesma. Já descobri o problema, na dgvRowIndex faltava estar como dgvRowIndex2 o problema era esta linhas objExcelSheet2.Cells(dgvRowIndex, dgvCellIndex2) = cell.Value
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now