Exel y vb.net

26/06/2006 - 23:51 por SergioT | Informe spam
Hola

tengo un problema bastante raro con el Excel2003 desde vb.net
instancion una aplicacion excel, un libro y una hoja, luego opero con ellos
y finalmente cierro el libro , el excel y hasta le coloco nothing a los
objetos usados pero se queda el proceso excel corriendo, por lo menos eso
muestra el Adm de Tareas del XP

mato al excel asi:

miLibro.saveCopyAs(spath)
miLibro.close
miExcel.quit

milibro=nothing
miExcel=nothing
GC.Collect()


Que me falta para matar los procesos???? GRACIASSSSSSS
Salu2
Sergio T.

Preguntas similare

Leer las respuestas

#1 SoftJaén
27/06/2006 - 08:01 | Informe spam
"SergioT" escribió:

tengo un problema bastante raro con el Excel2003 desde vb.net
instancio una aplicacion excel, un libro y una hoja, luego opero con ellos
y finalmente cierro el libro , el excel y hasta le coloco nothing a los
objetos usados pero se queda el proceso excel corriendo, por lo menos eso
muestra el Adm de Tareas del XP

Que me falta para matar los procesos?



Hola, Sergio:

Si haces una llamada expresa al recolector de elementos no utilizados,
entiendo que en el Administrador de tareas no debería de aparecer el proceso
de Excel, porque de lo contrario, desaparecía el proceso cuando cierres el
formulario o finalice la aplicación. Pero el hecho que llames al método
«Quit» y establezcas a «Nothing» el valor de la variable objeto
«Excel.Application», no significa que EN ESE MISMO INSTANTE se elimine el
proceso.

En Visual Basic clásico, así es como se finaliza el proceso, pero en .NET la
cosa es bastante distinta por la finalización no determinada de la que
disponen los objetos. El establecer un valor a «Nothing» significa que dicha
variable objeto será eliminada del todo por el recolector de elementos no
utilizados, ALGÚN MOMENTO DESPUÉS que haya salido de su ámbito de
visibilidad o se haya establecido expresamente su valor a «Nothing».

Pero como no has expuesto TODO el código que utilizas, o al menos, el tipo
de declaración de objetos y el alcance de los mismos que empleas, pues
ignoro el motivo por el cual no se "mata" el proceso.

A continuación te muestro un ejemplo para manejar una instancia de Excel.
Para ejecutarlo, inicia un nuevo proyecto y haces referencia a la biblioteca
de Microsoft Excel 11.0. Inserta cuatro botones de comando en el formulario
de inicio, abres el editor de código y copia/pega lo siguiente:

Imports Microsoft.Office.Interop

Public Class Form1

Private oApp As Excel.Application ' Objeto Application
Private oWorkBook As Excel.Workbook ' Libro de trabajo

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' Creamos una nueva instancia de Excel
oApp = New Excel.Application

' Creo un nuevo objeto WorkBook
oWorkBook = oApp.Workbooks.Add

MessageBox.Show("Se ha creado la instancia de Excel, " & _
"pero todavía no es visible.")
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

' Establezco el objeto Sheet con la primera hoja activa
Dim oSheet As Excel.Worksheet ' Hoja de trabajo
oSheet = CType(oWorkBook.Sheets(1), Excel.Worksheet)

' Hago visible la aplicación, activando la primera hoja
oApp.Visible = True
oWorkBook.Windows(1).Activate()

' Le doy al usuario el control de la aplicación.
oApp.UserControl = True

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click

' Indico que el libro ya ha sido guardado
oWorkBook.Saved = True

' Cierro el libro
oWorkBook.Close()

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click

' 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()

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

With Me
.Button1.Text = "Abrir Excel"
.Button2.Text = "Mostrar Excel"
.Button3.Text = "Cerrar Excel"
.Button4.Text = "Salir de Excel"
End With
End Sub

End Class

Ejecuta el código en el mismo orden que aparece el texto mostrado en los
botones de comando.

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.
Respuesta Responder a este mensaje
#2 SergioT
27/06/2006 - 16:03 | Informe spam
Hola

Gracias por tu explicación, solo tengo una dduda y es que Hago algo similar
con Word y te cuento que el Word se cierra casi instantaneamente y
desaparece del Adm de procesos, cosa que no ocurre con el Excel

