LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoSheetUtils.py
Vai alla documentazione di questo file.
1 '''
2 Funzioni di utilità per la manipolazione dei fogli
3 relativamente alle funzionalità specifiche di LeenO
4 '''
5 import uno
6 from com.sun.star.sheet.CellFlags import HARDATTR, EDITATTR, FORMATTED
7 
8 import pyleeno as PL
9 import LeenoUtils
10 import SheetUtils
11 import LeenoAnalysis
12 import LeenoComputo
13 import Dialogs
14 import LeenoDialogs as DLG
15 
16 
18  '''
19  Indica qual è il Documento Principale
20  nell'apposita area del foglio corrente
21  '''
22  # legge il percorso del documento principale
23  sUltimus = LeenoUtils.getGlobalVar('sUltimus')
24 
25  # dal foglio risale al documento proprietario
26  oDoc = SheetUtils.getDocumentFromSheet(oSheet)
27 
28  # se si sta lavorando sul Documento Principale, non fa nulla
29  try:
30  if sUltimus == uno.fileUrlToSystemPath(oDoc.getURL()):
31  return
32  except Exception:
33  # file senza nome
34  return
35 
36  d = {
37  'COMPUTO': 'F1',
38  'VARIANTE': 'F1',
39  'Elenco Prezzi': 'A1',
40  'CONTABILITA': 'F1',
41  'Analisi di Prezzo': 'A1'
42  }
43  cell = d.get(oSheet.Name)
44  if cell is None:
45  return
46 
47  oSheet.getCellRangeByName(cell).String = 'DP: ' + sUltimus
48  oSheet.getCellRangeByName("A1:AT1").clearContents(EDITATTR + FORMATTED + HARDATTR)
49 
50 # ###############################################################
51 
53  '''
54  area
55  '''
56  oDoc = LeenoUtils.getDocument()
57  oSheet = oDoc.CurrentController.ActiveSheet
58 
59  oPrintArea = oSheet.getPrintAreas()
60 
61  oSheet.getCellRangeByPosition(
62  oPrintArea[0].StartColumn, oPrintArea[0].StartRow,
63  oPrintArea[0].EndColumn, oPrintArea[0].EndRow
64  ).CellBackColor = 16777215 #sbianca
65  return
66 
67 
68 
70  '''
71  Cancella area di stampa del foglio corrente
72  '''
74  oDoc = LeenoUtils.getDocument()
75  oSheet = oDoc.CurrentController.ActiveSheet
76  oSheet.setPrintAreas(())
77  return
78 
79 # ###############################################################
80 
81 def setVisibilitaColonne(oSheet, sValori):
82  '''
83  sValori { string } : una stringa di configurazione della visibilità colonne
84  permette di visualizzare/nascondere un set di colonne
85  T = visualizza
86  F = nasconde
87  '''
88  n = 0
89  for el in sValori:
90  oSheet.getCellByPosition(n, 2).Columns.IsVisible = True if el == 'T' else False
91  n += 1
92 
93 # ###############################################################
94 
95 def setLarghezzaColonne(oSheet):
96  '''
97  regola la larghezza delle colonne a seconda della sheet
98  '''
99  if oSheet.Name == 'Analisi di Prezzo':
100  for col, width in {'A':1600, 'B':11000, 'C':1500, 'D':1500, 'E':1500, 'F':1500,
101  'G':1500, 'H':2000, 'I':1900, 'J':1900, 'K':1900}.items():
102  oSheet.Columns[col].Width = width
103  SheetUtils.freezeRowCol(oSheet, 0, 2)
104 
105  elif oSheet.Name == 'CONTABILITA':
106  setVisibilitaColonne(oSheet, 'TTTFFTTTTTFTFTFTFTFTTFTTFTFTTTTFFFFFF')
107  # larghezza colonne importi
108  oSheet.getCellRangeByPosition(13, 0, 1023, 0).Columns.Width = 1900
109  # larghezza colonne importi
110  oSheet.getCellRangeByPosition(19, 0, 23, 0).Columns.Width = 1000
111  # nascondi colonne
112  oSheet.getCellRangeByPosition(51, 0, 1023, 0).Columns.IsVisible = False
113 
114  for col, width in {'A':600, 'B':1500, 'C':6300, 'F':1300, 'G':1300,
115  'H':1300, 'I':1300, 'J':1700, 'L':1700, 'N':1900,
116  'P':1900, 'T':1000, 'U':1000, 'W':1000, 'X':1000,
117  'Z':1900, 'AC':1700, 'AD':1700, 'AE':1700,
118  'AX':1900, 'AY':1900}.items():
119  oSheet.Columns[col].Width = width
120  SheetUtils.freezeRowCol(oSheet, 0, 3)
121 
122  elif oSheet.Name in ('COMPUTO', 'VARIANTE'):
123  # mostra colonne
124  oSheet.getCellRangeByPosition(5, 0, 8, 0).Columns.IsVisible = True
125 
126  oSheet.getColumns().getByName('A').Columns.Width = 600
127  oSheet.getColumns().getByName('B').Columns.Width = 1500
128  oSheet.getColumns().getByName('C').Columns.Width = 6300 # 7800
129  oSheet.getColumns().getByName('F').Columns.Width = 1500
130  oSheet.getColumns().getByName('G').Columns.Width = 1300
131  oSheet.getColumns().getByName('H').Columns.Width = 1300
132  oSheet.getColumns().getByName('I').Columns.Width = 1300
133  oSheet.getColumns().getByName('J').Columns.Width = 1700
134  oSheet.getColumns().getByName('L').Columns.Width = 1700
135  oSheet.getColumns().getByName('S').Columns.Width = 1700
136  oSheet.getColumns().getByName('AC').Columns.Width = 1700
137  oSheet.getColumns().getByName('AD').Columns.Width = 1700
138  oSheet.getColumns().getByName('AE').Columns.Width = 1700
139  SheetUtils.freezeRowCol(oSheet, 0, 3)
140  setVisibilitaColonne(oSheet, 'TTTFFTTTTTFTFFFFFFTFFFFFFFFFFFFFFFFFFFFFFFFFTT')
141  if oSheet.Name == 'Elenco Prezzi':
142  oSheet.getColumns().getByName('A').Columns.Width = 1600
143  oSheet.getColumns().getByName('B').Columns.Width = 10000
144  oSheet.getColumns().getByName('C').Columns.Width = 1500
145  oSheet.getColumns().getByName('D').Columns.Width = 1500
146  oSheet.getColumns().getByName('E').Columns.Width = 1600
147  oSheet.getColumns().getByName('F').Columns.Width = 1500
148  oSheet.getColumns().getByName('G').Columns.Width = 1500
149  oSheet.getColumns().getByName('H').Columns.Width = 1600
150  oSheet.getColumns().getByName('I').Columns.Width = 1200
151  oSheet.getColumns().getByName('J').Columns.Width = 1200
152  oSheet.getColumns().getByName('K').Columns.Width = 100
153  oSheet.getColumns().getByName('L').Columns.Width = 1600
154  oSheet.getColumns().getByName('M').Columns.Width = 1600
155  oSheet.getColumns().getByName('N').Columns.Width = 1600
156  oSheet.getColumns().getByName('O').Columns.Width = 100
157  oSheet.getColumns().getByName('P').Columns.Width = 1600
158  oSheet.getColumns().getByName('Q').Columns.Width = 1600
159  oSheet.getColumns().getByName('R').Columns.Width = 1600
160  oSheet.getColumns().getByName('S').Columns.Width = 100
161  oSheet.getColumns().getByName('T').Columns.Width = 1600
162  oSheet.getColumns().getByName('U').Columns.Width = 1600
163  oSheet.getColumns().getByName('V').Columns.Width = 1600
164  oSheet.getColumns().getByName('W').Columns.Width = 100
165  oSheet.getColumns().getByName('X').Columns.Width = 1600
166  oSheet.getColumns().getByName('Y').Columns.Width = 1600
167  oSheet.getColumns().getByName('Z').Columns.Width = 1600
168  oSheet.getColumns().getByName('AA').Columns.Width = 1600
169  SheetUtils.freezeRowCol(oSheet, 0, 3)
170  adattaAltezzaRiga(oSheet)
171 
172 # ###############################################################
173 def rRow(oSheet):
174  '''
175  Restituisce la posizione della riga rossa
176  '''
177  nRow = SheetUtils.getLastUsedRow(oSheet) +10
178  for n in reversed(range(0, nRow)):
179  if oSheet.getCellByPosition(
180  0,
181  n).CellStyle == 'Riga_rossa_Chiudi':
182  return n
183 
184 def cercaUltimaVoce(oSheet):
185  nRow = SheetUtils.getLastUsedRow(oSheet) +1
186  if nRow == 0:
187  return 0
188  for n in reversed(range(0, nRow)):
189  # if oSheet.getCellByPosition(0, n).CellStyle in('Comp TOTALI'):
190  if oSheet.getCellByPosition(
191  0,
192  n).CellStyle in ('EP-aS', 'EP-Cs', 'An-sfondo-basso Att End',
193  'Comp End Attributo', 'Comp End Attributo_R',
194  'comp Int_colonna',
195  'comp Int_colonna_R_prima',
196  'Livello-0-scritta', 'Livello-1-scritta',
197  'livello2 valuta'):
198  break
199  return n
200 
201 
202 # ###############################################################
203 
204 
205 def cercaPartenza(oSheet, lrow):
206  '''
207  oSheet foglio corrente
208  lrow riga corrente nel foglio
209  Ritorna il nome del foglio [0] e l'id della riga di codice prezzo componente [1]
210  il flag '#reg' solo per la contabilità.
211  partenza = (nome_foglio, id_rcodice, flag_contabilità)
212  '''
213  stili_computo = LeenoUtils.getGlobalVar('stili_computo')
214  stili_contab = LeenoUtils.getGlobalVar('stili_contab')
215 
216  # COMPUTO, VARIANTE
217  if oSheet.getCellByPosition(0, lrow).CellStyle in stili_computo:
218  sStRange = LeenoComputo.circoscriveVoceComputo(oSheet, lrow)
219  partenza = (oSheet.Name, sStRange.RangeAddress.StartRow + 1)
220 
221  # CONTABILITA
222  elif oSheet.getCellByPosition(0, lrow).CellStyle in stili_contab:
223  sStRange = LeenoComputo.circoscriveVoceComputo(oSheet, lrow)
224 
225  try:
226  partenza = (oSheet.Name, sStRange.RangeAddress.StartRow + 1,
227  oSheet.getCellByPosition(22,
228  sStRange.RangeAddress.StartRow + 1).String)
229  except:
230  lrow = 3
231  partenza = (oSheet.Name, lrow, '')
232 
233  # ANALISI o riga totale
234  elif oSheet.getCellByPosition(0, lrow).CellStyle in ('An-lavoraz-Cod-sx', 'Comp TOTALI'):
235  partenza = (oSheet.Name, lrow)
236 
237  # nulla di quanto sopra
238  else:
239  partenza = (oSheet.Name, lrow, '')
240 
241  return partenza
242 
243 
244 # ###############################################################
245 
246 
247 def selezionaVoce(oSheet, lrow):
248  '''
249  Restituisce inizio e fine riga di una voce in COMPUTO, VARIANTE,
250  CONTABILITA o Analisi di Prezzo
251  lrow { long } : numero riga all'interno della voce
252  '''
253  if oSheet.Name in ('Elenco Prezzi'):
254  return lrow, lrow
255 
256  if oSheet.Name in ('COMPUTO', 'VARIANTE'):
257  sStRange = LeenoComputo.circoscriveVoceComputo(oSheet, lrow)
258  elif oSheet.Name == 'Analisi di Prezzo':
259  sStRange = LeenoAnalysis.circoscriveAnalisi(oSheet, lrow)
260 
261  elif oSheet.Name == 'CONTABILITA':
262  partenza = cercaPartenza(oSheet, lrow)
263  if partenza[2] == '#reg':
264  PL.sblocca_cont()
265  if LeenoUtils.getGlobalVar('sblocca_computo') == 0:
266  return
267  pass
268  else:
269  pass
270  sStRange = LeenoComputo.circoscriveVoceComputo(oSheet, lrow)
271  else:
272  raise
273 
274  SR = sStRange.RangeAddress.StartRow
275  ER = sStRange.RangeAddress.EndRow
276  # ~ oDoc.CurrentController.select(oSheet.getCellRangeByPosition(0, SR, 250, ER))
277  return SR, ER
278 
279 # ###############################################################
280 
281 def prossimaVoce(oSheet, lrow, n=1, saltaCat=False):
282  '''
283  oSheet { obect }
284  lrow { double } : riga di riferimento
285  n { integer } : se 0 sposta prima della voce corrente
286  se 1 sposta dopo della voce corrente
287  sposta il cursore prima o dopo la voce corrente restituendo un idrow
288  '''
289  stili_cat = LeenoUtils.getGlobalVar('stili_cat')
290  stili_computo = LeenoUtils.getGlobalVar('stili_computo')
291  stili_contab = LeenoUtils.getGlobalVar('stili_contab')
292  noVoce = LeenoUtils.getGlobalVar('noVoce')
293  stili = stili_computo + stili_contab
294 
295  # ~lrow = PL.LeggiPosizioneCorrente()[1]
296  if lrow == 0:
297  while oSheet.getCellByPosition(0, lrow).CellStyle not in stili:
298  lrow += 1
299  return lrow
300  fine = cercaUltimaVoce(oSheet) + 1
301  # la parte che segue sposta il focus alla voce successiva
302  if lrow >= fine:
303  return lrow
304  if oSheet.getCellByPosition(0, lrow).CellStyle in stili:
305  if n == 0:
306  sopra = LeenoComputo.circoscriveVoceComputo(oSheet, lrow).RangeAddress.StartRow
307  lrow = sopra
308  elif n == 1:
309  sotto = LeenoComputo.circoscriveVoceComputo(oSheet, lrow).RangeAddress.EndRow
310  lrow = sotto + 1
311  if saltaCat == True:
312  while oSheet.getCellByPosition(0, lrow).CellStyle in stili_cat:
313  lrow += 1
314  while oSheet.getCellByPosition(0, lrow).CellStyle in ('uuuuu', 'Ultimus_centro_bordi_lati'):
315  lrow += 1
316  return lrow
317 # ###############################################################
318 
319 def eliminaVoce(oSheet, lrow):
320  '''
321  usata in PL.MENU_elimina_voci_azzerate()
322 
323  Elimina una voce in COMPUTO, VARIANTE, CONTABILITA o Analisi di Prezzo
324  lrow { long } : numero riga
325  '''
326  voce = selezionaVoce(oSheet, lrow)
327  SR = voce[0]
328  ER = voce[1]
329 
330  oSheet.getRows().removeByIndex(SR, ER - SR + 1)
331 
332 def elimina_voce(lrow=None, msg=1):
333  '''
334  @@@ MODIFICA IN CORSO CON 'LeenoSheetUtils.eliminaVoce'
335  Elimina una voce in COMPUTO, VARIANTE, CONTABILITA o Analisi di Prezzo
336  lrow { long } : numero riga
337  msg { bit } : 1 chiedi conferma con messaggio
338  0 esegui senza conferma
339  '''
340  oDoc = LeenoUtils.getDocument()
341  oSheet = oDoc.CurrentController.ActiveSheet
342 
343  if oSheet.Name == 'Elenco Prezzi':
344  Dialogs.Info(Title = 'Info', Text="""Per eliminare una o più voci dall'Elenco Prezzi
345 devi selezionarle ed utilizzare il comando 'Elimina righe' di Calc.""")
346  return
347 
348  if oSheet.Name not in ('COMPUTO', 'CONTABILITA', 'VARIANTE', 'Analisi di Prezzo'):
349  return
350 
351  try:
352  SR = PL.seleziona_voce()[0]
353  except:
354  return
355  ER = PL.seleziona_voce()[1]
356  if msg == 1:
357  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(
358  0, SR, 250, ER))
359  if '$C$' in oSheet.getCellByPosition(9, ER).queryDependents(False).AbsoluteName:
360  undo = 1
361  PL._gotoCella(9, ER)
362  PL.comando ('ClearArrowDependents')
363  PL.comando ('ShowDependents')
364  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(
365  0, SR, 250, ER))
366  messaggio= """
367 Da questa voce dipende almeno un Vedi Voce.
368 VUOI PROCEDERE UGUALMENTE?"""
369  else:
370  messaggio = """OPERAZIONE NON ANNULLABILE!\n
371 Stai per eliminare la voce selezionata.
372  Voi Procedere?\n"""
373  # ~return
374  if Dialogs.YesNoDialog(Title='*** A T T E N Z I O N E ! ***',
375  Text= messaggio) == 1:
376  try:
377  undo
378  comando ('Undo')
379  except:
380  pass
381  oSheet.getRows().removeByIndex(SR, ER - SR + 1)
382  PL._gotoCella(0, SR+1)
383  else:
384  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(
385  0, SR, 250, ER))
386  return
387  elif msg == 0:
388  oSheet.getRows().removeByIndex(SR, ER - SR + 1)
389  if oSheet.Name != 'Analisi di Prezzo':
390  PL.numera_voci(0)
391  else:
392  PL._gotoCella(0, SR+2)
393  oDoc.CurrentController.select(
394  oDoc.createInstance("com.sun.star.sheet.SheetCellRanges"))
395 
396 # ###############################################################
397 
398 def inserisciRigaRossa(oSheet):
399  '''
400  Inserisce la riga rossa di chiusura degli elaborati nel foglio specificato
401  Questa riga è un riferimento per varie operazioni
402  Errore se il foglio non è un foglio di LeenO
403  '''
404  lrow = 0
405  nome = oSheet.Name
406  if nome in ('COMPUTO', 'VARIANTE', 'CONTABILITA'):
407  lrow = cercaUltimaVoce(oSheet) + 2
408  for n in range(lrow, SheetUtils.getLastUsedRow(oSheet) + 2):
409  if oSheet.getCellByPosition(0, n).CellStyle == 'Riga_rossa_Chiudi':
410  return
411  oSheet.getRows().insertByIndex(lrow, 1)
412  oSheet.getCellByPosition(0, lrow).String = 'Fine Computo'
413  oSheet.getCellRangeByPosition(0, lrow, 34, lrow).CellStyle = 'Riga_rossa_Chiudi'
414  oSheet.getCellByPosition(2, lrow
415  ).String = 'Questa riga NON deve essere cancellata, MAI!!!(ma può rimanere tranquillamente NASCOSTA!)'
416  elif nome == 'Analisi di Prezzo':
417  lrow = cercaUltimaVoce(oSheet) + 2
418  oSheet.getCellByPosition(0, lrow).String = 'Fine ANALISI'
419  oSheet.getCellRangeByPosition(0, lrow, 10, lrow).CellStyle = 'Riga_rossa_Chiudi'
420  oSheet.getCellByPosition(1, lrow
421  ).String = 'Questa riga NON deve essere cancellata, MAI!!!(ma può rimanere tranquillamente NASCOSTA!)'
422  elif nome == 'Elenco Prezzi':
423  lrow = cercaUltimaVoce(oSheet) + 1
424  if oSheet.getCellByPosition(0, lrow).CellStyle != 'Riga_rossa_Chiudi':
425  lrow += 1
426  oSheet.getCellByPosition(0, lrow).String = 'Fine elenco'
427  oSheet.getCellRangeByPosition(0, lrow, 9, lrow).CellStyle = 'Riga_rossa_Chiudi'
428  oSheet.getCellRangeByPosition(11, lrow, 21, lrow).CellStyle = 'EP statistiche_Contab'
429  oSheet.getCellRangeByPosition(23, lrow, 25, lrow).CellStyle = 'EP statistiche'
430  oSheet.getCellRangeByPosition(26, lrow, 26, lrow).CellStyle = 'EP-mezzo %'
431  s = str(lrow + 1)
432  oSheet.getCellByPosition(12, lrow).String = 'TOTALE'
433  oSheet.getCellByPosition(13, lrow).Formula = '=SUBTOTAL(9;N3:N' + s + ')'
434  oSheet.getCellByPosition(16, lrow).String = 'TOTALE'
435  oSheet.getCellByPosition(17, lrow).Formula = '=SUBTOTAL(9;R3:R' + s + ')'
436  oSheet.getCellByPosition(20, lrow).String = 'TOTALE'
437  oSheet.getCellByPosition(21, lrow).Formula = '=SUBTOTAL(9;V3:V' + s + ')'
438  oSheet.getCellByPosition(23, lrow).String = 'TOTALE'
439  oSheet.getCellByPosition(24, lrow).Formula = '=SUBTOTAL(9;Y3:Y' + s + ')'
440  oSheet.getCellByPosition(25, lrow).Formula = '=SUBTOTAL(9;Z3:Z' + s + ')'
441  oSheet.getCellByPosition(26, lrow).Formula = '=IFERROR(IFS(AND(N' + s + '>R' + s + ';R' + s + '=0);-1;AND(N' + s + '<R' + s + ';N' + s + '=0);1;N' + s + '=R' + s + ';"--";N' + s + '>R' + s + ';-(N' + s + '-R' + s + ')/N' + s + ';N'+ s + '<R' + s + ';-(N' + s + '-R' + s + ')/N' + s + ');"--")'
442  oSheet.getCellByPosition(1, lrow
443  ).String = 'Questa riga NON deve essere cancellata, MAI!!!(ma può rimanere tranquillamente NASCOSTA!)'
444 
445 # ###############################################################
446 from com.sun.star.beans import PropertyValue
447 
448 def setAdatta():
449  # ~da sistemare
450  '''
451  altezza { integer } : altezza
452  fissa il valore dell'altezza ottimale
453  '''
454  # oDoc = LeenoUtils.getDocument()
455  # oSheet = oDoc.CurrentController.ActiveSheet
457  desktop = LeenoUtils.getDesktop()
458  oFrame = desktop.getCurrentFrame()
459  dispatchHelper = ctx.ServiceManager.createInstanceWithContext(
460  'com.sun.star.frame.DispatchHelper', ctx)
461  oProp = PropertyValue()
462  oProp.Name = 'aExtraHeight'
463  oProp.Value = 10
464  properties = (oProp, )
465  dispatchHelper.executeDispatch(oFrame, '.uno:SetOptimalRowHeight', '', 0,
466  properties)
467 
468 def adattaAltezzaRiga(oSheet):
469  '''
470  Adatta l'altezza delle righe al contenuto delle celle.
471  imposta l'altezza ottimale delle celle
472  usata in PL.Menu_adattaAltezzaRiga()
473  '''
474 
475  # qui il refresh manda in freeze
476  # ~LeenoUtils.DocumentRefresh(False)
477 
478  oDoc = LeenoUtils.getDocument()
479  # ~oDoc = SheetUtils.getDocumentFromSheet(oSheet)
480  if not oDoc.getSheets().hasByName('S1'):
481  return
482 
483  usedArea = SheetUtils.getUsedArea(oSheet)
484  oSheet.getCellRangeByPosition(0, 0, usedArea.EndColumn, usedArea.EndRow).Rows.OptimalHeight = True
485 
486  # DALLA VERSIONE 6.4.2 IL PROBLEMA è RISOLTO
487  # DALLA VERSIONE 7 IL PROBLEMA è PRESENTE
488  if float(PL.loVersion()[:5].replace('.', '')) >= 642:
489  return
490 
491  # se la versione di LibreOffice è maggiore della 5.2
492  # esegue il comando agendo direttamente sullo stile
493  lista_stili = ('comp 1-a', 'Comp-Bianche in mezzo Descr_R',
494  'Comp-Bianche in mezzo Descr', 'EP-a',
495  'Ultimus_centro_bordi_lati')
496  # NELLE VERSIONI DA 5.4.2 A 6.4.1
497  if(
498  float(PL.loVersion()[:5].replace('.', '')) > 520 or
499  float(PL.loVersion()[:5].replace('.', '')) < 642):
500  for stile_cella in lista_stili:
501  try:
502  oDoc.StyleFamilies.getByName("CellStyles").getByName(stile_cella).IsTextWrapped = True
503  except Exception:
504  pass
505 
506  test = usedArea.EndRow + 1
507 
508  for y in range(0, test):
509  if oSheet.getCellByPosition(2, y).CellStyle in lista_stili:
510  oSheet.getCellRangeByPosition(0, y, usedArea.EndColumn, y).Rows.OptimalHeight = True
511 
512  if oSheet.Name in ('Elenco Prezzi', 'VARIANTE', 'COMPUTO', 'CONTABILITA'):
513  oSheet.getCellByPosition(0, 2).Rows.Height = 800
514  if oSheet.Name == 'Elenco Prezzi':
515  test = usedArea.EndRow + 1
516  for y in range(0, test):
517  oSheet.getCellRangeByPosition(0, y, usedArea.EndColumn, y).Rows.OptimalHeight = True
518  return
519 
520 
521 # ###############################################################
522 
523 
524 def inserSuperCapitolo(oSheet, lrow, sTesto='Super Categoria'):
525  '''
526  lrow { double } : id della riga di inserimento
527  sTesto { string } : titolo della categoria
528  '''
529  if oSheet.Name not in ('COMPUTO', 'VARIANTE', 'CONTABILITA'):
530  return
531  if not sTesto:
532  sTesto ='senza_titolo'
533  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Default':
534  # se oltre la riga rossa
535  lrow -= 2
536  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Riga_rossa_Chiudi':
537  # se riga rossa
538  lrow -= 1
539 
540  oSheet.getRows().insertByIndex(lrow, 1)
541  oSheet.getCellByPosition(2, lrow).String = sTesto
542 
543  # inserisco i valori e le formule
544  oSheet.getCellRangeByPosition(0, lrow, 41, lrow).CellStyle = 'Livello-0-scritta'
545  oSheet.getCellRangeByPosition(2, lrow, 17, lrow).CellStyle = 'Livello-0-scritta mini'
546  oSheet.getCellRangeByPosition( 18, lrow, 18, lrow).CellStyle = 'Livello-0-scritta mini val'
547  oSheet.getCellRangeByPosition(24, lrow, 24, lrow).CellStyle = 'Livello-0-scritta mini %'
548  oSheet.getCellRangeByPosition(29, lrow, 29, lrow).CellStyle = 'Livello-0-scritta mini %'
549  oSheet.getCellRangeByPosition(30, lrow, 30, lrow).CellStyle = 'Livello-0-scritta mini val'
550  oSheet.getCellRangeByPosition(2, lrow, 11, lrow).merge(True)
551 
552  # rinumero e ricalcolo
553  # ocellBaseA = oSheet.getCellByPosition(1, lrow)
554  # ocellBaseR = oSheet.getCellByPosition(31, lrow)
555  lrowProvv = lrow - 1
556  while oSheet.getCellByPosition(31, lrowProvv).CellStyle != 'Livello-0-scritta':
557  if lrowProvv > 4:
558  lrowProvv -= 1
559  else:
560  break
561  oSheet.getCellByPosition(31, lrow).Value = oSheet.getCellByPosition(1, lrowProvv).Value + 1
562 
563 
564 # ###############################################################
565 
566 
567 def inserCapitolo(oSheet, lrow, sTesto='Categoria'):
568  '''
569  lrow { double } : id della riga di inserimento
570  sTesto { string } : titolo della categoria
571  '''
572  if oSheet.Name not in ('COMPUTO', 'VARIANTE', 'CONTABILITA'):
573  return
574  if not sTesto:
575  sTesto ='senza_titolo'
576 
577  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Default':
578  # se oltre la riga rossa
579  lrow -= 2
580  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Riga_rossa_Chiudi':
581  # se riga rossa
582  lrow -= 1
583  oSheet.getRows().insertByIndex(lrow, 1)
584  oSheet.getCellByPosition(2, lrow).String = sTesto
585 
586  # inserisco i valori e le formule
587  oSheet.getCellRangeByPosition(0, lrow, 41, lrow).CellStyle = 'Livello-1-scritta'
588  oSheet.getCellRangeByPosition(2, lrow, 17, lrow).CellStyle = 'Livello-1-scritta mini'
589  oSheet.getCellRangeByPosition(18, lrow, 18, lrow).CellStyle = 'Livello-1-scritta mini val'
590  oSheet.getCellRangeByPosition(24, lrow, 24, lrow).CellStyle = 'Livello-1-scritta mini %'
591  oSheet.getCellRangeByPosition(29, lrow, 29, lrow).CellStyle = 'Livello-1-scritta mini %'
592  oSheet.getCellRangeByPosition(30, lrow, 30, lrow).CellStyle = 'Livello-1-scritta mini val'
593  oSheet.getCellRangeByPosition(2, lrow, 11, lrow).merge(True)
594 
595  # rinumero e ricalcolo
596  # ocellBaseA = oSheet.getCellByPosition(1, lrow)
597  # ocellBaseR = oSheet.getCellByPosition(31, lrow)
598  lrowProvv = lrow - 1
599  while oSheet.getCellByPosition(31, lrowProvv).CellStyle != 'Livello-1-scritta':
600  if lrowProvv > 4:
601  lrowProvv -= 1
602  else:
603  break
604  oSheet.getCellByPosition(31, lrow).Value = oSheet.getCellByPosition(1, lrowProvv).Value + 1
605 
606 
607 # ###############################################################
608 
609 
610 def inserSottoCapitolo(oSheet, lrow, sTesto):
611  '''
612  lrow { double } : id della riga di inserimento
613  sTesto { string } : titolo della sottocategoria
614  '''
615  if oSheet.Name not in ('COMPUTO', 'VARIANTE', 'CONTABILITA'):
616  return
617  if not sTesto:
618  sTesto ='senza_titolo'
619 
620  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Default':
621  # se oltre la riga rossa
622  lrow -= 2
623  if oSheet.getCellByPosition(1, lrow).CellStyle == 'Riga_rossa_Chiudi':
624  # se riga rossa
625  lrow -= 1
626 
627  oSheet.getRows().insertByIndex(lrow, 1)
628  oSheet.getCellByPosition(2, lrow).String = sTesto
629 
630  # inserisco i valori e le formule
631  oSheet.getCellRangeByPosition(0, lrow, 41,lrow).CellStyle = 'livello2 valuta'
632  oSheet.getCellRangeByPosition(2, lrow, 17, lrow).CellStyle = 'livello2_'
633  oSheet.getCellRangeByPosition(18, lrow, 18, lrow).CellStyle = 'livello2 scritta mini'
634  oSheet.getCellRangeByPosition(24, lrow, 24, lrow).CellStyle = 'livello2 valuta mini %'
635  oSheet.getCellRangeByPosition(29, lrow, 29, lrow).CellStyle = 'livello2 valuta mini %'
636  oSheet.getCellRangeByPosition(30, lrow, 30, lrow).CellStyle = 'livello2 valuta mini'
637  oSheet.getCellRangeByPosition(31, lrow, 33, lrow).CellStyle = 'livello2_'
638  oSheet.getCellRangeByPosition(2, lrow, 11, lrow).merge(True)
639 
640  # oSheet.getCellByPosition(1, lrow).Formula = '=AF' + str(lrow+1) + '''&"."&''' + 'AG' + str(lrow+1)
641  # rinumero e ricalcolo
642  # ocellBaseA = oSheet.getCellByPosition(1, lrow)
643  # ocellBaseR = oSheet.getCellByPosition(31, lrow)
644 
645  lrowProvv = lrow - 1
646  while oSheet.getCellByPosition(32, lrowProvv).CellStyle != 'livello2 valuta':
647  if lrowProvv > 4:
648  lrowProvv -= 1
649  else:
650  break
651  oSheet.getCellByPosition(
652  32, lrow).Value = oSheet.getCellByPosition(1, lrowProvv).Value + 1
653  lrowProvv = lrow - 1
654  while oSheet.getCellByPosition(31, lrowProvv).CellStyle != 'Livello-1-scritta':
655  if lrowProvv > 4:
656  lrowProvv -= 1
657  else:
658  break
659  oSheet.getCellByPosition(31, lrow).Value = oSheet.getCellByPosition(1, lrowProvv).Value
660  # SubSum_Cap(lrow)
661 
662 
663 # ###############################################################
664 
665 
666 def invertiUnSegno(oSheet, lrow):
667  '''
668  Inverte il segno delle formule di quantità nel rigo di misurazione lrow.
669  lrow { int } : riga di riferimento
670  usata con XPWE_it
671  '''
672  if oSheet.Name in ('COMPUTO', 'VARIANTE'):
673  if 'comp 1-a' in oSheet.getCellByPosition(2, lrow).CellStyle:
674  if 'ROSSO' in oSheet.getCellByPosition(2, lrow).CellStyle:
675  oSheet.getCellByPosition(
676  9, lrow
677  ).Formula = '=IF(PRODUCT(E' + str(lrow + 1) + ':I' + str(
678  lrow + 1) + ')=0;"";PRODUCT(E' + str(
679  lrow + 1) + ':I' + str(lrow + 1) + '))'
680  # se VediVoce
681  # ~ if oSheet.getCellByPosition(4, lrow).Type.value != 'EMPTY':
682  # ~ oSheet.getCellByPosition(9, lrow).Formula='=IF(PRODUCT(E' +
683  # str(lrow+1) + ':I' + str(lrow+1) + ')=0;"";PRODUCT(E' +
684  # str(lrow+1) + ':I' + str(lrow+1) + '))' # se VediVoce
685  # ~ else:
686  # ~ oSheet.getCellByPosition(9, lrow).Formula=
687  # '=IF(PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) +
688  # ')=0;"";PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + '))'
689  for x in range(2, 10):
690  oSheet.getCellByPosition(
691  x, lrow).CellStyle = oSheet.getCellByPosition(
692  x, lrow).CellStyle.split(' ROSSO')[0]
693  else:
694  oSheet.getCellByPosition(
695  9, lrow
696  ).Formula = '=IF(PRODUCT(E' + str(lrow + 1) + ':I' + str(
697  lrow + 1) + ')=0;"";-PRODUCT(E' + str(
698  lrow + 1) + ':I' + str(lrow + 1) + '))' # se VediVoce
699  # ~ if oSheet.getCellByPosition(4, lrow).Type.value != 'EMPTY':
700  # ~ oSheet.getCellByPosition(9, lrow).Formula =
701  # '=IF(PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;
702  # "";-PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + '))' # se VediVoce
703  # ~ else:
704  # ~ oSheet.getCellByPosition(9, lrow).Formula =
705  # '=IF(PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + ')=0;
706  # "";-PRODUCT(E' + str(lrow+1) + ':I' + str(lrow+1) + '))'
707  for x in range(2, 10):
708  oSheet.getCellByPosition(
709  x, lrow).CellStyle = oSheet.getCellByPosition(
710  x, lrow).CellStyle + ' ROSSO'
711  if oSheet.Name in ('CONTABILITA'):
712  formula1 = oSheet.getCellByPosition(9, lrow).Formula
713  formula2 = oSheet.getCellByPosition(11, lrow).Formula
714  oSheet.getCellByPosition(11, lrow).Formula = formula1
715  oSheet.getCellByPosition(9, lrow).Formula = formula2
716  if oSheet.getCellByPosition(11, lrow).String != '':
717  for x in range(2, 12):
718  oSheet.getCellByPosition(
719  x, lrow).CellStyle = oSheet.getCellByPosition(
720  x, lrow).CellStyle + ' ROSSO'
721  else:
722  for x in range(2, 12):
723  oSheet.getCellByPosition(
724  x, lrow).CellStyle = oSheet.getCellByPosition(
725  x, lrow).CellStyle.split(' ROSSO')[0]
726 
727 
728 # ###############################################################
729 
730 def numeraVoci(oSheet, lrow, tutte):
731  '''
732  tutte { boolean } : True rinumera tutto
733  False rinumera dalla voce corrente in giù
734  '''
736  lastRow = SheetUtils.getUsedArea(oSheet).EndRow + 1
737  n = 1
738 
739  if not tutte:
740  for x in reversed(range(0, lrow)):
741  if(
742  oSheet.getCellByPosition(1, x).CellStyle in ('comp Art-EP', 'comp Art-EP_R') and
743  oSheet.getCellByPosition(1, x).CellBackColor != 15066597):
744  n = oSheet.getCellByPosition(0, x).Value + 1
745  break
746  for row in range(lrow, lastRow):
747  if oSheet.getCellByPosition(1, row).CellBackColor == 15066597:
748  oSheet.getCellByPosition(0, row).String = ''
749  elif oSheet.getCellByPosition(1,row).CellStyle in ('comp Art-EP', 'comp Art-EP_R'):
750  oSheet.getCellByPosition(0, row).Value = n
751  n += 1
752  else:
753  for row in range(0, lastRow):
754  if oSheet.getCellByPosition(1, row).CellStyle in ('comp Art-EP','comp Art-EP_R'):
755  oSheet.getCellByPosition(0, row).Value = n
756  n = n + 1
758 
759 
760 # ###############################################################
761 
763  '''elimina le righe vuote negli elaborati di COMPUTO, VARIANTE o CONTABILITA'''
764  oDoc = LeenoUtils.getDocument()
766  oSheet = oDoc.CurrentController.ActiveSheet
767  if oSheet.Name not in ('COMPUTO', 'VARIANTE', 'CONTABILITA'):
768  Dialogs.Exclamation(Title='Avviso!', Text='''È possibile usare questo comando solo nelle
769 tabelle COMPUTO, VARIANTE o CONTABILITA.''')
770  return
771  if Dialogs.YesNoDialog(Title='ATTENZIONE!',
772  Text="Stai per eliminare tutte le righe vuote dell'elabotato " + oSheet.Name +
773  ".\nVuoi procedere?") == 0:
774  return
775  else:
776  pass
777  lrow_c = PL.LeggiPosizioneCorrente()[1]
778  if oSheet.Name == 'CONTABILITA':
779  sString = 'T O T A L E'
780  else:
781  sString = 'TOTALI COMPUTO'
782  lrow = SheetUtils.uFindStringCol(sString, 2, oSheet, start=2, equal=1, up=True)
783  progress = Dialogs.Progress(Title='Eliminazione delle righe vuote in corso...', Text="Lettura dati")
784  progress.setLimits(0, lrow)
785  progress.setValue(0)
786  progress.show()
787  for y in reversed(range(0, lrow)):
788  progress.setValue(y)
789  test = False
790  for x in (range(0, 8 +1)):
791  if oSheet.getCellByPosition(0, y).CellStyle not in ('Comp Start Attributo', 'Comp Start Attributo_R'):
792  if oSheet.getCellByPosition(x, y).Type.value != 'EMPTY':
793  test = True
794  break
795  if test == False and x == 8 :
796  oSheet.getRows().removeByIndex(y, 1)
797  progress.hide()
799  lrow_ = SheetUtils.uFindStringCol(sString, 2, oSheet, start=2, equal=1, up=True)
800  PL._gotoCella(1, 4)
801  Dialogs.Info(Title='Ricerca conclusa', Text='Eliminate ' + str(lrow - lrow_) + ' righe vuote.')
LeenoSheetUtils.inserCapitolo
def inserCapitolo(oSheet, lrow, sTesto='Categoria')
Definition: LeenoSheetUtils.py:567
SheetUtils.freezeRowCol
def freezeRowCol(oSheet, row, col)
Definition: SheetUtils.py:331
LeenoUtils.getGlobalVar
def getGlobalVar(name)
Definition: LeenoUtils.py:123
LeenoSheetUtils.adattaAltezzaRiga
def adattaAltezzaRiga(oSheet)
Definition: LeenoSheetUtils.py:468
LeenoSheetUtils.invertiUnSegno
def invertiUnSegno(oSheet, lrow)
Definition: LeenoSheetUtils.py:666
LeenoUtils.getDocument
def getDocument()
Definition: LeenoUtils.py:67
LeenoSheetUtils.eliminaVoce
def eliminaVoce(oSheet, lrow)
Definition: LeenoSheetUtils.py:319
LeenoSheetUtils.inserSottoCapitolo
def inserSottoCapitolo(oSheet, lrow, sTesto)
Definition: LeenoSheetUtils.py:610
SheetUtils.uFindStringCol
def uFindStringCol(sString, nCol, oSheet, start=2, equal=0, up=False)
Definition: SheetUtils.py:403
LeenoUtils.DocumentRefresh
def DocumentRefresh(boo)
Definition: LeenoUtils.py:109
LeenoSheetUtils.cercaUltimaVoce
def cercaUltimaVoce(oSheet)
Definition: LeenoSheetUtils.py:184
LeenoSheetUtils.setAdatta
def setAdatta()
Definition: LeenoSheetUtils.py:448
LeenoSheetUtils.prossimaVoce
def prossimaVoce(oSheet, lrow, n=1, saltaCat=False)
Definition: LeenoSheetUtils.py:281
SheetUtils.getUsedArea
def getUsedArea(oSheet)
Definition: SheetUtils.py:373
LeenoSheetUtils.setLarghezzaColonne
def setLarghezzaColonne(oSheet)
Definition: LeenoSheetUtils.py:95
LeenoUtils.getComponentContext
def getComponentContext()
Definition: LeenoUtils.py:47
Dialogs.YesNoDialog
def YesNoDialog(*Title, Text)
Definition: Dialogs.py:2545
LeenoSheetUtils.ScriviNomeDocumentoPrincipaleInFoglio
def ScriviNomeDocumentoPrincipaleInFoglio(oSheet)
Definition: LeenoSheetUtils.py:17
Dialogs.Info
def Info(*Title='', Text='')
Definition: Dialogs.py:2539
LeenoSheetUtils.inserisciRigaRossa
def inserisciRigaRossa(oSheet)
Definition: LeenoSheetUtils.py:398
Dialogs.Exclamation
def Exclamation(*Title='', Text='')
Definition: Dialogs.py:2536
LeenoSheetUtils.cercaPartenza
def cercaPartenza(oSheet, lrow)
Definition: LeenoSheetUtils.py:205
LeenoSheetUtils.rRow
def rRow(oSheet)
Definition: LeenoSheetUtils.py:173
Dialogs.Progress
Definition: Dialogs.py:2583
LeenoSheetUtils.MENU_elimina_righe_vuote
def MENU_elimina_righe_vuote()
Definition: LeenoSheetUtils.py:762
LeenoSheetUtils.SbiancaCellePrintArea
def SbiancaCellePrintArea()
Definition: LeenoSheetUtils.py:52
LeenoUtils.getDesktop
def getDesktop()
Definition: LeenoUtils.py:59
LeenoComputo.circoscriveVoceComputo
def circoscriveVoceComputo(oSheet, lrow)
Definition: LeenoComputo.py:65
LeenoSheetUtils.inserSuperCapitolo
def inserSuperCapitolo(oSheet, lrow, sTesto='Super Categoria')
Definition: LeenoSheetUtils.py:524
LeenoSheetUtils.elimina_voce
def elimina_voce(lrow=None, msg=1)
Definition: LeenoSheetUtils.py:332
LeenoSheetUtils.numeraVoci
def numeraVoci(oSheet, lrow, tutte)
Definition: LeenoSheetUtils.py:730
SheetUtils.getLastUsedRow
def getLastUsedRow(oSheet)
Definition: SheetUtils.py:392
LeenoSheetUtils.DelPrintSheetArea
def DelPrintSheetArea()
Definition: LeenoSheetUtils.py:69
LeenoSheetUtils.selezionaVoce
def selezionaVoce(oSheet, lrow)
Definition: LeenoSheetUtils.py:247
LeenoAnalysis.circoscriveAnalisi
def circoscriveAnalisi(oSheet, lrow)
Definition: LeenoAnalysis.py:59
LeenoSheetUtils.setVisibilitaColonne
def setVisibilitaColonne(oSheet, sValori)
Definition: LeenoSheetUtils.py:81
SheetUtils.getDocumentFromSheet
def getDocumentFromSheet(oSheet)
Definition: SheetUtils.py:76