Alan Salazar
VB.Net 2008 + SQL 2K Server
> Tengo que abrir un archivo de excel (c:\mis archivos\datos.xls) y
> eliminarl las filas del rango (A1:A7). Como podria hacerlo?
Una vez que hayas referenciado en tu proyecto la versión adecuada de la
biblioteca Microsoft Excel Object Library, ejecutarías algo parecido a lo
siguiente:
Dim oApp As Excel.Application ' Objeto Application
Dim oWorkBook As Excel.Workbook ' Libro de trabajo
' Creamos una nueva instancia de Excel
oApp = New Excel.Application
' Abro el libro de trabajo
oWorkBook = oApp.Workbooks.Open("C:\Mis documentos\Libro1.xls")
' Referencio la hoja llamada Hoja4
Dim oSheet As Excel.Worksheet = _
CType(oWorkBook.Sheets("Hoja4"), Excel.Worksheet)
' Eliminamos las filas de la 1 a la 7
oSheet.Range("1:7").Delete()
' Guardamos los cambios
oWorkBook.Save()
' Cierro el libro
oWorkBook.Close()
' Cerramos Excel
oApp.Quit()
oApp = Nothing
' Aunque no se recomienda, obligamos a que se
' lleve a cabo la recolección de elementos
' no utilizados.
GC.Collect()
' Detenemos el proceso actual hasta que finalice
' el método Collect
GC.WaitForPendingFinalizers()
¡Eso es todo!
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
disculpad que me meta, pero estaba a punto de enviar una respuesta
'casi' calcada de la de Enrique y me ha llamado la atencion el 'casi',
que si no os importa paso a consultar a Enrique =>
>
> ' Aunque no se recomienda, obligamos a que se
> ' lleve a cabo la recolección de elementos
> ' no utilizados.
> GC.Collect()
>
> ' Detenemos el proceso actual hasta que finalice
> ' el método Collect
> GC.WaitForPendingFinalizers()
>
a) dado que comentas que no se recomienda, ¿cual es el motivo de
usarlo en este caso?
b)¿ existe algun tipo de procesos en los que convenga particularmente
tirar de GC?
lo dicho, disculpas por la intromision, pero no he usado nunca el
'recolector' y, dado que Excel es otro de mis vicios, creo que no me
vendria mal saber un poco el motivo de usarlo en casos como este.
un saludo
Ivan
> a) dado que comentas que no se recomienda, ¿cual es el motivo de
> usarlo en este caso?
Eliminar de la memoria el proceso creado por Excel. O eso creía yo, pero veo
que por mucho que llame al "basurero", el proceso de Excel sigue apareciendo
en el Administrador de tareas de Windows.
Si por casualidad tienes Windows XP instalado en tu equipo, ¿podrías
ejecutar el código para ver si desaparece el proceso Excel del Administrador
de tareas? Tengo instalado Windows Vista Ultimate, y no desaparece el
proceso, y me atrevería a jurar que en Windows XP sí desaparece. :-(
> b)¿ existe algun tipo de procesos en los que convenga particularmente
> tirar de GC?
Pues para el caso que nos ocupa: reclamar la memoria usada por el objeto
Excel.Application.
Generalmente no es necesario llamar expresamente al método «Collect», porque
de ello se encarga el runtime de .net cuando lo estime necesario. Piensa que
una recolección de elementos no utilizados puede llevar su tiempo, por lo
que el rendimiento de la aplicación puede verse afectado.
Si observamos que los objetos creados por la aplicación no se destruyen
completamente, es cuando habría que llamar a dicho método, a fin de reclamar
la mayor cantidad de memoria.
Pero me acabo de dar cuenta que en Windows Vista, no desaparece el proceso
de Excel del Administrador de Tareas. Si tienes Windows XP y deseas realizar
la prueba, te agradecería que me comentases los resultados.
lo 1º gracias por tus aclaraciones'
>.... el proceso de Excel sigue apareciendo
> en el Administrador de tareas de Windows.
>
> Si por casualidad tienes Windows XP instalado en tu equipo, ¿podrías
> ejecutar el código para ver si desaparece el proceso Excel del Administrador
> de tareas?
me temo que en xp tampoco desaparece [al menos durante los minutos que
mi impaciencia me ha permitido esperar] hasta que cierras el
formulario (en el caso de mis pruebas)
¿que implicaria esto? ¿que el proceso sigue consumiendo memoria?
me ha parecido que con GC el espacio ocupado se mantiene estable,
mientras que sin el (poniendolo como comentario), el espacio ocupado
oscila ligeramente al menos al principio, y mas bien hacia arriba,
pero ni estoy seguro de que con GC no lo haga ni se si quiere decir
algo. Solo como dato por si acaso te sirve de algo
------------
en cuanto al codigo funciona perfectamente. Solo un apunte para OP por
si no lo supiera:
en mi caso, tras referenciar excel, para los tipos Excel.Application
he tenido que usar la jerarquia completa. Pej =>
Dim oApp As Microsoft.Office.Interop.Excel.Application
aunque en los casos diferentes de Application, se lo puede ahorrar
importando el espacio de nombres [ Microsoft.Office.Interop.Excel ],
pudiendo usar pej. Workbook, WorkSheet, etc, a secas
bueno, solo por si se diera el caso
un saludo y gracias de nuevo
Ivan
PD: y si das con alguna explicacion/solucion del tema de recolector te
agradezco si lo comentas :-)
el codigo queda así:
Dim oApp As Application
' Dim oApp As Excel.Application ' Objeto Application
Dim oWorkBook As Workbook ' Libro de trabajo
' Creamos una nueva instancia de Excel
oApp = New Application
' Abro el libro de trabajo
oWorkBook = oApp.Workbooks.Open("C:\Libro1.xls")
' Referencio la hoja llamada Hoja4
Dim oSheet As Worksheet = _
CType(oWorkBook.Sheets("Hoja1"), Worksheet)
' Eliminamos las filas de la 1 a la 7
oSheet.Range("1:7").Delete()
' Guardamos los cambios
oWorkBook.Save()
oSheet = Nothing
' Cierro el libro
oWorkBook.Close()
oWorkBook = Nothing
' Cerramos Excel
oApp.Quit()
oApp = Nothing
' Aunque no se recomienda, obligamos a que se
' lleve a cabo la recolección de elementos
' no utilizados.
GC.Collect()
' Detenemos el proceso actual hasta que finalice
' el método Collect
'GC.WaitForPendingFinalizers()
________________
Geovanny Quirós C.
Heredia, Costa Rica
"Ivan" <ivanl...@gmail.com> escribió en el mensaje de
noticias:75ba4554-0c13-4f7d...@m73g2000hsh.googlegroups.com...
>he realizado
> pruebas y di con que falta asiganrle Nothing a oSheet y a oWorkbook y ahí
> si se cierra el proceso excel.
jodo, habia probado con oWorkBook=Nothing, pero evidentemente se me
escapo el oSheet
efectivamente parece que ahora si va
un saludo y muchas gracias
Ivan
> he realizado pruebas y di con que falta asiganrle Nothing a
> oSheet y a oWorkbook y ah� si se cierra el proceso excel.
Hola, Geovanny:
Por m�s �Nothing� que escriba, no se cierra el proceso de Excel del
Administrador de Tareas, y eso que estoy llamando al m�todo
�ReleaseComObject� de la clase System.Runtime.InteropServices.Marshal.
Digo yo que las pruebas las habr�s efecuado en Windows XP, o por casualidad
las has ejecutado en Windows Vista.
Un saludo
--
Enrique Mart�nez
[MS MVP - VB]
Nota informativa: La informaci�n contenida en este mensaje, as� como el
c�digo fuente incluido en el mismo, se proporciona �COMO EST{, sin
garant�as de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en pr�ctica, utilizar o ejecutar lo recomendado o
> habia probado con oWorkBook=Nothing, pero evidentemente se me
> escapo el oSheet
>
> efectivamente parece que ahora si va
¿Ejecutado bajo Windows XP o bajo Windows Vista?
El tema de los procesos de las aplicaciones de Microsoft Offices es bastante
conocido, tal y como se explica en el siguiente artículo de la Base del
Conocimiento (en inglés):
Office application does not quit after automation from Visual Studio .NET
client
http://support.microsoft.com/?scid=kb;EN-US;317109
Pero como te indiqué anteriormente, me atrevería a jurar que el código
fuente, tal cual lo indiqué en mi primera respuesta, eliminaba el proceso de
Excel del Administrador de tareas en Windows XP. Pero ahora que me ha dado
por ejecutarlo en Windows Vista Ultimate, observo que no desaparece, aunque
establezca a Nothing el valor de todas las variables objeto declaradas,
llame al método «ReleaseComObject» de la clase
System.Runtime.InteropServices.Marshal, y por último, efectúe una
recolección de elementos no utilizados. No hay manera que desaparezca.
Por eso ya no sé si es un problema con el código fuente de la aplicación o
se debe a un problema con el sistema operativo.
> ¿Ejecutado bajo Windows XP o bajo Windows Vista?
>
> Pero como te indiqué anteriormente, me atrevería a jurar que el código
> fuente, tal cual lo indiqué en mi primera respuesta, eliminaba el proceso de
> Excel del Administrador de tareas en Windows XP.
bajo Windows XP [Vista casi ni lo conozco], y tal y como comenta
Geovanny parece que sin el nothing el proceso no desaparece y con este
si.
> Por eso ya no sé si es un problema con el código fuente de la aplicación o
> se debe a un problema con el sistema operativo.
la verdad es que yo no controlo nada, aun mas si me sacas de cuatro
codigos, pero de todas formas voy a indagar un poco a ver si me entero
algo
un saludo
Ivan
> bajo Windows XP
Efectivamente, estaba completamente seguro que el c�digo fuente eliminaba el
proceso de Excel bajo Windows XP, una vez establecido el valor Nothing a
todas las variables objeto declaradas, y llamando en �ltima instancia al
recolector de elementos no utilizados. Pero no ocurre lo mismo si ejecutamos
el mismo c�digo bajo Windows Vista, y no tengo ni la menor idea del motivo
al cual se puede deber. :-(
Gracias por la confirmaci�n.
--
Enrique Mart�nez
[MS MVP - VB]
Nota informativa: La informaci�n contenida en este mensaje, as� como el
c�digo fuente incluido en el mismo, se proporciona �COMO EST{, sin
garant�as de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en pr�ctica, utilizar o ejecutar lo recomendado o
Lamentablemente no tengo un Vista para probar :(
Saludos
________________
Geovanny Quir�s C.
Heredia, Costa Rica
"SoftJa�n" <grupo_n...@softjaen.es> escribi� en el mensaje de
noticias:urlWUVgH...@TK2MSFTNGP03.phx.gbl...
> mis pruebas las he hecho en un Windows XP con VS2008, segun pude
> documentarme los objetos de Excel "oApp", "oWorkBook" y "oSheet "
> deben ser destruidos para que el recolector pueda eliminar el
> proceso Excel.
Si todo eso est� muy bien, pero que el c�digo lo ejecuto bajo Windows Vista,
y nada... El proceso de Excel sigue "vivo y coleando" en el Administrador de
Tareas. :-)
Gracias por la confirmaci�n.
--
' Cerramos Excel
oApp.UserControl = False
oApp.Quit()
oApp = Nothing
________________
Geovanny Quir�s C.
Heredia, Costa Rica
"SoftJa�n" <grupo_n...@softjaen.es> escribi� en el mensaje de
noticias:OfbAWFlH...@TK2MSFTNGP02.phx.gbl...
> si haces este cambio que pasa?...en mis pruebas igual lo cierra pero en
> Vista no s� que pasar�a.
>
>
> ' Cerramos Excel
> oApp.UserControl = False
> oApp.Quit()
> oApp = Nothing
Pues no sucede nada: el proceso contin�a apareciendo en el Administrador de
tareas, a pesar de llamar al m�todo �ReleaseComObject� y al recolector de
elementos no utilizados, previo establecimiento del valor Nothing de TODAS
las variables objeto declaradas.