import openpyxl
from openpyxl.chart.series import Series
from openpyxl.styles import Font,Alignment,NamedStyle,PatternFill
from openpyxl.chart import BarChart,Reference
# 可以参考: https://blog.csdn.net/xiaomage0511/article/details/124166836
wb = openpyxl.load_workbook(filename="test02.xlsx")
sheet = wb.get_sheet_by_name('Sheet1')
sheet['A3'] = 'bobo'
# 设置字体,name表示字体如:宋体,color必须是16进制的argb ,sz表示大小,b表示加粗,i表示斜体
f = Font(name="MV Boli",sz=14,b=True,i=True,color="6d2f2a")
# sheet['A3'].font = f #可以单独去设置,那就不需要去设置style
# sheet = wb.active
# cell = sheet.cell()
# 对齐方式,horizontal水平对齐
a = Alignment(horizontal="right")
# sheet['A3'].alignment = a #可以单独去赋值
# 背景填充
p = PatternFill(patternType="solid",fgColor="e03814")
# sheet['A3'].fill = p
# 公式计算,跟写入数据一样的,但是读取的时候需要设置在 load_workbook中设置read_only=True
sheet['E2'] = '=SUM(B2:C2)'
# 添加筛选
# sheet.auto_filter.ref = "A1:C1" # 添加筛选的表头
# sheet.auto_filter.add_filter_column(1,[10,20]) # 添加筛选列对应的值
# sheet.auto_filter.add_filter_column(0,["王新"])
# 排序 ref指定排序、过滤的范围 ,目前有bug,需要人为的手工去确认保存下
sheet.auto_filter.ref = "A1:C6"
sheet.auto_filter.add_sort_condition("B2:B6", descending=True)
# 设置列宽度和行高 row_dimensions 返回一个字典,key为行号
sheet.row_dimensions[1].height=50
sheet.column_dimensions["A"].width=100
# 单元格的拆分和合并
sheet.merge_cells("D1:F6")
sheet["D1"]=30 # 给左上角的赋值
print(sheet["D1"].value) # 为 30
print(sheet["D2"].value) # 为 None
sheet.unmerge_cells("D1:F6")
# 冻结窗格
"""
在 OpenPyXL 中,每个 Worksheet 对象都有一个 freeze_panes 属性,可以设置为一个 Cell 对象或一个单元格坐标的字符串。
请注意,单元格上边的所有行和左边的所有列都会冻结,但单元格所在的行和列不会冻结
"""
sheet.freeze_panes = "A2" # 冻结第一行
# 解冻结 sheet.freeze_panes = "A1" 或者None
sheet.freeze_panes = None
# 创建柱状图
# sheet = wb.active
chart1= BarChart()
chart1.type = "col" # 设置图表属性,type 为 col 为列状图,bar 为水平图
chart1.title = "销量柱状图"
chart1.y_axis.title = '序号'
chart1.x_axis.title = '年龄和身高'
data = Reference(worksheet=sheet,min_row=1,max_row=6,min_col=1,max_col=3) # 取出数据范围
chart1.add_data(data,titles_from_data=True)
series = Reference(sheet, min_col=4, min_row=2, max_row=6) # 设置横坐标的值,如果只设置min_col则,max_col=min_col
chart1.set_categories(series)
sheet.add_chart(chart1, "A10")
# style相当于是对 Font,Alignment,PatternFill等的一个整合
# 将上方的字体,背景,对齐方式整合到一起
s = NamedStyle(font=f,alignment=a,fill=p)
sheet['A3'].style = s
wb.save('test02_style.xlsx')