0
点赞
收藏
分享

微信扫一扫

几行代码教你美化excel

数据统计我们可以很方便地用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页的操作和插入图片,最终能多美,就需要发挥脑洞了。工具在手,天下我有。

举报

相关推荐

0 条评论