from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side, numbers
from openpyxl.formatting.rule import CellIsRule, FormulaRule
from openpyxl.utils import column_index_from_string
# 创建工作簿
wb = Workbook()
ws = wb.active
ws.title = "小李的美好生活"
# 表头数据
headers = ["年月", "服装服饰", "饮食", "水电气房租", "交通", "通信", "阅读培训", "社交应酬", "医疗保健", "休闲旅游", "个人兴趣", "公益活动", "总支出"]
# 表格数据行(简化示例,你可补充完整真实数据)
data = [
["2016年01月", 300, 800, 1100, 100, 100, 200, 80, 300, 0, 0, 0],
["2016年02月", 1200, 600, 900, 200, 300, 300, 20, 500, 0, 0, 0],
["2016年03月", 500, 750, 1000, 300, 200, 200, 0, 300, 0, 0, 0],
["2016年04月", 150, 900, 1000, 300, 100, 300, 200, 100, 0, 0, 0],
["2016年05月", 200, 800, 1500, 200, 200, 200, 100, 200, 0, 0, 0],
["2016年06月", 200, 850, 1100, 250, 100, 600, 200, 300, 0, 0, 0],
["2016年07月", 1100, 850, 1100, 300, 900, 300, 150, 0, 0, 0, 0],
["2016年08月", 1100, 850, 1100, 200, 0, 200, 100, 100, 0, 0, 0],
["2016年09月", 200, 900, 1000, 200, 0, 200, 150, 600, 0, 0, 0],
["2016年10月", 200, 900, 1200, 180, 0, 100, 100, 400, 0, 0, 0],
["2016年11月", 800, 1050, 1100, 350, 0, 500, 60, 200, 0, 0, 0],
["2016年12月", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
["月均开销", "", "", "", "", "", "", "", "", "", "", "", ""]
]
# 写入表头
ws.append(headers)
# 写入数据
for row in data:
ws.append(row)
# 步骤③:简化应用主题(设置字体、对齐等模拟)
# 设置标题行(第1行)格式
for cell in ws[1]:
cell.font = Font(size=14, bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center')
cell.fill = PatternFill(start_color='C0C0C0', end_color='C0C0C0', fill_type='solid')
cell.border = Border(left=Side(style='thin'), right=Side(style='thin'), top=Side(style='thin'), bottom=Side(style='thin'))
# 步骤④:设置货币类型(B3:M15,假设数据到15行 )
for row in ws.iter_rows(min_row=3, max_row=15, min_col=2, max_col=13):
for cell in row:
cell.number_format = '_($* #,##0_);_($* (#,##0);_($* "-"_);_(@_)'
# 步骤⑤:函数计算
# 计算每月总支出(M列,从第3行开始 )
for row_num in range(3, 15):
ws.cell(row=row_num, column=13, value=f'=SUM(B{row_num}:L{row_num})')
# 计算类别月均支出(假设放第15行,对应B15:L15 )
for col_num in range(2, 13):
ws.cell(row=15, column=col_num, value=f'=AVERAGE(B3:B14)')
# 计算每月平均总支出(M15 )
ws.cell(row=15, column=13, value='=AVERAGE(M3:M14)')
# 排序(按总支出列升序,A2:M14 )
# 先获取数据行,排序后重新写入(openpyxl排序较麻烦,这里简单模拟,实际可在Excel里操作或用其他方法 )
data_rows = list(ws.iter_rows(min_row=2, max_row=14, min_col=1, max_col=13))
data_rows.sort(key=lambda x: x[12].value)
for idx, row in enumerate(data_rows, start=2):
for col_idx, cell in enumerate(row, start=1):
ws.cell(row=idx, column=col_idx, value=cell.value)
# 步骤⑥:条件格式(简化模拟 )
# 单项开支>1000突出显示(B3:L14 )
for row in ws.iter_rows(min_row=3, max_row=14, min_col=2, max_col=11):
for cell in row:
if cell.value and cell.value > 1000:
cell.font = Font(color='FF0000', bold=True)
cell.fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid')
# 月总支出>月均总支出110%加粗倾斜(M3:M14 ,M15是月均 )
monthly_avg = ws.cell(row=15, column=13).value
for row_num in range(3, 15):
total_cell = ws.cell(row=row_num, column=13)
if total_cell.value and total_cell.value > monthly_avg * 1.1:
total_cell.font = Font(bold=True, italic=True)
# 步骤⑦:插入季度列
ws.insert_cols(2) # 在B列插入,原B列及后右移
ws.cell(row=1, column=2, value='季度') # 表头
# 填充季度公式(B3开始 )
for row_num in range(3, 15):
year_month = ws.cell(row=row_num, column=1).value
month = int(year_month[5:7])
quarter = (month - 1) // 3 + 1
ws.cell(row=row_num, column=2, value=f'{quarter}季度')
# 步骤⑧:复制工作表
new_ws = wb.copy_worksheet(ws)
new_ws.title = "按季度汇总"
# 删除月均开销行(假设是第15行 )
new_ws.delete_rows(15)
# 改变标签颜色(openpyxl设置标签颜色有限,可在Excel里手动改 )
# 步骤⑨:分类汇总(openpyxl难完全模拟交互版分类汇总,这里简单计算季度均值,实际可在Excel完成 )
# 先按季度列(B列 )排序
data_rows_new = list(new_ws.iter_rows(min_row=2, max_row=new_ws.max_row, min_col=1, max_col=new_ws.max_column))
data_rows_new.sort(key=lambda x: x[1].value)
for idx, row in enumerate(data_rows_new, start=2):
for col_idx, cell in enumerate(row, start=1):
new_ws.cell(row=idx, column=col_idx, value=cell.value)
# 简单计算季度各类开支均值(示例,可扩展 )
quarters = list(set([cell.value for cell in new_ws['B'][2:new_ws.max_row]]))
for quarter in quarters:
for col in range(3, 13): # 开支列
values = [new_ws.cell(row=r, column=col).value for r in range(2, new_ws.max_row) if new_ws.cell(row=r, column=2).value == quarter]
avg = sum(values)/len(values) if values else 0
# 可将结果写入新行,这里简单打印示意
print(f'季度{quarter},第{column_index_from_string(col)}列均值:{avg}')
# 保存工作簿
wb.save("小李的支出表_processed.xlsx")
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
from openpyxl.utils import column_index_from_string
# 创建工作簿等基础操作(同之前代码,补充完整数据后 )
wb = Workbook()
ws = wb.active
ws.title = "小李的美好生活"
# (省略数据写入、格式设置等之前的代码,确保数据准确,包含季度列、分类汇总前数据 )
# 假设已完成分类汇总前的所有处理,以下模拟分类汇总后的数据写入(示例,实际需按真实计算 )
summary_ws = wb["按季度汇总"]
# 手动补充分类汇总后的数据(这里仅示意,实际用分类汇总功能计算 )
summary_data = [
["季度", "服装服饰", "饮食", "水电气房租", "交通", "通信", "阅读培训", "社交应酬", "医疗保健", "休闲旅游", "个人兴趣", "公益活动", "总支出"],
["1季度", 400, 780, 1000, 200, 200, 230, 100, 250, 0, 0, 0, 3160],
["1季度 平均值", 400, 780, 1000, 200, 200, 230, 100, 250, 0, 0, 0, 3160],
# 继续补充其他季度及平均值数据...
]
for row in summary_data:
summary_ws.append(row)
# 保存工作簿,之后在Excel里手动完成步骤⑩
wb.save("小李的支出表_complete.xlsx")