本技能用于按照博维管理咨询公司的Excel行文格式标准来创建、修改和审阅Excel表格。
博维的Excel规范追求的核心目标是:打印出来清晰美观、任何人拿到都能看懂、数据可回溯可验证。
> 前置依赖: 使用本技能前,需确保已安装 openpyxl:
> ```bash
> C:\Users\Lenovo\.workbuddy\binaries\python\envs\default\Scripts\pip install openpyxl
> ```
> 运行 Python 脚本时使用:
> ```bash
> C:\Users\Lenovo\.workbuddy\binaries\python\envs\default\python.exe script.py
> ```
> 在使用本技能之前,先阅读通用 xlsx skill(xlsx/SKILL.md)获取openpyxl的基础用法和通用最佳实践。
> 本技能中的规则在与通用xlsx skill冲突时,以本技能为准。
openpyxl 实现要点:
from openpyxl.styles import Font, Alignment, PatternFill
title_font = Font(name='黑体', size=20, bold=True)
title_align = Alignment(horizontal='center', vertical='center', wrap_text=True)
# 合并标题行覆盖所有数据列
ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=last_col)
ws['A1'].font = title_font
ws['A1'].alignment = title_align
由于openpyxl单个单元格只能设置一种字体,按以下规则处理:
Font(name='仿宋', size=12)Font(name='Times New Roman', size=12)Font(name='仿宋', size=12)Font(name='Times New Roman', size=12) 并通过 ws.sheet_properties 设置默认字体header_font = Font(name='黑体', size=12)
header_align = Alignment(horizontal='center', vertical='center')
header_border = Border(
left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin')
)
Font(name='仿宋', size=12)Font(name='Times New Roman', size=12) 或 Font(name='仿宋', size=12)horizontal='left')horizontal='center')vertical='center')用于两个场景:
规则:
RGB: C00000)from openpyxl.styles import PatternFill
# 突出色
highlight_font = Font(name='仿宋', size=12, bold=True, color='C00000')
highlight_fill = PatternFill(start_color='FFF2CC', end_color='FFF2CC', fill_type='solid')
# 注意:theme色在openpyxl中不易直接使用,用近似RGB替代
# theme 7 tint 0.8 ≈ FFF2CC(浅黄)
# 暗红 = C00000
(1) 公司/单位名称与日期
(2) 表头布局
(3) 数字格式
number_format = '#,##0')number_format = '#,##0.00')number_format = '0.00%' 或 '0.0%')number_format = 'YYYY-MM-DD')(4) 消除错误值
#DIV/0!, #N/A, #REF! 等)"-"IF/IFNA/IFERROR 消除错误值=IF(ISERROR(A1/B1),0,A1/B1) 或 =IFERROR(A1/B1,0)在openpyxl中生成公式时,始终包裹IFERROR:
# 不要写:ws['F2'] = '=A2/B2'
# 要写:
ws['F2'] = '=IFERROR(A2/B2,"-")'
(5) 公式标注列
购股金额=A*3(万元)from openpyxl.styles import Border, Side
thin_border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
博维制表不仅关注最终呈现,更强调Excel文件作为"工作底稿"的可追溯性和可读性。
在为咨询项目制作测算表、分析模型时,遵循以下原则:
将数据处理过程分为三个区域,尽量用三张独立的工作表(Sheet)来组织:
=Sheet_Working!B1),不再包含独立公式。实际操作:
Input/取数区、Working/运算区、Output/输出区=单元格引用 进行取数,而不是复制粘贴和手打数值在openpyxl中:当需要在不同Sheet间引用数据时,在输出Sheet写公式引用运算Sheet的结果:
ws_output['B2'] = "=Working!B10"
y/n 优于 1/0)日期+文件标题+版本号生成的Excel文件应该考虑打印友好性:
# 设置打印区域
ws.print_area = f'A1:{get_column_letter(last_col)}{last_row}'
# 页面设置
ws.page_setup.orientation = 'landscape' # 或 'portrait',视表格宽度
ws.page_setup.paperSize = ws.PAPERSIZE_A4
ws.page_setup.fitToWidth = 1
ws.page_setup.fitToHeight = 0 # 不限制高度
ws.sheet_properties.pageSetUpPr.fitToPage = True
# 页边距(厘米转英寸)
ws.page_margins.left = 0.75
ws.page_margins.right = 0.75
ws.page_margins.top = 1.0
ws.page_margins.bottom = 1.0
# 冻结首行(表头)
ws.freeze_panes = 'A2' # 或表头下一行
import openpyxl
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "股权分配表"
# === 样式定义 ===
title_font = Font(name='黑体', size=20, bold=True)
title_align = Alignment(horizontal='center', vertical='center', wrap_text=True)
header_font = Font(name='黑体', size=12)
header_align = Alignment(horizontal='center', vertical='center')
body_font_cn = Font(name='仿宋', size=12) # 中文内容
body_font_en = Font(name='Times New Roman', size=12) # 英文/数字内容
highlight_font = Font(name='仿宋', size=12, bold=True, color='C00000')
highlight_fill = PatternFill(start_color='FFF2CC', end_color='FFF2CC', fill_type='solid')
thin_border = Border(
left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin')
)
center_align = Alignment(horizontal='center', vertical='center')
left_align = Alignment(horizontal='left', vertical='center')
# === 1. 标题 ===
last_col = 10 # J列
ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=last_col)
ws['A1'] = 'XX企业股权分配表'
ws['A1'].font = title_font
ws['A1'].alignment = title_align
ws.row_dimensions[1].height = 25
# === 2. 副标题行(公司名 + 日期) ===
ws['A2'] = '公司:XX有限公司'
ws['A2'].font = Font(name='Times New Roman', size=12, color='C00000')
ws['A2'].fill = highlight_fill
ws['A2'].alignment = left_align
ws[f'{get_column_letter(last_col-1)}2'] = '设计日期:2025年3月30日'
ws[f'{get_column_letter(last_col-1)}2'].font = Font(name='宋体', size=12)
ws[f'{get_column_letter(last_col-1)}2'].alignment = left_align
# === 3. 表头 ===
headers = ['序号', '姓名', '部门', '职位', '入职日期', '工龄(年)',
'月薪(元)', '拟分配股份数(万股)', '股份占比', '备注']
for col_idx, h in enumerate(headers, 1):
cell = ws.cell(row=3, column=col_idx, value=h)
cell.font = header_font
cell.alignment = header_align
cell.border = thin_border
# === 4. 数据行(示例) ===
# ... 填入数据,根据内容类型选择 body_font_cn 或 body_font_en
# ... 所有数据单元格设置 thin_border 和 center_align
# === 5. 合计行 ===
# sum_row 的关键列使用 highlight_font + highlight_fill + thin_border
# === 6. 公式标注行 ===
# 在合计行下方加标注:如 "购股金额=A*3(万元)"
# === 7. 数字格式 ===
# 金额列: cell.number_format = '#,##0'
# 百分比列: cell.number_format = '0.00%'
# 日期列: cell.number_format = 'YYYY-MM-DD'
# === 8. 列宽调整 ===
# 根据内容自适应或手动设置合理列宽
# === 9. 打印设置 ===
ws.page_setup.orientation = 'landscape'
ws.page_setup.paperSize = ws.PAPERSIZE_A4
当审阅已有Excel文件是否符合博维标准时,按以下清单逐项检查:
#DIV/0!、#N/A、#REF! 等错误?0值是否显示为"-"?共 1 个版本