Ricerca 
it-ITen-US
Register
Login
In-Vesti Dotnetwork
IN-VESTI DNW!!!
Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta.
Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni
Effettua il pagamento usando IWBank
Click per andare alla pagina di Iscrizione
Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione.  Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt.  Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!!
.:DotNetWork Founders:.
    Print     


DotNetWork Forums
[vb2008] Importare foglio excel 2007 in datatable
Last Post 29 Nov 2009 04:05 by Mario De Ghetto [MVP]. 21 Replies.
Printer Friendly
Sort:
PrevPrev NextNext
You are not authorized to post a reply.
Author Messages Resolved

Posts:688

--
16 Nov 2009 12:55  
Salve ragazzi vorrei chiedervi alcune informazioni sulle quali sto impazzendo. Avrei la necessità di importare dei dati da un foglio excel 2007 in una datatable ma non riesco a capire da dove cominciare. Potreste darmi qualche indicazione?
Grazie per il vostro aiuto.

Posts:688

--
16 Nov 2009 13:39  
Sto provando ad utilizzare il seguente codice

ofd_Open.ShowDialog()
Dim str_nomefile As String = ""
str_nomefile = ofd_Open.FileName.ToString
Dim sConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + str_nomefile.ToString + ";Extended Properties=Excel 12.0 Macro;HDR=YES"
Dim objConn As New OleDb.OleDbConnection(sConnectionString)
objConn.Open()

Dim objCmdSelect As New OleDb.OleDbCommand("SELECT * FROM FOGLIO2", objConn)
Dim reader As OleDb.OleDbDataReader = objCmdSelect.ExecuteReader
mDati.Load(reader)
objConn.Close()
kdgv_Dati.DataSource = mDati

Ma il problema è che quando vado ad aprire la connessione con il codice

objConn.Open()

Mi restituisce l'errore

Impossibile trovare ISAM installabile

Da cosa dipende l'errore? Dove sbaglio? Come posso risolvere?

Grazie per il vostro aiuto!

Posts:192

--
16 Nov 2009 14:01  
L'errore sull'istruzione relativa al metodo Open deriva dal fatto che forse non utilizzi una stringa di connessione corretta. Prova a verificarla, magari dando un'occhiata al sito http://www.connectionstrings.com/.
L'errore ti compare sia nell'eseguibile sia nell'IDE?

Posts:176

--
16 Nov 2009 14:08  
Ciao, credo che tutto dipenda da quel "select * from FOGLIO2". Andrebbe usato [FOGLIO2$]  come denominazione.
Ho avuto uno scontro analogo e mi sono fatto una serie di passaggi per analizzare il problema:
come stringa di connessione ho usato:

Dim xls As New System.Data.OleDb.OleDbConnectionStringBuilder
With xls
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 8.0;HDR=YES;MAXSCANROWS=0;IMEX=1;"""
.DataSource = nomeFileXLS
End With

dopodichè usando la
.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, Nothing) mi sono ricavato il nome delle "tabelle" così come vengono viste,
quindi ne ho aperta una con:

Dim cmd As System.Data.OleDb.OleDbCommand = XLS.CreateCommand cmd.CommandText = "select * from [" & tabellaNome & "]"
dove tabellaNome è tale e quale quella letta dallo SchemaTable.

di solito una cosa del tipo: "Foglio1$"
 
Spero di essere stato chiaro nell'espletare

Saluti

Posts:192

--
16 Nov 2009 14:12  
A proposito di questa stringa di connessione:

.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 8.0;HDR=YES;MAXSCANROWS=0;IMEX=1;"""

vi segnalo solo un problema che ho riscontrato: la libreria JET è solo a 32 bit ed è incompatibile con la piattaforma a 64 bit. Se avete un sistema operativo a 64 bit, il progetto deve essere creato comunque a 32 bit, altrimenti non riesce a utilizzare il Provider JET.

Posts:688

