背景:工作上,经常需要从数据库产出报表,由于这种报表需要提交给领导看,所以对格式的要求要比平常高不少,每次设置格式虽然花的时间不算太多,但是长期下来,积少成多,花在格式上的时间就会太多,为了方便调整格式,我写了下面的脚本,主要功能是设置中国式报表,具体为:表格上面有一行合并居中的标题,标题下面左边是查询日期,单位,表格最下面有合计行。
#python3
import xlwings as xw
path = r'E:\当前工作\分单位0624b1.xlsx'
wb = xw.Book(path)
sht = wb.sheets['SQL Results']
# 开始格式调整
# 1. 设置字体大小为14
sht['A1:L17'].font.size = 14
# 2.自动调整行高列宽
sht.autofit('c')
# 4.在开始插入两行
if sht['A2'].value is not None:
sht.api.Rows(1).Insert()
sht.api.Rows(1).Insert()
# 5. 输入表头
sht['A1'].value='分单位'
sht['A1'].font.size= 18
sht.range('A1:L1').api.Merge()
# 把文字居中
sht['A1'].api.HorizontalAlignment = -4108
sht['A1'].font.name= '黑体'
sht['A2'].value='查询日期:2022年6月24日'
sht['A2'].font.name= '黑体'
sht['A2'].font.size= 14
sht['L2'].value='单位:户,万元'
sht['L2'].api.HorizontalAlignment=-4152 # 把文字右对齐
sht['L2'].font.name= '黑体'
sht['L2'].font.size= 14
# 3.把文本转成数字
# sht['c2'].value = int(sht['c2'].value)+0
# sht.range('C2').api.NumberFormatLocal = "0"
for i in sht.range('c4:l17'):
if i.value is None:
i.value=0
else:
i.value=float(i.value)+0
columns_letters = ['C','D','E','F','G','H','I','J','K','L']
for c in columns_letters:
sht[c+'18'].value= "=sum({}4:{}17)".format(c,c)
for i in range(7,13):
sht.range('A3:l18').api.Borders(i).LineStyle=1
sht['b18'].value='合计'
sht['h18'].value='=G18/F18*100'
sht['h18'].api.NumberFormatLocal = "0.00"
原格式:
调整后:
主要改动格式如下:
- 合并居中
- 设置单元格的值
- 设置边框
- 自动调整行高列宽
- 设置字体类型和字体大小
- 把文本转数字
- 设置数字的小数位数
- 设置单元格的公式
几个心得体会:
- xlwings可以直接调用windows中的api,所以好多强大 的功能都是通过这个实现。
- 有些关键的操作,要注意放置的位置 ,比插入行。插入行后,有些单元格的位置就变了,这时设置格式的区域就要相应变化,因此为了程序能反复测试运行,最好是在插入行前加一个判断 。