Aprire file Excel con Vb .Net

martedì 20 maggio 2008 - 16.17

nicop Profilo | Newbie

Salve ragazzi,
avrai bisogno di una mano,in pratica ho un file excel che dovrei aprire tramite Vb .Net 2003 prenderne il contenuto e salvare in un database access.
Mi date qualche spunto su come partire??
Grazie a tutti per le eventuali risposte.

ciao

Brainkiller Profilo | Guru

>Salve ragazzi,
>avrai bisogno di una mano,in pratica ho un file excel che dovrei
>aprire tramite Vb .Net 2003 prenderne il contenuto e salvare
>in un database access.
>Mi date qualche spunto su come partire??

Ciao,
allora io di solito uso gli Office PIAs. Sono degli Assembly di interoperabilità che ti consentono di interfacciarti con i tools di Office tra cui naturalmente Excel. Per farli funzionare è necessario che sulla macchina sia installato il prodotto Excel nel tuo caso.
Questi PIAs fanno da classe proxy e ti collegano all'object model di Excel esposto tramite i classici oggetti COM.

Qui ci sono due articoli uno di introduzione ai PIA e l'altro è un'applicazione per generare file di Excel in 3 modi diversi (uno dei tre è tramite PIA). La procedura contraria è di leggerli quindi ti può essere d'aiuto per capire come fare:
http://www.dotnethell.it/articles/officexppia.aspx
http://www.dotnethell.it/articles/ExportExcelDataset.aspx

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

Innazzitutto grazie per la risposta.
Allora googlando ero arrivato gia ai link da te postati ed infatti tramite loro mi sono iscritto sul forum .
Seguendo quello che c'è scritto nei documenti sono riuscito ad installare le PIA e a fare le reference ad Excel all'interno di Vb .Net ,scusami però tramite quei documenti non sono riuscito a trovare info utili a quello che devo fare ed allora ho postato sul forum.
Gentilmente potresti darmi qualche altra dritta??

ciao nicola.

Brainkiller Profilo | Guru

>Gentilmente potresti darmi qualche altra dritta??

Ciao Nicola,
allora guarda qui:
http://www.dotnethell.it/articles/ExportExcelDataset.aspx

Vai al Listato n° 1. Spero tu conosca un po' di VBA, lo conosci ? Se sì avrai vita molto agevolata.
A questo punto tu hai referenziato le DLL e quindi hai accesso all'object Model di Excel, lo stesso che puoi usare creando delle Macro in Excel. In questa situazione sei nella condizione di poter pilotare quasi tutte le funzionalità di Excel da codice.

Quindi puoi per esempio aprire un file Excel in questo modo:

Workbook wbk= ap.Workbooks.Open("C:\\test.xls");

Una volta aperto l'Intellisense di Visual Studio ti può aiutare visualizzandoti tutti i metodi e le proprietà del Workbook. Potrai quindi andare a leggere Range di Celle o singole celle e così avanti.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

Dopo varie ricerce e varie prove sono riuscito ad aprire il file Excel con Vb .Net con questo semplice frammento di codice
Sub Apri() Dim numRighe As Integer Dim indRiga As Integer Dim strPerc As String 'Apertura finestra di dialogo per apertura file If ApriFile.ShowDialog = DialogResult.OK Then 'apre excel exApp = New Excel.Application 'Rende visibile Excel exApp.Visible = True 'apre il file xls strPerc = ApriFile.FileName exWb = exApp.Workbooks.Open(strPerc) 'seleziona il foglio di lavoro 1 del file excel exWs = exWb.Worksheets(1) End If End Sub
Ora mi serve qualche altro piccolo spunto per andare avanti !!!
A questo punto aperto il file Excel devo estrarre il contenuto e inserire il tutto in un database fatto in Access ...
Illuminami !!!

Grazie ancora Nicola

Brainkiller Profilo | Guru