Te paso la funcion que usa el Excel para que me des tu opinion, se trata de
una funcion que la uso en un proceso medio largo que consiste en hacer una
consulta a la BD, crear una planilla excel, luego usar esa plantilla como un
"origen de datos" de word de forma que en una plantilla pueda convinar
documentos con los datos de la planilla excel. Como veras solo lo uso al
excel para generar el origen de datos a ser usado luego por Word para
convinar cartas. En la etapa inicial del proceso coloco el DS en un texto
que luego lo habro con Excel y lo convierto el libro, de eso se trata la
funcion que te paso a continuacion y donde el excel se queda "trancado", Un
detalle mas, esto lo hago en una clase que esta en un proyecto de tipo
"libreria de clases" que es usado por una aplicacion asp.net, Con esto logro
tener 2 cosas el documento Excel con la "base de datos" y las cartas
convinadas
( si tienes una sujerencia mejor para el proceso es bienvenida)

bueno ahi va la funcioncita.:

'=='Esta funcion Recibe un dtatable y un path con nombre de file donde grabara
el Excel, lo que hace es paçsar el DS a un texto y de ahi llama
'a la fiuncion que convierte el text en excel
'== Public Sub DataTableToExcel(ByVal pDataTable As DataTable, ByVal
sPathParaGuardarExcel As String)
Dim sFileName As String = Path.GetTempFileName()
FileOpen(1, sFileName, OpenMode.Output)

Dim sb As String
Dim dc As DataColumn
For Each dc In pDataTable.Columns
sb &= dc.Caption & Microsoft.VisualBasic.ControlChars.Tab
Next
PrintLine(1, sb)

Dim i As Integer = 0
Dim dr As DataRow
For Each dr In pDataTable.Rows
i = 0 : sb = ""
For Each dc In pDataTable.Columns
If Not IsDBNull(dr(i)) Then
sb &= CStr(dr(i)) &
Microsoft.VisualBasic.ControlChars.Tab
Else
sb &= Microsoft.VisualBasic.ControlChars.Tab
End If
i += 1
Next

PrintLine(1, sb)
Next
FileClose(1)
TextToExcel(sFileName, sPathParaGuardarExcel)

End Sub
'=='Esta es la funcion que convierte un file texto en un Excel ESTA ES LA QUE
MOLESTA CON EL EXCEL INMortAL
'== Public Sub TextToExcel(ByVal sFileName As String, ByVal
sPathParaGuardarExcel As String)

Dim vFormato As Excel.XlRangeAutoFormat

Dim vCultura As System.Globalization.CultureInfo =
System.Threading.Thread.CurrentThread.CurrentCulture
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

Dim Exc As Excel.Application = New Excel.Application
Exc.Workbooks.OpenText(sFileName, , , ,
Excel.XlTextQualifier.xlTextQualifierNone, , True)

Dim Wb As Excel.Workbook = Exc.ActiveWorkbook
Dim Ws As Excel.Worksheet = Wb.ActiveSheet

'Se le indica el formato al que queremos exportarlo
Dim valor As Integer = 1
If valor > -1 Then
Select Case valor
Case 0 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatNone
Case 1 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatSimple
Case 2 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic1
Case 3 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2
Case 4 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic3
Case 5 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1
Case 6 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting2
Case 7 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting3
Case 8 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting4
Case 9 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatColor1
Case 10 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatColor2
Case 11 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatColor3
Case 12 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatList1
Case 13 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatList2
Case 14 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatList3
Case 15 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormat3DEffects1
Case 16 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormat3DEffects2
End Select

Ws.Range(Ws.Cells(1, 1), Ws.Cells(Ws.UsedRange.Rows.Count,
Ws.UsedRange.Columns.Count)).AutoFormat(vFormato)

sFileName = Path.GetTempFileName.Replace("tmp", "xls")
File.Delete(sFileName)
Exc.ActiveWorkbook.SaveAs(sFileName,
Excel.XlTextQualifier.xlTextQualifierNone - 1)

End If

sNombre = Ws.Name

Wb.SaveCopyAs(sPathParaGuardarExcel)

'
Exc.Workbooks.Close()
Exc.Application.Quit()
'
Exc.Quit()

Ws = Nothing
Wb = Nothing
Exc = Nothing

