Aiuto!Connessione Excel con Visual Studio 2005!

lunedì 21 gennaio 2008 - 08.52

gdlcore Profilo | Junior Member

Salve,
il problema è il seguente:
devo fare un mini applicativo che effettua una ricerca su un foglio excel effettuando dei filtri in base a dei campi che gli inserisco. In allegato mando lo screenshot dell'interfaccia che ho già fatto.

Il mio problema più grosso è la connessione del file excel,la sintassi della connessione e le relative istruzioni di ricerca su uno dei fogli del file.
Comunque il file excel contiene la lista delle banche d'Italia con le relative informazioni(ABI,CAB,Nome,Città..).

Spero che qualcuno riesca ad essermi di aiuto in qualche modo perchè sto cercando la soluzione da più di 2 settimane..grazie!

Saluti

Luca

0v3rCl0ck Profilo | Guru

Ciao,

La connection string che cerchi è la seguente:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyExcel.xls;Extended Properties="Excel 8.0;HDR=Yes;IMEX=1";

In pratica è necessario specificare nelle extended properties che il driver dovrà comunicare con un excel di versione 8.0 o precedente. Se devi aprire un excel con il 2007 la connection string sarà:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;Extended Properties="Excel 12.0;HDR=YES";

Comunque per avere una lista completa di connection string possibili, ti consiglio di dare un occhio al questo sito web: http://www.connectionstrings.com

Inoltre in allegato ti ho messo un esempio di come accedere con l'OLEDB all'excel proprio come un database.


Enjoy It
http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Scusa la mia ignoranza..ho inserito la riga che mi hai detto ma mi da errore e mi dice che Provider deve essere dichiarato,prima di inserire quella riga devo fare dei passaggi?C'è una procedura per aprire dei file?E' da 2 settimane che sto usando Visual Studio 2005, è tutto nuovo per me..mi potresti aiutare meglio?Grazie scusa..

0v3rCl0ck Profilo | Guru

Prova a dare un occhio al progetto che ti ho allegato, li si vede con precisione come accedere al foglio excel

http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Ok, ci sono quasi..ma mi da questo errore:
"dtgExcel" non è un membro di "WindowsApplication1.Form1".
Nel file che mi hai mandato, in esplora soluzioni si visualizza il file Excel Test.xls, come hai fatto?Io non riesco a trovare il modo per caricarlo li..è quello il problema? Grazie..

0v3rCl0ck Profilo | Guru

>Ok, ci sono quasi..ma mi da questo errore:
>"dtgExcel" non è un membro di "WindowsApplication1.Form1".

dtgExcel è una grilia che ho messo nel progetto, al quale poi associo il datatable che ho riempito con i dati presi dall'excel.

>Nel file che mi hai mandato, in esplora soluzioni si visualizza
>il file Excel Test.xls, come hai fatto?Io non riesco a trovare
>il modo per caricarlo li..

Per comodità io ho messo il file nel progetto, e poi gli ho specificato dalle proprietà del file, che deve essere copiato nella cartella di output. In questo modo quando si compila, l'eseguibile e quel file risiedono nella medesima locazione. Quindi ho potuto utilizzare la property Application.StartupPath per creare la stringa contenente il path, perchè sono sicuro che il file risiede nella stessa posizione dell'eseguibile. Ad ogni modo è un semplice path, basta metterci il path corretto per il foglio excel che vuoi aprire (es.: C:\pippo.xls).

>è quello il problema?

Il problema sta sicuramente nel path dell'excel. Nell'applicativo di esempio che ti ho dato, ci sono un paio di Property che ritornano il path del file, basta che tu modifichi quelle property in modo tale da ritornare il corretto path al tuo file excel.

>Grazie..
Prego

http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Ciao,sono ancora io..
Non riesco ancora..forse mi perdo qualche passaggio..
Ho errore su questa parte:

