excel-insert

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

📖 技能介紹


name: excel-insert description: | Safely insert rows or columns in Excel files. Supports inserting columns to the left/right of specified columns, or rows above/below specified rows. Custom header naming and fill content supported. 在 Excel 檔案中安全插入行或列。支援在指定列的左側/右側插入列,或在指定行的上方/下方插入行。可自定義表頭命名和填充內容。 Trigger keywords: "insert column" "add column" "insert row" "add row" "new column" 觸發詞包括"插入列""加一列""新增列""左邊加列""右邊加列""插入行""加一行""上面加行""下面加行""在第X列/行前/後插入"。


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

Excel Safe Insert (Row & Column) / Excel 安全插入(行列通用)

第零步:需求解析

自動識別插入型別 / Auto-detect Insert Type

從使用者原話中判斷要插入還是

使用者說 判定
"插入列""加一列""新增列""左邊""右邊""E列後面" → 列模式
"插入行""加一行""新增行""上面""下面""第5行後面" → 行模式

列模式解析

要素 常見表述 預設值
目標位置 "第5列左邊""E列右側""申請日後面" 必須明確
插入方向 "左邊""左側""前面" → left;"右邊""右側""後面" → right left
表頭命名 "叫xxx" → 指定 "新列" 或留空
填充內容 "填xxx" → 值/公式

行模式解析

要素 常見表述 預設值
目標位置 "第5行上面""第3行下面" 必須明確
插入方向 "上面""上方""前面" → above;"下面""下方""後面" → below above
填充內容 "填xxx" → 值/公式 空(留白行)

解析示例

使用者說 提取
"在E列左邊插入一列,叫'格式化日期'" 列模式, E列, left, 表頭='格式化日期'
"第5行下面加三行空行" 行模式, 第5行, below, 3行, 空
"申請日後面加一列" 列模式, 申請日(勘察定位), right

第一步:勘察

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

FILE = '目標檔案.xlsx'
size_mb = os.path.getsize(FILE) / 1024 / 1024
print(f'檔案大小: {size_mb:.1f} MB')

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, ws.max_column + 1):
    h = ws.cell(row=1, column=col_idx).value
    if h:
        col_letter = chr(64 + col_idx) if col_idx <= 26 else f'col{col_idx}'
        print(f'  列{col_idx} [{col_letter}]: {h}')

# 如果使用者用名稱定位 → 匹配列號或行號
target_idx = None  # 最終的列號或行號

# 列模式:定位列號
if MODE == 'column':
    if isinstance(target_spec, str):  # 使用者說的是列名
        for col_idx in range(1, ws.max_column + 1):
            if ws.cell(row=1, column=col_idx).value == target_spec:
                target_idx = col_idx
                print(f'\n定位: "{target_spec}" → 列{target_idx}')
                break
    else:
        target_idx = int(target_spec)  # 使用者直接給列號

# 行模式:定位行號
elif MODE == 'row':
    target_idx = int(target_spec) if isinstance(target_spec, int) else int(target_spec)

# 雙重掃描(檢查附近是否有公式)
print('\n=== 公式檢查 ===')
wb2 = load_workbook(FILE, data_only=True)
ws2 = wb2.active
if MODE == 'column':
    check_range = range(max(1, target_idx - 2), min(ws.max_column + 1, target_idx + 3))
else:
    check_range = range(1, ws.max_column + 1)  # 行模式檢查整行

for col_idx in check_range:
    for row_idx in range(max(1, target_idx - 2), min(ws.max_row + 1, target_idx + 3)) if MODE == 'row' else range(2, min(6, ws.max_row + 1)):
        v_raw = ws.cell(row=row_idx, column=col_idx).value
        if v_raw and isinstance(v_raw, str) and v_raw.startswith('='):
            print(f'  ⚠️ 列{col_idx}行{row_idx}: 公式 = {v_raw[:50]}')
wb2.close()

print(f'\n準備執行: {MODE}模式, 位置={target_idx}, 方向={DIRECTION}')

7w4.net收錄了海量優質技能外掛。

第二步:規劃

列模式

  • 插入點:DIRECTION == 'left'insert_cols(target_col)'right'insert_cols(target_col + 1)
  • 多列插入:從右到左