GC.Collect()

If valor > -1 Then
Dim p As System.Diagnostics.Process = New
System.Diagnostics.Process
p.EnableRaisingEvents = False
' p.Start("Excel.exe", pFileName)
End If
System.Threading.Thread.CurrentThread.CurrentCulture = vCultura
'llamamos al merge
End Sub

MUCHAS GRACIAS POR LA AYUPA
Salu2
SergioT

"SoftJaén" escribió en el mensaje
news:%
"SergioT" escribió:

tengo un problema bastante raro con el Excel2003 desde vb.net
instancio una aplicacion excel, un libro y una hoja, luego opero con
ellos
y finalmente cierro el libro , el excel y hasta le coloco nothing a los
objetos usados pero se queda el proceso excel corriendo, por lo menos
eso
muestra el Adm de Tareas del XP

Que me falta para matar los procesos?



Hola, Sergio:

Si haces una llamada expresa al recolector de elementos no utilizados,
entiendo que en el Administrador de tareas no debería de aparecer el
proceso
de Excel, porque de lo contrario, desaparecía el proceso cuando cierres el
formulario o finalice la aplicación. Pero el hecho que llames al método
«Quit» y establezcas a «Nothing» el valor de la variable objeto
«Excel.Application», no significa que EN ESE MISMO INSTANTE se elimine el
proceso.

En Visual Basic clásico, así es como se finaliza el proceso, pero en .NET
la
cosa es bastante distinta por la finalización no determinada de la que
disponen los objetos. El establecer un valor a «Nothing» significa que
dicha
variable objeto será eliminada del todo por el recolector de elementos no
utilizados, ALGÚN MOMENTO DESPUÉS que haya salido de su ámbito de
visibilidad o se haya establecido expresamente su valor a «Nothing».

Pero como no has expuesto TODO el código que utilizas, o al menos, el tipo
de declaración de objetos y el alcance de los mismos que empleas, pues
ignoro el motivo por el cual no se "mata" el proceso.

A continuación te muestro un ejemplo para manejar una instancia de Excel.
Para ejecutarlo, inicia un nuevo proyecto y haces referencia a la
biblioteca
de Microsoft Excel 11.0. Inserta cuatro botones de comando en el
formulario
de inicio, abres el editor de código y copia/pega lo siguiente:

Imports Microsoft.Office.Interop

Public Class Form1

Private oApp As Excel.Application ' Objeto Application
Private oWorkBook As Excel.Workbook ' Libro de trabajo

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' Creamos una nueva instancia de Excel
oApp = New Excel.Application

' Creo un nuevo objeto WorkBook
oWorkBook = oApp.Workbooks.Add

MessageBox.Show("Se ha creado la instancia de Excel, " & _
"pero todavía no es visible.")
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

' Establezco el objeto Sheet con la primera hoja activa
Dim oSheet As Excel.Worksheet ' Hoja de trabajo
oSheet = CType(oWorkBook.Sheets(1), Excel.Worksheet)

' Hago visible la aplicación, activando la primera hoja
oApp.Visible = True
oWorkBook.Windows(1).Activate()

' Le doy al usuario el control de la aplicación.
oApp.UserControl = True

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click

' Indico que el libro ya ha sido guardado
oWorkBook.Saved = True

' Cierro el libro
oWorkBook.Close()

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click

' 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()

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

With Me
.Button1.Text = "Abrir Excel"
.Button2.Text = "Mostrar Excel"
.Button3.Text = "Cerrar Excel"
.Button4.Text = "Salir de Excel"
End With
End Sub

End Class

Ejecuta el código en el mismo orden que aparece el texto mostrado en los
botones de comando.

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.


Respuesta Responder a este mensaje
#3 SergioT
27/06/2006 - 17:05 | Informe spam
te reenvio el codigo un poco mas limpio,

Public Sub TextToExcel(ByVal pFileName As String, ByVal
sPathParaGuardarExcel As String, Optional ByVal eTipoAutoFortmato As
Excel.XlRangeAutoFormat = Excel.XlRangeAutoFormat.xlRangeAutoFormatSimple)

'Dim vCultura As System.Globalization.CultureInfo =
System.Threading.Thread.CurrentThread.CurrentCulture
'System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