" Private ReadOnly Property ExcelConnectionStringV12() As String
Get
--> Return String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={1};Extended Properties=""Excel 12.0;HDR=YES"";", Me.ExcelFilePath)<--
End Get
End Property"

Errore:"L'indice (in base zero) deve essere maggiore o uguale a zero e minore della dimensione dell'elenco degli argomenti."

Secondo me sbaglio qualcosa nel path del mio file..dove lo devo mettere per essere comodo come lo hai fatto tu?E qual'è la parola che mi va a richiamare la path del file excel..
Devo fare qualche altro passaggio oltre alla scrittura del codice?Tipo caricare origini di dati o cose del genere?

Scusami se ti chiedo cosi tante cose,ma almeno poi capisco..(si spera )


gdlcore Profilo | Junior Member

Ciao..più o meno sono riuscito ad arrangiarmi per quanto riguarda la visualizzazione della griglia nel DataGridView.
Ora il mio problema è quello di effettuare delle ricerche nei campi del foglio.

Come posso fare? Con che comandi posso effettuare la ricerca?

Qualcuno mi aiuti per favore..

0v3rCl0ck Profilo | Guru

>Ciao,sono ancora io..
>Non riesco ancora..forse mi perdo qualche passaggio..
>Ho errore su questa parte:
>
>" Private ReadOnly Property ExcelConnectionStringV12() As String
> Get
>--> Return String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data
>Source={1};Extended Properties=""Excel 12.0;HDR=YES"";", Me.ExcelFilePath)<--
> End Get
> End Property"

Questa è stata una mia svista ... devi mettere {0} al posto di {1}

>
>Errore:"L'indice (in base zero) deve essere maggiore o uguale
>a zero e minore della dimensione dell'elenco degli argomenti."
>
>Secondo me sbaglio qualcosa nel path del mio file..dove lo devo
>mettere per essere comodo come lo hai fatto tu?E qual'è la parola
>che mi va a richiamare la path del file excel..
>Devo fare qualche altro passaggio oltre alla scrittura del codice?Tipo
>caricare origini di dati o cose del genere?
>
>Scusami se ti chiedo cosi tante cose,ma almeno poi capisco..(si
>spera )

Non ti preoccupare, lo faccio volentieri

>
>
>

http://blogs.dotnethell.it/Regulator/

0v3rCl0ck Profilo | Guru

>Ciao..più o meno sono riuscito ad arrangiarmi per quanto riguarda
>la visualizzazione della griglia nel DataGridView.
>Ora il mio problema è quello di effettuare delle ricerche nei
>campi del foglio.
>
>Come posso fare? Con che comandi posso effettuare la ricerca?
>

Ti consiglio di effettuare le ricerche utilizzando le query direttamente su excel. Ad esempio, invece che mettere una semplice " SELECT * FROM [Foglio1] " aggiungere anche delle where " SELECT *FROM [Foglio1] WHERE [NomeColonna] = 'pippo' AND [NomeColonna2] = 100 "


http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Grazie..comunque ci siamo quasi.
Ora ho questo errore:
Tipi di dati non corrispondenti nell'espressione criterio.
Su questa istruzione:
DA.Fill(dtExcel)

Questo problema è riferito al filtro che faccio, ora ti faccio un esempio:
se voglio vedere le banche con Abi=01000 faccio:
Using Cmd As New OleDb.OleDbCommand("SELECT * FROM [Abi$] Where [AbiCode]=01000 ", Conn)

Però non mi va..dov'è il problema?

gdlcore Profilo | Junior Member

Mamma mia che scemo che sono..
Anche se è un numero ci vogliono gli apici perchè è in formato testo..
Non ho parole..

Grazie mille..se ho ancora qualche problema ti faccio sapere..
Io lavoro al mattino,quindi se ho qualche problema scriverò domani,grazie ancora..

0v3rCl0ck Profilo | Guru

