原文链接: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】获取下载链接。