none
[VB2010] Salvataggio e chiusura file excel

    Question

  • Salve a tutti,

    ho creato un'applicazione in VB che mi consente di apreire e scrivere file excel. Vorrei sapere se è possibile salvare automaticamente il file all'atto della chiusura senza fare comparire la tipica finestra di dialogo di salvataggio.

    Il codice che ho utilizzato è il seguente

     

    Dim objExcel As

    Object

     

    Dim objWorkbook As

    Object

     

    Dim objWorksheet As

    Object

    objExcel = CreateObject("Excel.Application"

    )

    objWorkbook = objExcel.Workbooks.open(

    String.Format("{0}"

    , percorsoScritture))

    objWorksheet = objWorkbook.worksheets(

    "Foglio1"

    )

    objExcel.Visible =

    True

    ... scrittura file...

    objWorkbook = objExcel.Workbooks.Close(

     

    )

    objExcel.quit()

    Tuesday, January 17, 2012 5:11 PM

Answers

All replies

  • Sono risucito a risolvere il problema con:

    objWorkbook = objExcel.Save()

    Tuttavia se esiste un file salvato con lo stesso nome mo chiede se sostituiro. E' possibile sovrascriverlo direttamente?

    Tuesday, January 17, 2012 6:03 PM
  • Ciao Rugg88,

    Sono risucito a risolvere il problema con:

    objWorkbook = objExcel.Save()

    Tuttavia se esiste un file salvato con lo stesso nome mo chiede se sostituiro. E' possibile sovrascriverlo direttamente?

    la finestra di dialogo e quella di Excel , non credo sia possibile cambiare l'impostazione.

    Ciao.


    Tuesday, January 17, 2012 6:17 PM
  • Rug88, scusa se mi permetto, ma in un altro post di oggi non avevo detto di aver risolto il problema della creazione del file Excel utilizzando la libreria CarlosAg Xml Writer Library che ti avevo consigliato?

    Come mai sei passato ad utilizzare l'oggetto COM di Excel?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Tuesday, January 17, 2012 6:38 PM
  • Il problema è che ho utilizzato due Library dato che avevo già scritto una parte dell'applicazione con quella di COM di Excel prima che tu mi dessi una mano. Mi consigli di modificare l'applicazione in modo da usare solo la CarlosAg Xml Writer Library ?

    Tuesday, January 17, 2012 7:11 PM
  • Ciao Marco,

    sinceramente sto vedendo un po' come fare ad utilizzare solo la labrary (CarlosAg Xml Writer Library )che mi hai consigliato ma non ho capito bene come effettuare la scrittura delle celle (in particolare come scrivere in una determinata cella). Sapresti darmi qualche indizazione?

    Tuesday, January 17, 2012 8:02 PM
  • Per scrivere in una determinata cella, devi indicare le coordinate di riga e colonna desiderate, utilizzando le proprietà Index degli oggetti WorksheetRow e WorksheetCell.

    Ad esempio, supponendo che tu abbia un oggetto Worksheet di nome sheet, per scrivere nella cella B4, che ha indice di riga 4, indice di colonna 2, devi usare questo codice:

    Dim row = sheet.Table.Rows.Add()
    row.Index = 4
    Dim cellValue As New WorksheetCell("valore)
    cellValue.Index = 2
    
    row.Cells.Add(cellValue)
    

    Diciamo che non è un modo molto intuitivo, però puoi facilmente creare una funzione che, data la cella nella forma "A1", "A2", ecc. ti restituisce i corrispondenti indici di riga e di colonna.

    Un'altra soluzione è quella che ti segnalato Mauro Servienti nell'altro post, ovvero un'altra libreria per la scrittura di file Excel, http://closedxml.codeplex.com/. Gli ho dato una rapida occhiata e sembra davvero ben fatta, inoltre include nativamente la possibiltà d scrivere in una determinata cella (come potrai vedere nell'esempio contenuto nella pagina principale su CodePlex ti cui ti ho dato il link).


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Tuesday, January 17, 2012 8:35 PM
  • Ho provato con scaricando la libreria ClosedXML e caricandola (inserendo anche Imports ClosedXML) e prendendo il codice dal link che mi hai postato (l'ho tradotto in VB). Tuttavia il compilatore mi dice 

    XLWorkbook non è riconosciuto. Come mai?

    Tuesday, January 17, 2012 10:30 PM
  • La classe XLWorkbook è contenuta nel namespace CloseXML.Excel, quindi l'import corretto da utilizzare è:

    Imports ClosedXML.Excel
    


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Tuesday, January 17, 2012 10:36 PM
  • Si ora non è riconosciuto ma mettendo questo codice:

    Dim

     

    workbook = New XLWorkbook

    ()

     

    Dim worksheet = workbook.Worksheets.Add("Sample Sheet"

    )

    worksheet.Cell(

    "A1").Value =

    "Hello World!"

    workbook.SaveAs(

    "HelloWorld.xlsx"

    )

    risulta un errore quando eseguo il debug. Mi esce la seguente scritta "L'inizializzatore di tipo di 'ClosedXML.Excel.XLWorkbook' ha generato un'eccezione.". Dove sbaglio ora?

    Tuesday, January 17, 2012 10:43 PM
  • La libreria ClosedXML utilizza l'Open XML SDK di Microsoft. L'errore è dovuto al fatto che non quest'ultimo non è presente sul tuo PC.

    Per risolvere il problema, scarica il file DocumentFormat.OpenXml.dll da questo indirizzo: http://www.codeplex.com/Download?ProjectName=closedxml&DownloadId=177539. Fatto questo, aggiungi al tuo progetto anche la reference a tale file (come hai già fatto per ClosedXML): ora tutto dovrebbe funzionare senza problemi.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Wednesday, January 18, 2012 12:30 AM
  • Ho inserto ClosedXML è relativo import (Imports DocumentFormat.OpenXml.Packaging Imports DocumentFormat.OpenXml.Wordprocessing) ora non si blocca più ma non mi esce nulla nella cella indicata. Ti inserisco tutto il codice che ho inserito:

    Imports System.IO
    Imports DocumentFormat.OpenXml.Packaging
    Imports DocumentFormat.OpenXml.Wordprocessing
    Imports CarlosAg.ExcelXmlWriter
    Imports ClosedXML.Excel
    Module Module1

        Sub Main()
            Dim filename As String = "C:\Users\UTENTE\Desktop\PROVA\FDS+EVAC_OUT\prova1_OUTPUT.xml"
            Dim book As New Workbook()

            Dim sheet As Worksheet = book.Worksheets.Add("Pagina1")

            Dim workbook = New XLWorkbook()
            Dim worksheet = workbook.Worksheets.Add("Sample Sheet")
            worksheet.Cell("A1").Value = "Hello World!"
            workbook.SaveAs("HelloWorld.xlsx")
           
            book.Save(filename)
            Process.Start(filename)

        End Sub

    End Module

    Wednesday, January 18, 2012 7:40 AM
  • C'è un errore nel codice.

    Tu fai

    workbook.SaveAs("HelloWorld.xlsx")
    

    Quindi salvi il file con nome HelloWorld.xlsx.

    Subito dopo, però, salvi un altro oggetto, di tipo Workbook, quindi ancora relativo alla libreria CarlosAg Xml Excel Writer, e poi tenti di aprilo: in quest'ultimo non hai scritto nulla, quindi ottieni giustamente un file vuoto.

    Apri il file HelloWorld.xlsx e vedrai che trovarei il valore corretto nella cella A1.

    Per evitare problemi del genere, ti consiglio di eliminare la reference alla vecchia libreria dal progetto.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Wednesday, January 18, 2012 8:30 AM
  • Grazie mille ancora una volta, finalmente ho capito!

    Un ultima cosa, il formato originale del file creato è xml, giusto? In tal caso c'è qualche modo per evitare che mi esca ogni volta che lo apro con excel esca la fastidiosa finestra di dialogo che mi avvisa della differenza del formato di apertura rispetto a quello originale?

    Wednesday, January 18, 2012 8:51 AM
  • La libreria ClosedXML salva nel formato nativo di Excel, quindi in formato xlsx, perciò puoi assegnare ai tuoi file questa estensione, proprio come avviene nell'esempio che hai provato tu stesso.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Wednesday, January 18, 2012 8:58 AM
  • Grazie mille!!! Funziona!!! I tuoi aiuti sono sempre validi!!!!

    Ruggiero

    Wednesday, January 18, 2012 1:16 PM
  • E per me è sempre un piacere :-)


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva
    Wednesday, January 18, 2012 6:01 PM