123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- 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='')
- self.simple_style = xlwt.XFStyle()
- 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):
- if len(data) > 0:
- for index, v in enumerate(data):
- if(len(v)) == 17:
- 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 # 定义列宽
- style = self.simple_style if y >= 3 else self.default_style
- ws.write(start_row, col, value,
- style=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, file_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 = 1
- self.insert_cells(ws, d, start_row, 0, len(d[0]))
- self.wb.save(file_path)
- if __name__ == '__main__':
- rf = ReportFileUtils()
- data_1 = {}
- data = data_1.get('data2')
- sheet_names = ['前一日数据', '本月数据', '上线后所有']
- title = "测ss试.xlsx"
- head_1 = ['城市', '项目名称', '浏览量', '浏览人数', '新增用户', '新增获电', '推荐用户', '分享获电', '裂变获电',
- '扫码到访数', '全民经纪人注册数', '老业主注册数', '报备成功数', '报备到访数']
- headers = [head_1, head_1, head_1]
- rf.create_excel_file(data, sheet_names, title, headers, r'D:\elab-code\elab_mvp\resources\report_jian\测ss试.xlsx')
|