Documents

excel-format-optimizer

Try it

Excel 格式优化工具:提升字体可读性、统一边框样式、调整列宽行高和缩放比例。当用户提到 Excel 字体太小、阅读体验差、边框太丑、格式需要美化、表格不好看时触发。适用于 Windows 桌面端阅读场景。

What it does

Excel 格式优化工具:提升字体可读性、统一边框样式、调整列宽行高和缩放比例。当用户提到 Excel 字体太小、阅读体验差、边框太丑、格式需要美化、表格不好看时触发。适用于 Windows 桌面端阅读场景。

The skill document

Excel 格式优化器

针对已有 Excel 文件进行格式优化,重点解决 字体太小、边框不统一、列宽不合理、无缩放设置 等桌面端阅读体验问题。

适用场景

  • 用户收到他人制作的 Excel,字体太小看不清
  • 表格边框风格混乱(有的有框有的没框、粗细不一)
  • 需要统一字体、字号、列宽、行高
  • 需要调整缩放比例和视图设置

前置条件

openpyxl 安装

openpyxl 通常不在默认环境中,需要安装:

# 国内环境 pypi.org 经常超时,直接用清华镜像
cd "C:\Users\17551\.workbuddy\binaries\python\envs\default"
./Scripts/pip.exe install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 30

Python 运行时

使用 managed Python(非系统 Python):

C:\Users\17551\.workbuddy\binaries\python\envs\default\Scripts\python.exe

工作流程

第 1 步:诊断现有格式

先读取文件,全面了解当前格式状态,不要跳过这一步直接改

import openpyxl

wb = openpyxl.load_workbook(path)
for sn in wb.sheetnames:
    ws = wb[sn]
    # 检查:max_row, max_column, merged_cells
    # 检查:column_dimensions(列宽)
    # 检查:row_dimensions(行高)
    # 检查:每个单元格的 font(name, size, bold, color)
    # 检查:每个单元格的 alignment(horizontal, vertical, wrap_text)
    # 检查:fill(start_color, patternType)
    # 检查:border(left/right/top/bottom 的 style)
    # 检查:sheet_view.zoomScale, freeze_panes

关键检查项:

  1. 字体大小分布(找出最小和最大字号)
  2. 字体是否混用(如 Aptos + 宋体)
  3. 哪些列没有设置宽度(会显示默认窄列)
  4. 边框风格是否统一(thin/medium 混用、部分单元格无框)
  5. 是否有合并单元格(修改时需特别注意)
  6. 是否有公式(必须保留,不能误删)

第 2 步:制定优化方案

根据诊断结果,确定优化策略。以下是推荐默认值:

字体优化

原字号新字号说明
>= 1822主标题
>= 1618小标题/总分
>= 1012正文
>= 911脚注
< 912异常小字
  • Windows 环境:统一字体为 微软雅黑(渲染清晰、兼容性好)
  • Mac 环境:统一字体为 PingFang SC

列宽优化

  • 根据 sheet 内容和列数,为每一列设置合理宽度
  • 必须检查:有些列在原文件中没有设置 column_dimensions,需要手动补齐
  • 正文列宽度建议 20-30,长文本列 50-100,编号/序号列 8-12

行高优化

  • 按原行高 × 1.25 放大(适配更大字号)
  • 如原行高未设置(None),给默认值 20

