* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 28, 2024, 04:36:43 pm

Inserisci il nome utente, la password e la durata della sessione.

12 Visitatori, 0 Utenti

Autore Topic: [Risolto] aprire un file miofoglio.ods e leggerne il contenuto  (Letto 1714 volte)

petrusic

  • Hero Member
  • *****
  • Post: 629
  • Karma: +0/-0
[Risolto] aprire un file miofoglio.ods e leggerne il contenuto
« il: Gennaio 15, 2021, 10:10:26 pm »
Mi trovo ad affrontare la seguente tematica:
Caricare il contenuto delle celle di alcuni fogli elettronici, costruiti da me anni fa e contenenti valori contabili.
Poi dovrei tasfreririli nel corrispondente mio DB Sqlite3.
Non  avendo alcuna idea di come aprire un file LibreOffice.ods, ho cercato una risposta sul wiki. Non ho trovato però specificatamente ciò che mi serve, perche qui (per esempio) viene trattato di come fare funzionare il foglio elettronico denro un programma Lazarus ed a me non interessa.
Io, infatti dovrei solamente accedere alk contenuto della celle e costruire, nel mio progetto, un array strutturato a modo mio per riversarlo poi nelle opportune tabelle del mio DB.

Ho scaricato fpspreadsheet-1.12.zip e, dopo averlo estratto, ho creato un nuovo progetto dove ho aggiunto la use "fpspreadsheet"
Codice: [Seleziona]
unit daContoDom_aDomusRatio;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, fpspreadsheet;

type
  TForm1 = class(TForm)
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

end.                           
Ora dovrei aprire un file.ods e leggerne il contenuto, ma non ho capito
Ho  cercato guide o esempi di utilizzo per l'accesso a fogli elettronici, ma non niente di calzante.
E allora, come procedere?
« Ultima modifica: Gennaio 24, 2021, 03:21:20 pm da petrusic »
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2924
  • Karma: +20/-4
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #1 il: Gennaio 16, 2021, 08:44:51 am »
ciao

in effetti quello è un tutotial per scrivere una applicazione tipo foglio elettronico.
Però fpSpreadsheet comprende sia i componenti visuali (per sviluppo GUI) che i componenti non visuali, che sono quelli che ti servono.

Leggi questa pagina wiki
https://wiki.lazarus.freepascal.org/FPSpreadsheet
nella sezione Basic viene spiegato il funzionamento di questo package, leggi bene soprattutto le classi TsWorkbook e TsWorkSheet poiché è da li che devi partire.

Io uso questo package da tempo è realmente stabile e potente ma soprattutto non usa OLE/Activex per accedere ai fogli elettronici!

Ciao
nomorelogic
Imagination is more important than knowledge (A.Einstein)

tito_livio

  • Full Member
  • ***
  • Post: 174
  • Karma: +4/-0
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #2 il: Gennaio 17, 2021, 01:12:24 am »
Ciao, se non ho capito male il tuo problema è solo convertire i dati.
SE è così, potresti salvare i fogli elettronici in csv e poi li leggi come un file di testo.
« Ultima modifica: Gennaio 17, 2021, 01:16:18 am da tito_livio »

petrusic

  • Hero Member
  • *****
  • Post: 629
  • Karma: +0/-0
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #3 il: Gennaio 17, 2021, 04:58:27 pm »
Ciao, se non ho capito male il tuo problema è solo convertire i dati.
SE è così, potresti salvare i fogli elettronici in csv e poi li leggi come un file di testo.
Si, è vero. Dovrei però convertire i miei file.ods, ciascuno con 4 fogli elettronici al suo interno, in altrettanti file.csv. Per farlo dovrei affidarmi ad un convertitore specifico, magari on-line. Non so, sono alquanto scettico.
Comunque, grazie per il suggerimento. Vi potrò ricorrere qualora dovessi fallire con FPSpreadsheet.
ciao ciao

