Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

En el proyecto en el que me encuentro, tenemos desarrollada una librería .NET para obtener informes en Excel mediante la llamada a una BAPI de SAP. Esta librería trabaja con el objeto COM de Excel y al mismo tiempo es consumida desde ASP.NET, sí, ya se que Microsoft no recomienda el uso de componentes Office en aplicaciones ASP.NET, "COM Interop with Microsoft Office products from an ASP.NET web page. Excel was not designed to be used inthis way" pero esto es un caso de fuerza mayor y no hay mas narices, puesto que son informes bastantes complejos que no basta con utilizar un DataGrid y rendereizar su contenido y lanzar una salida con Response.Write y poner el Response.ContentType = "application/vnd.ms-excel, como tantos ejemplos hay por ahí.

El problema con el que me he encontrado es el siguiente:

Todas las pruebas realizadas han funcionado a la perfección en las máquinas de desarrollo (Eso de ser Administrador de máquina...) pero... cuando lo he montado en el servidor de pruebas y he hecho la primera petición de un informe me he encontrado con esto:

Acceso Denegado

Juer, pues si que empezamos bien. La primera conclusión es evidente: Falta de Permisos, así que le he arrancado el Debugger de mi máquina y le he pedido a mi compañero que hiciera una petición de informe para ver donde casca:

ApplicationClass objExcel = new ApplicationClass();

Le he dado permisos de Administrador a mi compañero en mi máquina, ha vuelto a ejecutar la petición y ¡Vualá! todo funciona, porque estas llamadas a objetos COM necesitan para ejecución local/remota unos privilegios mínimos.

La configuración del sitio web tiene el acceso anónimo deshabilitado y la autenticación windows integrada (Estamos en una intranet) y en el Web.Config impersonate a true con autenticación Windows.

Soluciones que no piensas:

  • Dar permisos de Adminsitrador a la cuenta MACHINE\ASPNET

ESTO NI SE TE OCURRA

  • Impersonar el hilo de ejecución de la aplicación con un usuario Adminsitrador

La gente de sistemas nunca te lo dará y además no me parece una buena solución puesto que vulnera muchos principios de seguridad como en el primer caso.

  • Hacer una impersonación sólo cuando generas el Informe con una cuenta de usuario que sea Adminsitrador 

La gente de sistemas nunca te lo dará

Bueno, pues visto que esto va a ser que no, de repente, cacharreando con los Servicios de Componentes encuentro una cosita que se llama Configuración DCOM (Distributted Component Object Model) y al expandirlo me encuanto con esto:

Síííííí!!!! Aplicación Microsoft Excel, esto pinta bien y además tiene propiedades, así que pinchamos:

Juer y encima tiene una pestaña de Seguridad

Así que marcamos el check Personalizar de los Permisos de inicio y activación y pulsamos el botón Modificar para dar permisos al Usuario/Grupo que desamos:

Aceptamos todo y con esto hemos resuelto el maldito error. En mi caso hemos dados permisos a un Grupo que contiene a los usuarios que acceden a la aplicación. (Aunque la imagen corresponde al equipo mio de casa ;))

Por último y por cuestiones de performance en nuestra aplicación es necesario liberar todos los objetos COM que utilicemos, para que no se queden esos malditos procesos llamados EXCEL (Os lo digo por experiencia propia), que aperecen a porrillo en el Administrador de Tareas, y para ello os dejo este enlace del Support de Microsoft:

La aplicación de Office no se cierra después de automatización desde cliente de Visual Studio . NET

Con la solución que propone conseguí eliminar eso malditos procesos que parecían desaparecer con el oApp.Quit(); oApp = null; pero que en realidad no desaparecían y se estaban acumulando llevandose 36 Mb de memoria cada uno.

Bueno pues espero que os sirva y que no tengáis que romperos tanto el coco y os encontréis tantos probelmas como me he encontrado yo.

Published 15/3/2007 20:56 por Luis Ruiz Pavón
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2007/03/15/como-utilizar-com-interop-office-excel-en-tus-proyectos-asp-net-y-no-morir-en-el-intento.aspx

