LeenO guarda a Python
Non è ufficiale e non c’è fretta. Del resto non devo rispettare alcuna scadenza, ma è, di fatto, iniziato il porting del codice di LeenO da Free/Open/Libre o comepiùvipiace-Basic a Python.
Provo a “giustificarne” qui il mio impegno. Sto sviluppando l’emissione dei documenti contabili riguardanti la contabilità a misura. Per sviluppare e testare ho necessità di verificare le nuove funzionalità su di una contabilità già eseguita e consegnata con l’uso di un altro programma. Ho a disposizione un lavoro prodotto con Primus di ACCA e mi toccherebbe inserirlo da capo, a manuzza, in LeenO.
A questo punto “approfitto” per scrivere un bel XPWE_import (che ce vo’! – minimizzare aiuta…). Purtroppo tocca subito precisare che salvando il lavoro prodotto da Primus in formato XPWE si perdono alcune informazioni: a parte parecchi dati dell’anagrafica, soprattutto le incidenze di manodopera e le quote di sicurezza relative alle voci di elenco prezzi. Viene spontaneo pensare che si tratti della solita pratica mal celata di lock-in – pratica molto diffusa tra i produttori di software chiuso e proprietario che impedisce agli utenti la libera migrazione ad altro software. Sopravviveremo.
Sulla scia di XML_import, anche questa volta uso Python. Inutile dire che in LeenO sono raccolte diverse sub Basic di contorno senza le quali sarebbe più faticoso lavorare. Ed eccomi a tradurre una funzione per la ricerca di stringhe di testo.
Questa la versione in *Basic:
rem Return the cell that contains the text Function uFindString(sString$, oSheet ) As Variant ' richiamata da diverse cose Dim nCurCol As Integer Dim nCurRow As Integer Dim nEndCol As Integer Dim nEndRow As Integer Dim oCell As Object Dim oCursor As Object Dim aAddress As Variant Dim sFind As String rem oSheet = ThisComponent.Sheets.getByName("COMPUTO") rem sString = "TOTALI COMPUTO" oCell = oSheet.GetCellbyPosition(0,0) oCursor = oSheet.createCursorByRange(oCell) oCursor.GotoEndOfUsedArea(True) aAddress = oCursor.RangeAddress nEndRow = aAddress.EndRow nEndCol = aAddress.EndColumn For nCurCol = 0 To nEndCol 'Go through the range column by column, For nCurRow = 0 To nEndRow 'row by row. oCell = oSheet.GetCellByPosition( nCurCol, nCurRow ) sFind = oCell.String 'Get cell contents. If inStr(sFind, sString$) Then uFindString = oCell Exit Function End If Next Next End Function
Questa la traduzione in Python:
def uFindString (sString, oSheet): """Trova la prima ricorrenza di una stringa (sString) riga per riga in un foglio di calcolo (oSheet) e restituisce una tupla (IDcolonna, IDriga)""" #~ oDoc = XSCRIPTCONTEXT.getDocument() #~ oSheet = oDoc.CurrentController.ActiveSheet #~ sString = 'TOTALI COMPUTO' oCell = oSheet.getCellByPosition(0,0) oCursor = oSheet.createCursorByRange(oCell) oCursor.gotoEndOfUsedArea(True) aAddress = oCursor.RangeAddress nEndRow = aAddress.EndRow nEndCol = aAddress.EndColumn try: for nRow in range(0,nEndRow): for nCol in range(0,nEndCol): oCell = oSheet.getCellByPosition(nCol,nRow) if sString in oCell.String: raise ValueError except ValueError: return (nCol,nRow)
Naturalmente, come si fa mettendo in pratica la ricetta della nonna, non manco di metterci del mio: se nella versione *Basic ottengo l’oggetto cella (oCell) da cui poi mi tocca estrarre la posizione della stringa trovata nella forma (IDcolonna, IDriga), nella versione trascritta in Python preferisco che mi sia restituita direttamente la coppia (IDcolonna, IDriga), abbreviando il processo di un passo.
https://leeno.org/leeno-guarda-a-python/https://i0.wp.com/leeno.org/wp-content/uploads/2015/06/images.png?fit=149%2C239&ssl=1https://i0.wp.com/leeno.org/wp-content/uploads/2015/06/images.png?resize=149%2C150&ssl=1BlogSviluppoNon è ufficiale e non c'è fretta. Del resto non devo rispettare alcuna scadenza, ma è, di fatto, iniziato il porting del codice di LeenO da Free/Open/Libre o comepiùvipiace-Basic a Python. Provo a 'giustificarne' qui il mio impegno. Sto sviluppando l'emissione dei documenti contabili riguardanti la contabilità a misura. Per...Giuseppe VizzielloGiuseppe Vizziellogiuserpe@giuserpe.itAdministratorLeenO - Computo metrico assistito
carissimo Giuseppe,
guardo con simpatia il tuo lavoro per produrre un software di computo metrico in LibreOffice.
Anch’io mi sono cimentato in questa sfida.
Questo post è vecchio di quattro anni, e penso che nel frattempo avrai cambiato approccio, ma a me risulta che ciclare le singole celle sia molto più lento che recuperare una array di array con DataArray e ciclare su questo, sia in Basic che Python.
Ti chiedo informazioni sulla variabile XSCRIPTCONTEXT, che esiste quando la rout è chiamata tramite il menù macro o da un evento, ma non riesco ad averla quando chiamo python tramite il service “com.sun.star.script.provider.MasterScriptProviderFactory” e seguente createScriptProvider.
Hai qualche suggerimento?
Ciao Nick
Ciao Nick,
sì, è fuori dubbio che il DataArray per leggere o scrivere dati in aree del file è veloce. Infatti da un po’ ne faccio un largo uso.
In quanto a XSCRIPTCONTEXT faccio fatica a seguirti, ma è possibile che sia un mio limite.
Prova a dare un’occhiata a http://www.openoffice.org/api/docs/common/ref/com/sun/star/script/provider/XScriptContext.html
Nel 90% dei casi i miei script cominciano proprio con
oDoc = XSCRIPTCONTEXT.getDocument()
.Se vuoi un confronto diretto puoi raggiungermi su https://t.me/leeno_computometrico
Sono disponibile generalmente in tarda serata.
Ciao