PDA

View Full Version : [VB] Estrarre dati da Excel


race2
14-01-2003, 15:12
Ho un foglio di Excel, e vorrei estrarre dei dati da una colonna ben precisa per poi archiviarli in un Database.

es:

Nella colonna "A" ci sono elencati i "Nomi"
Nella colonna "B" ci sono elencati i "Cognomi"

Con VB.NET, come posso creare un Ciclo "WHILE" o "FOR" oppure un "DataSet" che mi estragga i dati da Excel ???

Poi li archivio nel mio Database...!!!

race2
15-01-2003, 11:14
Sono riuscito a connettermi al foglio di EXCEL, ora vorrei fare un "SELECT" ma non trovo informazioni sufficenti, mi date una mano ???

Vorrei fere un SELECT * FROM ???

oppure:

selezionare la colonna interessata tipo: SELECT A FROM ???

??? stanno per "non so cosa mettere"

Aiuto!!!


Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\x\aaa.xls;" & _
"Extended Properties=""Excel 8.0;HDR=No""")

conn.Open()

Dim comm As New OleDbCommand("SELCT * FROM -cosa metto???-", conn)
Dim read As OleDbDataReader
read = comm.ExecuteReader
read.Read()
MsgBox(read("-cosa metto???-"))
read.Close()

conn.Close()

ilsensine
15-01-2003, 11:18
In "FROM" devi indicare la tabella/tabelle interessate dalla query. Ad es. se vuoi estrarre tutti i dati dalla colonna pippo nella tabella pluto, basta che esegui "select pippo from pluto"
Non mi chiedere però se gli oggetti che stai usando sono corretti, questo non lo so.

race2
15-01-2003, 11:35
Tu mi stai dicendo come fare una semplice Query, io sto' parlando di una query su un foglio di EXCEL, quindi:

per nometabella cosa si intende???
e
per nome cella cosa si intende ???

ilsensine
15-01-2003, 12:32
Ah credevo che dovevi prendere i dati da un db esterno
Provato con il nome del foglio?

soalle
15-01-2003, 13:46
Devi per forza connetterti come un DB? Altrimenti potresti in maniera abbastanza facile così:


Sub SelectCells()

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Open(FileName:="c:\My Documents\TestBook1.xls")
Set xlSheet = xlBook.ActiveSheet
xlApp.Visible = True

MsgBox(xlSheet.cells[0,0])

End Sub

race2
15-01-2003, 14:01
ok sei un grande, solo un ultima cosa ,

quale Namesystem devo importare ???



Imports ???

race2
15-01-2003, 14:19
Ma mi apre un foglio di Excel !!!

Io vorrei Usare Excel proprio come un Database

Leggere i campi
Scrivere i campi
Eliminare i campi

ma non aprirlo per visualizzare il risultato

ho dovuto modificare la : MsgBox(xlSheet.Cells(1, 1)) ma mi da ancora un errore:

Informazioni aggiuntive: Impossibile convertire l'argomento "Prompt" nel tipo "String".

allora io ho fatto: MsgBox(xlSheet.Cells(1, 1).ToString) e quindi mi da:

System._ComObject

Come devo fare???

ilsensine
15-01-2003, 14:33
Originally posted by "race2"

Ma mi apre un foglio di Excel !!!

Umm c'è un modo per non farlo aprire, (molto) tempo fa l'ho fatto, vatti a ricordare...
Devi spulciarti un pò di documentazione sul vba di Excel, ricordo solo che accedere alle celle non è affatto difficile. Io gestivo (modificavo) addirittura i grafici...

soalle
15-01-2003, 15:05
Io non programmo in VB ma mi sono interessato all'automation con Excel tramite C#... anyway:

per non farlo aprire:

xlApp.visible= false;

in generale non penso sia necessario importare un namespace poiché il VB.NET istanzia direttamente l'oggetto COM non gestito (infatti se ti va tutto questo è la riprova...); se vuoi lavorare con codice gestito (con C# ho fatto così) devi scaricarti da microsoft gli oxppia che sono i wrapper gestiti agli oggetti COM.
Poi guardati la documentazione di Excel che si trova più o meno qua:

"E:\Programmi\Microsoft Office\Office10\1040\VBAXL10.CHM"

Se non c'è devi installartela da Office ("Documentazione VBA" o qualcosa del genere). Lì trovi tutto il DOM di Excel con il quale puoi lavorare tranquillamente.
Naturalmente come diceva ilsensine puoi modificare anche i grafici (leggi doc).

per modificare una cella semplicemente:

xlSheet.Cells[1,1]="Pippo"

Ciaociao
Soalle

ilsensine
15-01-2003, 15:14
Originally posted by "soalle"

per modificare una cella semplicemente:

xlSheet.Cells[1,1]="Pippo"

Forse Race ha confuso [ ] con ( ) ?

soalle
15-01-2003, 15:17
oppss sì.... l'ho scritto un po' troppo C or Java-like...

ho trovato anche questo:

Dim xlApp as Excel.Application
Set xlApp = CreateObject("Excel.Application")

xlApp.Workbooks.Add
xlApp.Sheets(1).Cells(1.1).Select
xlApp.ActiveCell.Value = 10