缩放比例

  • 设为 110%(sheet_view.zoomScale = 110

冻结窗格(谨慎使用)

  • 重要教训:冻结窗格可能导致用户打开文件后体验异常(冻结行数过多占屏)
  • 如需设置,只冻结表头行(1-2 行),不要冻结多行
  • 建议默认不设置,除非用户明确要求

第 3 步:执行优化

import openpyxl
from openpyxl.styles import Font, Alignment, Border, Side, PatternFill
from copy import copy

wb = openpyxl.load_workbook(src)

TARGET_FONT = '微软雅黑'  # Windows

def new_font_size(old_size):
    if old_size >= 18:
        return 22
    elif old_size >= 16:
        return 18
    elif old_size >= 10:
        return 12
    elif old_size >= 9:
        return 11
    else:
        return 12

for sn in wb.sheetnames:
    ws = wb[sn]

    # 1. 遍历所有单元格,更新字体和字号
    for row in ws.iter_rows(min_row=1, max_row=ws.max_row, max_col=ws.max_column):
        for cell in row:
            f = cell.font
            cell.font = Font(
                name=TARGET_FONT,
                size=new_font_size(f.size),
                bold=f.bold,
                italic=f.italic,
                color=f.color.rgb if f.color else 'FF222222',
                underline=f.underline,
                strike=f.strike,
                vertAlign=f.vertAlign
            )
            # 保留原有对齐方式,但确保 vertical 和 wrap_text 有值
            a = cell.alignment
            cell.alignment = Alignment(
                horizontal=a.horizontal,
                vertical=a.vertical if a.vertical else 'center',
                wrap_text=a.wrap_text if a.wrap_text is not None else True,
                text_rotation=a.text_rotation,
                indent=a.indent,
                shrink_to_fit=a.shrink_to_fit
            )

    # 2. 设置列宽(每个 sheet 不同)
    col_widths = {...}  # 根据诊断结果设置
    for col, width in col_widths.items():
        ws.column_dimensions[col].width = width

    # 3. 放大行高
    for row_num in range(1, ws.max_row + 1):
        rd = ws.row_dimensions.get(row_num)
        if rd and rd.height:
            ws.row_dimensions[row_num].height = round(rd.height * 1.25, 1)

    # 4. 设置缩放
    ws.sheet_view.zoomScale = 110
    ws.sheet_view.zoomScaleNormal = 110

wb.save(dst)

第 4 步:边框美化(按需)

当用户反馈"边框太丑"时,对特定区域进行边框统一:

thin = Side(style='thin', color='FFD9D9D9')      # 浅灰细线
medium = Side(style='medium', color='FFAAAAAA')   # 中灰粗线
header_fill = PatternFill(start_color='FFF2F2F2', end_color='FFF2F2F2', patternType='solid')

# 遍历目标区域,统一边框
for row in ws.iter_rows(min_row=start, max_row=end, min_col=1, max_col=max_col):
    for cell in row:
        top, bottom, left, right = thin, thin, thin, thin
        # 区块标题行:加粗上下边框 + 浅灰底色
        if cell.row in header_rows:
            top, bottom = medium, medium
            cell.fill = header_fill
        # 最后行:底部加粗
        if cell.row == last_row:
            bottom = medium
        cell.border = Border(left=left, right=right, top=top, bottom=bottom)

边框美化原则:

  • 使用浅灰色(#D9D9D9 / #AAAAAA)代替默认黑色,视觉更柔和
  • 数据行统一细边框,区块标题用粗边框分隔
  • 合并单元格区域加浅灰底色突出分区

第 5 步:验证

保存后必须验证:

wb2 = openpyxl.load_workbook(dst)
for sn in wb2.sheetnames:
    ws = wb2[sn]
    # 1. 验证公式未丢失
    for row in ws.iter_rows():
        for cell in row:
            if cell.value and isinstance(cell.value, str) and cell.value.startswith('='):
                print(f'{cell.coordinate}: {cell.value}')
    # 2. 验证合并单元格
    print(f'Merged: {list(ws.merged_cells.ranges)}')
    # 3. 验证字体
    print(f'Font: {ws["A1"].font.name}, sz={ws["A1"].font.size}')
    # 4. 验证缩放
    print(f'Zoom: {ws.sheet_view.zoomScale}')

踩坑记录与避坑指南

坑 1:pypi.org 超时

现象pip install openpyxl 超时失败,报 ReadTimeoutErrorSSLEOFError

原因:国内网络访问 pypi.org 不稳定

解决:使用清华镜像

./Scripts/pip.exe install openpyxl -i https://pypi.tuna.tsinghua.edu.cn/simple --timeout 30

坑 2:文件被占用导致 PermissionError

现象wb.save(path)PermissionError: [Errno 13] Permission denied

原因:文件正在被腾讯文档编辑器或 Excel 打开预览,文件锁未释放

解决:另存为新文件名(如 _v2.xlsx),不要尝试关闭用户的编辑器

dst = path.replace('.xlsx', '_v2.xlsx')
wb.save(dst)

坑 3:冻结窗格导致体验问题

现象:设置 freeze_panes 后,用户打开文件反馈"出现冻结情况"

原因:冻结行数过多(如冻结了 8 行含标题+信息行+表头),占据大量屏幕空间

解决

  • 默认不设置冻结窗格
  • 如用户要求,只冻结 1-2 行表头
  • 用户反馈后立即移除:ws.freeze_panes = None

坑 4:openpyxl 不保留公式计算结果

现象:用 openpyxl 保存后,公式单元格可能显示为 0 或空白

原因:openpyxl 保存公式为字符串,不计算结果。需要 Excel/WPS 打开后自动重算

解决

  • 不要用 data_only=True 加载(会把公式替换为值并永久丢失公式)
  • 保存后提醒用户用 Excel/WPS 打开即可自动重算
  • 如需验证公式值,使用 xlsx skill 中的 scripts/recalc.py(需要 LibreOffice)

坑 5:字体名混用

现象:原文件中不同单元格使用不同字体(如 Aptos + 宋体),统一后仍有残留

解决:遍历所有单元格强制设置 name=TARGET_FONT,不要只改部分

坑 6:部分列没有设置宽度

现象:优化后发现某些列仍然很窄

原因:原文件中部分列的 column_dimensions 未设置,openpyxl 不会自动补齐

解决:在诊断阶段检查所有列是否有宽度设置,对缺失的列手动赋值

输出文件命名

  • 优化版:{原文件名}_优化版.xlsx
  • 如遇文件锁:{原文件名}_优化版_v2.xlsx(递增版本号)

优化检查清单

  • 所有单元格字体已统一为目标字体
  • 正文字号 >= 12pt
  • 所有列都有明确的宽度设置
  • 行高已按比例放大
  • 缩放比例已设置(110%)
  • 公式全部保留(未丢失)
  • 合并单元格未受损
  • 边框风格统一(无残留旧样式)
  • 文件可正常打开(无损坏)

Related skills

Excel全能工具箱:读写、预览、合并、拆分、关联、去重、清洗、校验、模板填充、样式、条件格式、公式、图表、透视表、数据分析、差异对比、图片插入、密码保护。典型场景:月度业务报表合并汇总、HR花名册/考勤表关联清洗、运营数据透视分析、绩效数据校验去重、批量生成offer/通知模板、薪酬表加密保护、业务周报图表生成。触发词:Excel、表格、xlsx、csv、电子表格、合并Excel、拆分Excel、Excel图表、数据透视表、Excel公式、条件格式、数据清洗、Excel模板、Excel对比、Excel加密、VLOOKUP、去重、数据校验、统计分析、格式转换、业务报表、花名册、考勤表、绩效数据、运营数据、excel toolbox、spreadsheet、merge excel、split excel、excel chart、pivot table。即使用户没有明说'用Excel工具箱',只要涉及Excel/表格/xlsx/csv文件的操作都应触发。不适用:在线协作编辑(用Google Sheets等在线工具)、纯代码开发、Skill管理。

1 installs

优化 EPUB 文件的阅读体验:重写 CSS、统一中英文双语段落排版、强制字体(如 LXGW WenKai)、美化代码块与表格、解决阅读器白底白字问题。当用户需要美化/优化 EPUB 排版、修复 EPUB 显示异常、调整 EPUB 字体或颜色时调用。

1 installs

从自然语言描述生成Excel公式,诊断表格错误,支持VLOOKUP、条件求和等常用函数。Use when 需要文本翻译、多语言转换、本地化处理时使用。不适用于专业医学法律翻译认证。适用于独立开发者、企业团队和自动化工作流场景。支持中文交互,无需复杂配置即开即用。输出结果可直接使用,减少二次加工成本。

1 installs

Convert Excel (.xlsx) sign-in sheets and rosters to print-ready A4 PDFs with Chinese font support. Use when the user needs to (1) convert an Excel table/rost...

Excel 工具(免费版)面向个人用户与独立开发者,提供 Excel 文件的基础处理能力:读取、写入、数据清洗、公式计算与基础统计。通过 openpyxl 与 pandas 等标准库操作 xlsx 文件,无需安装 Microsoft Excel。Use when 需要数据分析、报表生成、统计洞察、数据可视化时使用。不适用于实时流数据处理.

1 installs

结构化整理层级型 Excel 表格(.xlsx),处理父子层级关系、向下填充、分组首行显示、筛选优化。当用户上传 Excel 文件并要求「结构化整理」「填充数据」「整理表格」「整理测试用例」「清理表格格式」时使用。

1 installs