tito_livio

  • Full Member
  • ***
  • Post: 174
  • Karma: +4/-0
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #4 il: Gennaio 17, 2021, 10:29:39 pm »
Non serve nessun programma esterno. I fogli elettronici li salvi in csv con il tuo programma per i fogli elettronici, per esempio LibreOffice. Nel salvare gli dici, per esempio che devi separare i campi con il ; .

petrusic

  • Hero Member
  • *****
  • Post: 629
  • Karma: +0/-0
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #5 il: Gennaio 19, 2021, 04:19:21 pm »
Leggi questa pagina wiki
https://wiki.lazarus.freepascal.org/FPSpreadsheet
nella sezione Basic viene spiegato il funzionamento di questo package, leggi bene soprattutto le classi TsWorkbook e TsWorkSheet poiché è da li che devi partire.
Avevo già letto la pagina prima di scrivere, ma riconosco di averlo fatto senza il necessario approfondimento. Purtroppo io ho mai simpatizzato con la lingua inglese.
Meno male che oggi esistono strumenti fantastici.

Sono andato avanti fino a costruire una ListBox, dove ho caricato, tramite la libreria "TSearchRec", i nomi dei file.ods/xls che dovrei leggere singolarmente in modo da trasferire il contenuto delle celle di ciascun foglio, interno al file-cartella, in una matrice mia per la successiva scansione estrattiva.:
Riporto qui il mio programmino così come l'ho scritto fino ad ora:
Codice: [Seleziona]
unit frmmain;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls,
  fpspreadsheet, laz_fpspreadsheet;

