Python实例:openpyxl自适应调整列宽或行高

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

 

今天的例子介绍如何在openpyxl中根据单元格内容自动调整列宽或者行高。

需要注意的是,在Excel里中文是占据2个字符宽度的,所以需要先找出单元格内容中的中文字符数目,本文的例子是通过判断字符的unicode编码范围实现的。

# 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

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

1)自动调整列宽

先用faker生成单行数据,逐行添加到excel中。再每列遍历,找出这一列中占据最宽的一个单元格,以该单元格的宽度值设置为该列的宽度,在这个例子中行高采用的是默认高度。

#juzicode.com/VX公众号:juzicode
import re
from openpyxl import Workbook
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

# 初始化
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      

# 保存表格    
wb.save('faker-profile-列宽自适应.xlsx')        

 

2)自动调整行高

先用faker生成单行数据,逐行添加到excel中。因为默认的列宽不合适,这个例子中对每列设定了一个宽度,再每行遍历,找出这一行中占据最高的一个单元格,以该单元格的高度值设置为该行的高度。

#juzicode.com/VX公众号:juzicode
import re
import math
from openpyxl import Workbook
from openpyxl.styles import Alignment, Side, Border
from faker import Faker
from tqdm   import tqdm 


N = 200 # 生成数据条数
COL_WIDTH = 20 # 列宽固定字符宽度

# 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

# 初始化
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):
    c = col[0].column_letter
    ws.column_dimensions[c].width = COL_WIDTH 

# 逐行遍历
for i,row in enumerate(ws.rows):  
    row_dim = ws.row_dimensions[i+1]
    max_lent = 0
    for cell in row:
        cell.alignment = Alignment(horizontal='left', wrap_text=True)    
        lent = cal_len(str(cell.value))
        if lent > max_lent:
            max_lent = lent
    height = math.ceil(max_lent / COL_WIDTH) * 20 + 2
    print('row=%d,height=%d' % (i+1, height))
    row_dim.height = height 
    
# 保存表格    
wb.save('faker-profile-行高自适应.xlsx')        

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

  

扩展阅读:

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

发表评论

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