最近需要写一个用python将数据写入excel的小工具,遇到了自适应列宽写入excel的问题,特此记录下解决思路及过程。
运行环境:Windows10
、PyCharm 2017.3.2
、Python3.6
、xlwt1.3.0
编写小dome如下:
import xlwt
'''
利用python的xlwt模块自适应列宽写入excel
'''
row_num = 0 # 记录写入行数
# 个人信息:姓名,性别,年龄,手机号,固定电话,邮箱
line_name = ['姓名','性别','年龄','手机号','固定电话','邮箱']
data = [
['厘清','女','31','18745214693','010-4784125','5412546qq.com'],
['张三','男','26','18245554693','010-4784125','无'],
['王武','男','19','13245266693','无','785992546qq.com'],
['熊大','男','16','无','010-4784125','115412546qq.com'],
['熊二','男','22','18745214693','010-4784125','3654126qq.com']
]
# 创建一个Workbook对象
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
# 创建一个sheet对象
sheet = book.add_sheet('person_msg', cell_overwrite_ok=True)
# 写入列名
for name in range(0, len(line_name)):
sheet.write(row_num, name, line_name[name])
row_num += 1
# 写入数据
for i in range(0, len(data)):
for j in range(0, len(data[i])):
sheet.write(row_num, j, data[i][j])
row_num += 1
# 保存excel文件
book.save('person_msg.xls')
解决思路:获取每列写入字符长度,比较出每列最宽的长度,最后设置合适的长度。
计算字符串的长度时要注意一个汉字占两个字节,需要指定字符串的字符集才能获取正确的字符数
>>> str = 'liming李明'
>>> len(str)
8
>>> len(str.encode('gb18030'))
10
最后代码如下:
import xlwt
import copy
'''
利用python的xlwt模块自适应列宽写入excel
'''
# 获取每列所占用的最大列宽
def get_max_col(max_list):
line_list = []
# i表示行,j代表列
for j in range(len(max_list[0])):
line_num = []
for i in range(len(max_list)):
line_num.append(max_list[i][j]) # 将每列的宽度存入line_num
line_list.append(max(line_num)) # 将每列最大宽度存入line_list
return line_list
def write_excel():
row_num = 0 # 记录写入行数
col_list = [] # 记录每行宽度
# 个人信息:姓名,性别,年龄,手机号,固定电话,邮箱
data = [
['姓名','性别','年龄','手机号','固定电话','邮箱'],
['厘清','女','31','18745214693','0104784125','5412546qq.com'],
['张三','男','26','18245554693','010-4784125','无'],
['王武','男','19','13245266693','无','785992546qq.com'],
['熊大','男','16','无','010-4784125','115412546qq.com'],
['熊二','男','22','18745214693','010-4784125','3654126qq.com']
]
# 创建一个Workbook对象
book = xlwt.Workbook(encoding="utf-8",style_compression=0)
# 创建一个sheet对象
sheet = book.add_sheet('person_msg', cell_overwrite_ok=True)
col_num = [0 for x in range(0, len(data))]
# 写入数据
for i in range(0, len(data)):
for j in range(0, len(data[i])):
sheet.write(row_num, j, data[i][j])
col_num[j] = len(data[i][j].encode('gb18030')) # 计算每列值的大小
col_list.append(copy.copy(col_num)) # 记录一行每列写入的长度
row_num += 1
# 获取每列最大宽度
col_max_num = get_max_col(col_list)
# 设置自适应列宽
for i in range(0, len(col_max_num)):
# 256*字符数得到excel列宽,为了不显得特别紧凑添加两个字符宽度
sheet.col(i).width = 256 * (col_max_num[i] + 2)
# 保存excel文件
book.save('person_msg.xls')
write_excel()