>Mamma mia che scemo che sono..
>Anche se è un numero ci vogliono gli apici perchè è in formato
>testo..
>Non ho parole..

Vabbe, succede dai...

>
>Grazie mille..se ho ancora qualche problema ti faccio sapere..
>Io lavoro al mattino,quindi se ho qualche problema scriverò domani,grazie
>ancora..

Prego, magari accetta un post così chiudiamo il thread.


http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Ciao, risolto il problema della connessione, ora ho il problema di ricercare dei campi sul foglio.
In allegato c'è l'interfaccia grafica del mini applicativo.
Come già accennato in un altro thread, io dovrei inserire uno o più campi di ricerca e dovrei effettuare i filtri relativi sul mio foglio excel.
Il mio problema è quello di inserire la stringa di ricerca in una variabile, che utilizzerò per effettuare il filtro al momento della visualizzazione dei campi..quindi devo utilizzare la stessa variabile che si aggiorna e verrà utilizzata in seguito.
Spero di essere stato chiaro..
Grazie..

0v3rCl0ck Profilo | Guru

>Ciao,

Ciao

>risolto il problema della connessione, ora ho il problema
>di ricercare dei campi sul foglio.

Bene

>In allegato c'è l'interfaccia grafica del mini applicativo.
>Come già accennato in un altro thread, io dovrei inserire uno
>o più campi di ricerca e dovrei effettuare i filtri relativi
>sul mio foglio excel.
>Il mio problema è quello di inserire la stringa di ricerca in
>una variabile, che utilizzerò per effettuare il filtro al momento
>della visualizzazione dei campi..quindi devo utilizzare la stessa
>variabile che si aggiorna e verrà utilizzata in seguito.
>Spero di essere stato chiaro..
>Grazie..

Utilizza delle variabili private con associate delle proprietà pubbliche, su ogni nuova form di ricerca, in questo modo, dalla finestra principale, prima di aprire la form di ricerca, gli imposti la proprietà di ricerca con il contenuto digitato nella textbox e successivamente apri la form, in questo modo, all'avvio della finestra lanci la query su excel e poi fai vedere i dati in una griglia.

Un altro consiglio. Invece che costruirti a mano la query, con i vari filtri con la corretta sintassi, ti puoi aiutare utilizzando gli OledbCommand e gli OledbParameter:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Spero di esserti stato di aiuto


http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

>Utilizza delle variabili private con associate delle proprietà
>pubbliche, su ogni nuova form di ricerca, in questo modo, dalla
>finestra principale, prima di aprire la form di ricerca, gli
>imposti la proprietà di ricerca con il contenuto digitato nella
>textbox e successivamente apri la form, in questo modo, all'avvio
>della finestra lanci la query su excel e poi fai vedere i dati
>in una griglia.

Non ho capito bene questo passaggio..tu dici che per ogni ricerca dovrei fare un form diverso?In teoria io dovrei avere la possibilità di ricercare una banca sia per nome che per città quindi non posso fare la ricerca in form diversi..


>Un altro consiglio. Invece che costruirti a mano la query, con
>i vari filtri con la corretta sintassi, ti puoi aiutare utilizzando
>gli OledbCommand e gli OledbParameter:
>
>Dim Cmd As New OleDb.OleDbCommand()
>
> Cmd.Connection = Conn
>Cmd.CommandText = "SELECT * FROM [Foglio1$] WHERE ColonnaStringa
>= ? AND ColonnaNumerica = ? AND ColonnaData = ?"
>
>Cmd.Parameters.Add(New OleDb.OleDbParameter("@ColonnaStringa",
>"Ciao Mondo!"))
>Cmd.Parameters.Add(New OleDb.OleDbParameter("@ColonnaNumerica",
>100))
>Cmd.Parameters.Add(New OleDb.OleDbParameter("@ColonnaData", Date.Now))
>
> Dim DA As New OleDb.OleDbDataAdapter(Cmd)
>
> DA.Fill(DT)