Comentarios

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Excelente artículo... que recuerdos ver pantallazos del dcomcnfg.exe a estas alturas de la vida con .Net 3.0 rulando por ahí... DCOM forever!!

Thursday, March 15, 2007 9:28 PM por Rodrigo Corral

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

jejeje

36Mb de memoria cada uno = una instancia de Excel ... el gran problema de la interfaz com q exporta excel es q e no es un com, es un activex exe !!! (el RCW se vuelve loco)

Y pensar que hace unos años una herramienta conocida de reporting "incluia" las capacidades de reporting de excel y word. Yo me quede flipado y cuando comence a hacer una reverse engineering para ver q hacian, como bien tu dices desp del oApp.Quit(), llamaban a un servicio externo q se recorria todos los procesos existentes y se calzaba a los exceles ... curioso no ?

Saludos

Friday, March 16, 2007 3:56 PM por El Bruno

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Gracias por el aporte Bruno, desconocía que se tratase de un ActiveX.

Y como en el enlace que he puesto al support, no dejes de liberar ninguno o el proceso se queda.

Salu2

Saturday, March 17, 2007 9:56 AM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Es verdad que MS no recomienda el uso de excel en el server side pero también lo tacha de ilegal, pues si, si algún día la gente esta de software association llega con la Policía a tus oficinas y ven que estas haciendo esta atrocidad no solo te golpearan por mal programador sino que también te secuestraran tus servidores. Para prevenir esto MS creo el famoso excel services que corre en SharePoint o también puedes usar ASPOSE que son componentes .net creados para este fin.

NUNCA implementen una aplicacion de este tipo

Sunday, March 18, 2007 10:36 PM por Alberto Acosta

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Ante una aclaración de este tipo por tu parte, creo que aparte de llamarme Mal Programador deberías argumentar tu crítica para saber porqué es ilegal.

Yo por mi parte, te dejo un documento donde advierten que no recomienda el uso para server-side pero en ningún momento dicen nada sobre "Malos Programadores", "Golpes", "Policía"... es más como dije al principio ha sido un requerimiento especial y no ha habido mas cojo... aunque claramente digo que Microsoft no lo recomienda:

Considerations for server-side Automation of Office

http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757

Salu2

Monday, March 19, 2007 10:01 AM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Muy buen articulo.

Tuesday, March 20, 2007 4:06 PM por Sergio

# Modificando documentos Office 2007 con .Net

Buenas mientras descanso en las minivacaciones de semana santa completamente desenchufado y con un par

Saturday, April 7, 2007 7:54 PM por El Bruno

# Modificando documentos Office 2007 con .Net

Buenas mientras descanso en las minivacaciones de semana santa completamente desenchufado y con un par

Saturday, April 7, 2007 7:54 PM por El Bruno

# Modificando documentos Office 2007 con .Net

Buenas mientras descanso en las minivacaciones de semana santa completamente desenchufado y con un par

Saturday, April 7, 2007 7:55 PM por El Bruno

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola

Tu articulo esta muy interesante y funciona bien, ahora yo tengo ese problema pero con word :( y no hay un application Word en el adm de componentes alguna vez hiciste con word?? si lo hiciste a quien hay que dar permisos ??

salu2

sergio

Monday, June 4, 2007 10:59 PM por SergioT

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

otra vez yo,

como una alternativa para no utilizar el excel está utilizar el ado.net directamente para escribir el excel, tengo un pequeño ejemplo si lo quieren ver en mi blog, que por cierto estoy recien comenzando :)

http://sergiotardio.blogspot.com/2007/05/excel-y-adonet.html

salu2

sergio

Monday, June 4, 2007 11:11 PM por SergioT

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Mira a ver si te sirve el DCOM -> Documento de Microsoft Word.

Como alternativa a utilizar COM de Excel te recomiendo ASPOSE.

Salu2

Monday, June 11, 2007 3:15 PM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola

Por lo que leí esta bastante interesante e ASPOSE lo unico malo es que no es gratis :)

Te cuento que estoy utulizando ado.net para cargar una planilla desde un datatable, pero he notado que para cargar miles de registros, uno a uno se pone lento, mas de lo que quisiera, y me preguntaba si no conoces alguna forma de llenar todo un datatable direco a un excel , pero de preferencia con ado.net sin componentes que comprar :)

Por otro lado he dejado de utilizar el word y estoy utilizando archivos RTF de forma que los abro y hago la manipulacion del stream, no me salio tan dificil, y funciona bien no mas. Lo que yo necesitaba era cartas y sobres tipo que luego se deben combinar con  N registros. Lo unico que no me gusta es la manipulacion de los codigos de rtf es un poco lioso y puede ser suceptible a errores.

Salu2

SergioT

Monday, June 11, 2007 5:07 PM por SergioT

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Friday, June 22, 2007 1:56 PM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

HOla.

El articulo me parece muy interesante pero cuando ingreso al MTC no aparece la carpeta Configuración DCOM y no puedo asignarles permisos, y cuando entro jecutando dcomcnfg si me aparece el EXCEL, pero no me permite ingresar a las pestañas de configuración. Hay alguna manera de restaurar la carpeta de configuración DCOM , tengo un windows 200 como servidor

Monday, July 2, 2007 5:41 PM por CoriSoledad

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Excelente y dejame derte que no es de las soliciones que se le ocurre a cualquiera, me fue de mucha utilidad.

Friday, July 6, 2007 11:21 PM por ever.torres

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Gracias compañero!!! Ese tipo de comentarios le dan más ganas a uno de seguir escribiendo ;)

Salu2

Tuesday, July 10, 2007 2:22 PM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

"...Excel was not designed to be used inthis way" ni en "another way" jeje. A ver si alguien ha pasado por esto..

El interop, al cargar los datos de un archivo excel en un datagrid es lento de narices, xo si además quieres mostrar el formato...ya te mueres.

¿Existe alguna forma que yo no conozca? o ¿alguna forma de incrustar la tabla excel con formato y todo en un formulario?

Tuesday, July 17, 2007 8:46 PM por jajavi

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Como alternativa a utilizar COM de Excel te recomiendo ASPOSE es la leche y aunque es de pago merece la pena, puedes verlo en:

www.aspose.com/.../Default.aspx

Salu2

Friday, July 27, 2007 10:21 AM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Que bien amigo, eso era lo que buscaba, gracias, Calif. 10. =)

Friday, October 19, 2007 1:40 AM por JORGE

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola, una dudota, esto mismo que se explica en este articulo aplica para word?, porque tengo una aplicación que usa word y en mi maquina funciona, pero como se menciona en el articulo, pues la gente de sistemas no me va a dar un usuario administrador, y con el que me dieron me marca un error al momento de generar el archivo de word "Word cannot open the existing", alguien podria ayudarme con esto.

Thursday, December 27, 2007 1:54 AM por jose

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Has mirado con dcomcnfg.exe si hay un DCOM para Word?

Salu2

Thursday, December 27, 2007 10:23 AM por Luis Ruiz Pavón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola Luis, gracias por contestar, pues ya cheque el dcomcnfg y ahi esta ademas de excel tambien el word, e intente hacer algo similar a lo que esta en el articulo pero no he tenido exito, me marca algunos errores como que no tiene suficiente memoria o que el tiempo de espera termino, en fin no he tenido exito. Alguna idea de lo que puede estar pasando?

Thursday, December 27, 2007 7:04 PM por jose

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola. Buscando soluciones a este error me he encontrado con esta. Pero mi situacion particular es con Word. Pretendo instanciar una aplicacion word de la siguiente manera:

Dim oWordApp As New Microsoft.Office.Interop.Word.Application

y me genera el error:

Error al recuperar un generador de clases COM para el componente con

