影刀RPA Excel单元格样式:字体、颜色、边框
📅 2026/7/9 4:46:54
👁️ 阅读次数
📝 编程学习
影刀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-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):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,没问题# 但这种情况会丢样式:直接拷贝单元格格式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,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=0forcharinstr(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)
编程学习
技术分享
实战经验