cerca sul sito MS Office XP automation...

race2
15-01-2003, 15:20
Guarda l'allegato......

soalle
15-01-2003, 15:24
Considera che VB non lo conosco... ma penso appunto che si debbano usare le ( )....
Poi VB è case-sensitive? Se sì, Cells va con la maiuscola...

ilsensine
15-01-2003, 15:26
Originally posted by "soalle"


Poi VB è case-sensitive? Se sì, Cells va con la maiuscola...
No, almeno questo me lo ricordo :D

ilsensine
15-01-2003, 15:29
Fermi tutti, mi viene un sospetto...credo che "Cells" ritorni un oggetto composto da un insieme di celle, forse bisogna usare qualche altro metodo (prova Range, tratto da un esempio postato da Aragon qualche post più in basso)
Che schifo, non mi ricordo più nulla...

soalle
15-01-2003, 15:33
beh non ci giurerei... forse è un metodo alternativo per selezionare più celle...

Ho trovato anche questo:

xlSheet.Range(xlSheet.Cells(1,1), xlSheet.Cells(3,3)).Value = 1000

soalle
15-01-2003, 15:36
Direi risolto l'arcano...

Set xlBook = xlApp.Workbooks.Add()
xlBook.Worksheets(1).Cells(1, 1).Value = "Hello"
xlBook.SaveAs "C:\Book1.xls"
xlBook.Close
Set xlBook = Nothing

e così per leggere una cella suppongo bisogna usare:

MsgBox(xlBook.Worksheets(1).Cells(1, 1).Value)

race2
15-01-2003, 15:37
Non e' Case sensitivo VB e neppure VB.NET

PS. IO SONO IN VB.NET ...!!!

le parentesi vanno tonde non quadre in VB...

questo e' un esempi del codoce che uso per inserire i campi in modalita' uno ad uno:


Dim oExcel As Object
Dim oBook As Object
Dim oSheet As Object

oExcel = CreateObject("Excel.Application")
oBook = oExcel.Workbooks.Add

oSheet = oBook.Worksheets(1)
oSheet.Range("A1").Value = "Nome"
oSheet.Range("B1").Value = "Cognome"
oSheet.Range("A1:B1:C1:D1").Font.Bold = True
oSheet.Range("A2").Value = "Mario"
oSheet.Range("B2").Value = "Rossi"

oBook.SaveAs("c:\x\" & "aaa.xls")
oSheet = Nothing
oBook = Nothing
oExcel.Quit()
oExcel = Nothing
GC.Collect()

ilsensine
15-01-2003, 15:37
beh non ci giurerei... forse è un metodo alternativo per selezionare più celle...
Già forse ho detto una boiata...
cmq mi ero scritto un piccolo howto sugli oggetti com di excel, visto che conosco bene la mia memoria. Stasera cerco di ritrovarlo.

ilsensine
15-01-2003, 15:39
Originally posted by "race2"


questo e' un esempi del codoce che uso per inserire i campi in modalita' uno ad uno:

...e quindi la soluzione al tuo problema, no?

race2
15-01-2003, 15:39
OK, grazie mille!!!

ilsensine
15-01-2003, 15:41
for(x=0; x<10000; ++x) fprintf(".value");

così forse me lo ricordo

soalle
15-01-2003, 15:47
Originally posted by "ilsensine"

for(x=0; x<10000; ++x) fprintf(".value");

così forse me lo ricordo
:D

race2
15-01-2003, 16:04
Originally posted by "ilsensine"

for(x=0; x<10000; ++x) fprintf(".value");

così forse me lo ricordo


ma non e': for(x=0; x<10000; x++) fprintf(".value");


io faccio PHP e quindi e' molto simile

ilsensine
15-01-2003, 16:07
In questo caso è uguale, non importa se incremento x prima o dopo che...ne ignori il valore :D

race2
16-01-2003, 08:56
ECCOLA!!!!


Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\x\aaa.xls;" & _
"Extended Properties=""Excel 8.0;HDR=Yes""")
conn.Open()
Dim comm As New OleDbCommand("SELECT * FROM [Foglio1$]", conn)
Dim read As OleDbDataReader = comm.ExecuteReader
While read.Read()
MsgBox(read(1).ToString)
End While
conn.Close()


solo che non mi legge la prima riga, cioe' mi salta la riga 1 in tutti i fogli, perche???

ilsensine
16-01-2003, 11:37
Prova così (oki che nn conosco bene il vb, però puoi capire cosa intendo):


Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=c:\x\aaa.xls;" & _
"Extended Properties=""Excel 8.0;HDR=Yes""")
conn.Open()
Dim comm As New OleDbCommand("SELECT * FROM [Foglio1$]", conn)
Dim read As OleDbDataReader = comm.ExecuteReader
' Occorrerebbe controllare prima se la query è non nulla (recordcount o simili)
do
MsgBox(read(1).ToString)
While read.Read()
conn.Close()

leon84
28-01-2003, 15:14
Ragazzi mi spiegate una cosa ? Ho inserito il foglio elettronico su di un form . Ora voglio copiare il contenuto di una cella in una casella di testo . Come faccio ? POtreste spiegarmi per cortesia ? Grazie