行模式

  • 插入點:DIRECTION == 'above'insert_rows(target_row)'below'insert_rows(target_row + 1)
  • 多行插入:從下到上(sorted(target_rows, reverse=True)

第三步:執行

import time
t0 = time.time()

# ===== 使用者配置 =====
MODE = 'column'       # 'column' 或 'row'
TARGET_IDX = None     # 目標列號或行號
DIRECTION = 'left'    # column: left/right; row: above/below
NEW_HEADER = None     # 僅列模式有效,None=留空
FILL_VALUE = None     # None=留空
AMOUNT = 1            # 插入數量(預設1)
# ====================

wb = load_workbook(FILE)
ws = wb.active
total_rows = ws.max_row
total_cols = ws.max_column

from openpyxl.styles import Font

if MODE == 'column':
    # 列插入邏輯
    insert_at = TARGET_IDX if DIRECTION == 'left' else TARGET_IDX + 1

    for i in range(AMOUNT):
        ws.insert_cols(insert_at)
        new_col = insert_at

        # 寫表頭
        if NEW_HEADER:
            header_text = f'{NEW_HEADER}{i+1}' if AMOUNT > 1 else NEW_HEADER
            ws.cell(row=1, column=new_col).value = header_text
            ws.cell(row=1, column=new_col).font = Font(name='Arial', size=10, bold=True)

        # 填充內容
        if FILL_VALUE is not None:
            for row in range(2, total_rows + 1):
                ws.cell(row=row, column=new_col).value = FILL_VALUE
                if row % 50000 == 0:
                    print(f'  進度: {row}/{total_rows}')

        print(f'已插入列{new_col} (原列{TARGET_IDX}的{DIRECTION})')

elif MODE == 'row':
    # 行插入邏輯
    insert_at = TARGET_IDX if DIRECTION == 'above' else TARGET_IDX + 1

    for i in range(AMOUNT):
        ws.insert_rows(insert_at)
        new_row = insert_at

        # 填充內容
        if FILL_VALUE is not None:
            for col in range(1, total_cols + 1):
                ws.cell(row=new_row, column=col).value = FILL_VALUE

        print(f'已插入行{new_row} (原行{TARGET_IDX}的{DIRECTION})')

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

if MODE == 'column':
    new_col = TARGET_IDX if DIRECTION == 'left' else TARGET_IDX + 1
    # 驗證表頭
    if NEW_HEADER:
        h = ws.cell(row=1, column=new_col).value
        print(f'新列表頭: "{h}" {"✓" if h == NEW_HEADER else "⚠️"}')
    # 驗證總列數
    print(f'總列數: {ws.max_column} (原{ws.max_column - AMOUNT} + {AMOUNT})')
    # 抽查
    for row in [2, ws.max_row // 2, ws.max_row]:
        v = ws.cell(row=row, column=new_col).value
        print(f'  行{row}: {repr(v)[:30] if v else "(空)"}')

elif MODE == 'row':
    new_row = TARGET_IDX if DIRECTION == 'above' else TARGET_IDX + 1
    print(f'總行數: {ws.max_row} (原{ws.max_row - AMOUNT} + {AMOUNT})')
    # 抽查新行的幾個列
    for col in [1, 2, min(3, ws.max_column)]:
        v = ws.cell(row=new_row, column=col).value
        print(f'  行{new_row}列{col}: {repr(v)[:30] if v else "(空)"}')

wb.close()

注意事項

  1. 列插入多列:從右到左處理
  2. 行插入多行:從下到上處理
  3. 公式引用:openpyxl 的 insert 會自動更新直接引用,但 INDIRECT/OFFSET 不會
  4. 合併單元格:插入位置與合併區域相交時,合併會自動擴充套件
  5. 操作前必備份:遵循 [[excel-safe-workflow]] 第零步——操作前自動備份(時間戳命名),成功後保留最新3份,失誤後立即刪除損壞檔案並從備份恢復

🤖 AI 評測

這是一份質量中等偏上的 Excel 輔助技能,流程設計完整、邏輯清晰,支援行列插入和自定義命名,對新手友好。但程式碼示例需要手動修改配置,對非技術使用者不夠友好;缺少自動備份功能與說明不符,操作安全風險需注意。總體適合有一定基礎的使用者使用。

📊 多維度評分

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

📁 包含檔案 (1 個)

📄 SKILL.md 8.1 KB