report_file_utils.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import xlwt
  2. class ReportFileUtils:
  3. def __init__(self):
  4. self.wb = xlwt.Workbook()
  5. self.styleOK = xlwt.easyxf()
  6. self.default_style = self.set_style('Times New Roman',
  7. 200,
  8. bold=False,
  9. format_str='', align='')
  10. pass
  11. def set_style(self, name, height, bold=False, format_str='', align='center'):
  12. style = xlwt.XFStyle() # 初始化样式
  13. font = xlwt.Font() # 为样式创建字体
  14. font.name = name # 'Times New Roman'
  15. font.bold = bold
  16. font.height = height
  17. borders = xlwt.Borders() # 为样式创建边框
  18. borders.left = 2
  19. borders.right = 2
  20. borders.top = 0
  21. borders.bottom = 2
  22. alignment = xlwt.Alignment() # 设置排列
  23. if align == 'center':
  24. alignment.horz = xlwt.Alignment.HORZ_CENTER
  25. alignment.vert = xlwt.Alignment.VERT_CENTER
  26. else:
  27. alignment.horz = xlwt.Alignment.HORZ_LEFT
  28. alignment.vert = xlwt.Alignment.VERT_BOTTOM
  29. style.font = font
  30. style.borders = borders
  31. style.num_format_str = format_str
  32. style.alignment = alignment
  33. return style
  34. def horizontal_cell_merge(self, ws, start_row, end_row, start_col, end_col, content):
  35. """
  36. 横向单元格合并
  37. :param ws:
  38. :param start_row:
  39. :param end_row:
  40. :param start_col:
  41. :param end_col:
  42. :param content:
  43. :return:
  44. """
  45. ws.write_merge(
  46. start_row,
  47. end_row,
  48. start_col,
  49. end_col,
  50. content,
  51. self.set_style(
  52. 'Times New Roman',
  53. 320,
  54. bold=True,
  55. format_str=''))
  56. def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
  57. self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')
  58. def vertical_cell_merge(self, ws, start_row, end_row, start_col, end_col, content):
  59. """
  60. 纵向单元格合并
  61. :param ws:
  62. :param start_row:
  63. :param rows:
  64. :param start_col:
  65. :param end_col:
  66. :param content:
  67. :return:
  68. """
  69. ws.write_merge(
  70. start_row,
  71. end_row,
  72. start_col,
  73. end_col,
  74. content,
  75. self.set_style(
  76. 'Times New Roman',
  77. 320,
  78. bold=True,
  79. format_str='')) # 合并单元格
  80. def insert_cells(self, ws, data, start_row, start_col, end_col):
  81. for index, v in enumerate(data):
  82. y = 0
  83. for col in range(start_col, end_col):
  84. value = v[y]
  85. if value is None:
  86. value = 0
  87. ws.col(col).width = 150 * 30 # 定义列宽
  88. ws.write(start_row, col, str(value),
  89. style=self.default_style)
  90. y += 1
  91. start_row += 1
  92. def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
  93. """
  94. 空白占位
  95. :param ws:
  96. :param start_row:
  97. :param end_row:
  98. :param start_col:
  99. :param end_col:
  100. :return:
  101. """
  102. self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')
  103. def create_excel_file(self, data, sheet_names, title, headers, save_path):
  104. """
  105. 生成excel文件, data, sheet_names,headers 三者在数量上要对应
  106. :param data: 数据
  107. :param sheet_names: 工作簿名称
  108. :param title: 文件名称
  109. :param headers: 每个工作簿表头
  110. :return:
  111. """
  112. for index, d in enumerate(data):
  113. # 创建工作簿
  114. sheet_name = sheet_names[index]
  115. header = headers[index]
  116. ws = self.wb.add_sheet(sheet_name, cell_overwrite_ok=True)
  117. # 写入数据
  118. # 区域
  119. start_row = 0
  120. # 写入标题
  121. self.horizontal_cell_merge(ws, start_row, start_row, 0, len(header) - 1, sheet_name)
  122. start_row += 1
  123. # 写入表头
  124. self.insert_cells(ws, [headers[index]], start_row, 0, len(header))
  125. start_row += 1
  126. city_info = {}
  127. insert_data = []
  128. region_info = {}
  129. data_size = 0
  130. for key in d.keys():
  131. region_rows = 0
  132. value = d.get(key)
  133. region_name = key
  134. # 城市
  135. for key_1 in value.keys():
  136. value_1 = value.get(key_1)
  137. city_name = key_1
  138. region_rows += len(value_1)
  139. insert_data.extend(value_1)
  140. city_info[city_name] = len(value_1)
  141. data_size = len(value_1[0])
  142. region_info[region_name] = region_rows
  143. # 合并区域
  144. for key in region_info.keys():
  145. print(key)
  146. self.vertical_cell_merge(ws, start_row, start_row + region_info.get(key) - 1, 0, 0, key)
  147. start_row += region_info.get(key)
  148. # 城市合并
  149. start_row = 2
  150. for key in city_info.keys():
  151. self.vertical_cell_merge(ws, start_row, start_row + city_info.get(key) - 1, 1, 1, key)
  152. start_row += city_info.get(key)
  153. # 写入数据
  154. start_row = 2
  155. self.insert_cells(ws, insert_data, start_row, 2, 2 + data_size)
  156. self.wb.save(save_path + '/' + title)
  157. if __name__ == '__main__':
  158. rf = ReportFileUtils()
  159. data = [
  160. {"华北": {"上dfsd海": [['建业1', 2, 3, 4, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
  161. "北dfsdf京": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
  162. },
  163. "嘻嘻哈哈": {"上dfssd海": [['建业1', 2, 3, 4, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
  164. "北dfsdssf京": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
  165. }
  166. },
  167. {"华北": {"上海ss": [['建业1', 21, 31, 41, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
  168. "北京ss": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
  169. }
  170. },
  171. {"华北": {"上sdsfs海": [['建业1', 2, 3, 4, 5, 6, 7], ['建业2', 2, 3, 4, 5, 6, 7]],
  172. "sddss": [['建东1', 2, 3, 4, 5, 6, 7], ['建东2', 2, 3, 4, 5, 6, 7]]
  173. }
  174. }
  175. ]
  176. sheet_names = ['前一日数据', '本月数据', '上线后所有']
  177. title = "测ss试.xlsx"
  178. headers = [['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝'],
  179. ['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝'],
  180. ['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝']]
  181. rf.create_excel_file(data, sheet_names, title, headers, r'D:\elab\elab_mvp\test')