影刀RPA Excel单元格样式:字体、颜色、边框

影刀RPA Excel单元格样式:字体、颜色、边框

作者:林焱

什么情况用什么

生成的报表直接发出去被人嫌丑——标题没加粗、数字没对齐、表格没边框、条件不达标的数据没标红。这些问题在影刀RPA里用openpyxl的样式系统可以批量设置,不需要手动打开Excel一个个调。

适用场景:自动化报表美化、批量标注异常数据(红色底色)、统一多个文件的表格样式、生成带边框和配色的专业报表。

怎么做

字体设置

importopenpyxlfromopenpyxl.stylesimportFont,PatternFill,Border,Side,Alignment wb=openpyxl.load_workbook(r"C:\Reports\report.xlsx")ws=wb.active# 标题行:加粗、白色字、14号ws['A1'].font=Font(name='微软雅黑',size=14,bold=True,color='FFFFFF')# 表头行:加粗、深蓝色forcolinrange(1,6):[video(video-1jshCu6o-1783501051030)(type-csdn)(url-https://live.csdn.net/v/embed/525000)(image-https://v-![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4fdcb81474864710b1ae7682c7258db3.png#pic_center)blog.csdnimg.cn/asset/23da3fe1f67a47106d725406cfde9a97/cover/Cover0.jpg)(title-拼多多店群自动化上架方案)]cell=ws.cell(row=2,column=col)cell.font=Font(name='微软雅黑',size=11,bold=True,color='1F4E79')# 数据行:常规、黑色forrowinrange(3,ws.max_row+1):forcolinrange(1,6):ws.cell(row=row,column=col).font=Font(name='微软雅黑',size=10,color='000000')wb.save(r"C:\Reports\report.xlsx")

背景色填充

fromopenpyxl.stylesimportPatternFill# 标题行深蓝底header_fill=PatternFill(start_color='1F4E79',end_color='1F4E79',fill_type='solid')forcolinrange(1,6):ws.cell(row=1,column=col).fill=header_fill# 隔行变色(斑马线)even_fill=PatternFill(start_color='F2F2F2',end_color='F2F2F2',fill_type='solid')forrowinrange(3,ws.max_row+1):ifrow%2==0:forcolinrange(1,6):ws.cell(row=row,column=col).fill=even_fill# 异常数据标红red_fill=PatternFill(start_color='FFC7CE',end_color='FFC7CE',fill_type='solid')red_font=Font(name='微软雅黑',size=10,color='9C0006')forrowinrange(3,ws.max_row+1):score=ws.cell(row=row,column=4).valueifscoreisnotNoneandscore<60:forcolinrange(1,6):ws.cell(row=row,column=col).fill=red_fill ws.cell(row=row,column=col).font=red_font

边框设置

fromopenpyxl.stylesimportBorder,Side# 细边框thin_border=Border(left=Side(style='thin',color='000000'),right=Side(style='thin',color='000000'),top=Side(style='thin',color='000000'),bottom=Side(style='thin',color='000000'))# 给数据区域加边框forrowinrange(1,ws.max_row+1):forcolinrange(1,6):![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b1c6a35e62ac478599e5a1a814a93f45.png#pic_center)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6e0b3df698d749848770ba4a1f0410df.png#pic_center)ws.cell(row=row,column=col).border=thin_border# 表头加粗边框thick_bottom=Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),bottom=Side(style='medium',color='1F4E79')# 底部加粗)forcolinrange(1,6):ws.cell(row=2,column=col).border=thick_bottom

对齐方式

fromopenpyxl.stylesimportAlignment# 表头居中center_align=Alignment(horizontal='center',vertical='center',wrap_text=True)forcolinrange(1,6):ws.cell(row=2,column=col).alignment=center_align# 数字右对齐right_align=Alignment(horizontal='right',vertical='center')forrowinrange(3,ws.max_row+1):forcolinrange(3,6):# 第3-5列是数字ws.cell(row=row,column=col).alignment=right_align# 文本左对齐left_align=Alignment(horizontal='left',vertical='center')forrowinrange(3,ws.max_row+1):ws.cell(row=row,column=1).alignment=left_align

一键美化函数

