Newsgroup: it.comp.lang.delphi
Titolo: Lettura file XLS

Ciao a tutti,
devo poter leggere la prima colonna di un file xls, associare un dato
per ogni campo e salvarlo in un file txt.
Il file xls viene già letto dall'applicazione tramite ADOQuery ma qui
avrei un problema per riuscire a capire quale cella è stata letta
l'ultima volta. La colonna che contiene i dati che mi servono sono la
prima, la colonna A; dato che il file non lo leggo interamente in
un'unica volta ma in più volte, devo avere una sorta di "segnalibro"
che mi indichi da dove ripartire con la lettura dei dati da xls.
E' possibile?
ADOQuery1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Documents and
Settings\Colde\Desktop\WT_Ver_NODETECT\WT2006_Scarico dati
passivo_WT\DataImport\BIPPAGGIO.xls;Extended Properties=Excel 8.0;';
      ADOQuery1.SQL.Text := 'select * from [FOGLIO1$]';
      ADOQuery1.Open();
ShowMessage(ADOQuery1.Fields[0].Value);
            ADOQuery1.Next;
In questo modo ogni volta che accede al file xls per la lettura riparte
sempre dal primo campo. Ho pensato di leggere tutti i dati da xls per
memorizzarli in un array ma non posso farlo perchè i campi da
memorizzare sono sempre oltre i 3000.
Come posso fare? GRAZIE
P.S.
ho provato ad installare i componenti della TurboPower (OfficePartner)
ma per una serie di errori che ho incontrato non sono riuscito a
terminare l'installazione.

Ti salvi il numero dlel'ultima colonna processata in un file ini o similare.
A.

il salvataggio del numero non è un problema, per quello va bene una
semplice variabile ma la stringa SQL come dovrà diventare? Cioè, come
posso dire tramite SQL, di partire con la lettura dei dati dal valore N
(che sarà il valore recuperato dalla variabile) della prima colonna?
Grazie

 (che sarà il valore recuperato dalla variabile) della prima colonna?
mi sono perso. tu hai necessita' di ripartire dall'ultima COLONNA o
dall'ultima RIGA?
Inoltre, sicuro che non ti convenga usare OLE?
A.

L'SQL dovrebbe cambiare per poter recuperare i dati successivi ai dati
già recuperati.
A me serve ripartire dall'ultima riga recuperata, non la colonna.
Cosa cambia tra OLE e ADO? Non li ho mai usati entrambi quindi (cioè
ADO è la prima volta che lo uso) non li conosco molto, non è da tanto
che uso delphi e fino ad ora non mi sono mai serviti.
Grazie ancora del supporto.

 Cosa cambia tra OLE e ADO?
Ado è per accedere ai dati su database, come bde (obsoleto),
dbexpress, 
ado.net
 etc.
OLE sta per Object Linking and Embedding.
In pratica, piloti excel (word, powerpoint, e non solo...) da delphi.
Se cerchi nei vecchi post trovi un bel po di info.
Fai dei cfr a livello di performance.
Cmq, secondo me, leggere 3000 righe o 1500 da un foglio excel via ado
non dovrebbe comportare grosse differenze di tempo.
Se prp lo vuioi fare ti suggerisco di cercare info relative all'sql
supportato da excel o dal relativo oledb provider.
A.

 Come posso fare? GRAZIE
Ciao,
non capisco perche' hai problemi a memorizzare oltre 3000 elementi in un
vettore.
Hai valutato l'idea di leggere, elaborare (associare il dato) e
scrivere sul file di testo "al volo", ossia in un unico ciclo ?
Giuseppe

X Giuseppe:
si infatti ora è quello che faccio, apro xls e leggo il valore ogni
volta che mi serve. Il problema ora non si pone più.
Adesso ho un dubbio atroce:
dato che il software che sto sviluppando dovrà essere distribuito a
livello mondiale e ogni nazione ha la sua versione di Excell, come
faccio ad associargli il numero di foglio da dove deve recuperare i
dati? Mi spiego, all'interno della SQL io indico con [FOGLIO1$] il
foglio dove andare a reperire i dati ma questo con una versione
italiana. Se fosse in inglese ci sarebbe "Sheet1" e così via. Dato che
i dati devo prenderli in automatico, cosa posso scrivere nella SQL al
posto di [FOGLIO1$] in modo da renderlo standard a prescindere dalla
lingua con cui è tradotto excell? Esiste un modo che riconosca il
foglio1 in automatico senza dirglielo esplicitamente?
In alternativa, se proprio non dovesse esserci una soluzione, potrei
obbligare l'operatore che crea il file xls ad utilizzare un nome
standard in inglese.
Grazie
P.S.
il componente della TurboPower (OfficePartner) non centra niente con il
metodo OLE, vero?

 vettore.
1) il concetto di vettore è + di programmazione STRUTTURATA che OO.
Al limite, una collection...
2) oggi sono 3000. E se domani diventano di piu'?
3) che senso ha metterli in memoria e poi salvare?
Se deve processare una riga per volta ogni 10 minuti, ad esempio, a che
serve caricare le altre righe su cui lui non fa un tubazzo?
A.

 metodo OLE, vero?