Dim Exc As Excel.Application
Dim Ws As Excel.Worksheet
Try
Exc = CreateObject("Excel.Application")
Exc.Workbooks.OpenText(pFileName, , , ,
Excel.XlTextQualifier.xlTextQualifierNone, , True)

Ws = Exc.ActiveWorkbook.ActiveSheet

Exc.ActiveWorkbook.ActiveSheet.Range(Ws.Cells(1, 1),
Ws.Cells(Ws.UsedRange.Rows.Count,
Ws.UsedRange.Columns.Count)).AutoFormat(eTipoAutoFortmato)

pFileName = Path.GetTempFileName.Replace("tmp", "xls")
File.Delete(pFileName)
Exc.ActiveWorkbook.SaveAs(pFileName,
Excel.XlTextQualifier.xlTextQualifierNone - 1)

sNombre = Exc.ActiveWorkbook.ActiveSheet.Name

Exc.ActiveWorkbook.SaveCopyAs(sPathParaGuardarExcel)

Catch ex As Exception
Me.sError = ex.Message
End Try

Dim z As Excel.Workbook
For Each z In Exc.Workbooks
z.Close()
Next
Exc.Workbooks.Close()
Exc.Quit()

Exc.Application.Quit()
Ws = Nothing
Exc = Nothing


'GC.Collect()

End Sub

Public Function CombinarCartas(ByVal sPlantillaWord As String, ByVal
sDocExcel As String, ByVal sPathDestino As String) As Boolean

Dim oMainDoc As Word.Document
Dim oSel As Word.Selection
Dim sDBPath As String
Dim oApp As Word.Application


Try
oApp = CreateObject("Word.Application")

oMainDoc = oApp.Documents.Open(sPlantillaWord)
oApp.Visible = False

'Start a new main document for the mail merge.

With oMainDoc.MailMerge
.MainDocumentType =
Word.WdMailMergeMainDocType.wdFormLetters

'Set up the mail merge data source to Northwind.mdb.
sDBPath = sDocExcel
.OpenDataSource(Name:=sDBPath, _
SQLStatement:=" SELECT * FROM [" + sNombre + "$]")
'nom es el nombre de la hoja

End With

oMainDoc.MailMerge.Destination =
Word.WdMailMergeDestination.wdSendToNewDocument
oMainDoc.MailMerge.Execute(Pause:=False)

oApp.Documents(1).SaveAs(sPathDestino)
Catch ex As Exception
Me.sError = ex.Message
End Try

' matando aplicaciones y objetos

oMainDoc.Close()
oApp.Documents.Close()
oApp.Application.Quit()

oMainDoc = Nothing
oApp = Nothing

Return True
End Function




"SergioT" escribió en el mensaje
news:
Hola

Gracias por tu explicación, solo tengo una dduda y es que Hago algo
similar con Word y te cuento que el Word se cierra casi instantaneamente y
desaparece del Adm de procesos, cosa que no ocurre con el Excel

Te paso la funcion que usa el Excel para que me des tu opinion, se trata
de una funcion que la uso en un proceso medio largo que consiste en hacer
una consulta a la BD, crear una planilla excel, luego usar esa plantilla
como un "origen de datos" de word de forma que en una plantilla pueda
convinar documentos con los datos de la planilla excel. Como veras solo lo
uso al excel para generar el origen de datos a ser usado luego por Word
para convinar cartas. En la etapa inicial del proceso coloco el DS en un
texto que luego lo habro con Excel y lo convierto el libro, de eso se
trata la funcion que te paso a continuacion y donde el excel se queda
"trancado", Un detalle mas, esto lo hago en una clase que esta en un
proyecto de tipo "libreria de clases" que es usado por una aplicacion
asp.net, Con esto logro tener 2 cosas el documento Excel con la "base de
datos" y las cartas convinadas
( si tienes una sujerencia mejor para el proceso es bienvenida)

bueno ahi va la funcioncita.:

'==> 'Esta funcion Recibe un dtatable y un path con nombre de file donde
grabara el Excel, lo que hace es paçsar el DS a un texto y de ahi llama
'a la fiuncion que convierte el text en excel
'==> Public Sub DataTableToExcel(ByVal pDataTable As DataTable, ByVal
sPathParaGuardarExcel As String)
Dim sFileName As String = Path.GetTempFileName()
FileOpen(1, sFileName, OpenMode.Output)