Questo codice dove va inserito?A me da errore: cmd=prevista dichiarazione.
Ma quel punto di domanda nelle query deve essere il valore che gli passo dalla textbox?Come?

Grazie di tutto..

0v3rCl0ck Profilo | Guru

>>Utilizza delle variabili private con associate delle proprietà
>>pubbliche, su ogni nuova form di ricerca, in questo modo, dalla
>>finestra principale, prima di aprire la form di ricerca, gli
>>imposti la proprietà di ricerca con il contenuto digitato nella
>>textbox e successivamente apri la form, in questo modo, all'avvio
>>della finestra lanci la query su excel e poi fai vedere i dati
>>in una griglia.
>
>Non ho capito bene questo passaggio..tu dici che per ogni ricerca
>dovrei fare un form diverso?In teoria io dovrei avere la possibilità
>di ricercare una banca sia per nome che per città quindi non
>posso fare la ricerca in form diversi..

Generalizzavo... nel caso dovessi avere più form di ricerca. Nel tuo caso forse è sufficiente una sola form di ricerca con più proprietà pubbliche di ricerca, come ad esempio Nome e Città.

>
>
>>Un altro consiglio. Invece che costruirti a mano la query, con
>>i vari filtri con la corretta sintassi, ti puoi aiutare utilizzando
>>gli OledbCommand e gli OledbParameter:
>>
>>Dim Cmd As New OleDb.OleDbCommand()
>>
>> Cmd.Connection = Conn
>>Cmd.CommandText = "SELECT * FROM [Foglio1$] WHERE ColonnaStringa
>>= ? AND ColonnaNumerica = ? AND ColonnaData = ?"
>>
>>Cmd.Parameters.Add(New OleDb.OleDbParameter("@ColonnaStringa",
>>"Ciao Mondo!"))
>>Cmd.Parameters.Add(New OleDb.OleDbParameter("@ColonnaNumerica",
>>100))
>>Cmd.Parameters.Add(New OleDb.OleDbParameter("@ColonnaData", Date.Now))
>>
>> Dim DA As New OleDb.OleDbDataAdapter(Cmd)
>>
>> DA.Fill(DT)
>
>
>Questo codice dove va inserito?A me da errore: cmd=prevista dichiarazione.
>Ma quel punto di domanda nelle query deve essere il valore che
>gli passo dalla textbox?Come?

Probabilmente non è importata di default la System.Data. Prova a dichiarare la variabile Cmd con: System.Data.OleDb.OleDbCommand()
I punti interrogativi sono una sintassi per le query OleDb, dove non conta il nome del parametro, ma soltanto la loro posizione (ordine). I tuoi dati presi dalle textbox andranno impostati nei parameter, e i parameter stessi, andranno aggiunti al command, nello stesso ordine di come sono stati messi i punti interrogativi nella query.

>
>Grazie di tutto..
>

Prego


http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Grazie..in qualche modo sono riuscito a fare qualcosa,tutto grazie a te!!
Ma siccome ho ancora moltissimi dubbi sull'utilizzo di Visual Basic con Studio 2005, e ho notato che tu sei molto bravo ad utilizzarlo, mi potresti consigliare un buon libro-manuale che è fatto veramente bene e che è anche semplice da capire?Cioè qualcosa di valido..fammi sapere grazie mille..

0v3rCl0ck Profilo | Guru

>Grazie..in qualche modo sono riuscito a fare qualcosa,tutto grazie
>a te!!

Bene, sono contento

>Ma siccome ho ancora moltissimi dubbi sull'utilizzo di Visual
>Basic con Studio 2005, e ho notato che tu sei molto bravo ad
>utilizzarlo, mi potresti consigliare un buon libro-manuale che
>è fatto veramente bene e che è anche semplice da capire?Cioè
>qualcosa di valido..fammi sapere grazie mille..

