d300.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. from xml.etree import ElementTree as ET
  2. from collections import defaultdict
  3. import xlsxwriter as xlsw
  4. import openpyxl as xl
  5. from .declaration import Declaration
  6. class D300(Declaration):
  7. def __init__(self):
  8. super().__init__()
  9. def from_xml(self, fp):
  10. '''
  11. xml and pdf keys are not metching!!!
  12. '''
  13. xml = ET.parse(fp)
  14. root = xml.getroot()
  15. def_root = defaultdict(lambda: 0)
  16. def_root.update(root.attrib)
  17. self.def_root = def_root
  18. self.cui = def_root['cui']
  19. self.den = def_root['den']
  20. # addr=def_root['adresa'],
  21. self.month = int(def_root['luna'])
  22. self.year = int(def_root['an'])
  23. # rect=int(def_root['d_rec']),
  24. # bank=def_root['banca'],
  25. self.tip_decont = def_root['tip_decont']
  26. self.control = int(def_root['totalPlata_A'])
  27. self.li = int(def_root['R1_1'])
  28. self.pi = int(def_root['R3_1_1'])
  29. self.aib = int(def_root['R5_1_1'])
  30. self.tva_aib = int(def_root['R5_1_2'])
  31. self.ais = int(def_root['R7_1_1'])
  32. self.tva_ais = int(def_root['R7_1_2'])
  33. self.liv_19 = int(def_root['R9_1'])
  34. self.tvaL_19 = int(def_root['R9_2'])
  35. self.liv_9 = int(def_root['R10_1'])
  36. self.tvaL_9 = int(def_root['R10_2'])
  37. self.liv_5 = int(def_root['R11_1'])
  38. self.tvaL_5 = int(def_root['R11_2'])
  39. self.liv_txi = int(def_root['R13_1'])
  40. self.sc_cfdd = int(def_root['R14_1'])
  41. self.sc_fdd = int(def_root['R15_1'])
  42. self.reg_liv = int(def_root['R16_1'])
  43. self.tva_reg = int(def_root['R16_2'])
  44. self.tot_col = int(def_root['R17_1'])
  45. self.tva_tot_col = int(def_root['R17_2'])
  46. self.ach_19 = int(def_root['R22_1'])
  47. self.tvaA_19 = int(def_root['R22_2'])
  48. self.ach_9 = int(def_root['R23_1'])
  49. self.tvaA_9 = int(def_root['R23_2'])
  50. self.ach_5 = int(def_root['R24_1'])
  51. self.tvaA_5 = int(def_root['R24_2'])
  52. self.tot_ded = int(def_root['R32_2'])
  53. self.tot_plata = int(def_root['R41_2'])
  54. self.tot_rec = int(def_root['R42_2'])
  55. self.root = root
  56. self.decl_type = self.root.tag.split("}", 1)[-1]
  57. return self
  58. @property
  59. def data(self):
  60. data = {
  61. self.cui:
  62. [
  63. self.den,
  64. # addr=def_root['adresa'],
  65. self.month,
  66. self.year,
  67. # rect=int(def_root['d_rec']),
  68. # bank=def_root['banca'],
  69. self.tip_decont,
  70. self.control,
  71. self.li,
  72. self.pi,
  73. self.aib,
  74. self.tva_aib,
  75. self.ais,
  76. self.tva_ais,
  77. self.liv_19,
  78. self.tvaL_19,
  79. self.liv_9,
  80. self.tvaL_9,
  81. self.liv_5,
  82. self.tvaL_5,
  83. self.liv_txi,
  84. self.sc_cfdd,
  85. self.sc_fdd,
  86. self.reg_liv,
  87. self.tva_reg,
  88. self.tot_col,
  89. self.tva_tot_col,
  90. self.ach_19,
  91. self.tvaA_19,
  92. self.ach_9,
  93. self.tvaA_9,
  94. self.ach_5,
  95. self.tvaA_5,
  96. self.tot_ded,
  97. self.tot_plata,
  98. self.tot_rec
  99. ]
  100. }
  101. self.dict_data = data
  102. return self.dict_data
  103. def to_xlsx(self, xl_name, w_sheet_name, files, headers=[], obj={'type': None}, **kwargs):
  104. book = xlsw.Workbook(xl_name + '.xlsm')
  105. book.add_vba_project('./vbaProject.bin')
  106. sheet = book.add_worksheet(w_sheet_name)
  107. # sheet2 = book.add_worksheet('all')
  108. row, row2, col = 1, 1, 0
  109. headformat = book.add_format({'bold': True})
  110. hcol, hcol2 = 0, 0
  111. for h in headers:
  112. sheet.write(1, hcol, h, headformat)
  113. hcol += 1
  114. # for _ in range(8):
  115. # sheet2.write(1, hcol2, 'x', headformat)
  116. hcol2 += 1
  117. for file in files:
  118. d = D300() # obj['type']()
  119. d = d.from_xml(file)
  120. for i in d.data:
  121. row += 1
  122. sheet.write(row, col, i)
  123. print(f'write {row}', i)
  124. sheet.write_row(row, 1, d.data[i])
  125. # d_all = d.from_xml_all(file)
  126. # for el in d_all:
  127. # for dict_ in el:
  128. # row2 += 1
  129. # sheet2.write(row2, col, dict_)
  130. # sheet2.write_row(row2, 1, el[dict_])
  131. for k, a in kwargs.items():
  132. if k == 'autofilter':
  133. sheet.autofilter(a[0], a[1], 100, 100)
  134. # sheet2.autofilter(a[0], a[1], 1000, 1000)
  135. if k == 'freeze':
  136. sheet.freeze_panes(a[0], a[1])
  137. # sheet2.freeze_panes(a[0], a[1])
  138. book.close()
  139. # self._format_sh1(xl_name)
  140. # self._format_sh2(xl_name)
  141. def _format_sh1(self, xl_name):
  142. wb = xl.load_workbook(xl_name + '.xlsx')
  143. sh = wb.worksheets[0]
  144. colG = sh['G3':'G{}'.format(sh.max_row)]
  145. colIO = sh['I3':'O{}'.format(sh.max_row)]
  146. for valuesG, valuesIO in zip(colG, colIO):
  147. for value in valuesG:
  148. if isinstance(value.value, str):
  149. try:
  150. num_value = float(value.value)
  151. value.value = num_value
  152. except ValueError as ve:
  153. print(str(ve))
  154. value.number_format = '#,##0.00'
  155. for value in valuesIO:
  156. if isinstance(value.value, str):
  157. try:
  158. num_value = float(value.value)
  159. value.value = num_value
  160. except ValueError as ve:
  161. print(str(ve))
  162. value.number_format = '#,##0.00'
  163. wb.save(xl_name + '.xlsx')
  164. wb.close()
  165. def _format_sh2(self, xl_name):
  166. wb = xl.load_workbook(xl_name + '.xlsx')
  167. sh = wb.worksheets[1]
  168. colH = sh['H3':'H{}'.format(sh.max_row)]
  169. for valuesG in colH:
  170. for value in valuesG:
  171. if isinstance(value.value, str):
  172. try:
  173. num_value = float(value.value)
  174. value.value = num_value
  175. except ValueError as ve:
  176. print(str(ve))
  177. value.number_format = '#,##0.00'
  178. wb.save(xl_name + '.xlsx')
  179. wb.close()