CLSID {000209FF-0000-0000-C000-000000000046} debido al siguiente error: 80070005.

He estado probando las soluciones para excel pero nada. No sé a qué puede ser debido y la solución posible. Alguien tiene alguna propuesta??

Tuesday, April 15, 2008 2:19 PM por jjsantos

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola me parece muy interesante todo lo que han mencionado. Por mi cuenta ya pase por el problema de los permisos para utilizar los COM de excel pero ahora me surge un nuevo problema al publicar dicha aplicacion en un servidor Win 2000 que tiene Excel 2000. El error es el siguiente:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.:   at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)

En algun lado encontre que no es posible utilizar estos componentes con Excel 2000 lo cual no me convence.

Cualquier ayuda que me puedan dar será mas que bienvenida gracias...

Tuesday, July 29, 2008 4:02 PM por Bruno

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Queria consultarlos porque hice una aplicacion que levanta un excel del lado del servidor, a pesar de no estar aconsejado.....y me encontre que al querer levantar mas de una instancia me da un error de concurrencia.......Alguien tiene alguna data de porque puede suceder algo asi???? gracias!

Diego

Thursday, August 7, 2008 6:45 PM por Diego

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Me salvaste la vida mi pana, excelente articulo y muy bien explicado!!!

Tuesday, October 14, 2008 5:43 PM por Freddy Chirinos

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Exactamente lo q estaba buscando

Thursday, January 22, 2009 3:07 PM por nano

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Muy bueno el artículo, me ayudó a avanzar un poco. Ahora ya me deja ejecutar el código pero al hacerlo se abre una instancia del WINWORD.exe pero se queda en el taskmgr sin hacer nada y en la aplicación web da un tiemout. ¿Alguien sabe la causa y como resolvrlo?

Tuesday, July 7, 2009 1:21 PM por Aitor

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Sres

Agradeceria que me puedan ayudar urgentemente, al inicio tuve un problema de acceso denegado para crear un objeto de tipo excel, luego añadi la cuenta con la que estoy trabajando al DCOM, le di todos los permisos (ojo q la cuenta no es administrador).      

Despues de esto ejecuto la primera linea q muestro acontinuacion sin problemas,pero en la tercera linea mi aplicativo se cae, al querer abrir una hoja excel para trabajar. Sale error

1004 - No se puede abrir o guardar más documentos debido a que el espacio en disco o la memoria son insuficientes. • Para disponer de más memoria cierre los libros o programas que no necesite. • Para liberar espacio en el disco, elimine los archivos que no necesita del disco en el que desea guardar los documentos.

Set lobjExcel=CreateObject("Excel.Application")

lobjExcel.Application.Visible=True

Set lxlsWorkbook=lobjExcel.Workbooks.Add

Verifique si tenia objetos excel abierto en el task manager pero no encontre ninguno.ademas tengo suficiente espacio en disco.

¿que puedo hacer?

Tuesday, July 21, 2009 4:43 PM por Joanna

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Nadie ha dado con el problema de :

1004 - No se puede abrir o guardar más documentos debido a que el espacio en disco o la memoria son insuficientes. • Para disponer de más memoria cierre los libros o programas que no necesite. • Para liberar espacio en el disco, elimine los archivos que no necesita del disco en el que desea guardar los documentos.

He buscado y buscado información y nada...

