 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
 |
|
 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
 |
|
 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. |
|
|
|
|