C'entra eccome. Di fatto è un wrapper per l' OLE automation di office.
SaluMi
A.

Allora Alberto, se modifico il foglio di lavoro da "Foglio1" a "Prova1"
o "Sheet1", mi da errore dicendo che [FOGLIO1$] non è un nome valido.
Per intenderci, la SQL è questa:
select * from [FOGLIO1$] where Pectoral > 0
Quindi lui va a cercarmi esattamente il foglio di lavoro che ha quel
nome, se non c'è mi da errore. Vorrei evitare proprio questo, ovvero
vorrei far prelevare il primo foglio di lavoro disponibile in modo
automatico. E' possibile?
Non penso che dia errore perchè il foglio di lavoro è stato
modificato a mano, credo che se dovessi provare l'applicativo in
versione inglese, così com'è mi ritorna lo stesso errore. Spero di
sbagliarmi.
P.S.
L'idea di usare il package aggiuntivo della TurboPower mi ispirava
parecchio visto che mi sono già trovato bene con altri loro componenti
ma ho avuto dei problemi nell'installare il package e quando ho chiesto
aiuto qui sul NG ho avuto solo indicazioni parziali, ovvero nel momento
in cui ho postato gli errori dopo aver seguito indicazioni di un
utente, non mi è più stato detto niente e non trovando supporto al
mio problema sono dovuto passare ad altro. Ed eccomi qui.

 parecchio visto che mi sono già trovato bene con altri loro componenti
Come ti ho detto OfficePartner è un wrapper.
Io non l'ho mai usato, andando direttamente via ole.
Se cerchi nei vecchi post trovi circa 60terabite di materiale legato a
come usare excel.
baiBai
A.

 serve caricare le altre righe su cui lui non fa un tubazzo?
Non so se hai letto tutto il messaggio, ma gli suggerivo anche l'idea di
non memorizzare nulla e con unico ciclo leggere il dato/elaborarlo/salvare
il risultato. Ma a volte possono esserci altre ragioni, ad esempio dover
sbloccare prima possibile il file .xls da cui leggere i dati, etc.
Giuseppe

 sbloccare prima possibile il file .xls da cui leggere i dati, etc.
io non ritengo una buona strategia impegnare tempo e risorse a caricare 
una seuppur minima qnt di dati di cui all'utente non frega niente.
Mai visto che bei programmi che l'utente apre una form e senza poter 
dire "no, grazie" gli si popola una dbgrid con 10000 righe?
E lui sta li ad aspettare.. e si inkazza, giustamente.
Senza polemica, eh?? :-))
A

 Senza polemica, eh?? :-))
Nessuna polemica (la polemica è una delle che mi danno maggiore fastidio).
Giuseppe

 futuro al programma.
NI.
Tanto x iniziare, il cliente DEVE sapere che le modifiche si pagano a
prescindere, fermo restando il solito buon senso.
Poi, dipende molto dal tipo di rapporto che c'e' con il cliente stesso.
Ma il presupoposto e' che i professionisti ICT siamo NOI, e dovremmo
essere in grado di spremergli tutte le info possibili, xche LUI non sa
cosa è importante x mettere su un sw fatto come si deve, ma noi
dovremmo saperlo....
A.

 dovremmo saperlo....
Sono d'accordo, infatti io mi riferivo al caso che il cliente dicesse
espressamente che quella situazione non succederà mai.
Una situazione simile mi è capitata ai tempi del Clipper, nel 92, con un
cliente a cui dovevo realizzare delle stampe contenenti dati tabellari, su
cui erano presenti molte colonne, alcune delle quali contenevano degli
incassi; e dovendo stringere il più possibile la larghezza delle colonne
ho chiesto se gli importi inseriti ed i relativi totali potevano
raggiungere il miliardo di lire; lui si mise a ridere e (con aria quasi da
sfottò) mi rispose che in tal caso sarebbe stato ben felice di pagarmi le
modifiche. Bene, l'anno successivo me le feci pagare *per bene*.
Giuseppe

 modifiche. Bene, l'anno successivo me le feci pagare *per bene*.
Cosi' si fa! spesso la gente non da valore a cio che non paga.
Clipper, eh?
Mai ridefinito il funzionamento di getsys?
Mai smanettato con i codeblock e bestemmiato davanti all'uso massiccio
di macro?
Blinker o Exospace?
SixDriver o Comix?
:-))
A.

 SixDriver o Comix?
L'ultima volta che ho linkato un exe con il blinker è stato nel
lontano.... stamattina !
Giuseppe

 lontano.... stamattina !
io a giugno...eheheheheh!
A.

 Python non lo conosco. :-((
Io Python l'ho conosciuto per caso, però posso solo dirti che contiene
tante idee 'sorprendenti' che ti semplificano la programmazione in modo
incredibile.
Ti consiglio vivamente di darci un occhiata, vedrai che se cominci ad
usarlo non riuscirai più a farne a meno. Questa cosa l'ho
sperimentata personalmente ed è una frase molto comune nella
comunità pythoniana.
Credo comunque che stiamo cominciando ad essere leggermente OT
Giuseppe