| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 | import xlwtimport osfrom file_util import FileUtilimport datetimeclass 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 = self.save_path_create()        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):            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)            data_2 = values.get(2)            data_3 = values.get(3)            data_4 = values.get(4)            data_5 = values.get(5)            data_6 = values.get(6)            data_7 = values.get(7)            data_8 = values.get(8)            mail = values.get(0)            start_row = 0            global title            global sheet_name            if task_key in (2, 3):                # 周报                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  # 定义列宽                    print(data_1)                    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:                value = data[index][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 += 1if __name__ == '__main__':    xu = XlwtUtil()    data ={}    for x in xu.create_excel(data, ['2020-03-12', '2020-03-13'], 2):        print(x)
 |