--
16 Nov 2009 14:26  
La connectionstring cambia se il file è stato elaborato con Excel 2003 oppure 2007?
Penso che l'errore del riguardo la query ci sia in quanto è importatnte specificare il foglio al quale deve connettersi. Ma il problema è che l'errore mi viene restituito prima ancora di leggere la query.
Avviene nel momento in cui apre il file?

Ho provato a verificare la connectionstring e ne ho inserite di vari tipi ma per il file excel 2007 con estensione xlsm oppure xlsx la connectionstring penso sia quella corretta. Ho il presentimento che si tratti di driver e non so come uscirmene.
Grazie comunque per i vostri suggerimenti.
Farò qualche prova, nel frattempo se qualcuno ha qualche altro suggerimento sarà bene accetto.
Grazie

Posts:176

--
16 Nov 2009 14:50  
Ho provato la stessa tecnica con la "tua" stringa di connessione e funziona alla grande! Riesco a leggere i file xls e xlsx. Mentre con la "mia" stringa di connesisone ho un errore big like a house nel leggere i file xlsx. In pratica l'errore che hai avuto dovrebbe riferirsi al nome della tabella. Prova a sostituire
Dim objCmdSelect As New OleDb.OleDbCommand("SELECT * FROM FOGLIO2", objConn)
con
Dim objCmdSelect As New OleDb.OleDbCommand("SELECT * FROM [FOGLIO2$]", objConn)

ciao

Posts:176

--
16 Nov 2009 14:53  
Inserito da Mario De Ghetto [MVP] su 16 nov 2009 15.12
A proposito di questa stringa di connessione:

