数据统计我们可以很方便地用python计算,但是数据统计好后,呈现给领导或客户时,还是以excel为主,pandas直接生成的excel太丑,不符合福报人的品位,本文教大家一步步变美。
01 背景
先看丑的,通常pandas一行代码就能生成excel,如图:
df.to_excel(xlsx_path, header=False)
01 准备
通常python读取excel有两个包,xlsxwriter和openpyxl,论单元格单独处理,openpyxl要方便一些,论sheet的整体编辑,插入图片,xlsxwriter能力要强一些,这里先用openpyxl,后面文章插入图片时,再介绍xlsxwriter。
1、安装
pip install openpyxl
2、加载
先按路径加载完整的excel,openpyxl.load_workbook(xlsx_path),保存到wb,再激活第一个sheet页,保存为ws。
wb = openpyxl.load_workbook(xlsx_path)
ws = wb.active
02 修改格式
1、选择范围 如果要对整个sheet页的所有单元格进行选择,先单独取总行数和总列数,再组成。
rownum = str(ws.max_row) # 总行数
letter = get_column_letter(ws.max_column) # 最后一列的字母
cells = ws['A1:' + letter + rownum] # 全部单元格范围
2、设置值 如果要对其中的值进行修改,直接按二维数组的方式对单个单元格赋值。
ws.cell(1, 1).value = '品名2'
ws.cell(1, 5).value = '产量3'
3、格式化
对二维的单元格进行位置(居左、居中、居右),字体(字体大小,加粗,字体名称,颜色),边框,背景等格式处理。
def set_cells(cells, type, color=None):
aligncenter = Alignment(horizontal='center', vertical='center') # 居中
alignleft = Alignment(horizontal='left', vertical='center') # 居左
sidestyle = Side(border_style='thin')
border = Border(left=sidestyle, right=sidestyle, top=sidestyle, bottom=sidestyle)
font = Font(bold=False) # 字体不加粗
# font = Font(size=14, bold=False, name='微软雅黑', color="FF0000") # 字体大小,加粗,字体名称,字体名字
for i in cells:
for j in i:
if (type == 'percent'):
j.number_format = '0.00%'
elif (type == 'bold_false'):
j.font = font
elif (type == 'left'):
j.alignment = alignleft
elif (type == 'center'):
j.alignment = aligncenter
elif (type == 'border'):
j.border = border
elif (type == 'color'):
j.fill = PatternFill("solid", fgColor=color) # solid为样式
4、合并单元格 相邻的行或列,如果字符相同,可以使用sheet.merge_cells()合并单元格。
for j in range(head_row + 1,rownum + 1):
# 前一列的合并单元格
for row_range in last_row_list:
if start_row in row_range:
max_end_row = row_range[-1]
break
# 字符相同,
if cell_value.__eq__(sheet.cell(j, i).value) and j < max_end_row:
# 最后一行,是否合并
continue
end_row = j - 1
# 字符不相同,
if not cell_value.__eq__(sheet.cell(j, i).value):
cell_value = sheet.cell(j, i).value
if end_row - start_row >= 1:
sheet.merge_cells(start_row=start_row, end_row=end_row, start_column=i, end_column=i)
this_row_list.append(range(start_row, end_row + 1))
# 超过前一列的合并单元格
elif j >= max_end_row:
if max_end_row - start_row >= 1:
sheet.merge_cells(start_row=start_row, end_row=max_end_row, start_column=i, end_column=i)
this_row_list.append(range(start_row, max_end_row + 1))
this_row_list.append(range(max_end_row + 1, end_row + 1))
else:
if end_row - start_row >= 1:
sheet.merge_cells(start_row=start_row, end_row=end_row, start_column=i, end_column=i)
this_row_list.append(range(start_row, end_row + 1))
start_row = end_row + 1
03 结论
通过本文我们实现了对excel中单元格的基本格式美化,后面会介绍sheet页的操作和插入图片,最终能多美,就需要发挥脑洞了。工具在手,天下我有。
标签:end,max,单元格,excel,几行,start,sheet,美化,row From: https://blog.51cto.com/u_15786919/6366767