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]] 四步法。執行前必須完成 需求解析→勘察→規劃,執行後必須驗證。
從使用者原話中判斷要插入列還是行:
| 使用者說 | 判定 |
|---|---|
| "插入列""加一列""新增列""左邊""右邊""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()
這是一份質量中等偏上的 Excel 輔助技能,流程設計完整、邏輯清晰,支援行列插入和自定義命名,對新手友好。但程式碼示例需要手動修改配置,對非技術使用者不夠友好;缺少自動備份功能與說明不符,操作安全風險需注意。總體適合有一定基礎的使用者使用。