.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=""Excel 8.0;HDR=YES;MAXSCANROWS=0;IMEX=1;"""

vi segnalo solo un problema che ho riscontrato: la libreria JET è solo a 32 bit ed è incompatibile con la piattaforma a 64 bit. Se avete un sistema operativo a 64 bit, il progetto deve essere creato comunque a 32 bit, altrimenti non riesce a utilizzare il Provider JET.


Cioè? Il problema (32/64) risiederebbe nella stringa di connessione (ovvero nel provider usato?)
Questo sarebbe aggirato dal provider "Microsoft.ACE.OLEDB.12.0"?

Grazie e ciao

Posts:192

--
16 Nov 2009 15:03  
Il problema risiederebbe nell'uso della libreria JET (attraverso la stringa di connessione).
Se non fai uso di JET, no problem. Ma se ne fai uso, puoi utilizzarla solo in progetti a 32 bit (o anche in uno a 64 bit ma devi fare i salti mortali per farla trovare all'applicazione...).
Ovviamente se non usi JET non hai questo tipo di problema.

Posts:813

--
16 Nov 2009 15:46  

Vi do alcune risposte senza un ordine preciso:

1) Microsoft Jet Oledb oppure ODBC funziona correttamente e il codice di esempio si trova su www.connectionstrings.com

2) Il provider Microsoft.ACE mi giunge nuovo all'orecchio ma dove lo hai trovato?

3) Il nome del foglio, oltre al Dollaro deve essere esattamente quello scritto sulla etichetta del foglio excel, pertanto se in italiano Foglio 2 ha lo spazio come di solito è devi scrivere  [Foglio 2$] perché funzioni.

4) Fai attenzione che il driver ti mette tutte le colonne del foglio ove qualcuno ha inserito qualsiasi cosa... anche una formattazione.

5) C'è un provider specifico per Excel 12 ovvero 2007, ma quello normale funziona da 97 a 2003. non ho provato con gli xlsx però quindi può darsi che si debba usare lo specifico.

Ancora una volta, sul sito sopra citato ci sono non solo le stringhe di connessione ma anche gli esempi d'uso.

saluti

Sabrina

Sabrina

Posts:688

--
17 Nov 2009 14:46  
Scusate la mia ignoranza ma se il problema sarebbe la query cioè il fatto che magari foglio2 non è scritto come lui vuole l'errore dovrebbe darmelo all'esecuzione della query. Mentre il problema nasce prima dell'esecuzione della query.
Infatti analizzando il codice l'errore mi viene restituito alla riga

objConn.Open()

prima ancora di aver creato il command.
Quindi penso che il problema sia dovuto a qualche driver. Dato che mi chiede un ISAM installabile.
Comunque grazie per il vostri consigli proverò a fare qualche altra prova.

Grazie

Posts:813

--
20 Nov 2009 20:52  

se il problema è la open, allora è certamente sbagliato il provider e la connection string come ti avevamo detto.

Riguarda su connectionstrings.com per vedere qual'è il problema.

Sabrina

Posts:688

--
23 Nov 2009 09:46  
La cosa interessante è che anche dopo aver verificato sul sito connectionstring la mia stringa e dopo aver notato che la connectionstring è scritta correttamente mi viene sempre restituito l'errore. L'unica cosa che ora posso fare per provare è quello di provare su un'altro pc.

Grazie comunque!

Posts:12

--
23 Nov 2009 12:06  
Ti posto un po di codice che ho usato con buoni esiti:
Devi installare i Microsoft Excel Driver sulla macchina su cui ti gira l'applicazione.
Si scaricano gratuitamente prova a cercare su google : AccessDatabaseEngine.

Poi puoi usare questa funzione.
Il metodo funziona sia per file excel 2003 che 2007

Private Function RetreiveDataFromExcell(ByVal filePath As String) As DataTable
Dim dt As DataTable = New DataTable
Dim _connToExcelDriver as string = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};"
dim _dataSource as string = "OdbcConnectionToExcelDB" value="DBQ={0}"
Dim _ColumnsHeaders as string = "COLONNA1|COLONNA2|COLONNA3|COLONNA4"
OdbcConnToEcxell = _connToExcelDriver + String.Format(_dataSource, filePath)
Using connection As System.Data.Odbc.OdbcConnection = New System.Data.Odbc.OdbcConnection(OdbcConnToEcxell)
connection.Open()
Dim strSql As String = "select * from [Foglio1$]"
Using comm As System.Data.Odbc.OdbcCommand = New System.Data.Odbc.OdbcCommand(strSql, connection)
Using dataAdap As System.Data.Odbc.OdbcDataAdapter = New System.Data.Odbc.OdbcDataAdapter(comm)
dataAdap.Fill(dt)

Dim ColumnHeaders As ArrayList
ColumnHeaders = New ArrayList(_ColumnsHeaders.ToString().Split(Char.Parse("|")))

For i As Integer = 0 To ColumnHeaders.Count - 1
If (dt.Columns.Item(i).ColumnName.Trim() <> ColumnHeaders(i).ToString()) Then Throw New Exception("Formato del file non corretto")
Next

End Using
End Using
End Using
Return dt
end function



Posts:688

--
24 Nov 2009 09:28  
Ti ringrazio per il tuo suggerimento penso proprio che il mio problema sia la mancanza dei driver di importazione ora sto scaricando il file da internet e poi riproverò.

Grazie per il consiglio

Posts:688

--
24 Nov 2009 11:13  
Ho installato il file che mi hai consigliato ma comunque mi restituisce l'errore. e non riesco a capire il perchè.


Posts:663

--
24 Nov 2009 11:25  

Quale è l'errore e che file ti è stato consigliato?
L'unica cosa che ti serve è il MDAC 2.8

http://www.microsoft.com/downloads/...5d0506396c

Rudy Azzan

Posts:14

--
24 Nov 2009 17:16  
ciao

sono diversi giorni che sto cercando di visualizzare un Foglio1 di Excel all'interno di un DataGridView, ma ho dei problemi.

Prova a dare un'occhiata a questo codice - che mi hanno fornito - e che dovrebbe funzionare (a me  funziona)


Private Sub btnImporta_Click
Dim ExcelFilePath As String = ""
If OFdOpenFile.ShowDialog() = Windows.Forms.DialogResult.OK Then ExcelFilePath = Me.OFdOpenFile.FileName
End If

Stringa di connessione
Dim connectionStringTemplate As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source={0};" + _ 
"Extended Properties=""Excel 8.0;HDR=Yes"""