Parece que muchos se rindieron y quienes lo lograron no lo publicaron :(

Monday, November 2, 2009 8:03 PM por hellokytty

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola a mi me marca el siguiente error:

Error Object reference not set to an instance of an object.

Aun cuando ya tengo instalado Office en el Servidor. Yo se que no recomiendan la automatizacion de Office de lado del servidor pero en mi caso es una necesidad y no tenemos otra alternativa

Tuesday, February 2, 2010 5:42 PM por Agus

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

hola...hice todo pero no me muestra el archivo de excel que creo....se crean procesos de excel.exe en el servidor, pero no me muestra el archivo! en la pc de desarrollo anda lo mas bien, pero en el server no! AYUDA!

Tuesday, April 13, 2010 10:19 PM por Ale

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola, yo tengo un pequeño detalle cuando le doy clic al boton para que me de el reporte en excel no hace nada ni me marca error :S que puedo hacer...

Saludos

Saturday, August 28, 2010 12:25 AM por PalomaBtz

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola ya he podido pero tengo un inconveniente, el documento se abre en el servidor de aplicaciones(Servidor web) y no en el ordenador desde donde lo ejecuto..que debo hacer???

Wednesday, October 13, 2010 4:25 PM por camilo

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Sabes, quiero abrir un libro de excel con parametros enviados desde una grilla.

Dim xlApp As Object 'Un Libro de Excel

           Dim xlBook As Excel.Workbook ' Una hoja del libro

           Dim xlSheet As Excel.Worksheet 'Inicializar Excel y obtener un objeto de Aplicacion

           Dim ruta_excel As String

           ruta_excel = Server.MapPath("/" & "plantilla_nomina_EAC.xlt")

           xlApp = Nothing

           xlApp = CreateObject("Excel.Application")

           xlBook = Nothing

           xlBook = xlApp.Workbooks.Open(ruta_excel)

           xlSheet = xlBook.Worksheets(1)

           xlApp.Visible = True

Cuando se ejecuta este codigo me arroja el siguiente error:

NO SE PUEDE MOSTRAR UN CUADRO DE DIALOG O FORMULARIO MODAL CUALDO LA APLICACION NO ESTA EN MODO INTERACTIVE. ESPECIFIQUE ESTILO SERVICENOTIFICACION O DEFAULT DESKTOPONLY PARA MOSTRAR UNA NOTIFICACION DE UNA APLICAICON DE SERVICIO.

QUE PODRA SER??

Saturday, November 13, 2010 8:32 PM por Natalia

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Bueno yo he realizado los pasos descrito pero mi aplicación me sigue mandando el mismo error al tratar de mostrar los datos en ecxel desde una máquina cliente (No se puede crear el componente ActiveX). Desde mi máquina si de desarrollo funciona perfectamente.

Monday, January 17, 2011 3:40 PM por Ramón

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Ramón: Bueno yo he realizado los pasos descrito pero mi aplicación me sigue mandando el mismo error al tratar de mostrar los datos en Excel desde una máquina cliente (No se puede crear el componente ActiveX). Desde mi máquina de desarrollo funciona perfectamente. Alguien tiene otra solución o me falta algo por incluir en el servidor o en mi aplicación para que funcione, gracias de antemano.

Monday, January 17, 2011 4:57 PM por Ramon Romero

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Hola.

Sabes que tengo el mismo problema, pero con outlook 2003 y VS2005(estoy atrasada lo se, pero mi empresa no entiende esa parte), y he mirado en el DCOMCNFG pero no existe nada aparte de algo para los datos adjuntos de Outlook y otro para el buscador de outlook.

En modo debug funciona sin problemas, pero al instalarlo(como servicio windows) me envia el error mencionado. Este error es tanto en la máquina cliente como en el servidor.

Help me please!!!!

Friday, February 18, 2011 4:44 PM por Johanna

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Primero creo los objetos

Dim xlWorkBook As Excel.Workbook

Dim xlWorkSheet As Ecel.Worksheet

Me sale esto cuando hago la asignacion de memoria

xlWorkBook = New Excel.Application().Workbooks.Add(Missing.Value)

{System.UnauthorizedAccessException} System.Exception

Ya hice lo q pones arriba y nada... revise el web.config y esta en mode Windows... alguna ayuda sera agradecida :D

Saturday, March 12, 2011 4:11 PM por Pachango

# re: Como utilizar COM Interop Office (Excel) en tus proyectos ASP.NET y no morir en el intento...

Demasiado bueno el articulo no sabía que era exactamente hasta que leí esto :D muchisimas gracias jaja y lo mejor que me ayudo en el trabajo :)

Friday, September 2, 2011 6:11 PM por totobycrg