Ir para conteúdo
Fórum Script Brasil
  • 0

(RESOLVIDO) Problemas com Excel


Xistyle

Pergunta

Pessoal, boa noite!

Passei o dia todo pesquisando na net, mas nada me adiantou. Espero que possam em ajudar. Tenho uma aplicação que possui relatórios. Os relatórios podem ser exportados via Excel ou Crystal. Quando escolhido Excel, a rotina de exportação chama uma classe que criei que não estava dando problema algum... Contudo, de ontem pra hoje, começou a dar uns "paus".

Os erros que ocorrem são:

- Exception from HRESULT: 0x800A0E3C

- A first chance exception of type 'System.Runtime.InteropServices.COMException' occurred in mscorlib.dll

Não faço idéia do que seja! Cada site passa uma informação. Alguém já teve esse erro e foi resolvido? Acho que não é erro no código, pois o delimitei o SELECT que traz os dados, não incluindo o registro que apresentou erro e funcionou. Ainda assim, com outros filtros, funciona normalmente. ****** UPDATE: Realizei um teste removendo os dados de algumas linhas e mesmo assim o erro persistiu ******

Lembrando que é uma rotina genérica. Abaixo segue o código:

Imports Microsoft.Office.Interop
Imports System.Runtime.InteropServices

Public Class clsExcel

    '# Rotina que recebe o cabeçalho e exporta os dados para o Excel
    Public Sub gfcnExportarExcel(ByRef dtbDados As System.Data.DataTable, ByVal lstrNomeArquivo As String, Optional ByVal lintProcessoExistente As Integer = 0)
        Dim lobjExcel As New Excel.Application()
        Dim lbokPasta As Excel.Workbook
        Dim lshtPlanilha As New Excel.Worksheet
        Dim lcdlArquivo As New SaveFileDialog
        Dim lintContador As Integer
        Dim lintSomaProcesso As Integer = 0
        Dim lintIDProcesso As Integer = 0
        Dim lstrExtensao As String
        Dim lstrUltimaColuna As String = ""
        Dim lstrUltimaLinhaExcel As String
        Dim lproExcel As Process = Nothing

        Try
            '# Verifica se o Excel está instalado na máquina
            If lobjExcel Is Nothing Then
                MessageBox.Show("O Excel não foi encontrado neste computador. Verifique se está corretamente instalado!", "DIG", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Exit Sub
            End If

            '# Cria a pasta de trabalho
            lbokPasta = lobjExcel.Workbooks.Add

            '# Verifica se o documento possui mais de uma planilha (que não seja a que estamos exportando)
            '# e as exclui.
            If lbokPasta.Worksheets.Count > 1 Then

                For lintPlanilha As Integer = 1 To 3

                    If lintPlanilha = 3 Then
                        '# Cria a planilha e atribui o nome
                        lshtPlanilha = lbokPasta.Worksheets.Add()
                        lbokPasta.Worksheets.Item(1).Name = "Relatório"
                        lbokPasta.Sheets(2).Delete()
                    Else
                        lbokPasta.Sheets(lintPlanilha).Delete()
                    End If

                Next

            End If

            lintContador = 0

            '# Pega a extensão do arquivo e última linha do Excel, dependendo da versão
            lstrExtensao = Microsoft.VisualBasic.Right(lstrNomeArquivo, 4)
            lstrUltimaLinhaExcel = IIf(UCase(lstrExtensao) = ".XLS", "65536", "1048576")

            '# Formata o cabeçalho    
            For Each colCabecalho As DataColumn In dtbDados.Columns

                '# Realiza o teste para importar apenas colunas que não contenham as IDS
                If Mid(colCabecalho.Caption, 1, 2) <> "ID" Or colCabecalho.Caption = "ID_PUB" Then
                    lintContador += 1

                    With lshtPlanilha
                        .Cells(1, lintContador) = colCabecalho.Caption
                        .Cells(1, lintContador).Font.Bold = True
                        .Cells(1, lintContador).Font.Color = RGB(255, 255, 255) 'Branco
                        .Cells(1, lintContador).Interior.ColorIndex = 5 'Azul

                        '# Recebe a última coluna da planilha e alinha o texto do cabeçalho no centro
                        lstrUltimaColuna = Replace(lshtPlanilha.Cells(1, lintContador).Address(False, False), lshtPlanilha.Cells(1, lintContador).Row, "")
                        .Range(lstrUltimaColuna + "1").HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter

                    End With

                End If

            Next

            lintContador = 0

            '# Passa os valores do DataTable para as células do Excel
            '# Preenche a primera coluna
            For Each lcolColuna As DataColumn In dtbDados.Columns

                '# Verifica se a coluna que irá ser preenchida não é uma coluna de ID 
                If Mid(lcolColuna.Caption, 1, 2) <> "ID" Or lcolColuna.Caption = "ID_PUB" Then

                    '# Preenche as linhas
                    For llngLinha As Integer = 0 To (dtbDados.Rows.Count - 1)

                        '# Troca os ENTERs do campo texto por espaços
                        If UCase(lcolColuna.Caption) = "TEXTO" Then
                            lshtPlanilha.Cells((llngLinha + 2), (lcolColuna.Ordinal - lintContador) + 1) = lfcnTrocaCaracteres(CType(dtbDados.Rows(llngLinha).ItemArray(lcolColuna.Ordinal), String))
                        Else
                            lshtPlanilha.Cells((llngLinha + 2), (lcolColuna.Ordinal - lintContador) + 1) = dtbDados.Rows(llngLinha).ItemArray(lcolColuna.Ordinal)
                        End If

                        System.Windows.Forms.Application.DoEvents()
                        Debug.Print(dtbDados.Rows(llngLinha).ItemArray(0).ToString + " - " + dtbDados.Rows(llngLinha).ItemArray(lcolColuna.Ordinal).ToString)
                    Next

                    lintContador -= 1
                End If

                System.Windows.Forms.Application.DoEvents()
                lintContador += 1

            Next

            '# Formata a fonte
            lshtPlanilha.Range("A1:" + lstrUltimaColuna + (Convert.ToString(dtbDados.Rows.Count + 1))).Font.Name = "Calibri"

            '# Limita a altura e largura de campos com quantidade de caracteres muito grande
            lshtPlanilha.Rows.RowHeight = 14.25

            '# Configura o estilo da borda e tamanho
            lshtPlanilha.Range("A1:" + lstrUltimaColuna + (Convert.ToString(dtbDados.Rows.Count + 1))).Borders.LineStyle = Excel.XlLineStyle.xlContinuous
            lshtPlanilha.Range("A1:" + lstrUltimaColuna + (Convert.ToString(dtbDados.Rows.Count + 1))).Borders(Excel.XlBordersIndex.xlEdgeBottom).Weight = 4
            lshtPlanilha.Range("A1:" + lstrUltimaColuna + (Convert.ToString(dtbDados.Rows.Count + 1))).Borders(Excel.XlBordersIndex.xlEdgeLeft).Weight = 4
            lshtPlanilha.Range("A1:" + lstrUltimaColuna + (Convert.ToString(dtbDados.Rows.Count + 1))).Borders(Excel.XlBordersIndex.xlEdgeRight).Weight = 4
            lshtPlanilha.Range("A1:" + lstrUltimaColuna + (Convert.ToString(dtbDados.Rows.Count + 1))).Borders(Excel.XlBordersIndex.xlEdgeTop).Weight = 4

            '# Salva o arquivo com o nome especificado no SaveFileDialog que chamou a rotina de exportação
            lbokPasta.SaveAs(lstrNomeArquivo)

            MessageBox.Show("Relatório exportado com sucesso!", "DIG", MessageBoxButtons.OK, MessageBoxIcon.Information)

            Marshal.FinalReleaseComObject(lshtPlanilha)

            lbokPasta.Close(SaveChanges:=False)
            Marshal.FinalReleaseComObject(lbokPasta)

            lobjExcel.Quit()
            Marshal.FinalReleaseComObject(lobjExcel)

            lobjExcel = Nothing
            lbokPasta = Nothing
            lshtPlanilha = Nothing

        Catch ex As Exception
            MessageBox.Show("Ocorreu um erro durante o processo de exportação." + vbCrLf + _
                            "Erro:" + vbCrLf + _
                            ex.Message, "DIG", MessageBoxButtons.OK, MessageBoxIcon.Error)

        Finally

            '# Faz a soma de todos os Excel's abertos, incluindo o relatório
            For Each lproProcesso As Process In Process.GetProcessesByName("EXCEL")
                lintSomaProcesso += lproProcesso.Id
            Next lproProcesso

            lintIDProcesso = lintSomaProcesso - lintProcessoExistente
            If lintIDProcesso <> 0 Then lproExcel = Process.GetProcessById(lintIDProcesso)

            If lproExcel IsNot Nothing Then
                lproExcel.Kill()
            End If

        End Try

    End Sub

        Private Function lfcnTrocaCaracteres(ByVal lstrValorCampo As String) As String
        Dim lstrCaracterEspecial(97) As String
        Dim lintContador As Integer

        lstrCaracterEspecial(0) = Chr(9)    'Tab
        lstrCaracterEspecial(1) = Chr(11)   'Tab
        lstrCaracterEspecial(2) = Chr(13)   'Enter
        lstrCaracterEspecial(3) = Chr(127)  'DEL
        lstrCaracterEspecial(4) = Chr(128)  '€
        lstrCaracterEspecial(5) = Chr(129)  '
        lstrCaracterEspecial(6) = Chr(131)  'ƒ
        lstrCaracterEspecial(7) = Chr(132)  '„
        lstrCaracterEspecial(8) = Chr(133)  '…
        lstrCaracterEspecial(9) = Chr(134)  '†
        lstrCaracterEspecial(10) = Chr(135) '‡
        lstrCaracterEspecial(11) = Chr(136) 'ˆ
        lstrCaracterEspecial(12) = Chr(137) '‰
        lstrCaracterEspecial(13) = Chr(138) 'Š
        lstrCaracterEspecial(14) = Chr(139) '‹
        lstrCaracterEspecial(15) = Chr(140) 'Œ
        lstrCaracterEspecial(16) = Chr(141) '
        lstrCaracterEspecial(17) = Chr(142) 'Ž
        lstrCaracterEspecial(18) = Chr(143) '
        lstrCaracterEspecial(19) = Chr(144) '
        lstrCaracterEspecial(20) = Chr(145) '‘
        lstrCaracterEspecial(21) = Chr(147) '“
        lstrCaracterEspecial(22) = Chr(148) '”
        lstrCaracterEspecial(23) = Chr(149) '•
        lstrCaracterEspecial(24) = Chr(152) '˜
        lstrCaracterEspecial(25) = Chr(153) '™
        lstrCaracterEspecial(26) = Chr(154) 'š
        lstrCaracterEspecial(27) = Chr(155) '›
        lstrCaracterEspecial(28) = Chr(156) 'œ
        lstrCaracterEspecial(29) = Chr(157) '
        lstrCaracterEspecial(30) = Chr(158) 'ž
        lstrCaracterEspecial(31) = Chr(159) 'Ÿ
        lstrCaracterEspecial(32) = Chr(161) '¡
        lstrCaracterEspecial(33) = Chr(162) '¢
        lstrCaracterEspecial(34) = Chr(163) '£
        lstrCaracterEspecial(35) = Chr(164) '¤
        lstrCaracterEspecial(36) = Chr(165) '¥
        lstrCaracterEspecial(37) = Chr(166) '¦
        lstrCaracterEspecial(38) = Chr(167) '§
        lstrCaracterEspecial(39) = Chr(168) '¨
        lstrCaracterEspecial(40) = Chr(169) '©
        lstrCaracterEspecial(41) = Chr(171) '«
        lstrCaracterEspecial(42) = Chr(172) '¬
        lstrCaracterEspecial(43) = Chr(174) '®
        lstrCaracterEspecial(44) = Chr(175) '¯
        lstrCaracterEspecial(45) = Chr(177) '±
        lstrCaracterEspecial(46) = Chr(180) '´
        lstrCaracterEspecial(47) = Chr(181) 'µ
        lstrCaracterEspecial(48) = Chr(182) '¶
        lstrCaracterEspecial(49) = Chr(183) '·
        lstrCaracterEspecial(50) = Chr(184) '¸
        lstrCaracterEspecial(51) = Chr(187) '»
        lstrCaracterEspecial(52) = Chr(188) '¼
        lstrCaracterEspecial(53) = Chr(189) '½
        lstrCaracterEspecial(54) = Chr(190) '¾
        lstrCaracterEspecial(55) = Chr(191) '¿
        lstrCaracterEspecial(56) = Chr(198) 'Æ
        lstrCaracterEspecial(57) = Chr(208) 'Ð
        lstrCaracterEspecial(58) = Chr(215) '×
        lstrCaracterEspecial(59) = Chr(216) 'Ø
        lstrCaracterEspecial(60) = Chr(221) 'Ý
        lstrCaracterEspecial(61) = Chr(222) 'Þ
        lstrCaracterEspecial(62) = Chr(223) 'ß
        lstrCaracterEspecial(63) = Chr(230) 'æ
        lstrCaracterEspecial(64) = Chr(248) 'ø
        lstrCaracterEspecial(65) = Chr(253) 'ý
        lstrCaracterEspecial(66) = Chr(254) 'þ
        lstrCaracterEspecial(67) = Chr(255) 'ÿ
        lstrCaracterEspecial(68) = Chr(1)   '
        lstrCaracterEspecial(69) = Chr(2)   '
        lstrCaracterEspecial(70) = Chr(3)   '
        lstrCaracterEspecial(71) = Chr(4)   '
        lstrCaracterEspecial(72) = Chr(5)   '
        lstrCaracterEspecial(73) = Chr(6)   '
        lstrCaracterEspecial(74) = Chr(7)   '
        lstrCaracterEspecial(75) = Chr(8)   '
        lstrCaracterEspecial(76) = Chr(10)  '
        lstrCaracterEspecial(77) = Chr(11)  '
        lstrCaracterEspecial(78) = Chr(12)  '
        lstrCaracterEspecial(79) = Chr(14)  '
        lstrCaracterEspecial(80) = Chr(15)  '
        lstrCaracterEspecial(81) = Chr(16)  '
        lstrCaracterEspecial(82) = Chr(17)  '
        lstrCaracterEspecial(83) = Chr(18)  '
        lstrCaracterEspecial(84) = Chr(19)  '
        lstrCaracterEspecial(85) = Chr(20)  '
        lstrCaracterEspecial(86) = Chr(21)  '
        lstrCaracterEspecial(87) = Chr(22)  '
        lstrCaracterEspecial(88) = Chr(23)  '
        lstrCaracterEspecial(89) = Chr(24)  '
        lstrCaracterEspecial(90) = Chr(25)  '
        lstrCaracterEspecial(91) = Chr(26)  '
        lstrCaracterEspecial(92) = Chr(27)  '
        lstrCaracterEspecial(93) = Chr(28)  '
        lstrCaracterEspecial(94) = Chr(29)  '
        lstrCaracterEspecial(95) = Chr(30)  '
        lstrCaracterEspecial(96) = Chr(31)  '
        lstrCaracterEspecial(97) = "#"

        lfcnTrocaCaracteres = ""

        For lintContador = 0 To UBound(lstrCaracterEspecial)

            If InStr(1, lstrValorCampo, lstrCaracterEspecial(lintContador)) > 0 Then

                If lintContador = 23 Or lintContador = 49 Then '• ou ·
                    lstrValorCampo = Replace(lstrValorCampo, lstrCaracterEspecial(lintContador), "*")
                Else
                    lstrValorCampo = Replace(lstrValorCampo, lstrCaracterEspecial(lintContador), " ")
                End If

            End If

        Next

        lfcnTrocaCaracteres = lstrValorCampo

    End Function

End Class

Editado por Xistyle
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Encontrei o erro neste meu caso! O erro 0x800A0E3C é genérico, devido a dll que apresentou o erro ser de uso geral pelo VS.

Assim encontrei um único site falando que poderia ser um erro de leitura no Excel, que o Excel entenderia o dado como uma fórmula. E era isso mesmo! O dado iniciava com =====, ou seja, o Excel não encontrou a fórmula (exemplo: =SOMA(A1:A10)).

Com isso, coloquei uma rotina apenas para incluir um espaço em branco para corrigir! P$%@ workaround mas funfou!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...