Dim sb As String
Dim dc As DataColumn
For Each dc In pDataTable.Columns
sb &= dc.Caption & Microsoft.VisualBasic.ControlChars.Tab
Next
PrintLine(1, sb)

Dim i As Integer = 0
Dim dr As DataRow
For Each dr In pDataTable.Rows
i = 0 : sb = ""
For Each dc In pDataTable.Columns
If Not IsDBNull(dr(i)) Then
sb &= CStr(dr(i)) &
Microsoft.VisualBasic.ControlChars.Tab
Else
sb &= Microsoft.VisualBasic.ControlChars.Tab
End If
i += 1
Next

PrintLine(1, sb)
Next
FileClose(1)
TextToExcel(sFileName, sPathParaGuardarExcel)

End Sub
'==> 'Esta es la funcion que convierte un file texto en un Excel ESTA ES LA QUE
MOLESTA CON EL EXCEL INMortAL
'==> Public Sub TextToExcel(ByVal sFileName As String, ByVal
sPathParaGuardarExcel As String)

Dim vFormato As Excel.XlRangeAutoFormat

Dim vCultura As System.Globalization.CultureInfo =
System.Threading.Thread.CurrentThread.CurrentCulture
System.Threading.Thread.CurrentThread.CurrentCulture =
System.Globalization.CultureInfo.CreateSpecificCulture("en-US")

Dim Exc As Excel.Application = New Excel.Application
Exc.Workbooks.OpenText(sFileName, , , ,
Excel.XlTextQualifier.xlTextQualifierNone, , True)

Dim Wb As Excel.Workbook = Exc.ActiveWorkbook
Dim Ws As Excel.Worksheet = Wb.ActiveSheet

'Se le indica el formato al que queremos exportarlo
Dim valor As Integer = 1
If valor > -1 Then
Select Case valor
Case 0 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatNone
Case 1 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatSimple
Case 2 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic1
Case 3 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2
Case 4 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic3
Case 5 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting1
Case 6 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting2
Case 7 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting3
Case 8 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatAccounting4
Case 9 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatColor1
Case 10 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatColor2
Case 11 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatColor3
Case 12 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatList1
Case 13 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatList2
Case 14 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormatList3
Case 15 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormat3DEffects1
Case 16 : vFormato =
Excel.XlRangeAutoFormat.xlRangeAutoFormat3DEffects2
End Select

Ws.Range(Ws.Cells(1, 1), Ws.Cells(Ws.UsedRange.Rows.Count,
Ws.UsedRange.Columns.Count)).AutoFormat(vFormato)

sFileName = Path.GetTempFileName.Replace("tmp", "xls")
File.Delete(sFileName)
Exc.ActiveWorkbook.SaveAs(sFileName,
Excel.XlTextQualifier.xlTextQualifierNone - 1)

End If

sNombre = Ws.Name

Wb.SaveCopyAs(sPathParaGuardarExcel)

'
Exc.Workbooks.Close()
Exc.Application.Quit()
'
Exc.Quit()

Ws = Nothing
Wb = Nothing
Exc = Nothing

GC.Collect()

If valor > -1 Then
Dim p As System.Diagnostics.Process = New
System.Diagnostics.Process
p.EnableRaisingEvents = False
' p.Start("Excel.exe", pFileName)
End If
System.Threading.Thread.CurrentThread.CurrentCulture = vCultura
'llamamos al merge
End Sub

MUCHAS GRACIAS POR LA AYUPA
Salu2
SergioT

"SoftJaén" escribió en el mensaje
news:%
"SergioT" escribió:

tengo un problema bastante raro con el Excel2003 desde vb.net
instancio una aplicacion excel, un libro y una hoja, luego opero con
ellos
y finalmente cierro el libro , el excel y hasta le coloco nothing a los
objetos usados pero se queda el proceso excel corriendo, por lo menos
eso
muestra el Adm de Tareas del XP

Que me falta para matar los procesos?



Hola, Sergio:

Si haces una llamada expresa al recolector de elementos no utilizados,
entiendo que en el Administrador de tareas no debería de aparecer el
proceso
de Excel, porque de lo contrario, desaparecía el proceso cuando cierres
el
formulario o finalice la aplicación. Pero el hecho que llames al método
«Quit» y establezcas a «Nothing» el valor de la variable objeto
«Excel.Application», no significa que EN ESE MISMO INSTANTE se elimine el
proceso.