>Dopo varie ricerce e varie prove sono riuscito ad aprire il file
>Excel con Vb .Net con questo semplice frammento di codice

exWb = exApp.Workbooks.Open(strPerc)

questo ti sembrava diverso ?

Workbook wbk= ap.Workbooks.Open("C:\\test.xls");

>A questo punto aperto il file Excel devo estrarre il contenuto
>e inserire il tutto in un database fatto in Access ...
>Illuminami !!!

Ora puoi fare un ciclo sulle celle.
Recuperi il valore delle celle dando le coordinate x,y come a battaglia navale.
Esempio:

Dim ts as string ts=workbook.Cells(1,1)

restituisce il valore della cella A1.
Puoi fare due cicli for o do..while uno dentro l'altro.

Recuperi tutti i valori e ti costruisci delle query INSERT che poi pasi al DB.

Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

Hai ragione cmq mi sono basato un po sul tuo esempio ed un po se altri esempi !!
Uno cosa non mi è chiara ... io a priori non so di quante celle è formato il mio foglio excel,c'è qualche funzione che mi permette di sapere quando sono arrivato all'ultima cella piena???

ciaoo

Brainkiller Profilo | Guru

>Hai ragione cmq mi sono basato un po sul tuo esempio ed
>un po se altri esempi !!
>Uno cosa non mi è chiara ... io a priori non so di quante celle
>è formato il mio foglio excel,c'è qualche funzione che mi permette
>di sapere quando sono arrivato all'ultima cella piena???

Si, tu vai di cella in cella fino a quando non trovi una cella vuota ossia dove Value==""
E la matti come condizione al ciclo do..while
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

Salve eccomi di nuovo a darti un po di fastidio sei la mia boa in mezzo all'oceano !!!
L'altra volta ti ho chiesto come recuparare il valore delle celle e la tua risposta è stata la seguente :

Ora puoi fare un ciclo sulle celle. Recuperi il valore delle celle dando le coordinate x,y come a battaglia navale. Esempio: Dim ts as string ts=workbook.Cells(1,1) restituisce il valore della cella A1. Puoi fare due cicli for o do..while uno dentro l'altro.

ok... basandomi su questo mi sono ricavato il numero delle esatto delle righe e delle colonne ho attivato il range ed ho selezionato tutto il foglio di lavoro Excel.
Dopo di ciò ho fatto due cicli for nidificati per scorrere le righe e le colonne ,all'interno dei due cicli ho inserito un controllo tramite un if
solo per vedere se realmente analizzava il contenuto delle celle solo che quando incontra questa istruzione

Dim contenuto As String contenuto = exWs.Cells(2, 2)

Mi restituisce la seguente eccezione :

Eccezione non gestita di tipo "System.InvalidCastException" in microsoft.visualbasic.dll Informazioni aggiuntive: Cast non valido dal tipo 'Range' al tipo 'String'.

Cosa è che sbaglio ???

Ti posto di seguito il pezzo di codice ... e ti ringrazio per l'aiuto che mi stai dando e che sicuramente mi darai !!!!
Purtroppo sono alle prime armi con Vb .Net e spero di non darti fastidio.

Ciao nicola


'conta il numero di righe numRighe = exWs.UsedRange.Rows.Count 'conta il numero delle colonne numColonne = exWs.UsedRange.Columns.Count 'Attivazione range si selezione Celle prima parte exWs.Range(exWs.Cells(2, 1), exWs.Cells(numRighe, numColonne)).Select() 'leggo il contenuto delle celle ?? For indRiga = 2 To numRighe For indColonna = 2 To numColonne Dim contenuto As String contenuto = exWs.Cells(2, 2) If contenuto = "" Then MessageBox.Show("vuota") Else : MessageBox.Show("Piena") End If Next indColonna Next indRiga

Brainkiller Profilo | Guru

>Eccezione non gestita di tipo "System.InvalidCastException" in
>microsoft.visualbasic.dll
>Informazioni aggiuntive: Cast non valido dal tipo 'Range' al
>tipo 'String'.

