Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    492

    [VB.NET] Dopo aver aperto file excell e salvato dati, il processo rimane in memoria

    Salve a tutti
    nella mia applicazione apro un file excell, salvo i dati e poi chiudo la connessione, ma in task manager il processo rimane attivo.

    Di seguito il codice utilizzato

    Grazie per le risposte



    codice:
    Dim exWb = excellApp.Workbooks.Open(strPerc)
    
                    'seleziona il foglio di lavoro 1 del file excel
                    Dim numSheet = excellApp.Worksheets.Count
                    'Dim a = excellApp.Worksheets.Select(1)
                    Dim exWs = exWb.Worksheets(1)
                    Dim nameWs = exWs.name
    
                    Dim con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPerc & ";" & "Extended Properties=Excel 8.0")
                    con.Open()
                    Dim queryExcell As String = ("SELECT * FROM " & "[" & nameWs & "$]")
                    Dim cmd As New OleDb.OleDbDataAdapter(queryExcell, con)
                    DS = New DataSet
                    cmd.Fill(DS, "tabella")
                    DataGridViewExcell.DataSource = DS
                    DataGridViewExcell.DataMember = "Tabella"
    
                    con.Close()
    Premetto che ho visto procedure per killare i processi, ma c'è un modo meno drastico dopo aver aperto e letto un file excell?

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    492
    Avevo provato anche così dopo la chiusura della conn

    codice:
    excellApp.Workbooks.Close()
    ma in Task Manager risulta sempre attivo il processo

  4. #4
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    No, io mi riferisco all'oggetto excellApp, non al Workbooks (che comunque andrebbe chiuso anche quello).

    Dovrebbe essere
    codice:
    exWb.Close
    excellApp.Quit

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    492
    Provato con quanto mi hai indicato tu....ma in TM risulta sempre il processo EXCELL.exe. Più file excell apro e più ne rimangono aperti.
    Infatti se provo a riaprire più di una volta un file excell mi dice che è in uso da altro processo/utente

  6. #6
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Allora c'è anche qualche altro problema.

    Mostra il codice con cui crei l'oggetto excellApp...

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    492
    Ecco

    codice:
    Public Sub caricaExcell()
            Dim DS As New DataSet
    
            'Dim numRighe As Integer
            'Dim indRiga As Integer
            Dim strPerc As String
    
            Try
                'Apertura finestra di dialogo per apertura file
                Dim apriFile As New OpenFileDialog
                apriFile.InitialDirectory = App_Path()
    
                apriFile.Multiselect = True
                If apriFile.ShowDialog = DialogResult.OK Then
    
    
                    'apre excel
                    Dim excellApp = New Excel.Application
                    'Rende visibile Excel
                    'excellApp.Visible = False
                    'apre il file xls
                    strPerc = apriFile.FileName
    
                    'Gestire multiselezione
                    'Dim nFilesel = apriFile.FileNames
    
                    'Dim nFile As Integer
                    'nFile=asa.
    
                    Dim exWb = excellApp.Workbooks.Open(strPerc)
    
                    'seleziona il foglio di lavoro 1 del file excel
                    Dim numSheet = excellApp.Worksheets.Count
                    'Dim a = excellApp.Worksheets.Select(1)
                    Dim exWs = exWb.Worksheets(1)
                    Dim nameWs = exWs.name
    
                    Dim con As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & strPerc & ";" & "Extended Properties=Excel 8.0")
                    con.Open()
                    Dim queryExcell As String = ("SELECT * FROM " & "[" & nameWs & "$]")
                    Dim cmd As New OleDb.OleDbDataAdapter(queryExcell, con)
                    DS = New DataSet
                    cmd.Fill(DS, "tabella")
                    DataGridViewExcell.DataSource = DS
                    DataGridViewExcell.DataMember = "Tabella"
    
                    exWb.Close()
                    excellApp.Quit()
                    con.Close()
    
                    
                    'excellApp.Workbooks.Close()
    
                    caricaDatiDB()
    
                End If
            Catch ex As COMException
                MessageBox.Show("Error accessing Excel: " + ex.ToString())
            Catch ex As Exception
                MessageBox.Show("Error: " + ex.ToString())
            End Try
    
        End Sub

  8. #8

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    492
    esatto
    se pensi che mi crea solo prob (come sto vedendo anche io) accetto con enorme piacere altri suggerimenti ;-)

  10. #10
    Utente di HTML.it L'avatar di gibra
    Registrato dal
    Apr 2008
    residenza
    Italy
    Messaggi
    4,244
    Originariamente inviato da zorro77
    esatto
    se pensi che mi crea solo prob (come sto vedendo anche io) accetto con enorme piacere altri suggerimenti ;-)
    Personalmente sconsiglio questo metodo (early-binding), perchè obbliga ad aggiungere un riferimento ad una versione specifica di Excel, e quando si cambia versione oppure il codice viene eseguito su un computer che ha una versione diversa, non funziona più.

    E' sempre meglio usare il 'late-binding' ovvero CreateObject() che funzionerà sempre con qualsiasi versione di Excel installata.


    Quindi prima togli il riferimento alla libreria di Excel, poi modifica il codice come sotto (ti riporto le parti salienti):

    codice:
    'apre excel
    Dim excellApp As Object
    excellApp = CreateObject("Excel.Application")
    
    ' apre il workbook
    Dim exWb As Object
    exWb = excellApp.Workbooks.Open(strPerc)
    
    ' apre il worksheet
    Dim exWs As Object
    exWs = exWb.Worksheets(1)
    
    '
    ' codice vario di elaborazione
    '
    
    ' codice di chiusura
    con.Close()
    con = Nothing
    
    exWs = Nothing
    
    exWb.Close()
    exWb = Nothing
    
    excellApp.Quit()
    excellApp = Nothing
    Ovviamente, in questo caso, le righe seguenti non hanno più ragione d'essere:
    codice:
    Catch ex As COMException
        MessageBox.Show("Error accessing Excel: " + ex.ToString())

    Comunque, nonostante il codice sia corretto, vi sono effettivamente problemi nel rilascio dell'istanza di Excel.
    - Apri Gestione Attività e spostalo a destra dello schermo.
    - Ora avvia la tua applicazione e, una volta caricato il DataGridView si vede che l'istanza resta 'appesa'.
    - Nel DataGridView premi 2 o 3 volte i tasti END e HOME.
    - Vedrai che l'istanza sparisce da Gestione attività.

    Naturalmente non è un metodo applicabile quindi ecco la soluzione finale:

    Aggiungi l'Imports
    Imports System.Runtime.InteropServices

    Poi aggiungi al codice sopra le parti in blue che riporto sotto:

    codice:
    excellApp.Quit()
    
    Marshal.ReleaseComObject(excellApp)
    
    excellApp = Nothing
    
    GC.Collect()
    GC.WaitForPendingFinalizers()
    GC.Collect()
    Ora vedrai che in Gestione attività l'istanza viene rilasciata immediatamente.


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.