En Visual Basic clásico, así es como se finaliza el proceso, pero en .NET
la
cosa es bastante distinta por la finalización no determinada de la que
disponen los objetos. El establecer un valor a «Nothing» significa que
dicha
variable objeto será eliminada del todo por el recolector de elementos no
utilizados, ALGÚN MOMENTO DESPUÉS que haya salido de su ámbito de
visibilidad o se haya establecido expresamente su valor a «Nothing».

Pero como no has expuesto TODO el código que utilizas, o al menos, el
tipo
de declaración de objetos y el alcance de los mismos que empleas, pues
ignoro el motivo por el cual no se "mata" el proceso.

A continuación te muestro un ejemplo para manejar una instancia de Excel.
Para ejecutarlo, inicia un nuevo proyecto y haces referencia a la
biblioteca
de Microsoft Excel 11.0. Inserta cuatro botones de comando en el
formulario
de inicio, abres el editor de código y copia/pega lo siguiente:

Imports Microsoft.Office.Interop

Public Class Form1

Private oApp As Excel.Application ' Objeto Application
Private oWorkBook As Excel.Workbook ' Libro de trabajo

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' Creamos una nueva instancia de Excel
oApp = New Excel.Application

' Creo un nuevo objeto WorkBook
oWorkBook = oApp.Workbooks.Add

MessageBox.Show("Se ha creado la instancia de Excel, " & _
"pero todavía no es visible.")
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click

' Establezco el objeto Sheet con la primera hoja activa
Dim oSheet As Excel.Worksheet ' Hoja de trabajo
oSheet = CType(oWorkBook.Sheets(1), Excel.Worksheet)

' Hago visible la aplicación, activando la primera hoja
oApp.Visible = True
oWorkBook.Windows(1).Activate()

' Le doy al usuario el control de la aplicación.
oApp.UserControl = True

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button3.Click

' Indico que el libro ya ha sido guardado
oWorkBook.Saved = True

' Cierro el libro
oWorkBook.Close()

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button4.Click

' 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()

End Sub

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load

With Me
.Button1.Text = "Abrir Excel"
.Button2.Text = "Mostrar Excel"
.Button3.Text = "Cerrar Excel"
.Button4.Text = "Salir de Excel"
End With
End Sub

End Class

Ejecuta el código en el mismo orden que aparece el texto mostrado en los
botones de comando.

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.






Respuesta Responder a este mensaje
#4 SoftJaén
27/06/2006 - 20:02 | Informe spam
"SergioT" escribió:

Te paso la funcion que usa el Excel para que me des tu opinion, se trata
de una funcion que la uso en un proceso medio largo que consiste en hacer
una consulta a la BD, crear una planilla excel, luego usar esa plantilla
como un "origen de datos" de word de forma que en una plantilla pueda
convinar documentos con los datos de la planilla excel. Como veras solo lo
uso al excel para generar el origen de datos a ser usado luego por Word
para convinar cartas. En la etapa inicial del proceso coloco el DS en un
texto que luego lo habro con Excel y lo convierto el libro, de eso se
trata la funcion que te paso a continuacion y donde el excel se queda
"trancado", Un detalle mas, esto lo hago en una clase que esta en un
proyecto de tipo "libreria de clases" que es usado por una aplicacion
asp.net, Con esto logro tener 2 cosas el documento Excel con la "base de
datos" y las cartas convinadas

'==> 'Esta es la funcion que convierte un file texto en un Excel ESTA ES LA QUE
MOLESTA CON EL EXCEL INMortAL
'==> Public Sub TextToExcel




¡Vaya jaleo que tienes en el procedimiento! Me imagino que tendrás
desactivada la instrucción «Option Strict», porque de tenerla activada, no
serías capaz de ejecutar ni una sola línea de código. :-)

A simple vista, no observo nada extraño en el procedimiento «TextToExcel»,
que parece ser que es el que te deja el proceso de Excel en el Administrador
de tareas, pero algo raro tienes que tener por ahí, para que una vez llamado
el recolector de elementos no utilizados, ni siquiera se elimine el proceso.

