import xlwt


class ReportFileUtils:
    def __init__(self):
        self.styleOK = xlwt.easyxf()
        self.default_style = self.set_style('Times New Roman',
                       200,
                       bold=False,
                       format_str='', align='')
    pass

    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, end_row, 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,
            end_row,
            start_col,
            end_col,
            content,
            self.set_style(
                'Times New Roman',
                320,
                bold=True,
                format_str=''))  # 合并单元格

    def insert_cells(self, ws, data, start_row, start_col, end_col):
        for index, v in enumerate(data):
            y = 0
            for col in range(start_col, end_col):
                value = v[y]
                if value is None:
                    value = 0
                ws.col(col).width = 150 * 30  # 定义列宽
                ws.write(start_row, col, str(value),
                         style=self.default_style)
                y += 1
            start_row += 1

    def horizontal_space_cells(self, ws, start_row, end_row, start_col, end_col):
        """
            空白占位
        :param ws:
        :param start_row:
        :param end_row:
        :param start_col:
        :param end_col:
        :return:
        """
        self.horizontal_cell_merge(ws, start_row, end_row, start_col, end_col, '')

    def create_excel_file(self, data, sheet_names, title, headers, save_path):
        """
            生成excel文件, data, sheet_names,headers 三者在数量上要对应
        :param data: 数据
        :param sheet_names: 工作簿名称
        :param title: 文件名称
        :param headers: 每个工作簿表头
        :return:
        """
        self.wb = xlwt.Workbook()
        for index, d in enumerate(data):
            # 创建工作簿
            sheet_name = sheet_names[index]
            header = headers[index]
            ws = self.wb.add_sheet(sheet_name, cell_overwrite_ok=True)
            # 区域
            start_row = 0
            # 写入标题
            self.horizontal_cell_merge(ws, start_row, start_row, 0, len(header) - 1, sheet_name)
            start_row += 1

            # 写入表头
            self.insert_cells(ws, [headers[index]], start_row, 0, len(header))
            # start_row += 1
            # city_info = {}
            # insert_data = []
            # region_info = {}
            # data_size = 0
            # for key in d.keys():
            #     region_rows = 0
            #     value = d.get(key)
            #     region_name = key
            #     # 城市
            #     for key_1 in value.keys():
            #         value_1 = value.get(key_1)
            #         city_name = key_1
            #         region_rows += len(value_1)
            #         insert_data.extend(value_1)
            #         city_info[city_name] = len(value_1)
            #         data_size = len(value_1[0])
            #     region_info[region_name] = region_rows
            # # 合并区域
            # for key in region_info.keys():
            #     print(key)
            #     self.vertical_cell_merge(ws, start_row, start_row + region_info.get(key) - 1, 0, 0, key)
            #     start_row += region_info.get(key)
            # # 城市合并
            # start_row = 2
            # for key in city_info.keys():
            #      self.vertical_cell_merge(ws, start_row, start_row + city_info.get(key) - 1, 1, 1, key)
            #      start_row += city_info.get(key)

            # 写入数据
            start_row = 2
            self.insert_cells(ws, d, start_row, 0, len(d[0]))
        self.wb.save(save_path + '/' + title)


if __name__ == '__main__':
    rf = ReportFileUtils()
    data = [
                [[1, 2, 3, 5, 6, 7, 8, 9, 1]],
                [[1, 2, 3, 5, 6, 7, 8, 9, 1]],
                [[1, 2, 3, 5, 6, 7, 8, 9, 1]]

        ]

    sheet_names = ['前一日数据', '本月数据', '上线后所有']
    title = "测ss试.xlsx"
    headers = [['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝'],
               ['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝'],
               ['区域', '城市', '项目名称', '推荐人id', '姓名', '手机号', '火电', '注册', '宝贝']]
    rf.create_excel_file(data, sheet_names, title, headers, r'D:\elab\elab_mvp\test')