LeenO computo metrico con LibreOffice  3.22.0
Il software libero per la gestione di computi metrici e contabilità lavori.
LeenoImport.py
Vai alla documentazione di questo file.
1 """
2  LeenO - modulo di importazione prezzari
3 """
4 import os
5 import threading
6 import uno
7 from com.sun.star.beans import PropertyValue
8 
9 from io import StringIO
10 import xml.etree.ElementTree as ET
11 
12 import LeenoUtils
13 import pyleeno as PL
14 import LeenoDialogs as DLG
15 
16 import SheetUtils
17 
18 import Dialogs
19 
20 import LeenoImport_XmlSix
21 import LeenoImport_XmlToscana
22 import LeenoImport_XmlSardegna
23 import LeenoImport_XmlLiguria
24 import LeenoImport_XmlVeneto
25 import LeenoImport_XmlBasilicata
26 
27 
29  '''
30  corregge il paragrafo della descrizione negli elenchi prezzi
31  in modo che LibreOffice calcoli correttamente l'altezza della cella
32  '''
33  minLen = 130
34  splitted = txt.split('\n')
35  if len(splitted) > 1:
36  spl0 = splitted[0]
37  spl1 = splitted[1]
38  if len(spl0) + len(spl1) < minLen:
39  dl = minLen - len(spl0) - len(spl1)
40  spl0 = spl0 + dl * " "
41  txt = spl0 + '\n' + spl1
42  for t in splitted[2:]:
43  txt += '\n' + t
44  return txt
45 
46 
48  '''
49  prende una stringa contenente un file XML
50  elimina i namespaces dai dati
51  e ritorna il root dell' XML
52  '''
53  it = ET.iterparse(StringIO(data))
54  for _, el in it:
55  # strip namespaces
56  _, _, el.tag = el.tag.rpartition('}')
57  return it.root
58 
59 
60 def findXmlParser(xmlText):
61  '''
62  fa un pre-esame del contenuto xml della stringa fornita
63  per determinare se si tratta di un tipo noto
64  (nel qual caso fornisce un parser adatto) oppure no
65  (nel qual caso avvisa di inviare il file allo staff)
66  '''
67 
68  parsers = {
69  'xmlns="six.xsd"': LeenoImport_XmlSix.parseXML,
70  'autore="Regione Toscana"': LeenoImport_XmlToscana.parseXML,
71  'autore="Regione Sardegna"': LeenoImport_XmlSardegna.parseXML,
72  'autore="Regione Liguria"': LeenoImport_XmlLiguria.parseXML,
73  'rks=': LeenoImport_XmlVeneto.parseXML,
74  '<pdf>Prezzario_Regione_Basilicata': LeenoImport_XmlBasilicata.parseXML,
75  }
76 
77  # controlla se il file è di tipo conosciuto...
78  for pattern, xmlParser in parsers.items():
79  if pattern in xmlText:
80  # si, ritorna il parser corrispondente
81  return xmlParser
82 
83  # non trovato... ritorna None
84  return None
85 
86 def compilaElencoPrezzi(oDoc, dati, progress):
87  '''
88  Scrive la pagina dell' Elenco Prezzi di un documento LeenO
89  Il documento deve essere vuoto (appena creato)
90  I dati DEVONO essere nel formato seguente :
91 
92  articolo = {
93  'codice': codice,
94  'desc': desc,
95  'um': um,
96  'prezzo': prezzo,
97  'mdo': mdo,
98  'sicurezza': oneriSic
99  }
100  artList = { codice : articolo, ... }
101 
102  superCatList = { codice : descrizione, ... }
103  catList = { codice : descrizione, ... }
104 
105  dati = {
106  'titolo': titolo,
107  'superCategorie': superCatList,
108  'categorie': catList,
109  'articoli' : artList
110  }
111 
112  progress è una progressbar già visualizzata
113 
114  '''
115 
116  # inserisce supercategorie e categorie nella lista
117  # articoli, creando quindi un blocco unico
118  artList = dati['articoli']
119  superCatList = dati['superCategorie']
120  catList = dati['categorie']
121  for codice, desc in superCatList.items():
122  artList[codice] = {
123  'codice': codice,
124  'desc': desc,
125  'um': '',
126  'prezzo': '',
127  'mdo': '',
128  'sicurezza': ''
129  }
130  for codice, desc in catList.items():
131  artList[codice] = {
132  'codice': codice,
133  'desc': desc,
134  'um': '',
135  'prezzo': '',
136  'mdo': '',
137  'sicurezza': ''
138  }
139 
140  # ordina l'elenco per codice articolo
141  sortedArtList = sorted(artList.items())
142 
143  # ora, per velocità di compilazione, deve creare un array
144  # contenente tante tuples quanti articoli
145  # ognuna con la sequenza corretta per l'inserimento nel foglio
146  # (codice, desc, um, sicurezza, prezzo, mdo)
147  artArray = []
148  for item in sortedArtList:
149  itemData = item[1]
150  prezzo = itemData['prezzo']
151  mdo = itemData['mdo']
152  if mdo == 0:
153  mdo = ''
154  # ~if isinstance(prezzo, str) or isinstance(mdo, str):
155  # ~mdoVal = ''
156  # ~else:
157  # ~mdoVal = prezzo * mdo
158 
159  mdoVal = ''
160 
161  artArray.append((
162  itemData['codice'],
163  itemData['desc'],
164  itemData['um'],
165  itemData['sicurezza'],
166  prezzo,
167  mdo,
168  mdoVal
169  ))
170 
171  numItems = len(artArray)
172  numColumns = len(artArray[0])
173 
174  oSheet = oDoc.getSheets().getByName('S2')
175  oSheet.getCellByPosition(2, 2).String = dati['titolo']
176  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
177  oSheet.getCellByPosition(1, 0).String = dati['titolo']
178  oSheet.getRows().insertByIndex(4, numItems)
179 
180  # riga e colonna di partenza del blocco da riempire
181  startRow = 4
182  startCol = 0
183 
184  # fissa i limiti della progress
185  progress.setLimits(0, numItems)
186  progress.setValue(0)
187 
188  item = 0
189  step = 100
190  while item < numItems:
191  progress.setValue(item)
192  sliced = artArray[item:item + step]
193  num = len(sliced)
194  oRange = oSheet.getCellRangeByPosition(
195  startCol,
196  startRow + item,
197  # l'indice parte da 0
198  startCol + numColumns - 1,
199  startRow + item + num - 1)
200  oRange.setDataArray(sliced)
201 
202  item += step
203 
204  # ~oSheet.getRows().removeByIndex(3, 1)
205 
206  return True
207 
208 
210  '''
211  Routine di importazione di un prezzario XML in tabella Elenco Prezzi
212  '''
213  filename = Dialogs.FileSelect('Scegli il file XML da importare', '*.xml')
214  if filename is None:
215  return
216 
217  # se il file non contiene un titolo, utilizziamo il nome del file
218  # come titolo di default
219  defaultTitle = os.path.split(filename)[1]
220 
221  # legge il file XML in una stringa
222  with open(filename, 'r', errors='ignore', encoding="utf8") as file:
223  data = file.read()
224 
225  # cerca un parser adatto
226  xmlParser = findXmlParser(data)
227 
228  # se non trovato, il file è di tipo sconosciuto
229  if xmlParser is None:
231  Title = "File sconosciuto",
232  Text = "Il file fornito sembra di tipo sconosciuto.\n\n"
233  "Puoi riprovare cambiandone l'estensione in .XPWE quindi\n"
234  "utilizzando la relativa voce di menù per l'importazione.\n\n"
235  "In caso di nuovo errore, puoi inviare una copia del file\n"
236  "allo staff di LeenO affinchè il suo formato possa essere\n"
237  "importato dalla prossima versione del programma.\n\n"
238  )
239  return
240 
241  #try:
242  dati = xmlParser(data, defaultTitle)
243 
244  #except Exception:
245  # Dialogs.Exclamation(
246  # Title="Errore nel file XML",
247  # Text=f"Riscontrato errore nel file XML\n'{filename}'\nControllarlo e riprovare")
248  # return
249 
250  # il parser può gestirsi l'errore direttamente, nel qual caso
251  # ritorna None ed occorre uscire
252  if dati is None:
253  return
254 
255  # creo nuovo file di computo
256  oDoc = PL.creaComputo(0)
258 
259  # visualizza la progressbar
260  progress = Dialogs.Progress(
261  Title="Importazione prezzario",
262  Text="Compilazione prezzario in corso")
263  progress.show()
264 
265  # compila l'elenco prezzi
266  compilaElencoPrezzi(oDoc, dati, progress)
267 
268  # si posiziona sul foglio di computo appena caricato
269  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
270  oDoc.CurrentController.setActiveSheet(oSheet)
271 
272  # messaggio di ok
273  Dialogs.Ok(Text=f'Importate {len(dati["articoli"])} voci\ndi elenco prezzi')
274 
275  # nasconde la progressbar
276  progress.hide()
277 
278  # aggiunge informazioni nel foglio
279  # ~oSheet.getRows().insertByIndex(3, 1)
280  oSheet.getCellByPosition(11, 3).String = ''
281  oSheet.getCellByPosition(12, 3).String = ''
282  oSheet.getCellByPosition(13, 3).String = ''
283  oSheet.getCellByPosition(0, 3).String = '000'
284  oSheet.getCellByPosition(1, 3).String = '''ATTENZIONE!
285 1. Lo staff di LeenO non si assume alcuna responsabilità riguardo al contenuto del prezzario.
286 2. L’utente finale è tenuto a verificare il contenuto dei prezzari sulla base di documenti ufficiali.
287 3. L’utente finale è il solo responsabile degli elaborati ottenuti con l'uso di questo prezzario.
288 N.B.: Si rimanda ad una attenta lettura delle note informative disponibili sul sito istituzionale ufficiale di riferimento prima di accedere al prezzario.'''
289 
290  if Dialogs.YesNoDialog(Title='AVVISO!',
291  Text='''Vuoi ripulire le descrizioni dagli spazi e dai salti riga in eccesso?
292 
293 L'OPERAZIONE POTREBBE RICHIEDERE DEL TEMPO E
294 LibreOffice POTREBBE SEMBRARE BLOCCATO!
295 
296 Vuoi procedere comunque?''') == 0:
297  pass
298  else:
299  oRange = oDoc.NamedRanges.elenco_prezzi.ReferredCells.RangeAddress
300  SR = oRange.StartRow + 1
301  ER = oRange.EndRow
302  oDoc.CurrentController.select(oSheet.getCellRangeByPosition(1, SR, 1, ER -1))
303  PL.sistema_cose()
304 
305  # evidenzia e struttura i capitoli
306  PL.struttura_Elenco()
307  oSheet.getCellRangeByName('E2').Formula = '=COUNT(E:E) & " prezzi"'
308  dest = filename[0:-4]+ '.ods'
309  # salva il file col nome del file di origine
310  PL.salva_come(dest)
311  PL._gotoCella(0, 3)
313 
314  Dialogs.Info(
315  Title = "Importazione eseguita con successo!",
316  Text = '''
317 ATTENZIONE:
318 1. Lo staff di LeenO non si assume alcuna responsabilità riguardo al contenuto del prezzario.
319 2. L’utente finale è tenuto a verificare il contenuto dei prezzari sulla base di documenti ufficiali.
320 3. L’utente finale è il solo responsabile degli elaborati ottenuti con l'uso di questo prezzario.
321 
322 N.B.: Si rimanda ad una attenta lettura delle note informative disponibili
323  sul sito istituzionale ufficiale prima di accedere al Prezzario.'''
324  )
325 
326 
327 
329  '''
330  @@ DA DOCUMENTARE
331  '''
332  importa_listino_leeno_th().start()
333 
334 
335 class importa_listino_leeno_th(threading.Thread):
336  '''
337  @@ DA DOCUMENTARE
338  '''
339  def __init__(self):
340  threading.Thread.__init__(self)
341 
342  def run(self):
344 
345 
346 
348  '''
349  Esegue la conversione di un listino (formato LeenO) in template Computo
350  '''
351  oDoc = LeenoUtils.getDocument()
352  oSheet = oDoc.CurrentController.ActiveSheet
353  # giallo(16777072,16777120,16777168)
354  # verde(9502608,13696976,15794160)
355  # viola(12632319,13684991,15790335)
356  lista_articoli = list()
357  nome = oSheet.getCellByPosition(2, 0).String
358  try:
359  test = SheetUtils.uFindStringCol('ATTENZIONE!', 5, oSheet) + 1
360  except:
361  test = 5
362  fine = SheetUtils.getUsedArea(oSheet).EndRow + 1
363  assembla = DLG.DlgSiNo(
364  '''Il riconoscimento di descrizioni e sottodescrizioni
365 dipende dalla colorazione di sfondo delle righe.
366 
367 Nel caso in cui questa fosse alterata, il risultato finale
368 della conversione potrebbe essere inatteso.
369 
370 Considera anche la possibilità di recuperare il formato XML(SIX)
371 di questo prezzario dal sito ufficiale dell'ente che lo rilascia.
372 
373 Vuoi assemblare descrizioni e sottodescrizioni?''', 'Richiesta')
374  oDialogo_attesa = DLG.dlg_attesa()
375  DLG.attesa().start() # mostra il dialogo
376 
377  if assembla == 2:
378  PL.colora_vecchio_elenco()
379  orig = oDoc.getURL()
380  dest0 = orig[0:-4] + '_new.ods'
381 
382  orig = uno.fileUrlToSystemPath(PL.LeenO_path() + '/template/leeno/Computo_LeenO.ots')
383  dest = uno.fileUrlToSystemPath(dest0)
384 
385  PL.shutil.copyfile(orig, dest)
386  madre = ''
387  for el in range(test, SheetUtils.getLastUsedRow(oSheet) + 1):
388  tariffa = oSheet.getCellByPosition(2, el).String
389  descrizione = oSheet.getCellByPosition(4, el).String
390  um = oSheet.getCellByPosition(6, el).String
391  sic = oSheet.getCellByPosition(11, el).String
392  prezzo = oSheet.getCellByPosition(7, el).String
393  mdo_p = oSheet.getCellByPosition(8, el).String
394  mdo = oSheet.getCellByPosition(9, el).String
395  if oSheet.getCellByPosition(2,
396  el).CellBackColor in (16777072, 16777120,
397  9502608, 13696976,
398  12632319, 13684991):
399  articolo = (
400  tariffa,
401  descrizione,
402  um,
403  sic,
404  prezzo,
405  mdo_p,
406  mdo,
407  )
408  elif oSheet.getCellByPosition(2,
409  el).CellBackColor in (16777168, 15794160,
410  15790335):
411  if assembla == 2:
412  madre = descrizione
413  articolo = (
414  tariffa,
415  descrizione,
416  um,
417  sic,
418  prezzo,
419  mdo_p,
420  mdo,
421  )
422  else:
423  if madre == '':
424  descrizione = oSheet.getCellByPosition(4, el).String
425  else:
426  descrizione = madre + ' \n- ' + oSheet.getCellByPosition(
427  4, el).String
428  articolo = (
429  tariffa,
430  descrizione,
431  um,
432  sic,
433  prezzo,
434  mdo_p,
435  mdo,
436  )
437  lista_articoli.append(articolo)
438  oDialogo_attesa.endExecute()
439  PL._gotoDoc(dest) # vado sul nuovo file
440  # compilo la tabella ###################################################
441  oDoc = LeenoUtils.getDocument()
442  oDialogo_attesa = DLG.dlg_attesa()
443  DLG.attesa().start() # mostra il dialogo
444 
445  oSheet = oDoc.getSheets().getByName('S2')
446  oSheet.getCellByPosition(2, 2).String = nome
447  oSheet = oDoc.getSheets().getByName('Elenco Prezzi')
448  oSheet.getCellByPosition(1, 1).String = nome
449 
450  oSheet.getRows().insertByIndex(4, len(lista_articoli))
451  lista_come_array = tuple(lista_articoli)
452  # Parametrizzo il range di celle a seconda della dimensione della lista
453  colonne_lista = len(lista_come_array[1]
454  ) # numero di colonne necessarie per ospitare i dati
455  righe_lista = len(
456  lista_come_array) # numero di righe necessarie per ospitare i dati
457  oRange = oSheet.getCellRangeByPosition(
458  0,
459  4,
460  colonne_lista - 1, # l'indice parte da 0
461  righe_lista + 4 - 1)
462  oRange.setDataArray(lista_come_array)
463  oSheet.getRows().removeByIndex(3, 1)
464  oDoc.CurrentController.setActiveSheet(oSheet)
465  oDialogo_attesa.endExecute()
466 
467  PL.struttura_Elenco()
468  DLG.MsgBox('Conversione eseguita con successo!', '')
469  PL.autoexec()
470 
471 
472 
474  '''
475  Adatta la struttura del prezzario rilasciato dalla regione Emilia Romagna
476 
477  *** IMPRATICABILE: IL FILE DI ORIGINE È PARECCHIO DISORDINATO ***
478 
479  Il risultato ottenuto va inserito in Elenco Prezzi.
480  '''
481  oDoc = LeenoUtils.getDocument()
483  oSheet = oDoc.CurrentController.ActiveSheet
484  fine = SheetUtils.getLastUsedRow(oSheet) + 1
485  for i in range(0, fine):
486  if len(oSheet.getCellByPosition(0, i).String.split('.')) == 3 and \
487  oSheet.getCellByPosition(3, i).Type.value != 'EMPTY':
488  madre = oSheet.getCellByPosition(1, i).String
489  elif len(oSheet.getCellByPosition(0, i).String.split('.')) == 4:
490  if oSheet.getCellByPosition(1, i).String != '':
491  oSheet.getCellByPosition(1, i).String = (
492  madre +
493  "\n- " +
494  oSheet.getCellByPosition(1, i).String)
495  else:
496  oSheet.getCellByPosition(1, i).String = madre
497  oSheet.getCellByPosition(4, i).Value = oSheet.getCellByPosition(4, i).Value / 100
499 
500 
501 
503  '''
504  Adatta la struttura del prezzario rilasciato dalla regione Umbria
505 
506  Il risultato ottenuto va inserito in Elenco Prezzi.
507  '''
508  oDoc = LeenoUtils.getDocument()
510  oSheet = oDoc.CurrentController.ActiveSheet
511  oSheet.Columns.insertByIndex(4, 1)
512  oSheet.getCellByPosition(4, 0).String = 'Incidenza MdO\n%'
513  fine = SheetUtils.getLastUsedRow(oSheet) + 1
514  for i in range(1, fine):
515  oSheet.getCellByPosition(0, i).String = oSheet.getCellByPosition(0, i).String
516  if len(oSheet.getCellByPosition(0, i).String.split('.')) == 1 and \
517  len(oSheet.getCellByPosition(0, i).String.split('.')) == 2:
518  pass
519  if len(oSheet.getCellByPosition(0, i).String.split('.')) == 3 and \
520  oSheet.getCellByPosition(3, i).Type.value != 'EMPTY':
521  mdo = oSheet.getCellByPosition(5, i).Value
522  prz = oSheet.getCellByPosition(3, i).Value
523  oSheet.getCellByPosition(4, i).Value = mdo / prz
524  if len(oSheet.getCellByPosition(0, i).String.split('.')) == 4 and \
525  oSheet.getCellByPosition(3, i).Type.value == 'EMPTY':
526  madre = oSheet.getCellByPosition(1, i).String
527  if len(oSheet.getCellByPosition(0, i).String.split('.')) == 4 and \
528  oSheet.getCellByPosition(3, i).Type.value != 'EMPTY':
529  oSheet.getCellByPosition(1, i).String = madre +"\n- " + oSheet.getCellByPosition(1, i).String
530  mdo = oSheet.getCellByPosition(5, i).Value
531  prz = oSheet.getCellByPosition(3, i).Value
532  oSheet.getCellByPosition(4, i).Value = mdo / prz
534 
535 
536 
537 
539  '''
540  *** da applicare dopo aver unito i file in un unico ODS con Sub _accoda_files_in_unico ***
541  Adatta la struttura del prezzario rilasciato dalla regione Piemonte
542  partendo dalle colonne: Sez. Codice Descrizione U.M. Euro Manod. lorda % Manod. Note
543  Il risultato ottenuto va inserito in Elenco Prezzi.
544  '''
545  oDoc = LeenoUtils.getDocument()
547  oSheet = oDoc.CurrentController.ActiveSheet
548  fine = SheetUtils.getLastUsedRow(oSheet) + 1
549  elenco = list()
550  for i in range(0, fine):
551  if len(oSheet.getCellByPosition(1, i).String.split('.')) <= 2:
552  cod = oSheet.getCellByPosition(1, i).String
553  des = oSheet.getCellByPosition(2, i).String.replace('\n\n', '\n')
554  um = ''
555  eur = ''
556  mdol = ''
557  mdo = ''
558  if oSheet.getCellByPosition(7, i).String != '':
559  des = des + '\n(' + oSheet.getCellByPosition(7, i).String + ')'
560  elenco.append((cod, des, um, '', eur, mdo, mdol))
561 
562  if len(oSheet.getCellByPosition(1, i).String.split('.')) == 3:
563  cod = oSheet.getCellByPosition(1, i).String
564  des = oSheet.getCellByPosition(2, i).String.replace(' \n\n', '')
565  madre = des
566  um = ''
567  eur = ''
568  mdol = ''
569  mdo = ''
570  if oSheet.getCellByPosition(7, i).String != '':
571  des = des + '\n(' + oSheet.getCellByPosition(7, i).String + ')'
572  # ~elenco.append ((cod, des, um, '', eur, mdo, mdol))
573  if len(oSheet.getCellByPosition(1, i).String.split('.')) == 4:
574  cod = oSheet.getCellByPosition(1, i).String
575  des = madre
576  if oSheet.getCellByPosition(2, i).String != '...':
577  des = madre + '\n- ' + oSheet.getCellByPosition(2, i).String.replace('\n\n', '')
578  um = oSheet.getCellByPosition(3, i).String
579  eur = ''
580  if oSheet.getCellByPosition(4, i).Value != 0:
581  eur = oSheet.getCellByPosition(4, i).Value
582  mdol = ''
583  if oSheet.getCellByPosition(5, i).Value != 0:
584  mdol = oSheet.getCellByPosition(5, i).Value
585  mdo = ''
586  if oSheet.getCellByPosition(6, i).Value != 0:
587  mdo = oSheet.getCellByPosition(6, i).Value
588  # ~note= oSheet.getCellByPosition(7, i).String
589  elenco.append((cod, des, um, '', eur, mdo, mdol))
590 
591  try:
592  oDoc.getSheets().insertNewByName('nuova_tabella', 2)
593  except Exception:
594  pass
595 
596  PL.GotoSheet('nuova_tabella')
597  oSheet = oDoc.getSheets().getByName('nuova_tabella')
598  elenco = tuple(elenco)
599  oRange = oSheet.getCellRangeByPosition(0,
600  0,
601  # l'indice parte da 0
602  len(elenco[0]) - 1,
603  len(elenco) - 1)
604  oRange.setDataArray(elenco)
606 
607 
608 
609 def MENU_fuf():
610  '''
611  Traduce un particolare formato DAT usato in falegnameria - non c'entra un tubo con LeenO.
612  E' solo una cortesia per un amico.
613  '''
614  filename = Dialogs.FileSelect('Scegli il file DAT da importare', '*.dat')
615  riga = list()
616  try:
617  f = open(filename, 'r')
618  except TypeError:
619  return
620  ordini = list()
621  riga = ('Codice', 'Descrizione articolo', 'Quantità', 'Data consegna',
622  'Conto lavoro', 'Prezzo(€)')
623  ordini.append(riga)
624 
625  for row in f:
626  art = row[:15]
627  if art[0:4] not in ('HEAD', 'FEET'):
628  art = art[4:]
629  des = row[22:62]
630  num = 1 # row[72:78].replace(' ','')
631  # car = row[78:87]
632  dataC = row[96:104]
633  dataC = '=DATE(' + dataC[:4] + ';' + dataC[4:6] + ';' + dataC[
634  6:] + ')'
635  clav = row[120:130]
636  prz = row[142:-1]
637  riga = (art, des, num, dataC, clav, float(prz.strip()))
638  ordini.append(riga)
639 
640  oDoc = LeenoUtils.getDocument()
641  oSheet = oDoc.CurrentController.ActiveSheet
642  lista_come_array = tuple(ordini)
643  colonne_lista = len(lista_come_array[0]
644  ) # numero di colonne necessarie per ospitare i dati
645  righe_lista = len(
646  lista_come_array) # numero di righe necessarie per ospitare i dati
647 
648  oRange = oSheet.getCellRangeByPosition(
649  0,
650  0,
651  colonne_lista - 1, # l'indice parte da 0
652  righe_lista - 1)
653  oRange.setFormulaArray(lista_come_array)
654 
655  oSheet.getCellRangeByPosition(
656  0, 0,
658  SheetUtils.getLastUsedRow(oSheet)).Columns.OptimalWidth = True
659  oDoc.CurrentController.freezeAtPosition(0, 1)
660  PL._gotoCella(0, 1)
661  oDoc.CurrentController.ShowGrid = True
662  oSheet.getCellRangeByName('A1:F1').CellStyle = 'Accent 3'
663  return
664  PL.comando('Copy')
665 
667  desktop = LeenoUtils.getDesktop()
668  oFrame = desktop.getCurrentFrame()
669  dispatchHelper = ctx.ServiceManager.createInstanceWithContext('com.sun.star.frame.DispatchHelper', ctx)
670  oProp = []
671  oProp0 = PropertyValue()
672  oProp0.Name = 'Flags'
673  oProp0.Value = 'D'
674  oProp1 = PropertyValue()
675  oProp1.Name = 'FormulaCommand'
676  oProp1.Value = 0
677  oProp2 = PropertyValue()
678  oProp2.Name = 'SkipEmptyCells'
679  oProp2.Value = False
680  oProp3 = PropertyValue()
681  oProp3.Name = 'Transpose'
682  oProp3.Value = False
683  oProp4 = PropertyValue()
684  oProp4.Name = 'AsLink'
685  oProp4.Value = False
686  oProp5 = PropertyValue()
687  oProp5.Name = 'MoveMode'
688  oProp5.Value = 4
689  oProp.append(oProp0)
690  oProp.append(oProp1)
691  oProp.append(oProp2)
692  oProp.append(oProp3)
693  oProp.append(oProp4)
694  oProp.append(oProp5)
695  properties = tuple(oProp)
696  # _gotoCella(6,1)
697  dispatchHelper.executeDispatch(oFrame, '.uno:InsertContents', '', 0, properties)
698 
699  oDoc.CurrentController.select( oSheet.getCellRangeByPosition(0, 1, 5, SheetUtils.getLastUsedRow(oSheet) + 1))
700  PL.ordina_col(3)
701  oDoc.CurrentController.select(
702  oDoc.createInstance("com.sun.star.sheet.SheetCellRanges")) # unselect
703 
704 
LeenoImport.MENU_ImportElencoPrezziXML
def MENU_ImportElencoPrezziXML()
Definition: LeenoImport.py:209
LeenoImport.MENU_importa_listino_leeno
def MENU_importa_listino_leeno()
Definition: LeenoImport.py:328
Dialogs.Ok
def Ok(*Title='', Text='')
Definition: Dialogs.py:2542
LeenoImport.MENU_fuf
def MENU_fuf()
Definition: LeenoImport.py:609
LeenoImport.importa_listino_leeno_th.run
def run(self)
Definition: LeenoImport.py:342
LeenoUtils.getDocument
def getDocument()
Definition: LeenoUtils.py:67
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
LeenoImport.MENU_umbria
def MENU_umbria()
Definition: LeenoImport.py:502
SheetUtils.getUsedArea
def getUsedArea(oSheet)
Definition: SheetUtils.py:373
LeenoImport.MENU_emilia_romagna
def MENU_emilia_romagna()
Definition: LeenoImport.py:473
LeenoUtils.getComponentContext
def getComponentContext()
Definition: LeenoUtils.py:47
Dialogs.YesNoDialog
def YesNoDialog(*Title, Text)
Definition: Dialogs.py:2545
Dialogs.Info
def Info(*Title='', Text='')
Definition: Dialogs.py:2539
Dialogs.Exclamation
def Exclamation(*Title='', Text='')
Definition: Dialogs.py:2536
LeenoImport.importa_listino_leeno_th.__init__
def __init__(self)
Definition: LeenoImport.py:339
Dialogs.FileSelect
def FileSelect(titolo='Scegli il file...', est=' *.*', mode=0, startPath=None)
SOME COMMON DIALOGS.
Definition: Dialogs.py:2448
Dialogs.Progress
Definition: Dialogs.py:2583
LeenoImport.MENU_Piemonte
def MENU_Piemonte()
Definition: LeenoImport.py:538
SheetUtils.getLastUsedColumn
def getLastUsedColumn(oSheet)
Definition: SheetUtils.py:397
LeenoImport.fixParagraphSize
def fixParagraphSize(txt)
Definition: LeenoImport.py:28
LeenoUtils.getDesktop
def getDesktop()
Definition: LeenoUtils.py:59
LeenoImport.compilaElencoPrezzi
def compilaElencoPrezzi(oDoc, dati, progress)
Definition: LeenoImport.py:86
SheetUtils.getLastUsedRow
def getLastUsedRow(oSheet)
Definition: SheetUtils.py:392
LeenoImport.findXmlParser
def findXmlParser(xmlText)
Definition: LeenoImport.py:60
LeenoImport.importa_listino_leeno_run
def importa_listino_leeno_run()
Definition: LeenoImport.py:347
LeenoImport.importa_listino_leeno_th
Definition: LeenoImport.py:335
LeenoImport.stripXMLNamespaces
def stripXMLNamespaces(data)
Definition: LeenoImport.py:47