Desde luego, mi primer consejo sería que activaras la instrucción «Option
Strict», aún a riesgo de que te aparezcan multitud de líneas azules de
error. Pero si deseas corregir el problema, por ahí se empieza: activando
«Option Strict» y depurando los errores.

¿Has probado el ejemplo que he publicado? ¿Has observado que no se queda el
proceso en memoria? Lo único que tienes que hacer es adaptar el ejemplo a
tus necesidades, porque no hay otro misterio.

Exc = CreateObject("Excel.Application")



¿Por qué utilizas la función CreateObject? Si tienes referenciada en tu
proyecto la biblioteca de Excel, dicha función sobra. Cámbiala por la
siguiente:

' Creamos una nueva instancia de Excel
Exc = New Excel.Application

De todas maneras, te voy a decir una cosa. Si tu intención es crear un libro
de Excel con los datos de un archivo de texto delimitado, hay mejores
maneras de crearlo, de una forma más rápida y eficaz, sin utilizar para nada
la biblioteca de Excel, y por tanto, sin tener que preocuparte que el
proceso de Excel se quede o no en el Administrador de Tareas. Simplemente
tienes que utilizar los ISAM de Texto y de Excel que nos proporciona el
motor de datos Microsoft Jet, para llevar a efecto la operación. Si deseas
conocer cómo se hace, ahí va un ejemplo:

Imports System.Data.OleDb

Dim cnn As New OleDbConnection

' Configuramos la cadena de conexión para
' abrir el archivo de texto, indicando
' únicamente la ruta de la carpeta donde
' se encuentra el archivo de texto.
'
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos; " & _
"Extended Properties='TEXT;'"

Try
' Creamos un comando para posteriormente
'crear el libro de Excel.
'
Dim cmd As New OleDbCommand
With cmd
' Construimos la consulta SQL para crear el
' libro de Excel.
.CommandText = "SELECT * INTO NombreHojaExcel " & _
"IN ''[Excel 8.0;Database=C:\Mis documentos\Libro28.xls]" & _
"FROM NombreArchivoTexto#txt"

.Connection = cnn
End With

' Abrimos la conexión
cnn.Open()

' Ejecutamos el comando
Dim regAfectados As Integer = cmd.ExecuteNonQuery()
cmd = Nothing

MessageBox.Show("Número de registros afectados: " & _
regAfectados.ToString)

Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Errors(0).Message)

Catch ex As Exception
MessageBox.Show(ex.Message)

Finally
' Cerramos la conexión
cnn.Close()
cnn = Nothing

End Try

Fíjare con que facilidad se crea un flamante libro de Excel, con los datos
contenidos en un archivo de texto, sin utilizar para nada la biblioteca de
Excel. :-)

Si deseas conocer cómo trabajar con los ISAM de Texto y Excel, échale un
vistazo a los artículos que tengo publicados al respecto:

Trabajar con los datos de un archivo de texto
http://mvp-access.com/softjaen/arti...t_isam.htm

Trabajar con ADO, DAO y Excel
http://mvp-access.com/softjaen/arti..._excel.htm

Los ejemplos que aparecen en los artículos, fueron escritos para Visual
Basic 6.0, pero los puedes fácilmente adaptar a Visual Basic .NET, porque
como siempre digo, la teoría es la misma; no ha cambiado.

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.
Respuesta Responder a este mensaje
#5 SergioT
03/07/2006 - 22:51 | Informe spam
Hola

Gracias por el ejemplo de creacion de Excel voy a intentarlo

Salu2
Sergio

"SoftJaén" escribió en el mensaje
news:
"SergioT" escribió:

Te paso la funcion que usa el Excel para que me des tu opinion, se trata
de una funcion que la uso en un proceso medio largo que consiste en hacer
una consulta a la BD, crear una planilla excel, luego usar esa plantilla
como un "origen de datos" de word de forma que en una plantilla pueda
convinar documentos con los datos de la planilla excel. Como veras solo
lo
uso al excel para generar el origen de datos a ser usado luego por Word
para convinar cartas. En la etapa inicial del proceso coloco el DS en un
texto que luego lo habro con Excel y lo convierto el libro, de eso se
trata la funcion que te paso a continuacion y donde el excel se queda
"trancado", Un detalle mas, esto lo hago en una clase que esta en un
proyecto de tipo "libreria de clases" que es usado por una aplicacion
asp.net, Con esto logro tener 2 cosas el documento Excel con la "base de
datos" y las cartas convinadas

