Inquiridor
Exportar do sql para excel não funciona no IIS 7.5

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
Todas as Respostas
-
-
-
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 IfPergunta forum
-
-
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