我们经常说用python(3.7)处理表格,大部分使用的都是openpyxl(3.07)这个模块,由于每个月会统计打印机各个部门的打印量,然后出一个报表,报表格式比较复杂,数据比较简单,所有使用从模板文件复制新的表格,有人可能觉得直接复制一个文件更简单高效(有些地方就有局限性,比喻在同一个文件里复制一个sheet)。

1.表格内容有数据、列宽、行高、合并单元格、字体、样式、边框、对齐、单元格格式等

2.完美复制就要复制所有的属性

3.考虑到合并单元格,放在最后一步处理,否则合并单元格样式会丢失一部分

以下实现复制一个sheet

def copy_xls(src_file, tag_file, sheet_name):
# src_file是源xlsx文件,tag_file是目标xlsx文件,sheet_name是目标xlsx里的新sheet名称
src_wb = load_workbook(src_file)
targ_wb = load_workbook(tag_file)
src_ws = src_wb['Sheet1']
targ_ws = targ_wb.create_sheet(sheet_name)
max_row = src_ws.max_row # 最大行数
max_column = src_ws.max_column # 最大列数
w, h = 0, 0
#此处有坑当你获得一个列宽为13的时候实际上是这个列和前面单元格一样的宽度,并不是他真的是13
for i in range(1, max_column + 1):
column_letter = get_column_letter(i)
rs = src_ws.column_dimensions[column_letter].width
if (rs == 13):
rs = w
else:
w = rs
targ_ws.column_dimensions[column_letter].width = rs
#复制行高,没有列宽的坑
for i in range(1, max_row + 1):
rs = src_ws.row_dimensions[i].height
if rs != None:
targ_ws.row_dimensions[i].height = rs
#复制每个单元格
for column in range(1, max_column + 1):
for row in range(1, max_row + 1):
column_n = get_column_letter(column)
i = '%s%d' % (column_n, row) # 单元格编号
try:
#复制
targ_ws[i].value = copy(src_ws[i].value)
targ_ws[i].font = copy(src_ws[i].font)
targ_ws[i].border = copy(src_ws[i].border)
targ_ws[i].fill = copy(src_ws[i].fill)
targ_ws[i].number_format = copy(src_ws[i].number_format)
targ_ws[i].protection = copy(src_ws[i].protection)
targ_ws[i].alignment = copy(src_ws[i].alignment)
except Exception as e :
print(e)

wm = list(src_ws.merged_cells) # 开始处理合并单元格
for i in range(0, len(wm)):
cell2 = str(wm[i]).replace('(<MergedCellRange ', '').replace('>,)', '')
targ_ws.merge_cells(cell2)
targ_wb.save(tag_file)
targ_wb.close()
src_wb.close()