Io ti consiglio di prendere manuali della Microsoft Press. Non saprei suggerirti titoli precisi, perchè comunque io spesso e volentieri mi documento di più utilizzando la rete, direttamente sul sito dell'msdn della microsoft http://msdn2.microsoft.com/library e guardando molti WebCast, sempre forniti dalla microsoft con lezioni anche in lingua italiana (http://www.microsoft.com/italy/msdn/webcast/).

Accetta un post così chiudiamo il Thread

Ciao

http://blogs.dotnethell.it/Regulator/

gdlcore Profilo | Junior Member

Ciao sono sempre io..ho un altro problema.Non riesco ad effettuare un tipo di ricerca.
Ti spiego, ad esempio:
se devo cercare tramite il campo nome la "Banca di Roma" e io nella cella scrivo solo "Roma" non mi effettua la ricerca,come faccio?Ma anche se scrivo "Banca di Roma" non me la fa..c'è qualche problema con gli spazi? Questo è il codice che ho inserito io, dimmi se c'e qualcosa che non va,grazie mille,mi sei sempre di aiuto!

If TextDescrizione.Text <> "" And TextLocalita.Text = "" And TextAbi.Text = "" Then
Using Conn As New OleDb.OleDbConnection(Me.ExcelConnectionStringV12)
Using Cmd As New OleDb.OleDbCommand("SELECT * FROM [AbiCab$] Where [Descrizione]='" & TextDescrizione.Text & "'", Conn)
Using DA As New OleDb.OleDbDataAdapter(Cmd)
Dim dtExcel As New DataTable("AbiCab")
Conn.Open()
DA.Fill(dtExcel)
Conn.Close()
Me.dtgExcel.DataSource = dtExcel
End Using
End Using
End Using

Aspetto la tua risposta..

0v3rCl0ck Profilo | Guru

>Ciao sono sempre io..

Ciao

>ho un altro problema.Non riesco ad effettuare
>un tipo di ricerca.
>Ti spiego, ad esempio:
>se devo cercare tramite il campo nome la "Banca di Roma" e io
>nella cella scrivo solo "Roma" non mi effettua la ricerca,come
>faccio?Ma anche se scrivo "Banca di Roma" non me la fa..c'è qualche
>problema con gli spazi? Questo è il codice che ho inserito io,
>dimmi se c'e qualcosa che non va,grazie mille,mi sei sempre di
>aiuto!
>
>If TextDescrizione.Text <> "" And TextLocalita.Text = ""
>And TextAbi.Text = "" Then
>Using Conn As New OleDb.OleDbConnection(Me.ExcelConnectionStringV12)
>Using Cmd As New OleDb.OleDbCommand("SELECT * FROM [AbiCab$]
>Where [Descrizione]='" & TextDescrizione.Text & "'", Conn)
>Using DA As New OleDb.OleDbDataAdapter(Cmd)
>Dim dtExcel As New DataTable("AbiCab")
> Conn.Open()
> DA.Fill(dtExcel)
> Conn.Close()
> Me.dtgExcel.DataSource = dtExcel
> End Using
> End Using
> End Using

Se cerchi "Roma" e la descrizione nella cella contiene "Banca di Roma", di certo non viene fuori. Se nella cella sono presenti spazi la query ne tiene conto, inoltre stai attento perchè è Case Sensitive, quindi devi stare attento alle minuscole e alle maiuscole. Infine il comando per effettuare la ricerca di porzione di testo all'interno della cella, è LIKE, quindi se tu vuoi ad esempio cercare tutte le celle che contengono "Roma" dovrai fare una cosa di questo tipo:

"SELECT * FROM [AbiCab$] Where [Descrizione] LIKE '%" & TextDescrizione.Text & "%'"

Dove '%' è la whildcard che stabilisce il valore "tutto" come è l'asterisco '*' per le ricerche in windows.

>
>Aspetto la tua risposta..

Eccola

http://blogs.dotnethell.it/Regulator/
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5