123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- #coding:utf-8
- import xlwt
- import os
- from file_util import FileUtil
- import datetime
- class XlwtUtil(object):
- """
- 参考链接:https://www.cnblogs.com/xiao-apple36/p/9603499.html
- 官方文档:https://xlwt.readthedocs.io/en/latest/
- """
- title = {'day': {
- 1: '日数据概览',
- 2: '项目数据排行榜',
- 3: '项目历史累计总数',
- 4: '单个项目小程序数据排行榜',
- 5: '集团项目数据排行榜',
- 6: '项目获客来源场景分析',
- 7: '单个项目小程序获客来源场景分析',
- 8: '集团项目获客来源场景分析'
- },
- "week": {
- 1: '周数据概览',
- 2: '项目数据排行榜',
- 3: '项目历史累计总数',
- 4: '单个项目小程序数据排行榜',
- 5: '集团项目数据排行榜',
- 6: '项目获客来源场景分析',
- 7: '单个项目小程序获客来源场景分析',
- 8: '集团项目获客来源场景分析'
- }
- }
- header_2 = [['排名', '项目名称', '总浏览量', '总浏览人数', '新增获客', '新增获电']]
- header_6 = [['项目', '合计', '长按识别二维码', '会话', '公众号菜单', '公众号文章',
- '小程序历史列表', '扫一扫二维码', '搜索', '相册选取二维码',
- '其他小程序', '其他']]
- dir_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
- save_path = r'{}/elab_mvp/resources/report_data'.format(dir_path)
- def __init__(self):
- self.styleOK = xlwt.easyxf()
- def set_style(self, name, height, bold=False, format_str='', align='center'):
- style = xlwt.XFStyle() # 初始化样式
- font = xlwt.Font() # 为样式创建字体
- font.name = name # 'Times New Roman'
- font.bold = bold
- font.height = height
- borders = xlwt.Borders() # 为样式创建边框
- borders.left = 2
- borders.right = 2
- borders.top = 0
- borders.bottom = 2
- alignment = xlwt.Alignment() # 设置排列
- if align == 'center':
- alignment.horz = xlwt.Alignment.HORZ_CENTER
- alignment.vert = xlwt.Alignment.VERT_CENTER
- else:
- alignment.horz = xlwt.Alignment.HORZ_LEFT
- alignment.vert = xlwt.Alignment.VERT_BOTTOM
- style.font = font
- style.borders = borders
- style.num_format_str = format_str
- style.alignment = alignment
- return style
- def horizontal_cell_merge(self, ws, start_row, end_row, start_col, end_col, content):
- """
- 横向单元格合并
- :param ws:
- :param start_row:
- :param end_row:
- :param start_col:
- :param end_col:
- :param content:
- :return:
- """
- ws.write_merge(
- start_row,
- end_row,
- start_col,
- end_col,
- content,
- self.set_style(
- 'Times New Roman',
- 320,
- bold=True,
- format_str=''))
- def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
- self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')
- def vertical_cell_merge(self, ws, start_row, rows, start_col, end_col, content):
- """
- 纵向单元格合并
- :param ws:
- :param start_row:
- :param rows:
- :param start_col:
- :param end_col:
- :param content:
- :return:
- """
- ws.write_merge(
- start_row,
- 2 + rows - 1,
- start_col,
- end_col,
- content,
- self.set_style(
- 'Times New Roman',
- 320,
- bold=True,
- format_str='')) # 合并单元格
- def get_file_name(self, task_key, time_range, name):
- """
- 移动案场订阅日报【日报日期】| 移动案场订阅周报【数据开始时间】至【数据结束时间】
- :param task_key:
- :param time_range:
- :return:
- """
- day = '移动案场订阅日报_{}_{}.xls'
- week = '移动案场订阅周报_{}_{}至{}.xls'
- new_file_name = '/tmp'
- if task_key in (1, 4):
- day = day.format(name, time_range[0])
- return ['{}/{}'.format(new_file_name, day), day]
- elif task_key in (2, 3, 21):
- week = week.format(name, time_range[0], time_range[1])
- return ['{}/{}'.format(new_file_name, week), week]
- def save_path_create(self):
- tm = datetime.datetime.now().strftime('%Y-%m-%d')
- new_path = '{}/{}'.format(self.save_path, tm)
- FileUtil.mkdir_folder(new_path)
- return new_path
- def create_excel(self, data_dict, time_rang, task_key):
- self.default_style = self.set_style('Times New Roman',
- 200,
- bold=False,
- format_str='', align='')
- result = []
- for key in data_dict.keys():
- self.wb = xlwt.Workbook()
- values = data_dict.get(key)
- data_1 = values.get(1) if values.get(1) is not None else values.get('1')
- data_2 = values.get(2) if values.get(2) is not None else values.get('2')
- data_3 = values.get(3) if values.get(3) is not None else values.get('3')
- data_4 = values.get(4) if values.get(4) is not None else values.get('4')
- data_5 = values.get(5) if values.get(5) is not None else values.get('5')
- data_6 = values.get(6) if values.get(6) is not None else values.get('6')
- data_7 = values.get(7) if values.get(7) is not None else values.get('7')
- data_8 = values.get(8) if values.get(8) is not None else values.get('8')
- mail = values.get(0) if values.get(0) is not None else values.get('0')
- start_row = 0
- global title
- global sheet_name
- if task_key in (2, 3, 21):
- # 周报
- sheet_name = '周报'
- title = self.title.get('week')
- elif task_key in (1, 4):
- # 日报
- sheet_name = '日报'
- title = self.title.get('day')
- ws = self.wb.add_sheet(sheet_name, cell_overwrite_ok=True) # 增加sheet
- title_1 = title.get(1)
- if key == '金晶':
- data_name_1 = [['总浏览量', 'CNP小程序总浏览量', '单项目小程序总浏览量'], ['总浏览人数', 'CNP小程序总浏览人数', '单项目小程序总浏览人数']
- , ['新增获客', 'CNP小程序新增获客', '单项目小程序新增获客'], ['新增获电', 'CNP小程序新增获电', '单项目小程序新增获电']]
- else:
- data_name_1 = [
- ['总浏览量', '集团小程序总浏览量', '单项目小程序总浏览量'],
- ['总浏览人数', '集团小程序总浏览人数', '单项目小程序总浏览人数']
- , ['新增获客', '集团小程序新增获客', '单项目小程序新增获客'],
- ['新增获电', '集团小程序新增获电', '单项目小程序新增获电']
- ]
- # 1
- self.horizontal_cell_merge(ws, 0, 0, 0, 5, title_1)
- self.sceptical_insert_cells(ws, data_name_1, 1, [0, 2, 4])
- col_index = 0
- for col in [1, 3, 5]:
- for row in [1, 2, 3, 4]:
- ws.col(col).width = 150 * 30 # 定义列宽
- ws.write(row, col, str(data_1[col_index]),
- style=self.set_style('Times New Roman',
- 200,
- bold=False,
- format_str='', align=''))
- col_index += 1
- # 插入空白
- self.horizontal_space_cells(ws, 5, 5, 0, 5)
- start_row += 5
- # 2
- title_2 = title.get(2)
- start_row += 1
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_2)
- start_row += 1
- self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
- start_row += 1
- self.insert_cells(ws, data_2, start_row, [y for y in range(0, 6)])
- start_row += len(data_2)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
- start_row += 1
- # 3
- title_3 = title.get(3)
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_3)
- start_row += 1
- self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
- start_row += 1
- self.insert_cells(ws, data_3, start_row, [y for y in range(0, 6)])
- start_row += len(data_3)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
- start_row += 1
- if len(data_4) > 0 and len(data_5) > 0:
- if len(data_4) > 0:
- # 4
- title_4 = title.get(4)
- # self.insert_module_data(ws, title_4, self.header_2, data_4, start_row, 0, 5)
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_4)
- start_row += 1
- self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
- start_row += 1
- self.insert_cells(ws, data_4, start_row, [y for y in range(0, 6)])
- start_row += len(data_4)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
- start_row += 1
- if len(data_5) > 0:
- # 5
- title_5 = title.get(5)
- # self.insert_module_data(ws, title_5, self.header_2, data_5, start_row, 0, 5)
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 5, title_5)
- start_row += 1
- self.insert_cells(ws, self.header_2, start_row, [y for y in range(0, 6)])
- start_row += 1
- self.insert_cells(ws, data_5, start_row, [y for y in range(0, 6)])
- start_row += len(data_5)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 5)
- start_row += 1
- else:
- pass
- # 6
- if len(data_6) > 0:
- title_6 = title.get(6)
- # self.insert_module_data(ws, title_6, self.header_6, data_6, start_row, 0, 11)
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 11, title_6)
- start_row += 1
- self.insert_cells(ws, self.header_6, start_row, [y for y in range(0, 12)])
- start_row += 1
- self.insert_cells(ws, data_6, start_row, [y for y in range(0, 12)])
- start_row += len(data_6)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 11)
- start_row += 1
- if len(data_7) > 0 and len(data_8) > 0:
- if len(data_7) > 0:
- # 7
- title_7 = title.get(7)
- # self.insert_module_data(ws, title_7, self.header_6, data_7, start_row, 0, 11)
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 11, title_7)
- start_row += 1
- self.insert_cells(ws, self.header_6, start_row, [y for y in range(0, 12)])
- start_row += 1
- self.insert_cells(ws, data_7, start_row, [y for y in range(0, 12)])
- start_row += len(data_7)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 11)
- start_row += 1
- if len(data_8) > 0:
- # 8
- title_8 = title.get(8)
- # self.insert_module_data(ws, title_8, self.header_6, data_8, start_row, 0, 11)
- self.horizontal_cell_merge(ws, start_row, start_row, 0, 11, title_8)
- start_row += 1
- self.insert_cells(ws, self.header_6, start_row, [y for y in range(0, 12)])
- start_row += 1
- self.insert_cells(ws, data_8, start_row, [y for y in range(0, 12)])
- start_row += len(data_8)
- self.horizontal_space_cells(ws, start_row, start_row, 0, 11)
- start_row += 1
- else:
- pass
- file_path = self.get_file_name(task_key, time_rang, key)
- self.wb.save(file_path[0]) # 保存xls
- result.append([key, mail, file_path[0], file_path[1]])
- return result
- def insert_module_data(self, ws, title, header, data, start_row, start_col, end_col):
- self.horizontal_cell_merge(ws, start_row, start_row, start_col, end_col, title)
- start_row += 1
- self.insert_cells(ws, header, start_row, [y for y in range(start_col, (end_col + 1))])
- start_row += 1
- self.insert_cells(ws, data, start_row, [y for y in range(start_col, (end_col + 1))])
- start_row += len(data)
- self.horizontal_space_cells(ws, start_row, start_row, start_col, end_col)
- start_row += 1
- def insert_cells(self, ws, data, start_row, cols):
- for index, v in enumerate(data):
- for col in cols:
- data_1 = data[index]
- if isinstance(data_1, set):
- pass
- else:
- value = data_1[col]
- if value is None:
- value = 0
- ws.col(col).width = 150 * 30 # 定义列宽
- ws.write(start_row, col, str(value),
- style=self.default_style)
- start_row += 1
- def sceptical_insert_cells(self, ws, data, start_row, cols):
- for x in data:
- col_index = 0
- for col in cols:
- ws.col(col).width = 150 * 30 # 定义列宽
- ws.write(start_row, col, str(x[col_index]),
- style=self.default_style)
- col_index += 1
- start_row += 1
- if __name__ == '__main__':
- xu = XlwtUtil()
- result = {}
- data = result.get('data')
- for x in xu.create_excel(data, ['2020-03-12', '2020-03-13'], 2):
- print(x)
|