Python实例:openpyxl调整行颜色

原文链接:http://www.juzicode.com/python-example-openpyxl-adjust-fill-color

在阅读Excel表格时,如果表格比较大、列数比较多的时候容易出现“串行(hang)”。为了解决这个问题通常同一行填充同一个颜色,相邻行填充不同颜色,就能明显区分不同行的数据。

今天的例子介绍如何在openpyxl中调整不同行的颜色。

下面的例子中表格内容采用faker自动生成,faker用法可以参考: Python轮子:造假高手——faker(数据生成器) 。当然你也可以使用load_workbook()的方法打开本地文件。

1)交替使用2种颜色

下面的例子先用faker生成数据,再自适应调整列宽,最后逐行遍历,交替使用2种颜色将表格的相邻2行填充不同的颜色。

#juzicode.com/VX公众号:juzicode
import re
from openpyxl import Workbook
from openpyxl.styles import PatternFill,GradientFill
from faker import Faker
from tqdm import tqdm 

N = 200 # 生成数据条数

# excel表格里中文占2个字符宽度,该方法找出中文字符个数,
# 总长就是中文字符个数加总字符个数
def cal_len(text): 
    pattern = re.compile(r'[\u4e00-\u9fa5]')
    cn_char = re.findall(pattern,text)       # 查找中文字符
    lent = len(cn_char) + len(text)
    return lent

# 初始化PatternFill(fill_type='solid',fgColor='959392') 
fak = Faker('zh_CN')
wb = Workbook() 
ws = wb.active  

# 添加表头
p = fak.profile()  
print(p.keys())
ws.append(list(p.keys()))

# 生成个人数据
for i in tqdm(range(N)):  # 添加N行数据
    p=fak.profile()
    p['current_location'] = str(p['current_location'])  # excel不识别的数据类型转换为字符串
    p['website'] = str(p['website'])
    ws.append(list(p.values()))  # 添加数据

# 调整列宽,自适应
for i,col in enumerate(ws.columns):
    max_lent = 0
    for cell in col:             # 查找最长单元格
        lent = cal_len(str(cell.value))
        if lent > max_lent:
            max_lent = lent
    width = max_lent + 2         # 增加2个字符宽度,显示不会太紧凑 
    c = col[0].column_letter    
    print('col=%s,width=%d' % (c, width))
    ws.column_dimensions[c].width = width      

# 逐行填充颜色    
for i,row in enumerate(ws.rows): 
    if i % 2 == 0:
        fill = PatternFill(fill_type='solid',fgColor='00CCFFCC') 
    else:
        fill = PatternFill(fill_type='solid',fgColor='00CCFFFF') 
    for r in row:
        r.fill = fill
 
# 保存表格    
wb.save('faker-profile-行颜色渐变.xlsx')        

2)多行使用不同背景色

这个例子同样用faker生成数据,自适应调整列宽,最后逐行遍历,使用不同的颜色填充各行。

#juzicode.com/VX公众号:juzicode
import re
from openpyxl import Workbook
from openpyxl.styles import PatternFill,GradientFill
from openpyxl.styles.colors import Color
from faker import Faker
from tqdm import tqdm 

N = 200 # 生成数据条数

# excel表格里中文占2个字符宽度,该方法找出中文字符个数,
# 总长就是中文字符个数加总字符个数
def cal_len(text): 
    pattern = re.compile(r'[\u4e00-\u9fa5]')
    cn_char = re.findall(pattern,text)       # 查找中文字符
    lent = len(cn_char) + len(text)
    return lent

# 初始化PatternFill(fill_type='solid',fgColor='959392') 
fak = Faker('zh_CN')
wb = Workbook() 
ws = wb.active  

# 添加表头
p = fak.profile()  
print(p.keys())
ws.append(list(p.keys()))

# 生成个人数据
for i in tqdm(range(N)):  # 添加N行数据
    p=fak.profile()
    p['current_location'] = str(p['current_location'])  # excel不识别的数据类型转换为字符串
    p['website'] = str(p['website'])
    ws.append(list(p.values()))  # 添加数据

# 调整列宽,自适应
for i,col in enumerate(ws.columns):
    max_lent = 0
    for cell in col:             # 查找最长单元格
        lent = cal_len(str(cell.value))
        if lent > max_lent:
            max_lent = lent
    width = max_lent + 2         # 增加2个字符宽度,显示不会太紧凑 
    c = col[0].column_letter    
    print('col=%s,width=%d' % (c, width))
    ws.column_dimensions[c].width = width      

# 逐行填充颜色    
for i,row in enumerate(ws.rows): 
    fill = PatternFill(fill_type='solid',fgColor=Color(indexed=i%64)) 
    for r in row:
        r.fill = fill
 
# 保存表格    
wb.save('faker-profile-行颜色渐变2.xlsx')        

更多openpyxl实例公众号【桔子code】后台回复【openpyxl】获取下载链接。

扩展阅读:

  1. Python实例:openpyxl读写单元格
  2. Python轮子:Excel读写利器——openpyxl
  3. Python轮子:造假高手——faker(数据生成器)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注