由于数据的繁杂和日渐增多,报表成为工作上必不可少的一部分,报表的实现既能将数据有规划的整理也能把一大串繁琐的数据变得更加简洁可观。但是用excel处理大量的报表,工作量可想而知,每次都需要在月头和周头花费大量的时间来整理报表。自从学了python,就方便多了,将数据导入用python整理好后,保存为excel文件简直不要太简单,每次有需要的时候点点运行,更改下需求(比如时间)就可以了,可是单纯的用pandas导出的表格却不太美观,这时我就接触到了一个新的库——openpyxl,这个库也可以往excel中写入数据,但个人还是喜欢用pandas来导出excel,再用openpyxl库来修改excel的样式。
openpyxl只支持对xlsx、xlsm文件进行读、写操作,不支持xls文件
# 所需要的库
import itertools
import pandas as pd
from openpyxl.styles import *
from openpyxl.utils import get_column_letter
1.导出excel文件
自行准备一份数据,这里采用的数据是双索引双表头的。
代码实现:
writer = pd.ExcelWriter('文件名.xlsx', engine='openpyxl')
data.to_excel(writer)
worksheet = writer.sheets['Sheet1'] # 默认创建的表格的工作簿名为Sheet1,若不需要进行openpyxl操作,可不写
用pandas导出的表格如下图:
可以发现这份表格看着着实不美观,想要实现的报表样式如下图:
2.隐藏或删除行、列
因为是双索引双表头的表格,导出都会有一行索引名的行,暂时没有找到方法怎么在导出的时候去掉,只能在后续实现删除该行或隐藏该行。
代码实现:
worksheet.delete_rows(3) # 删除单行
worksheet.delete_cols(3) # 删除单列
worksheet.delete_cols(6, 3) # 多列删除,从第六列开始,删除3列即(F:H),行类似
worksheet.row_dimensions[3].hidden = 1 # 隐藏行
worksheet.column_dimensions[3].hidden = 1 # 隐藏列
3.合并单元格并填入数据
代码实现:
worksheet.merge_cells('A1:A2')
worksheet['A1'].value = '部门'
worksheet.merge_cells('B1:B2')
worksheet['B1'].value = '姓名'
4.添加边框
因为pandas导出的表格除了表头处有明显的边框,其他地方都没有,所以需要通过添加边框来美化表格。
注意这里需要导入Border和Side两个函数
代码实现:
# 设置单元格边框
border_set = Border(Side(style='thin', color='FF000000'),
right=Side(style='thin', color='FF000000'),
top=Side(style='thin', color='FF000000'),
bottom=Side(style='thin', color='FF000000')) # style的参数有很多,可自行搜索
# 设置所有单元格边框
for i in range(1, worksheet.max_row + 1):
for j in range(1, worksheet.max_column + 1):
worksheet.cell(row=i, column=j).border