none
Exportar do sql para excel não funciona no IIS 7.5 RRS feed

  • Pergunta

  • Olá pessoal, estou fazendo uma consulta no sql e exportando os dados para o excel usando Microsoft.Office.Interop.Excel.

    Funciona lindo na minha máquina, mas quando coloco no servidor, no IIS 7.5 ele mostra a seguinte mensagem quando tento gerar o excel: 

    O Microsoft Office Excel não pode abrir ou salvar mais documentos, porque não há memória ou espaço em disco suficiente disponíveis. • Para disponibilizar mais memória, feche as pastas de trabalho ou programas que não são mais necessários. • Para liberar espaço em disco, remova os arquivos desnecessários do disco em que você esta salvando.

    Alguém pode me dar uma luz?

    Obrigada!

    Segue  o fonte.

     Dim dt As New DataTable
            Dim oRel As New Relatorio
            Dim linha As Integer = 3
            Dim nColunas As Integer
            Dim oRet As New RetornoGenerico
            Dim objExcel As New Excel.Application
            Dim Pasta1 As Excel.Workbook
            Dim Plan1 As Excel.Worksheet


            Try


            
                    dt = oRel.GerarRelatorioExcel)


                    If dt.Rows.Count > 0 Then


                        'Define uma aplicação em Excel
                        'objExcel = New Excel.Application()


                        'Define uma (Pasta) (Arquivo de planilhas)
                        Pasta1 = objExcel.Workbooks.Add()


                        'Define uma planilha
                        Plan1 = objExcel.Worksheets.Add()
                        Plan1.Name = "RELATORIO"
                        Plan1.Activate()


                        'Definindo Títulos
                        objExcel.ActiveSheet.Range("A1:U1").merge()
                        objExcel.ActiveSheet.Cells(1, 1).Font.Bold = True
                        objExcel.ActiveSheet.Cells(1, 1).Value = txtNomeArq.Text.ToUpper
                        objExcel.ActiveSheet.cells(1, 1).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                        objExcel.ActiveSheet.Range("A2:U2").merge()
                        objExcel.ActiveSheet.Cells(2, 1).Font.Bold = True
                        If hdnDivisao.Value = "0" Then
                            objExcel.ActiveSheet.Cells(2, 1).Value = "TODAS AS DIVISÕES - BUDGET"
                        Else
                            objExcel.ActiveSheet.Cells(2, 1).Value = hdnDivisao.Value & " - BUDGET"
                        End If
                        objExcel.ActiveSheet.cells(2, 1).HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                        objExcel.ActiveSheet.Cells(3, 1).Value = "TITLE"
                        objExcel.ActiveSheet.Cells(3, 2).Value = "FASE"
                        objExcel.ActiveSheet.Cells(3, 3).Value = "PDFS"
                        objExcel.ActiveSheet.Cells(3, 4).Value = "DISTR."
                        objExcel.ActiveSheet.Cells(3, 5).Value = "PRICE"
                        objExcel.ActiveSheet.Cells(3, 6).Value = "FORMAT"
                        objExcel.ActiveSheet.Cells(3, 7).Value = "BINDING"
                        objExcel.ActiveSheet.Cells(3, 8).Value = "PAGES"
                        objExcel.ActiveSheet.Cells(3, 9).Value = "P."
                        objExcel.ActiveSheet.Cells(3, 10).Value = "JAN."
                        objExcel.ActiveSheet.Cells(3, 11).Value = "FEB."
                        objExcel.ActiveSheet.Cells(3, 12).Value = "MAR."
                        objExcel.ActiveSheet.Cells(3, 13).Value = "APR."
                        objExcel.ActiveSheet.Cells(3, 14).Value = "MAY"
                        objExcel.ActiveSheet.Cells(3, 15).Value = "JUN."
                        objExcel.ActiveSheet.Cells(3, 16).Value = "JUL."
                        objExcel.ActiveSheet.Cells(3, 17).Value = "AUG."
                        objExcel.ActiveSheet.Cells(3, 18).Value = "SEPT."
                        objExcel.ActiveSheet.Cells(3, 19).Value = "OCT."
                        objExcel.ActiveSheet.Cells(3, 20).Value = "NOV."
                        objExcel.ActiveSheet.Cells(3, 21).Value = "DEC."


                        'Preenchendo Células
                        For Each dr As DataRow In dt.Rows
                            linha += 1


                            objExcel.ActiveSheet.Cells(linha, 1).Value = dr.Item("descricao_pdfs")
                            objExcel.ActiveSheet.Cells(linha, 2).Value = dr.Item("fase")
                            objExcel.ActiveSheet.Cells(linha, 3).Value = dr.Item("cod_pdfs")
                            objExcel.ActiveSheet.Cells(linha, 4).Value = dr.Item("distribuicao")
                            objExcel.ActiveSheet.Cells(linha, 5).Value = dr.Item("preco")
                            objExcel.ActiveSheet.Cells(linha, 6).Value = dr.Item("formato")
                            objExcel.ActiveSheet.Cells(linha, 7).Value = dr.Item("binding")
                            objExcel.ActiveSheet.Cells(linha, 8).Value = dr.Item("qtde_paginas")
                            objExcel.ActiveSheet.Cells(linha, 9).Value = dr.Item("periodicidade")
                            objExcel.ActiveSheet.Cells(linha, 10).Value = dr.Item("edicao_jan")
                            objExcel.ActiveSheet.Cells(linha, 11).Value = dr.Item("edicao_fev")
                            objExcel.ActiveSheet.Cells(linha, 12).Value = dr.Item("edicao_mar")
                            objExcel.ActiveSheet.Cells(linha, 13).Value = dr.Item("edicao_abr")
                            objExcel.ActiveSheet.Cells(linha, 14).Value = dr.Item("edicao_mai")
                            objExcel.ActiveSheet.Cells(linha, 15).Value = dr.Item("edicao_jun")
                            objExcel.ActiveSheet.Cells(linha, 16).Value = dr.Item("edicao_jul")
                            objExcel.ActiveSheet.Cells(linha, 17).Value = dr.Item("edicao_ago")
                            objExcel.ActiveSheet.Cells(linha, 18).Value = dr.Item("edicao_set")
                            objExcel.ActiveSheet.Cells(linha, 19).Value = dr.Item("edicao_out")
                            objExcel.ActiveSheet.Cells(linha, 20).Value = dr.Item("edicao_nov")
                            objExcel.ActiveSheet.Cells(linha, 21).Value = dr.Item("edicao_dez")


                            If dr.Item("edicao_jan").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 10).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_fev").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 11).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_mar").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 12).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_abr").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 13).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_mai").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 14).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_jun").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 15).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_jul").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 16).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_ago").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 17).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_set").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 18).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_out").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 19).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_nov").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 20).NumberFormat = "000"
                            End If
                            If dr.Item("edicao_dez").ToString.Length = 3 Then
                                objExcel.ActiveSheet.Cells(linha, 21).NumberFormat = "000"
                            End If


                            'objExcel.ActiveSheet.Cells(linha, 4).NumberFormat = "###.###.##0,00"
                        Next


                        'Formatando Colunas
                        objExcel.ActiveSheet.Columns(1).EntireColumn.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft
                        For nColunas = 2 To 21
                            objExcel.ActiveSheet.Columns(nColunas).EntireColumn.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
                        Next


                        For nColunas = 1 To 21
                            objExcel.ActiveSheet.Cells(3, nColunas).Font.Bold = True
                            objExcel.ActiveSheet.Columns(nColunas).EntireColumn.AutoFit()
                        Next


                        'Desenhando Bordas
                        For nColunas = 1 To 21
                            objExcel.ActiveCell.Cells(1, nColunas).Borders.LineStyle = Excel.XlBordersIndex.xlEdgeLeft
                        Next


                        For y As Integer = 3 To linha
                            For z As Integer = 1 To 21
                                objExcel.ActiveCell.Cells(y, z).Borders.LineStyle = Excel.XlBordersIndex.xlEdgeLeft
                                objExcel.ActiveCell.Cells(1, 1).Borders.LineStyle = Excel.XlBordersIndex.xlEdgeLeft
                            Next
                        Next


                        'Tipo e Tamanho de Fonte
                        With objExcel.ActiveSheet.Cells.Font
                            .Name = "Arial"
                            .Size = 10
                        End With
                        objExcel.ActiveSheet.Cells(1, 1).Font.Size = 24
                        objExcel.ActiveSheet.Cells(2, 1).Font.Size = 22


                        'objExcel.Application.Visible = True
                        objExcel.Visible = True
                        objExcel.UserControl = True
                        objExcel = Nothing
                        Pasta1 = Nothing
                        Plan1 = Nothing



    Pergunta forum

    terça-feira, 3 de abril de 2012 13:35

Todas as Respostas

  • Boa Noite Juleca,

    Conseguiu resolver este problema? Estou com a mesma dificuldade.

    Obriigado

    quinta-feira, 14 de junho de 2012 22:30
  • O que acontece é que essas dlls interop do excel foram feitas para serem usadas em aplicações locais, não no servidor.

    Não tenho certeza mas acho que nesse caso você teria que instalar o excel no servidor.


    http://samuelcazelli.blogspot.com/

    sexta-feira, 15 de junho de 2012 09:58
  • Bom dia Rodrigo. 

    Citando o comentário do Samuel, eu fiz a instalação do excel no servidor, mas não resolveu o problema. Depois de diversas tentativas eu acabei desistindo de usar o Interop.Excel e troquei para o código abaixo.

    Não é tão maleável, mas serviu para o que eu precisava. 

    grdRelatorio1.DataSource = dt
            grdRelatorio1.DataBind()


            'se o grid tiver mais que 65536  linhas não podemos exportar
            If grdRelatorio1.Rows.Count.ToString + 1 < 65536 Then

                'grdRelatorio1.AllowPaging = "False"
                'grdRelatorio1.DataBind()

                Response.Clear()

                'Response.Buffer = True

                'Response.AddHeader("Content-Disposition", "attachment; filename=MyExcelFileName.xls")
                Response.AddHeader("content-disposition", "attachment;filename=" & saveAsFile & ".xls")
                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"

                'grdRelatorio1.DataType = System.Type.GetType("System.String")

                'Abaixo codifica os caracteres para o alfabeto latino
                Response.ContentEncoding = System.Text.Encoding.GetEncoding("Windows-1252")
                Response.Charset = "ISO-8859-1"
                'Desabilita o ViewState
                EnableViewState = False

                Dim writer As New System.IO.StringWriter()

                Dim html As New System.Web.UI.HtmlTextWriter(writer)
                grdRelatorio1.RenderControl(html)

                Response.Write(writer)

                Response.End()

                'grdRelatorio1.AllowPaging = "True"
                'grdRelatorio1.DataBind()

            Else
                MsgBox("planilha possui muitas linhas, não é possível exportar para o Excel")
            End If


    Pergunta forum

    sexta-feira, 15 de junho de 2012 11:52
  • Altere o Application Pool no IIS, habilitando aplicativos de 32Bits.
    terça-feira, 7 de agosto de 2012 16:56
  • Altere o Application Pool no IIS, habilitando aplicativos de 32Bits.

    Se fizer isso, irá gerar outro tipo de problema, como ter que reconfigurar todas as DSN de Fonte de Dados para também rodar em 32bits.

    É mais fácil mudar a forma como se exporta o relatório do que modificar a estrutura do servidor.


    Rafael Santos
    E-mail: rsdsantos@gmail.com

    Pequeno Gafanhoto


    • Editado Rafa Santos terça-feira, 7 de agosto de 2012 17:12
    terça-feira, 7 de agosto de 2012 17:12