word_addition.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. from docx.enum.style import WD_STYLE_TYPE
  2. from docx.enum.table import WD_TABLE_ALIGNMENT
  3. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
  4. from docx.oxml import OxmlElement, ns
  5. from docx.shared import Cm
  6. from docx.shared import Inches
  7. from docx.shared import Pt
  8. def create_element(name):
  9. return OxmlElement(name)
  10. def create_attribute(element, name, value):
  11. element.set(ns.qn(name), value)
  12. def add_page_number(paragraph):
  13. """Метод, добавляющий номера страниц в word."""
  14. # выравниваем параграф по центру
  15. paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  16. # запускаем динамическое обновление параграфа
  17. page_num_run = paragraph.add_run()
  18. # обозначаем начало позиции вывода
  19. fld_char1 = create_element('w:fldChar')
  20. create_attribute(fld_char1, 'w:fldCharType', 'begin')
  21. # задаем вывод текущего значения страницы PAGE (всего страниц NUM PAGES)
  22. instr_text = create_element('w:instrText')
  23. create_attribute(instr_text, 'xml:space', 'preserve')
  24. instr_text.text = "PAGE"
  25. # обозначаем конец позиции вывода
  26. fld_char2 = create_element('w:fldChar')
  27. create_attribute(fld_char2, 'w:fldCharType', 'end')
  28. # добавляем все в наш параграф (который формируется динамически)
  29. page_num_run._r.append(fld_char1)
  30. page_num_run._r.append(instr_text)
  31. page_num_run._r.append(fld_char2)
  32. def add_new_styles(document):
  33. """Метод, добавляющий стили текста."""
  34. styles = document.styles
  35. styles.add_style('PItalic', WD_STYLE_TYPE.PARAGRAPH)
  36. style = document.styles['PItalic']
  37. font = style.font
  38. font.name = 'Times New Roman'
  39. font.size = Pt(11)
  40. font.italic = True
  41. styles.add_style('Head-style', WD_STYLE_TYPE.PARAGRAPH)
  42. head_style = document.styles['Head-style']
  43. font = head_style.font
  44. font.name = 'Times New Roman'
  45. font.size = Pt(14)
  46. font.bold = True
  47. styles.add_style('Head-graphic', WD_STYLE_TYPE.PARAGRAPH)
  48. head_graphic = document.styles['Head-graphic']
  49. font = head_graphic.font
  50. font.name = 'Times New Roman'
  51. font.size = Pt(13)
  52. font.bold = True
  53. font.italic = True
  54. def section_choice(document):
  55. """Метод, добавляющий отступы в документе word."""
  56. sections = document.sections
  57. for section in sections:
  58. section.top_margin = Cm(1.5)
  59. section.bottom_margin = Cm(1.5)
  60. section.left_margin = Cm(1.5)
  61. section.right_margin = Cm(1.5)
  62. def make_table_bold(table, cols, rows):
  63. """Метод, изменяющий вес шрифтов в таблицах и выравнивающий таблицу по центру."""
  64. for row in range(1):
  65. for col in range(cols):
  66. # получаем ячейку таблицы
  67. cell = table.cell(row, col)
  68. # записываем в ячейку данные
  69. run = cell.paragraphs[0].runs[0]
  70. run.font.bold = True
  71. for row in range(1, rows):
  72. for col in range(1):
  73. # получаем ячейку таблицы
  74. cell = table.cell(row, col)
  75. # записываем в ячейку данные
  76. run = cell.paragraphs[0].runs[0]
  77. run.font.bold = True
  78. table.alignment = WD_TABLE_ALIGNMENT.CENTER
  79. def make_stat_table_bold(stat_table, cols, rows):
  80. """Метод, изменяющий вес шрифтов в статистических таблицах и выравнивающий таблицу по центру."""
  81. for row in stat_table.rows:
  82. for cell in row.cells:
  83. paragraphs = cell.paragraphs
  84. for paragraph in paragraphs:
  85. for run in paragraph.runs:
  86. font = run.font
  87. font.size = Pt(8)
  88. for row in range(2):
  89. for col in range(cols):
  90. # получаем ячейку таблицы
  91. cell = stat_table.cell(row, col)
  92. # записываем в ячейку данные
  93. run = cell.paragraphs[0].runs[0]
  94. run.font.bold = True
  95. run.font.size = Pt(9)
  96. for row in range(2, rows):
  97. for col in range(2):
  98. # получаем ячейку таблицы
  99. cell = stat_table.cell(row, col)
  100. # записываем в ячейку данные
  101. run = cell.paragraphs[0].runs[0]
  102. run.font.bold = True
  103. run.font.size = Pt(8.5)
  104. stat_table.alignment = WD_TABLE_ALIGNMENT.CENTER
  105. def draw_stat_table(stat_table, stat_info_1, stat_info_2):
  106. """Метод для построения статистических таблиц с информацией о средних значениях и о стандартных отклонениях
  107. параметра."""
  108. stat_table.cell(0, 0).text = "№"
  109. stat_table.cell(0, 1).text = "Стат-ка"
  110. stat_table.cell(0, 2).text = "№ детектора"
  111. stat_table.cell(0, 2).merge(stat_table.cell(0, 17))
  112. stat_table.cell(0, 0).merge(stat_table.cell(1, 0))
  113. stat_table.cell(0, 1).merge(stat_table.cell(1, 1))
  114. for j in range(16):
  115. stat_table.cell(1, j + 2).text = str(j + 1)
  116. stat_table.cell(2, 0).text = '1'
  117. stat_table.cell(2, 0).merge(stat_table.cell(3, 0))
  118. stat_table.cell(4, 0).text = '2'
  119. stat_table.cell(4, 0).merge(stat_table.cell(5, 0))
  120. for i in range(stat_info_1.shape[0]):
  121. stat_table.cell(i + 2, 1).text = stat_info_1.index[i]
  122. for j in range(stat_info_1.shape[-1]):
  123. stat_table.cell(i + 2, j + 2).text = str(round(stat_info_1.values[i, j], 2))
  124. for i in range(stat_info_2.shape[0]):
  125. stat_table.cell(i + 2 + stat_info_1.shape[0], 1).text = stat_info_2.index[i]
  126. for j in range(stat_info_2.shape[-1]):
  127. stat_table.cell(i + 2 + stat_info_1.shape[0], j + 2).text = str(round(stat_info_2.values[i, j], 2))
  128. def change_cell_size(table, column_num, size_arr):
  129. """Метод, меняющий размер клеток в таблице."""
  130. for i in range(column_num):
  131. for cell in table.columns[i].cells:
  132. cell.width = Inches(size_arr[i])
  133. def adding_graphic(document, title, picture_path, width):
  134. """Метод, добавляющий в word график."""
  135. document.add_picture(picture_path, width=Inches(width))
  136. last_paragraph = document.paragraphs[-1]
  137. last_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  138. picture_title = document.add_paragraph(title, style='PItalic')
  139. picture_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
  140. def statistical_table(frame, frame_2, dimension):
  141. """Метод, на вход которого, идут два датафрейма 1-го и 2-го кластера ПРИЗМА-32 с одинаковым параметром. Метод
  142. возвращает датафрейм с информацией о средних значениях и о стандартных отклонениях заданного параметра"""
  143. stat_info = frame.describe().tail(7).head(2)
  144. stat_info_2 = frame_2.describe().tail(7).head(2)
  145. stat_info.index = [f'mean({dimension})', f'std({dimension})']
  146. stat_info_2.index = [f'mean({dimension})', f'std({dimension})']
  147. return stat_info, stat_info_2
  148. def time_breaks_counter(brake_frame):
  149. breaks = len(brake_frame.index)
  150. fail_str_begin = []
  151. fail_str_end = []
  152. lost_minutes = []
  153. for i in range(len(brake_frame.index)):
  154. start_hour = int(brake_frame['StartSeconds'][i] // 60 // 60)
  155. start_minute = int((brake_frame['StartSeconds'][i] - start_hour * 3600) // 60)
  156. start_second = int((brake_frame['StartSeconds'][i] - start_hour * 3600) % 60)
  157. end_hour = int(brake_frame['EndSeconds'][i] // 60 // 60)
  158. end_minute = int((brake_frame['EndSeconds'][i] - end_hour * 3600) // 60)
  159. end_second = int((brake_frame['EndSeconds'][i] - end_hour * 3600) % 60)
  160. fail_str_begin.append(
  161. f" {brake_frame['Date'][i]} {start_hour:02}:{start_minute:02}:{start_second:02}")
  162. fail_str_end.append(
  163. f" {brake_frame['Date'][i]} {end_hour:02}:{end_minute:02}:{end_second:02}")
  164. lost_minutes.append(int(brake_frame['EndSeconds'][i]//60 - brake_frame['StartSeconds'][i]//60))
  165. for i in range(1, len(brake_frame.index)):
  166. if brake_frame['StartSeconds'][i] == 0 and brake_frame['EndSeconds'][i - 1] == 1435 and \
  167. (brake_frame['Date'][i] - brake_frame['Date'][i - 1]).days == 1:
  168. breaks -= 1
  169. return fail_str_begin, fail_str_end, lost_minutes, breaks