type

  { TForm1 }

  TForm1 = class(TForm)
    PulsAvvia: TButton;
    Label1: TLabel;
    lsDir: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure PulsAvviaClick(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

type
   TsSpreadsheetFormat = (sfExcel2, sfExcel5, sfExcel8, sfExcelXML, sfOOXML,
    sfOpenDocument, sfCSV, sfHTML, sfWikiTable_Pipes, sfWikiTable_WikiMedia, sfUser);   // sfOpenDocument è il tipo di formato valido per OpenOffice/LibreOffice.ods

const
    dirFogli: string = '/media/dirdati/dativari/ContDom/';

var
  MyWorkbook: TsWorkbook;   // dichiarazione necessaria per creare un'istanza della cartella di lavoro

{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
var
  Esito: TSearchRec;

  begin
    If FindFirst(dirFogli + 'ContDom*.*', faAnyFile,  Esito)=0 then
    begin
      Label1.Caption:= 'Directory corrente:' + chr(10) + dirFogli;
  repeat
   begin
     lsDir.Items.Add(Esito.Name);
   end;
   Until FindNext(Esito) <> 0;
   FindClose(Esito);
   PulsAvvia.Caption:='AVVIO' + chr(10) + 'LAVORO';
  end;
end;

procedure TForm1.PulsAvviaClick(Sender: TObject);

var
  ixFile, ixFoglio, n, nuFogli: Integer;

  nomeFilCorr, striMia: String;

  areaFile: TsWorkbook;
  foglioCorr: TsWorksheet;
begin
  striMia:= lsDir.Name;
  n:= lsDir.Items.Count - 1 ;
  for ixFile:= 0 to n do
  begin
    nomeFilCorr:= dirFogli + lsDir.Items[ixFile];
    areaFile:= TsWorkbook.Create;
    areaFile.ReadFromFile (nomeFilCorr);
    nuFogli:=  areaFile.GetWorksheetCount - 1;   // estraggo il numero dei fogli elettronici interni al file-cartella dirFogli + lsDir.Items[ixFile]
    ShowMessage('il file-cartella corre contiene n.' + IntToStr(nuFogli) + ' fogli elettronici');
    striMia:='il file-cartella corrente è' + nomeFilCorr +' e contiene n.' + IntToStr(nuFogli + 1) + ' fogli elettronici' + chr(10) + ' così denominati:';
    foglioCorr:= areaFile.GetFirstWorksheet;
    for ixFoglio:= 1 to nuFogli do
    begin
     striMia:= striMia + fogliocorr.Name + ', ';
     foglioCorr:= areaFile.GetNextWorksheet(foglioCorr);
     striMia:= striMia + fogliocorr.Name + ', ';
    end;
    ShowMessage(striMia);
    areaFile.newinstance;
  end;
  areaFile.Free;
  Application.Terminate;
end;

end.                                                                                                     

Di tutto il codice desidero commentare le due righe seguenti:
Citazione
areaFogli.ReadFromFile (dirFogli + lsDir.Items[0]);
  foglioCorr:=areaFogli.GetFirstWorksheet;
 
Infatti, se ho capito bene,
- la prima serve  a trasferire tutto il file letto all'interno di "areaFogli", alla quale però non posso accedere direttamente, ma solamente attraverso una successiva istruzione.
- la seconda è un esempio di creazione dell'insieme  "foglioCorr" coi valori del 1° foglio di "areaFogli"

Penso, a questo punto di avere capito come muovermi. Il cammino purtroppo è sempre lungo e faticoso.
Con pazienza e costanza, spero di farcela.
A presto.
« Ultima modifica: Gennaio 20, 2021, 12:16:19 pm da petrusic »
ciao ciao

petrusic

  • Hero Member
  • *****
  • Post: 629
  • Karma: +0/-0
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #6 il: Gennaio 20, 2021, 12:14:02 pm »
Sono di nuovo qui perchè la gioia del risultato ottenuto è durata poco.
Come si capisce dal codice che ho incluso nel mio precedente post, eseguo una lettura sequenziale di tutti i file.ods/xls presenti nella directory che li contiene.
Riesco a rilevare i nomi dei singoli fogli di calcolo, però, dopo avere terminato anche l'ultima istanza sull'ultimo file, il programma ferma in pausa, come se avessi comandato un stop di debug.
cliccando sul pulsnate "||", per farlo ripartire si apre una finestra "Assembler" per un possibile ERRORE che non capisco.
Ho provato a fermare l'avvio di una nuova istanza subito dopo la prima, è succede la stessa cosa.
Può essere perchè manca il richiamo di un distruttore dell'oggetto TsWorkbook?
L'ho cercato ma non ho saputo trovarlo. Ho pensato allora di utilizzare "areaFile.Free", nella speranza che fosse quello a svolgere la funzione di distruttore, ma non ho risolto.
L'errore c'è sempre ed il programma non termina.
ciao ciao

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2924
  • Karma: +20/-4
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #7 il: Gennaio 21, 2021, 01:15:21 am »
credo ci sia un errore di concetto da correggere
TWorkBook.Create dovrebbe essere richiamato 1 sola volta prima del loop for

da quello che si vede nell'immagine crei una istanza ad ogni iterazione del for + una nuova istanza poco prima della fine del loop con newinstance
dopo il loop c'è una sola Free.

quindi, premesso che di newinstance non c'è bisogno, il codice dovrebbe essere qualcosa di simile
Codice: [Seleziona]
areafile:=TWorkBook.Create
try
   ...
   for ixfile:=0 to n do
   begin
      areafile.ReadFromFile(...)
      ...
   end;
   ...
finally
  areafile.Free;
end;

Imagination is more important than knowledge (A.Einstein)

petrusic

  • Hero Member
  • *****
  • Post: 629
  • Karma: +0/-0
Re: aprire un file miofoglio.ods e leggerne il contenuto
« Risposta #8 il: Gennaio 21, 2021, 11:46:31 am »
TWorkBook.Create dovrebbe essere richiamato 1 sola volta prima del loop for

 :-[ Che sbadato!
Hai ragione, era proprio quello il problema.
Grazie!
ciao ciao

 

Recenti

How To

Utenti
  • Utenti in totale: 802
  • Latest: maXim.FI
Stats
  • Post in totale: 19218
  • Topic in totale: 2291
  • Online Today: 33
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 12
Total: 12

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.