'==>> 'Esta es la funcion que convierte un file texto en un Excel ESTA ES LA
QUE
MOLESTA CON EL EXCEL INMortAL
'==>> Public Sub TextToExcel




¡Vaya jaleo que tienes en el procedimiento! Me imagino que tendrás
desactivada la instrucción «Option Strict», porque de tenerla activada, no
serías capaz de ejecutar ni una sola línea de código. :-)

A simple vista, no observo nada extraño en el procedimiento «TextToExcel»,
que parece ser que es el que te deja el proceso de Excel en el
Administrador
de tareas, pero algo raro tienes que tener por ahí, para que una vez
llamado
el recolector de elementos no utilizados, ni siquiera se elimine el
proceso.

Desde luego, mi primer consejo sería que activaras la instrucción «Option
Strict», aún a riesgo de que te aparezcan multitud de líneas azules de
error. Pero si deseas corregir el problema, por ahí se empieza: activando
«Option Strict» y depurando los errores.

¿Has probado el ejemplo que he publicado? ¿Has observado que no se queda
el
proceso en memoria? Lo único que tienes que hacer es adaptar el ejemplo a
tus necesidades, porque no hay otro misterio.

Exc = CreateObject("Excel.Application")



¿Por qué utilizas la función CreateObject? Si tienes referenciada en tu
proyecto la biblioteca de Excel, dicha función sobra. Cámbiala por la
siguiente:

' Creamos una nueva instancia de Excel
Exc = New Excel.Application

De todas maneras, te voy a decir una cosa. Si tu intención es crear un
libro
de Excel con los datos de un archivo de texto delimitado, hay mejores
maneras de crearlo, de una forma más rápida y eficaz, sin utilizar para
nada
la biblioteca de Excel, y por tanto, sin tener que preocuparte que el
proceso de Excel se quede o no en el Administrador de Tareas. Simplemente
tienes que utilizar los ISAM de Texto y de Excel que nos proporciona el
motor de datos Microsoft Jet, para llevar a efecto la operación. Si deseas
conocer cómo se hace, ahí va un ejemplo:

Imports System.Data.OleDb

Dim cnn As New OleDbConnection

' Configuramos la cadena de conexión para
' abrir el archivo de texto, indicando
' únicamente la ruta de la carpeta donde
' se encuentra el archivo de texto.
'
cnn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=C:\Mis documentos; " & _
"Extended Properties='TEXT;'"

Try
' Creamos un comando para posteriormente
'crear el libro de Excel.
'
Dim cmd As New OleDbCommand
With cmd
' Construimos la consulta SQL para crear el
' libro de Excel.
.CommandText = "SELECT * INTO NombreHojaExcel " & _
"IN ''[Excel 8.0;Database=C:\Mis documentos\Libro28.xls]" & _
"FROM NombreArchivoTexto#txt"

.Connection = cnn
End With

' Abrimos la conexión
cnn.Open()

' Ejecutamos el comando
Dim regAfectados As Integer = cmd.ExecuteNonQuery()
cmd = Nothing

MessageBox.Show("Número de registros afectados: " & _
regAfectados.ToString)

Catch ex As OleDb.OleDbException
MessageBox.Show(ex.Errors(0).Message)

Catch ex As Exception
MessageBox.Show(ex.Message)

Finally
' Cerramos la conexión
cnn.Close()
cnn = Nothing

End Try

Fíjare con que facilidad se crea un flamante libro de Excel, con los datos
contenidos en un archivo de texto, sin utilizar para nada la biblioteca de
Excel. :-)

Si deseas conocer cómo trabajar con los ISAM de Texto y Excel, échale un
vistazo a los artículos que tengo publicados al respecto:

Trabajar con los datos de un archivo de texto
http://mvp-access.com/softjaen/arti...t_isam.htm

Trabajar con ADO, DAO y Excel
http://mvp-access.com/softjaen/arti..._excel.htm

Los ejemplos que aparecen en los artículos, fueron escritos para Visual
Basic 6.0, pero los puedes fácilmente adaptar a Visual Basic .NET, porque
como siempre digo, la teoría es la misma; no ha cambiado.

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.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida