excel-format

👤 yyy 📦 v1.0.0 ⭐ 4.3 ⬇️ 157 下載
📄 辦公效率 免費

📖 技能介紹


name: excel-format description: | Uniformly adjust Excel file formatting — font, size, bold, italic, color, alignment (horizontal/vertical), column width, row height. Supports per-scope application: entire sheet, specified columns/rows, headers, data area, or condition-matched cells. 統一調整 Excel 檔案的格式樣式——字型、字號、加粗、斜體、顏色、對齊方式(水平/垂直)、列寬行高。支援按範圍應用:整表、指定列/行、表頭、資料區、或條件匹配的單元格。 Trigger keywords: "font" "bold" "italic" "center" "align" "column width" "row height" "change style" "format" "beautify" 觸發詞包括"字型""加粗""斜體""居中""對齊""列寬""行高""改樣式""格式化""美化表格"。


This skill follows [[excel-safe-workflow]] four-step method. Must complete Requirement Parsing→Scout before execution, and Verify after. 本技能遵循 [[excel-safe-workflow]] 四步法。執行前必須完成 需求解析→勘察,執行後驗證。

Excel Format Adjustment / Excel 格式調整

第零步:需求解析

自動識別格式需求 / Auto-detect Format Requirements

從使用者原話提取所有已明確的格式引數,只追問沒說到的。

要素 常見表述 預設值
字型 "微軟雅黑""Arial""Times New Roman" 不改變
字號 "12號""10pt""大一點" 不改變
加粗 "加粗""粗體""bold" 不改變
斜體 "斜體""italic" 不改變
顏色 "紅色""藍色""#FF0000" 不改變
水平對齊 "居中""靠左""靠右""兩端對齊" 不改變
垂直對齊 "上下居中""頂部對齊""底部對齊" 不改變
列寬 "列寬15""自適應""自動調整寬度" 不改變
行高 "行高20""自適應" 不改變
應用範圍 "表頭""全部""E列""第2-10行""資料區" all(整表)

解析示例

使用者說 提取
"表頭加粗居中,字型改成微軟雅黑 12號" 範圍=表頭, 加粗, 水平居中, 字型=微軟雅黑, 字號=12
"全部改成 Arial 10號,金額列右對齊" 範圍=全部+金額列, 字型=Arial, 字號=10, 金額列=右對齊
"標題行加粗,資料區垂直居中" 表頭=加粗, 資料區=垂直居中
"列寬全部自適應" 全部列, 自適應列寬
"把表格美化一下" 全部, 用預設美化方案

預設美化方案(使用者只說"美化"時啟用)/ Default Beautify Preset

7w4.net小蔥技能站,你的AI助手技能庫。

區域 格式
表頭(第1行) 加粗、水平居中、垂直居中、Arial 10pt
資料區(第2行起) 垂直居中、Arial 10pt
所有列 自適應列寬

第一步:勘察

import os, sys
sys.stdout.reconfigure(encoding='utf-8')
from openpyxl import load_workbook

FILE = '目標檔案.xlsx'

wb = load_workbook(FILE)
ws = wb.active
print(f'工作表: {ws.title}, 行: {ws.max_row}, 列: {ws.max_column}')

# 展示當前樣式狀態
print('\n=== 當前格式 ===')
for col_idx in range(1, min(ws.max_column + 1, 8)):
    cell = ws.cell(row=1, column=col_idx)
    col_letter = chr(64 + col_idx) if col_idx <= 26 else f'col{col_idx}'
    print(f'  列{col_letter}表頭: font={cell.font.name}/{cell.font.size}, '
          f'bold={cell.font.bold}, align={cell.alignment.horizontal}')

# 確認操作範圍
print(f'\n格式應用範圍: {SCOPE}')
print(f'格式引數: {FORMAT_SPEC}')

第二步:執行

import time
t0 = time.time()
from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment, PatternFill

# ===== 使用者配置 =====
FILE = '目標檔案.xlsx'
SCOPE = 'all'           # 'all' / 'header' / 'data' / 'columns' / 'rows' / 'range'

# 字型配置(None = 不改變)
FONT_NAME = 'Arial'     # None 或字型名
FONT_SIZE = 10          # None 或數字
FONT_BOLD = None        # True / False / None
FONT_ITALIC = None      # True / False / None
FONT_COLOR = None       # 'FF0000'(紅) / '000000'(黑) / None

# 對齊配置(None = 不改變)
H_ALIGN = None          # 'center' / 'left' / 'right' / 'justify' / None
V_ALIGN = None          # 'center' / 'top' / 'bottom' / None

# 列寬行高(None = 不改變)
COL_WIDTH = None        # 數字 或 'auto'(自適應)
ROW_HEIGHT = None       # 數字 或 'auto'

# 範圍限定
HEADER_ROW = 1          # 表頭行號
DATA_START = 2          # 資料起始行
TARGET_COLS = None      # None=全部列, [1,2,5]=指定列
TARGET_ROWS = None      # None=全部行(配合SCOPE), [(2,10)]=指定行範圍
# ====================

wb = load_workbook(FILE)
ws = wb.active

def build_font():
    """構建字型物件"""
    kwargs = {}
    if FONT_NAME is not None: kwargs['name'] = FONT_NAME
    if FONT_SIZE is not None: kwargs['size'] = FONT_SIZE
    if FONT_BOLD is not None: kwargs['bold'] = FONT_BOLD
    if FONT_ITALIC is not None: kwargs['italic'] = FONT_ITALIC
    if FONT_COLOR is not None: kwargs['color'] = FONT_COLOR
    return Font(**kwargs) if kwargs else None

def build_alignment():
    """構建對齊物件"""
    kwargs = {}
    if H_ALIGN is not None: kwargs['horizontal'] = H_ALIGN
    if V_ALIGN is not None: kwargs['vertical'] = V_ALIGN
    return Alignment(**kwargs) if kwargs else None

new_font = build_font()
new_align = build_alignment()

# 確定操作範圍
cols_to_process = TARGET_COLS if TARGET_COLS else list(range(1, ws.max_column + 1))

if SCOPE == 'all':
    rows_to_process = range(1, ws.max_row + 1)
elif SCOPE == 'header':
    rows_to_process = [HEADER_ROW]
elif SCOPE == 'data':
    rows_to_process = range(DATA_START, ws.max_row + 1)
elif SCOPE == 'columns':
    rows_to_process = range(1, ws.max_row + 1)
elif SCOPE == 'rows':
    rows_to_process = TARGET_ROWS if TARGET_ROWS else range(1, ws.max_row + 1)

# 應用格式
count = 0
for row in rows_to_process:
    for col in cols_to_process:
        cell = ws.cell(row=row, column=col)
        if new_font:
            # 合併現有字型屬性(只覆蓋指定項)
            existing = cell.font
            kwargs = {'name': FONT_NAME if FONT_NAME else existing.name,
                      'size': FONT_SIZE if FONT_SIZE else existing.size,
                      'bold': FONT_BOLD if FONT_BOLD is not None else existing.bold,
                      'italic': FONT_ITALIC if FONT_ITALIC is not None else existing.italic,
                      'color': FONT_COLOR if FONT_COLOR else existing.color}
            cell.font = Font(**kwargs)
        if new_align:
            cell.alignment = new_align
        count += 1
    if row % 50000 == 0:
        print(f'  進度: {row}/{ws.max_row}')

print(f'已格式化 {count} 個單元格')

# 列寬
if COL_WIDTH == 'auto':
    # 用 pandas 快速計算每列最大寬度(比 openpyxl 逐格掃快 100 倍)
    import pandas as pd, numpy as np
    from openpyxl.utils import get_column_letter

    df = pd.read_excel(FILE)
    for col_idx in cols_to_process:
        col_name = df.columns[col_idx - 1]
        # 取前 5000 行 + 隨機抽樣 1000 行估算最大寬度
        sample = df[col_name].dropna().head(5000).astype(str)
        if len(sample) == 0:
            continue
        # 中文字元算 2 寬度,其餘算 1
        def char_width(s):
            return sum(2 if ord(c) > 127 else 1 for c in str(s))
        max_len = sample.apply(char_width).max()
        # 表頭也參與計算
        header_len = char_width(str(col_name))
        max_len = max(max_len, header_len)
        col_letter = get_column_letter(col_idx)
        ws.column_dimensions[col_letter].width = min(max_len + 3, 50)
elif COL_WIDTH is not None:
    from openpyxl.utils import get_column_letter
    for col_idx in cols_to_process:
        ws.column_dimensions[get_column_letter(col_idx)].width = COL_WIDTH

# 行高
if ROW_HEIGHT == 'auto':
    for row in rows_to_process:
        ws.row_dimensions[row].height = None  # Excel 自動計算
elif ROW_HEIGHT is not None:
    for row in rows_to_process:
        ws.row_dimensions[row].height = ROW_HEIGHT

print(f'\n儲存中...')
wb.save(FILE)
print(f'完成,耗時 {time.time()-t0:.1f}s')

第三步:驗證

wb = load_workbook(FILE, read_only=True, data_only=True)
ws = wb.active

# 驗證表頭格式
cell = ws.cell(row=1, column=1)
print(f'表頭字型: {cell.font.name}/{cell.font.size}pt')
print(f'表頭加粗: {cell.font.bold}')
print(f'表頭對齊: {cell.alignment.horizontal}/{cell.alignment.vertical}')

# 驗證資料區
cell2 = ws.cell(row=2, column=1)
print(f'資料字型: {cell2.font.name}/{cell2.font.size}pt')

# 驗證列寬
if ws.column_dimensions['A'].width:
    print(f'A列寬: {ws.column_dimensions["A"].width}')

wb.close()
print('✅ 驗證完成')

常用預設 / Common Presets

專業報表風 / Professional Report

FONT_NAME='Arial', FONT_SIZE=10, FONT_BOLD=True(header)
H_ALIGN='center'(header+data), V_ALIGN='center'
COL_WIDTH='auto'

中文文件風 / Chinese Document

FONT_NAME='微軟雅黑', FONT_SIZE=11
FONT_BOLD=True(header), H_ALIGN='center'(header)
V_ALIGN='center', COL_WIDTH='auto'

僅加粗居中表頭 / Bold+Center Header Only

SCOPE='header', FONT_BOLD=True, H_ALIGN='center', V_ALIGN='center'

注意事項

  1. 列寬自適應對中文友好(中文字元計 2 寬度),上限 40 字元
  2. 字型可用性取決於 Excel 開啟時的系統,Arial/微軟雅黑 一般都有
  3. 合併單元格中的格式需單獨處理
  4. 格式疊加:None 的引數不會被修改,保留原有格式
  5. 操作前必備份:遵循 [[excel-safe-workflow]] 第零步——操作前自動備份(時間戳命名),成功後保留最新3份,失誤後立即刪除損壞檔案並從備份恢復

🤖 AI 評測

這個 Skill 文件質量不錯,中英文說明清晰,流程規範,但缺少可直接執行的示例檔案,初次使用需要一定學習成本。程式碼考慮了中文字元和效能最佳化這些細節值得肯定。功能覆蓋了常用的格式調整需求,基本能滿足日常使用,但複雜場景(如條件匹配)支援有限。總體來說,這是一箇中規中矩的格式調整工具,中文使用者友好度較好。

📊 多維度評分

適應性4.2
規範性4.4
有效性4.4
可靠性3.9
可信度5

📁 包含檔案 (1 個)

📄 SKILL.md 9.6 KB