Ma te lo dà solo su quella cella 2,2 o anche su altre ?

Io uso questo banale codice in VBA e funziona:

Dim alfa As String alfa = Cells(3, 5) MsgBox alfa

Quindi dovrebbe andare anche in C#/VB.NET
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

Rieccomi ....
Allora con qualsiasi valore di Cells diverso da (0,0) mi restituisce l'eccezione che ti ho gia descritto prima .
Se invece mette Cells(0,0) ho questa eccezione :

Eccezione non gestita di tipo "System.Runtime.InteropServices.COMException" in mscorlib.dll Informazioni aggiuntive: Eccezione da HRESULT: 0x800A03EC.

Il codice scritto da me ,secondo un tuo parere, è giusto ??

grazie nicola

Brainkiller Profilo | Guru

>Il codice scritto da me ,secondo un tuo parere, è giusto ??
>grazie nicola

Prova a non far uso del Range. Commenta tutta la parte di selezione del Range.
E accedi alle celle singolarmente come ti ho indicato io in 3 istruzioni.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

Finalmente sono riuscito ad ottenere parte di cio che mi ero prefissato !!!
riesco a leggere il contenuto di tutte le celle , ora devo fare un'altro passettino in avanti ed eccomi qui a richiedere i tuoi preziossisimi consigli!!! spero che non ti disturbo !

In pratica ora che sono riuscito a recuperare tutte le informazioni del foglio Excel devo inserirle nel db !!!
nell 'altro post mi hai detto :

Recuperi tutti i valori e ti costruisci delle query INSERT che poi pasi al DB.

Su come collegare un db e fare le query sono quasi a zero !! mi dai qualche spunto per partire ??

grazie ancora nicola

P.s. ti posto di seguito la funzione che ho scritto per leggere il contenuto del file Excel cosi puoi vedere dove stava l'ingrippo !!!

Sub Leggi() Dim numRighe As Integer Dim numColonne As Integer Dim indRiga As Integer Dim indColonna As Integer 'conta il numero di righe numRighe = exWs.UsedRange.Rows.Count 'conta il numero delle colonne numColonne = exWs.UsedRange.Columns.Count 'Attivazione range di selezione Celle exWs.Range(exWs.Cells(2, 1), exWs.Cells(numRighe, numColonne)).Select() exWs.Activate() 'leggo il contenuto delle celle For indRiga = 28 To numRighe For indColonna = 1 To numColonne Dim contenuto As String contenuto = exWs.Cells(indRiga, indColonna).Value If contenuto <> "" Then MessageBox.Show(contenuto) Else : MessageBox.Show("vuota") End If Next indColonna Next indRiga End Sub

Brainkiller Profilo | Guru

>riesco a leggere il contenuto di tutte le celle , ora devo fare
>un'altro passettino in avanti ed eccomi qui a richiedere i tuoi
>preziossisimi consigli!!! spero che non ti disturbo !

Si poi alla fine ti mando le coordinate del conto corrente per il bonifico

>Su come collegare un db e fare le query sono quasi a zero !!
>mi dai qualche spunto per partire ??

Bisognerebbe capire intanto che DB vuoi usare


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

nicop Profilo | Newbie

hai ragione !!! il db è stato fatto in access ...

Brainkiller Profilo | Guru

Il codice è il seguente per effettuare una INSERT:

string queryString = "INSERT INTO TABELLA (Colonna) VALUES ('Valore')"; using (OleDbConnection connection = new OleDbConnection(connectionString)) { OleDbCommand command = new OleDbCommand(queryString, connection); command.ExecuteNonQuery(); }

La INSERT puoi costruirtela come vuoi concatenando i valori o ancora meglio usando query parametriche (OleDbParameter).

La connectionString può variare qui trovi degli esempi selezionando naturalmente Access:
http://www.connectionstrings.com

ciao


David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5