Jump to content
PMSF

[Resolvido] Exportação para Excel dá erro de datas

Recommended Posts

PMSF

boas tardes,

desta vez não consigo dar a volta ao problema.

estou a passar dados de uma DataGridView para o um novo ficheiro de excel, que funciona bem excepto para o campo data.

todas as data inferiores ao dia 12 (inclusive), passam para o formato americano, mês/dia/ano.

alguem me pode ajudar.

muito obrigado :)

Share this post


Link to post
Share on other sites
cdaniel.marques

Não sei que código estás a usar, mas tenta usar .ToString?:

.Cells(I + 2, j + 1).value = DataGridView1.Rows(I).Cells(j).Value.ToString vbnet

ou podes tentar formatar as células, após o preenchimento, para um formato pré-determinado:

Texto:

AppExcel.Columns("E:E").NumberFormat = "@"

Formato Data:

AppExcel.Columns("E:E").NumberFormat = "dd/mmm/yyyy"

substituindo a coluna "E:E", pela coluna onde tens a data

Verifica nas opções regionais o formato da data.

Edited by cdaniel.marques

Share this post


Link to post
Share on other sites
PMSF

obrigado pela resposta, só agora posso responder com mais certezas.

tenho o seguinte comando (que vi aqui num exemplo do forum ou da wiki:

Public Sub dgvExportaExtratoBCPExcel(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
	    ' Se foi seleccionada a opção xlsSaveAs e não foi indicado ficheiro
	    If [option] = xlsOption.xlsSaveAs And fileName = String.Empty Then
		    MessageBox.Show("É necessário indicar um nome para o ficheiro")
		    Exit Sub
	    End If
	    ' Adiciona um workbook e activa a worksheet actual
	    objExcelBook = objExcelApp.Workbooks.Add
	    objExcelSheet = CType(objExcelBook.Worksheets(1), Excel.Worksheet)
	    ' Ciclo nos cabeçalhos para escrever os títulos 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/células
	    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
			    Try
				    objExcelSheet.Cells(dgvRowIndex, dgvCellIndex) = cell.Value.ToString
				    dgvCellIndex += 1
			    Catch ex As Exception
			    End Try
		    Next
		    dgvRowIndex += 1
	    Next
	    ' Ajusta o largura das colunas automaticamente
	    objExcelSheet.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] = xlsOption.xlsSaveAs Then
		    objExcelBook.SaveAs(fileName)
		    objExcelBook.Close()
		    objExcelApp.Quit()
		    'MessageBox.Show("Ficheiro exportado com sucesso para: " & fileName)
	    Else
		    objExcelApp.Visible = True
	    End If
    Catch ex As Exception
	    MessageBox.Show("Erro não identificado. Mensagem original:" & vbNewLine + ex.Message)
    Finally
	    objExcelSheet = Nothing
	    objExcelBook = Nothing
	    objExcelApp = 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

o meu problema apenas ocorre nas datas com o dia inferior ou igual a 12.

porque apesar de o comando:

objExcelSheet.Cells(dgvRowIndex, dgvCellIndex) = cell.Value.ToString

a string

cell.Value.ToString

lida seja (por ex.) 01-04-2013 na célula do exel aparece 04-01-2013.

espero ter-me expressado bem :P

Share this post


Link to post
Share on other sites
bioshock

Há a propriedade numberFormat do Excel onde podes manusear o formato da data. Está em C# mas dá para perceber.

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
excelRange = excelApp.get_Range("g5", "g5");
excelRange.NumberFormat = "dd/MM/yyyy HH:mm:ss";

Share this post


Link to post
Share on other sites
PMSF

ok... adaptei e coloquei o seguinte código logo após criar e abrir o novo ficheiro excel

objExcelSheet.Range("A:B").NumberFormat = "dd/MM/yyyy"

e continua com o mesmo problema.

relembro que não é o formato que está errado, mas a infomação final

o excel assume o dia como sendo o mês e o mês como sendo o dia.

estive a ler e fiquei a pensar se não seria das definições regionais do excel....

alguem sabe sobre o tema?!

Share this post


Link to post
Share on other sites
PMSF

após tanto tempo passado desde a ultima resposta venho dar a resposta que me parece correta, pelo menos no meu caso funcionou.

neste pedaço de código:

For Each cell As DataGridViewCell In row.Cells
Try
  objExcelSheet.Cells(dgvRowIndex, dgvCellIndex) = cell.Value.ToString
  dgvCellIndex += 1
Catch ex As Exception
End Try
Next

alterei-o para:

For Each cell As DataGridViewCell In row.Cells
Try
  If dgvCellIndex = 1 Or dgvCellIndex = 2 Then
 ExportaDatas = cell.Value.ToString
 objExcelSheet.Cells(dgvRowIndex, dgvCellIndex) = ExportaDatas
  Else
 objExcelSheet.Cells(dgvRowIndex, dgvCellIndex) = cell.Value.ToString
  End If
  dgvCellIndex += 1
 Catch ex As Exception
 End Try
Next

devo referir que acrescentei a variável no inicio do código:

Dim ExportaDatas As Date

assim já não passa tudo como string, mas nestes campos (1 e 2) onde tenho datas ele assume o valor correto.

obrigado a todos pela ajuda :)

Edited by PMSF

Share this post


Link to post
Share on other sites
jcbiker

eu tenho assim:

oXLSheet1.Range("I8").Value = Format(CDate(tit.z.Inicio), "dd-MMMM-yyyy") 

Share this post


Link to post
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

×
×
  • 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.