xlwt_util.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #coding:utf-8
  2. import xlwt
  3. import os
  4. from file_util import FileUtil
  5. import datetime
  6. class XlwtUtil(object):
  7. """
  8. 参考链接:https://www.cnblogs.com/xiao-apple36/p/9603499.html
  9. 官方文档:https://xlwt.readthedocs.io/en/latest/
  10. """
  11. title = {'day': {
  12. 1: '日数据概览',
  13. 2: '项目数据排行榜',
  14. 3: '项目历史累计总数',
  15. 4: '单个项目小程序数据排行榜',
  16. 5: '集团项目数据排行榜',
  17. 6: '项目获客来源场景分析',
  18. 7: '单个项目小程序获客来源场景分析',
  19. 8: '集团项目获客来源场景分析'
  20. },
  21. "week": {
  22. 1: '周数据概览',
  23. 2: '项目数据排行榜',
  24. 3: '项目历史累计总数',
  25. 4: '单个项目小程序数据排行榜',
  26. 5: '集团项目数据排行榜',
  27. 6: '项目获客来源场景分析',
  28. 7: '单个项目小程序获客来源场景分析',
  29. 8: '集团项目获客来源场景分析'
  30. }
  31. }
  32. header_2 = [['排名', '项目名称', '总浏览量', '总浏览人数', '新增获客', '新增获电']]
  33. header_6 = [['项目', '合计', '长按识别二维码', '会话', '公众号菜单', '公众号文章',
  34. '小程序历史列表', '扫一扫二维码', '搜索', '相册选取二维码',
  35. '其他小程序', '其他']]
  36. dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  37. save_path = r'{}/elab_mvp/resources/report_data'.format(dir_path)
  38. def __init__(self):
  39. self.styleOK = xlwt.easyxf()
  40. def set_style(self, name, height, bold=False, format_str='', align='center'):
  41. style = xlwt.XFStyle() # 初始化样式
  42. font = xlwt.Font() # 为样式创建字体
  43. font.name = name # 'Times New Roman'
  44. font.bold = bold
  45. font.height = height
  46. borders = xlwt.Borders() # 为样式创建边框
  47. borders.left = 2
  48. borders.right = 2
  49. borders.top = 0
  50. borders.bottom = 2
  51. alignment = xlwt.Alignment() # 设置排列
  52. if align == 'center':
  53. alignment.horz = xlwt.Alignment.HORZ_CENTER
  54. alignment.vert = xlwt.Alignment.VERT_CENTER
  55. else:
  56. alignment.horz = xlwt.Alignment.HORZ_LEFT
  57. alignment.vert = xlwt.Alignment.VERT_BOTTOM
  58. style.font = font
  59. style.borders = borders
  60. style.num_format_str = format_str
  61. style.alignment = alignment
  62. return style
  63. def horizontal_cell_merge(self, ws, start_row, end_row, start_col, end_col, content):
  64. """
  65. 横向单元格合并
  66. :param ws:
  67. :param start_row:
  68. :param end_row:
  69. :param start_col:
  70. :param end_col:
  71. :param content:
  72. :return:
  73. """
  74. ws.write_merge(
  75. start_row,
  76. end_row,
  77. start_col,
  78. end_col,
  79. content,
  80. self.set_style(
  81. 'Times New Roman',
  82. 320,
  83. bold=True,
  84. format_str=''))
  85. def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
  86. self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')
  87. def vertical_cell_merge(self, ws, start_row, rows, start_col, end_col, content):
  88. """
  89. 纵向单元格合并
  90. :param ws:
  91. :param start_row:
  92. :param rows:
  93. :param start_col:
  94. :param end_col:
  95. :param content:
  96. :return:
  97. """
  98. ws.write_merge(
  99. start_row,
  100. 2 + rows - 1,
  101. start_col,
  102. end_col,
  103. content,
  104. self.set_style(
  105. 'Times New Roman',
  106. 320,
  107. bold=True,
  108. format_str='')) # 合并单元格
  109. def get_file_name(self, task_key, time_range, name):
  110. """
  111. 移动案场订阅日报【日报日期】| 移动案场订阅周报【数据开始时间】至【数据结束时间】
  112. :param task_key:
  113. :param time_range:
  114. :return:
  115. """
  116. day = '移动案场订阅日报_{}_{}.xls'
  117. week = '移动案场订阅周报_{}_{}至{}.xls'
  118. new_file_name = '/tmp'
  119. if task_key in (1, 4):
  120. day = day.format(name, time_range[0])
  121. return ['{}/{}'.format(new_file_name, day), day]
  122. elif task_key in (2, 3, 21):
  123. week = week.format(name, time_range[0], time_range[1])
  124. return ['{}/{}'.format(new_file_name, week), week]
  125. def save_path_create(self):
  126. tm = datetime.datetime.now().strftime('%Y-%m-%d')
  127. new_path = '{}/{}'.format(self.save_path, tm)
  128. FileUtil.mkdir_folder(new_path)
  129. return new_path
  130. def create_excel(self, data_dict, time_rang, task_key):
  131. self.default_style = self.set_style('Times New Roman',
  132. 200,
  133. bold=False,
  134. format_str='', align='')
  135. result = []
  136. for key in data_dict.keys():
  137. self.wb = xlwt.Workbook()
  138. values = data_dict.get(key)
  139. data_1 = values.get(1) if values.get(1) is not None else values.get('1')
  140. data_2 = values.get(2) if values.get(2) is not None else values.get('2')
  141. data_3 = values.get(3) if values.get(3) is not None else values.get('3')
  142. data_4 = values.get(4) if values.get(4) is not None else values.get('4')
  143. data_5 = values.get(5) if values.get(5) is not None else values.get('5')
  144. data_6 = values.get(6) if values.get(6) is not None else values.get('6')
  145. data_7 = values.get(7) if values.get(7) is not None else values.get('7')
  146. data_8 = values.get(8) if values.get(8) is not None else values.get('8')
  147. mail = values.get(0) if values.get(0) is not None else values.get('0')
  148. start_row = 0
  149. global title
  150. global sheet_name
  151. if task_key in (2, 3, 21):
  152. # 周报
  153. sheet_name = '周报'
  154. title = self.title.get('week')
  155. elif task_key in (1, 4):
  156. # 日报
  157. sheet_name = '日报'
  158. title = self.title.get('day')
  159. ws = self.wb.add_sheet(sheet_name, cell_overwrite_ok=True) # 增加sheet
  160. title_1 = title.get(1)
  161. if key == '金晶':
  162. data_name_1 = [['总浏览量', 'CNP小程序总浏览量', '单项目小程序总浏览量'], ['总浏览人数', 'CNP小程序总浏览人数', '单项目小程序总浏览人数']
  163. , ['新增获客', 'CNP小程序新增获客', '单项目小程序新增获客'], ['新增获电', 'CNP小程序新增获电', '单项目小程序新增获电']]
  164. else:
  165. data_name_1 = [
  166. ['总浏览量', '集团小程序总浏览量', '单项目小程序总浏览量'],
  167. ['总浏览人数', '集团小程序总浏览人数', '单项目小程序总浏览人数']
  168. , ['新增获客', '集团小程序新增获客', '单项目小程序新增获客'],
  169. ['新增获电', '集团小程序新增获电', '单项目小程序新增获电']
  170. ]
  171. # 1
  172. self.horizontal_cell_merge(ws, 0, 0, 0, 5, title_1)
  173. self.sceptical_insert_cells(ws, data_name_1, 1, [0, 2, 4])
  174. col_index = 0
  175. for col in [1, 3, 5]:
  176. for row in [1, 2, 3, 4]:
  177. ws.col(col).width = 150 * 30 # 定义列宽
  178. ws.write(row, col, str(data_1[col_index]),
  179. style=self.set_style('Times New Roman',
  180. 200,
  181. bold=False,
  182. format_str='', align=''))
  183. col_index += 1
  184. # 插入空白
  185. self.horizontal_space_cells(ws, 5, 5, 0, 5)
  186. start_row += 5
  187. # 2
  188. title_2 = title.get(2)
  189. start_row += 1
  190. self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_2)
  191. start_row += 1
  192. self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
  193. start_row += 1
  194. self.insert_cells(ws, data_2, start_row, [y for y in range(0, 6)])
  195. start_row += len(data_2)
  196. self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
  197. start_row += 1
  198. # 3
  199. title_3 = title.get(3)
  200. self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_3)
  201. start_row += 1
  202. self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
  203. start_row += 1
  204. self.insert_cells(ws, data_3, start_row, [y for y in range(0, 6)])
  205. start_row += len(data_3)
  206. self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
  207. start_row += 1
  208. if len(data_4) > 0 and len(data_5) > 0:
  209. if len(data_4) > 0:
  210. # 4
  211. title_4 = title.get(4)
  212. # self.insert_module_data(ws, title_4, self.header_2, data_4, start_row, 0, 5)
  213. self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_4)
  214. start_row += 1
  215. self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
  216. start_row += 1
  217. self.insert_cells(ws, data_4, start_row, [y for y in range(0, 6)])
  218. start_row += len(data_4)
  219. self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
  220. start_row += 1
  221. if len(data_5) > 0:
  222. # 5
  223. title_5 = title.get(5)
  224. # self.insert_module_data(ws, title_5, self.header_2, data_5, start_row, 0, 5)
  225. self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_5)
  226. start_row += 1
  227. self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
  228. start_row += 1
  229. self.insert_cells(ws, data_5, start_row, [y for y in range(0, 6)])
  230. start_row += len(data_5)
  231. self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
  232. start_row += 1
  233. else:
  234. pass
  235. # 6
  236. if len(data_6) > 0:
  237. title_6 = title.get(6)
  238. # self.insert_module_data(ws, title_6, self.header_6, data_6, start_row, 0, 11)
  239. self.horizontal_cell_merge(ws, start_row, start_row, 0, 11, title_6)
  240. start_row += 1
  241. self.insert_cells(ws, self.header_6, start_row, [y for y in range(0, 12)])
  242. start_row += 1
  243. self.insert_cells(ws, data_6, start_row, [y for y in range(0, 12)])
  244. start_row += len(data_6)
  245. self.horizontal_space_cells(ws, start_row, start_row, 0, 11)
  246. start_row += 1
  247. if len(data_7) > 0 and len(data_8) > 0:
  248. if len(data_7) > 0:
  249. # 7
  250. title_7 = title.get(7)
  251. # self.insert_module_data(ws, title_7, self.header_6, data_7, start_row, 0, 11)
  252. self.horizontal_cell_merge(ws, start_row, start_row, 0, 11, title_7)
  253. start_row += 1
  254. self.insert_cells(ws, self.header_6, start_row, [y for y in range(0, 12)])
  255. start_row += 1
  256. self.insert_cells(ws, data_7, start_row, [y for y in range(0, 12)])
  257. start_row += len(data_7)
  258. self.horizontal_space_cells(ws, start_row, start_row, 0, 11)
  259. start_row += 1
  260. if len(data_8) > 0:
  261. # 8
  262. title_8 = title.get(8)
  263. # self.insert_module_data(ws, title_8, self.header_6, data_8, start_row, 0, 11)
  264. self.horizontal_cell_merge(ws, start_row, start_row, 0, 11, title_8)
  265. start_row += 1
  266. self.insert_cells(ws, self.header_6, start_row, [y for y in range(0, 12)])
  267. start_row += 1
  268. self.insert_cells(ws, data_8, start_row, [y for y in range(0, 12)])
  269. start_row += len(data_8)
  270. self.horizontal_space_cells(ws, start_row, start_row, 0, 11)
  271. start_row += 1
  272. else:
  273. pass
  274. file_path = self.get_file_name(task_key, time_rang, key)
  275. self.wb.save(file_path[0]) # 保存xls
  276. result.append([key, mail, file_path[0], file_path[1]])
  277. return result
  278. def insert_module_data(self, ws, title, header, data, start_row, start_col, end_col):
  279. self.horizontal_cell_merge(ws, start_row, start_row, start_col, end_col, title)
  280. start_row += 1
  281. self.insert_cells(ws, header, start_row, [y for y in range(start_col, (end_col + 1))])
  282. start_row += 1
  283. self.insert_cells(ws, data, start_row, [y for y in range(start_col, (end_col + 1))])
  284. start_row += len(data)
  285. self.horizontal_space_cells(ws, start_row, start_row, start_col, end_col)
  286. start_row += 1
  287. def insert_cells(self, ws, data, start_row, cols):
  288. for index, v in enumerate(data):
  289. for col in cols:
  290. data_1 = data[index]
  291. if isinstance(data_1, set):
  292. pass
  293. else:
  294. value = data_1[col]
  295. if value is None:
  296. value = 0
  297. ws.col(col).width = 150 * 30 # 定义列宽
  298. ws.write(start_row, col, str(value),
  299. style=self.default_style)
  300. start_row += 1
  301. def sceptical_insert_cells(self, ws, data, start_row, cols):
  302. for x in data:
  303. col_index = 0
  304. for col in cols:
  305. ws.col(col).width = 150 * 30 # 定义列宽
  306. ws.write(start_row, col, str(x[col_index]),
  307. style=self.default_style)
  308. col_index += 1
  309. start_row += 1
  310. if __name__ == '__main__':
  311. xu = XlwtUtil()
  312. result = {}
  313. data = result.get('data')
  314. for x in xu.create_excel(data, ['2020-03-12', '2020-03-13'], 2):
  315. print(x)