Dim strSQL As String = "Select * From [Foglio1$]" 
Dim cn As New OleDb.OleDbConnection(strConn)
cn.Open()

' Load the Excel worksheet into a DataTable

Dim ds As New DataSet()
Dim da As System.Data.Common.DataAdapter = New System.Data.OleDb.OleDbDataAdapter(strSQL, cn)

'Riempi il DataSet
da.Fill(ds)

'e a questo punto colleghi il tuo DataGridView alla Tabella(0) del DataSet.
Me.TuaDgv.DataSource = ds.Tables(0)

A me fin qua va tutto bene. Carica e visualizza tutto bene.

A me i problemi vengono dopo.

Mi fai sapere se ti funziona?

ciao


Posts:14

--
24 Nov 2009 17:27  
come Data Source metti questa

"Data Source=|DataDirectory|NomeFile.xls;"

se no ti da errore.

Quella di prima andava bene prima che modificassi qualche riga di codice.

Scusa la svista.

ciao

Posts:688

--
25 Nov 2009 10:37  

 Se mi promettete che non mi linciate vi dirò qual era l'errore commesso.

Promesso!


Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Prova.xlms;Extended Properties="Excel 12.0 Macro;HDR=YES";

Questa è la stringa di connessione che io copiavo e incollavo da ConnectionString
Incollandola su vb in una variabile stringa l'intelligence mi avvertiva di un errore in quanto la stringa contiene le proprietà tra virgolette che io cancellavo quindi la mia Stringa diventava

dim ConnectionString as string="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Prova.xlms;Extended Properties=Excel 12.0 Macro;HDR=YES;"

E il tutto generava l'errore che mi ha fatto impazzie ed infuriare

Dopo aver reincollato la stringa di connessione con maggiore lucidità ho notata la presenza delle virgolette a le ho sostituite con gli apici trasformando la mia string così:


dim ConnectionString as string="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Prova.xlms;Extended Properties='Excel 12.0 Macro;HDR=YES';"

non ci crederete ma ora tutto funziona correttamente

Perso tanto tempo per un particolare in apparenza insignificante.
Comunque tutto è bene quel che finisce bene senza il mio linciaggio.

Comunque grazie a tutti per i vostri suggerimente e consigli.

Grazie!


Posts:14

--
28 Nov 2009 21:34  
ciao a tutti,

@hidden
non ci crederete ma ora tutto funziona correttamente

ma ti funziona anche il salvataggio dei dati?

a me no.

ciao
Massimo

Posts:192

--
29 Nov 2009 04:05  

Visto che il problema era la stringa di connessione?
Bene, sono contento che tu abbia risolto.

You are not authorized to post a reply.

Active Forums 4.1
       
Articoli
Assembly Strong Named
Digital Signature of Assemblies, use and functionality
2007/08/05 | Author: Sabrina Cosolo
Working with Arrays
The backpack problem
2007/07/29 | Author: Alberto De Luca
Codedom Getting Started part 1
How to generate automatically C# or VB code using CodeDom and the .NET framework
2009/11/07 | Author: Sabrina Cosolo
Ereditarietà applicata ai controlli
Creazione di una combobox che mostra immagini al posto del testo
2008/07/06 | Author: Andrea Zingoni
Panoramica degli Eventi Pilotati
Come iniziare a capire com'è fatto WPF (parte 4)
2007/08/14 | Author: Patrizia Cosolo
ADO.NET Funzionalità di base
Effettuare una ricerca su recordset disconnessi tramite DataView
2007/12/02 | Author: Andrea Zingoni
Visual Studio LightSwitch Beta 1 - Installazione
La procedura di installazione e le risorse sul web
2010/08/24 | Author: Mario De Ghetto
Code unit testing (part 2)
let's build some unit tests for the ADO.NET Base Helper Library
2008/03/09 | Author: Sabrina Cosolo
    Print     
Home|Forums|Blogs|Mappa del sito
© 2007-2010 by DotNetWork  .:.  Terms Of Use  .:.  Privacy Statement  .:.  Login  .:.