Pergunta

Fundo

Estamos desenvolvendo alguns utilitários em casa usando ASP.NET 2.0. Uma delas é extrair algumas informações de bancos de dados e construção de um livro do Excel que contém uma série de planilhas com dados com base em consultas no banco de dados.

Problema

O protótipo de prova de conceito (uma página ASP.NET simples que consulta um único item do banco de dados e abre Excel para adicionar dados para uma planilha) está funcionando bem quando executado localmente nas máquinas de desenvolvimento, felizmente criar e exibir planilha do Excel, conforme solicitado. No entanto, quando executado em nosso servidor, nós temos o seguinte erro ao tentar instanciar Excel.

Não é possível para objeto elenco COM do tipo 'Microsoft.Office.Interop.Excel.ApplicationClass' para tipo de interface 'Microsoft.Office.Interop.Excel._Application'. Esta operação falhou porque a chamada QueryInterface no componente COM para a interface com IID '{000208D5-0000-0000-C000-000000000046}' falhou devido ao seguinte erro: Nenhuma interface suportada (exceção de HRESULT: 0x80004002 (E_NOINTERFACE)) .

Solução?

Estamos usando o PIA para o Excel 2003 e temos Excel 2003 ea PIA instalado no servidor. Alguém pode explicar por que isso não está funcionando ou nos dar algumas dicas sobre como podemos acompanhar o baixo problema?

Obrigado por qualquer ajuda que você pode proporcionar.

Foi útil?

Solução

Pode o usuário que as pistas de pool de aplicativos ASP.NET sob têm acesso ao aplicativo? Tente fazer login como esse usuário (ou alterar o pool de aplicativos para executar como esse usuário) e abrindo Excel. Se isso funcionar, tente executar um aplicativo WinForms no servidor como o usuário com o código que está falhando.

Não tenho certeza, mas acho que as assembleias PIA pode precisar ser registrado via regsvr32.

Eu suspeito que se você executar como serviço de rede, você não será capaz de iniciar o Excel (login não interativa, conta restrita, etc). Seu código ASP.NET é executado dentro do pool de aplicativos. Você pode alterar o usuário do pool de aplicativos é executado como através do gerenciador de IIS. Se você quiser verificar o que o código está sendo executado como olhar para o processo de w3wp no Gerenciador de tarefas.

Para o teste, altere o pool de aplicativos para executar como o usuário que você sabe que funciona com Excel.

Outras dicas

Nós usamos Aspose (comercial). Office em um servidor não é muito divertido.

  • Você tem que ter cuidado com o licenciamento.
  • De vez em quando você precisa matar um processo de suspensão.
  • Obtendo os direitos direita leva algum esforço.

É chamado PI (t) Um por um motivo ...

Considere trabalhar com XLSX (Novo no Office 2007, mas há um plug-in para o Office 2003), que são apenas ZIP arquivos contendo arquivos XML que você pode manipular sem a necessidade de Excel. O (baseado em XML) SpreadsheetML é bem documentada e não muito complicado para programa contra (você pode até achar um LINQ to SpreadsheetML em algum lugar na web).

Como foi apontado acima, o Excel não é realmente um produto de servidor e você pode correr em todos os tipos de problemas quando usá-lo em um servidor.

Eu acho que o problema é que uma vez que você implantar seu aplicativo para o IIS de repente você está correndo dentro de um MTA COM Apartment. Eu acredito que o Excel é um componente STA e, portanto, não pode ser criado dentro do MTA. Você precisará definir a opção aspcompat na página que você está usando

<%@ page aspcompat=true %>

Mais informações aqui

A partir Microsoft , (ênfase no fonte original):

Microsoft atualmente não recomendo, e não suporta, aplicativos de automação do Microsoft Office a partir de qualquer, aplicativo cliente não-interativo autônoma ou componente (incluindo ASP, ASP.NET, DCOM e serviços NT), porque o Office pode apresentar um comportamento instável e / ou impasse quando o Office é executado nesse ambiente.

Com uma lista de razões pelas quais você não deve fazê-lo:

  • ... Muitos serviços executados em contas que não têm perfis de usuário (como a conta SYSTEM ou o IWAM_ [nome do servidor] contas). Portanto, o Office pode não inicializar corretamente na inicialização. Nesta situação, o Office retorna um erro na função CreateObject ou a função CoCreateInstance. Mesmo se o aplicativo do Office pode ser iniciado, outras funções podem não funcionar corretamente se não existe nenhum perfil de usuário.
  • Se ocorrer um erro inesperado, ou se um parâmetro não especificado é necessário para completar uma função, o Office é projetado para alertar o usuário com uma caixa de diálogo modal que pede ao usuário que o usuário quer fazer. Uma caixa de diálogo modal em um desktop não interativo não pode ser descartada. Portanto, esse segmento pára de responder (trava) indefinidamente. Apesar de certas práticas de codificação podem ajudar a reduzir a probabilidade de este problema, estas práticas não pode impedir totalmente o problema. Este fato sozinho faz correr aplicações do Office de um ambiente do lado do servidor arriscado e não suportado.
  • componentes do lado do servidor precisa ser altamente reentrante, componentes COM multi-threaded que têm o mínimo de sobrecarga e alto rendimento para vários clientes. aplicativos do Office estão em quase todos os aspectos o oposto. aplicações do Office são servidores de automação não reentrante, com base em STA que são projetados para fornecer funcionalidade diversificada, mas intensivo de recursos para um único cliente.

E o seu código pode lançar os seguintes erros:

  • CoCreateInstance

    • Erro em tempo de execução '429': o componente ActiveX não pode criar objeto
    • Run-time error '70': Permissão negada
    • CO_E_SERVER_EXEC_FAILURE (0x80080005): execução no servidor falhou
    • E_ACCESSDENIED (0x80070005): Acesso negado
    • trava
    • retorna com nenhum erro, mas não funcionou

E finalmente:

Devido às limitações com o projeto do escritório, alterações à configuração do Office não são suficientes para resolver todas as questões. A Microsoft recomenda uma série de alternativas que não requerem Office para ser instalado do lado do servidor, e que pode executar tarefas mais comuns com mais eficiência e mais rapidamente do que Automation. Antes de envolver Office como um do lado do servidor componente em seu projeto, considere alternativas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top