openpyxl单元格宽高自适应

默认使用openpyxl导出的excel数据都挤在一起,看起来确实不太美观,通过如下函数即可实现单元格的宽高自适应

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def adjust_ws(ws):
def get_length(text):
_length = 0
for char in str(text):
if '\u4e00' <= char <= '\u9fff': # 中文字符
_length += 2
else:
_length += 1
return _length

def has_chinese(text):
try:
text.encode('ascii')
return False
except UnicodeEncodeError:
return True

for col in ws.columns:
max_length = 0
column = col[0].column_letter

for cell in col:
if cell.value:
lines = str(cell.value).split('\n')
length = max(get_length(line) for line in lines)
if length > max_length:
max_length = length

# 设置列宽,这里可以根据需要调整比率增加或减少宽度
ws.column_dimensions[column].width = (max_length + 2) * 1

for row in ws.rows:
max_lines = 1
for cell in row:
if cell.value:
lines_count = sum([1.4 if has_chinese(x) else 1 for x in str(cell.value).split('\n')])
if lines_count > max_lines:
max_lines = lines_count
# 设置行高,可根据需要调整比率增加或减少
ws.row_dimensions[row[0].row].height = 15 * max_lines

通过一个实际例子说明如何使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from openpyxl import Workbook
from openpyxl.styles import Alignment

def export_excel():
# 创建工作簿和工作表
wb = Workbook()
ws = wb.active

# 示例数据(包含换行符)
data = [
['姓名', '描述', '备注'],
['张三', '这是一段很长的描述\n需要换行显示', '备注1'],
['李四', '另一段描述内容\n同样需要换行', '备注2'],
]

# 写入数据
for row_idx, row in enumerate(data, start=1):
for col_idx, value in enumerate(row, start=1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
if '\n' in str(value):
cell.alignment = Alignment(
wrap_text=True,
vertical='center',
horizontal='left'
)

# 引用上述函数调整列宽和行高
adjust_ws(ws)

# 保存文件
wb.save('example.xlsx')

export_excel()

注意:通过上述代码可以发现为了自适应宽高对整个excel的内容进行了横向和竖向的遍历,所以其效率肯定不会高,在应用于大量数据的excel时会出现性能问题。