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.