defbeautify_report(ws,title_row=1,header_row=2,data_start_row=3,num_cols=6):"""一键美化表格"""# 颜色方案title_fill=PatternFill(start_color='1F4E79',end_color='1F4E79',fill_type='solid')header_fill=PatternFill(start_color='D6E4F0',end_color='D6E4F0',fill_type='solid')even_fill=PatternFill(start_color='F8F9FA',end_color='F8F9FA',fill_type='solid')thin=Side(style='thin',color='B0B0B0')border=Border(left=thin,right=thin,top=thin,bottom=thin)# 标题行forcolinrange(1,num_cols+1):cell=ws.cell(row=title_row,column=col)cell.font=Font(name='微软雅黑',size=14,bold=True,color='FFFFFF')cell.fill=title_fill cell.alignment=Alignment(horizontal='center',vertical='center')cell.border=border# 表头行forcolinrange(1,num_cols+1):cell=ws.cell(row=header_row,column=col)cell.font=Font(name='微软雅黑',size=11,bold=True,color='1F4E79')cell.fill=header_fill cell.alignment=Alignment(horizontal='center',vertical='center',wrap_text=True)cell.border=border# 数据行forrowinrange(data_start_row,ws.max_row+1):forcolinrange(1,num_cols+1):cell=ws.cell(row=row,column=col)cell.font=Font(name='微软雅黑',size=10)cell.border=borderifrow%2==0:cell.fill=even_fillifcol>=3:# 数字列右对齐cell.alignment=Alignment(horizontal='right',vertical='center')else:cell.alignment=Alignment(horizontal='left',vertical='center')# 行高ws.row_dimensions[title_row].height=30ws.row_dimensions[header_row].height=25# 列宽自适应(简易版)forcolinrange(1,num_cols+1):max_length=0forrowinrange(1,ws.max_row+1):val=ws.cell(row=row,column=col).valueifval:# 中文字符算2个宽度length=sum(2iford(c)>127else1forcinstr(val))iflength>max_length:max_length=length ws.column_dimensions[openpyxl.utils.get_column_letter(col)].width=min(max_length+4,50)# 在影刀中调用beautify_report(ws,num_cols=5)wb.save(r"C:\Reports\report.xlsx")

有什么坑

坑1:样式覆盖问题

给单元格设了字体后再设背景色,字体样式没了——因为每次赋值都是完整替换,不是追加:

# 错误:先设font再设fill,font还在cell.font=Font(bold=True)cell.fill=PatternFill(...)# fill不会影响font,没问题# 但这种情况会丢样式:直接拷贝单元格格式![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/3e9e455183b641979b017fc20fe4460c.png#pic_center)cell.style='Title'# 用style属性会重置所有样式cell.font=Font(bold=True)# 之前用style设的都没了

坑2:颜色值格式

openpyxl的颜色用hex字符串,不带#号。常见错误:

# 错误:带了#号cell.font=Font(color='#FF0000')# 不报错但不生效# 正确:不带#号cell.font=Font(color='FF0000')# 纯红色# 带透明度的ARGB格式cell.font=Font(color='FFFF0000')# FF=不透明,FF0000=红色

坑3:边框只设了部分方向

TEMU店群如何管理运营?

想只加底部边框,结果四边都有了——因为Border默认值不是None:

# 错误:只传bottom,其他方向默认有值cell.border=Border(bottom=Side(style='thin'))# 可能出现意外边框# 正确:显式指定不需要的方向为Nonecell.border=Border(left=None,![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/cd03d767eefd48dc8992bbcd48cfceeb.png#pic_center)right=None,top=None,bottom=Side(style='thin',color='000000'))

坑4:大量单元格设样式导致文件巨大

给10000行×20列每个单元格单独设Font、Fill、Border对象,文件从100KB膨胀到5MB。原因是每个样式对象都是独立的。解决方案——用命名样式:

fromopenpyxl.stylesimportNamedStyle# 创建命名样式(只存一份)data_style=NamedStyle(name='data_style')data_style.font=Font(name='微软雅黑',size=10)data_style.border=Border(left=Side(style='thin'),right=Side(style='thin'),top=Side(style='thin'),bottom=Side(style='thin'))# 注册wb.add_named_style(data_style)# 应用(引用同一个样式对象)forrowinrange(3,10003):forcolinrange(1,21):ws.cell(row=row,column=col).style='data_style'

坑5:列宽自适应不准

中文字符宽度计算不准导致列宽不够,文字被截断。改进方案:

importopenpyxl.utilsdefauto_width(ws,col_num):"""更准确的列宽自适应"""max_length=0col_letter=openpyxl.utils.get_column_letter(col_num)forrowinrange(1,ws.max_row+1):cell=ws.cell(row=row,column=col_num)ifcell.value:# 区分中英文length=0![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/805e84ff9ae6480b948352e90d49a93f.png#pic_center)forcharinstr(cell.value):iford(char)>127:# 中文或全角length+=2.1else:length+=1iflength>max_length:max_length=length# 加padding,但不超过50ws.column_dimensions[col_letter].width=min(max_length+3,50)