Jasper.W

word-document-organizer

办公效率v1.0.1
作者:Jasper.W更新于 2026-05-18共 2 个版本 · 最新版本发布于 2026-03-10@clawhub_okgptai/word-document-organizer
文档处理#Document#Word#Microsoft Office#文档

据 AlphaMoat 统计,截至 2026-09,word-document-organizer 累计下载 4,302 次、获 3 个星标,在全部 5,078 个 AI 技能中排名第 2,290 位,在「办公效率」分类(435 个)中排名第 195 位。

累计安装
631
累计下载
4,302
星标
3
全站排名
#2,290
全站前 46% · 「办公效率」前 45%
平台累计安装累计下载星标评论
ClawHub ↗582,1232-
SkillHub ↗6314,3023—

各平台的计数口径不同,统计时间不一致。

这个技能是做什么的

接收 docx 的完整路径,按学术、商务或极简模板统一标题层级与正文样式,并生成目录。学术模板用宋体、层级分明,适合论文与报告。依赖 python-docx,缺库时会先补装,处理过程会记录变更。

资料发布于 2026-10-27

可以用来做什么

  • 把散乱排版的论文统一成学术样式
  • 给长报告补一份自动目录

什么时候用

  • 收到的文档格式混乱时
  • 要按模板批量统一外观时

示例提示词

以下是根据技能文档生成的示例,不代表实际运行结果。

把这份论文按学术模板排版并加目录
统一这份报告的标题层级

月度数据趋势

累计下载4,302
1,0712,8064,5412026-03 · 累计下载 1,3102026-05 · 累计下载 2,2522026-06 · 累计下载 2,5262026-07 · 累计下载 2,9782026-08 · 累计下载 3,3812026-09 · 累计下载 4,30226-0326-09
星标3
2332026-03 · 星标 22026-05 · 星标 32026-06 · 星标 32026-07 · 星标 32026-08 · 星标 32026-09 · 星标 326-0326-09

2026-09 起统计方法调整:同名技能按作者分别统计,并覆盖全部技能。图中虚线为调整前的月份,与之后的数据不直接比较,也不计算跨越调整的增长。

月份累计下载环比星标
2026-094,302—3
2026-083,381+13.5%3
2026-072,978+17.9%3
2026-062,526+12.2%3
2026-052,252—3
2026-031,310—2

SKILL.md 原文

以下是作者发布的原始文件,按纯文本显示,本站未做修改或审核;其中的链接不可点击,命令请核实后再运行。抓取于 2026-10-23。

10.0 KB · ClawHub v1.0.1
---
name: word-document-organizer
version: 1.0.0
description: 智能整理Word文档,自动格式化、生成目录、统一样式,支持学术/商务/极简模板
author: Jasper.W
tags: [productivity, microsoft-office, document, automation, word]
tools: [bash, python]
---

# Word 文档整理助手
展开全部(共 312 行)

智能识别文档结构,自动应用标准化排版,生成专业目录,让文档整理一键完成。

## 触发条件
当用户提出以下请求时激活此技能:
- "整理word文档"
- "格式化文档" 
- "生成文档目录"
- "统一文档样式"
- "排版优化"
- "修复word格式"
- "规范文档格式"
- "word排版"

## 参数定义

### document_path(必需)
- **类型**: string
- **描述**: Word文档的完整路径(支持.docx格式)
- **示例**: "C:/Users/Desktop/报告.docx", "/home/user/docs/论文.docx"

### operations(可选,默认: all)
- **类型**: array[string]
- **描述**: 要执行的操作列表
- **可选值**: 
  - `format`: 格式化段落(行距、间距、字体统一)
  - `toc`: 生成文档目录
  - `styles`: 应用标准样式模板
  - `cleanup`: 清理空段落和冗余格式
  - `all`: 执行所有操作(默认)

### style_template(可选,默认: academic)
- **类型**: string
- **描述**: 样式模板类型
- **可选值**:
  - `academic`: 学术模板(宋体、层级分明,适合论文/报告)
  - `business`: 商务模板(微软雅黑、现代简洁,适合商业文档)
  - `minimal`: 极简模板(Arial、紧凑排版,适合笔记/草稿)
  - `default`: 默认模板(通用设置)

### output_path(可选)
- **类型**: string
- **描述**: 输出文件路径(默认覆盖原文件,建议指定新路径保留原文件)
- **示例**: "C:/Users/Desktop/报告_整理版.docx"

## 执行流程

### 步骤1: 环境检查与备份
```bash
#!/bin/bash
# 检查文件存在性
if [ ! -f "${document_path}" ]; then
    echo "错误:文件不存在 ${document_path}"
    echo "请检查路径是否正确,或文件是否被移动/删除"
    exit 1
fi

# 检查文件扩展名
if [[ ! "${document_path}" =~ \.(docx|doc)$ ]]; then
    echo "错误:仅支持 .docx 或 .doc 格式"
    exit 1
fi

# 创建时间戳备份
backup_path="${document_path}.backup.$(date +%Y%m%d_%H%M%S)"
cp "${document_path}" "${backup_path}"
echo "已创建备份: ${backup_path}"
```

### 步骤2: 安装Python依赖
```bash
#!/bin/bash
# 检查python-docx是否已安装
python3 -c "import docx" 2>/dev/null || pip3 install python-docx -q
echo "依赖检查完成"
```

### 步骤3: 执行文档整理(核心Python脚本)
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.oxml.ns import qn
import sys
import re
import os

# 获取参数
doc_path = "${document_path}"
output_path = "${output_path}" if "${output_path}" else doc_path
template = "${style_template}"
operations = [op.strip() for op in "${operations}".split(",")] if "${operations}" else ["all"]

print(f"处理文件: {doc_path}")
print(f"执行操作: {operations}")
print(f"使用模板: {template}")

# 加载文档
try:
    doc = Document(doc_path)
except Exception as e:
    print(f"无法打开文档: {e}")
    print("提示:请确保文档未被Microsoft Word占用(关闭Word后重试)")
    sys.exit(1)

# 模板配置
TEMPLATES = {
    "academic": {
        "h1_size": 18, "h2_size": 16, "h3_size": 14, "body_size": 12,
        "h1_font": "黑体", "h2_font": "黑体", "body_font": "宋体",
        "line_spacing": 1.5, "space_after": 6
    },
    "business": {
        "h1_size": 16, "h2_size": 14, "h3_size": 12, "body_size": 11,
        "h1_font": "微软雅黑", "h2_font": "微软雅黑", "body_font": "微软雅黑",
        "line_spacing": 1.5, "space_after": 6
    },
    "minimal": {
        "h1_size": 14, "h2_size": 12, "h3_size": 11, "body_size": 10.5,
        "h1_font": "Arial", "h2_font": "Arial", "body_font": "Arial",
        "line_spacing": 1.15, "space_after": 3
    },
    "default": {
        "h1_size": 16, "h2_size": 14, "h3_size": 12, "body_size": 12,
        "h1_font": "宋体", "h2_font": "宋体", "body_font": "宋体",
        "line_spacing": 1.5, "space_after": 6
    }
}

config = TEMPLATES.get(template, TEMPLATES["academic"])
changes_log = []

# 操作1: 格式化
if "format" in operations or "all" in operations:
    print("正在格式化文档...")
    count = 0
    for para in doc.paragraphs:
        para.paragraph_format.line_spacing = config["line_spacing"]
        para.paragraph_format.space_after = Pt(config["space_after"])
        para.paragraph_format.space_before = Pt(0)

        if not para.style.name.startswith('Heading'):
            for run in para.runs:
                run.font.name = config["body_font"]
                run._element.rPr.rFonts.set(qn('w:eastAsia'), config["body_font"])
                run.font.size = Pt(config["body_size"])
        count += 1

    changes_log.append(f"格式化 {count} 个段落")

# 操作2: 应用样式
if "styles" in operations or "all" in operations:
    print("正在应用样式模板...")
    title_count = 0

    for para in doc.paragraphs:
        text = para.text.strip()
        if not text:
            continue

        if re.match(r'^[第][一二三四五六七八九十\d]+[章\s]|^[\d]+\s*[、..\s]|^[((][一二三四五六七八九十]+[))]', text):
            para.style = doc.styles['Heading 1']
            for run in para.runs:
                run.font.name = config["h1_font"]
                run._element.rPr.rFonts.set(qn('w:eastAsia'), config["h1_font"])
                run.font.size = Pt(config["h1_size"])
                run.font.bold = True
                run.font.color.rgb = RGBColor(0, 0, 0)
            title_count += 1

        elif re.match(r'^\d+\.\d+[\s.、]|^[((][\d一二三四五六七八九十]+[))]', text):
            para.style = doc.styles['Heading 2']
            for run in para.runs:
                run.font.name = config["h2_font"]
                run._element.rPr.rFonts.set(qn('w:eastAsia'), config["h2_font"])
                run.font.size = Pt(config["h2_size"])
                run.font.bold = True
            title_count += 1

        elif re.match(r'^\d+\.\d+\.\d+|^[((]\d+[))]', text):
            para.style = doc.styles['Heading 3']
            for run in para.runs:
                run.font.size = Pt(config["h3_size"])
                run.font.bold = True
            title_count += 1

    changes_log.append(f"识别并格式化 {title_count} 个标题")

# 操作3: 生成目录
if "toc" in operations or "all" in operations:
    print("正在生成目录...")

    toc_entries = []
    for para in doc.paragraphs:
        if para.style.name.startswith('Heading'):
            level = int(para.style.name[-1]) if para.style.name[-1].isdigit() else 1
            toc_entries.append((level, para.text.strip()))

    if toc_entries:
        first_para = doc.paragraphs[0]
        toc_title = first_para.insert_paragraph_before("目录")
        toc_title.alignment = WD_ALIGN_PARAGRAPH.CENTER
        for run in toc_title.runs:
            run.font.size = Pt(config["h1_size"])
            run.font.bold = True
            run.font.name = config["h1_font"]
            run._element.rPr.rFonts.set(qn('w:eastAsia'), config["h1_font"])

        for level, text in toc_entries[:50]:
            indent = "    " * (level - 1)
            entry_para = first_para.insert_paragraph_before(f"{indent}{text}")
            entry_para.paragraph_format.left_indent = Inches(0.3 * (level - 1))
            for run in entry_para.runs:
                run.font.size = Pt(config["body_size"])

        separator = first_para.insert_paragraph_before("—" * 30)
        separator.alignment = WD_ALIGN_PARAGRAPH.CENTER

        changes_log.append(f"生成目录,包含 {len(toc_entries)} 个条目")
    else:
        changes_log.append("未检测到标题结构,跳过目录生成")

# 操作4: 清理
if "cleanup" in operations or "all" in operations:
    print("正在清理冗余内容...")
    removed = 0
    prev_empty = False

    for i in range(len(doc.paragraphs) - 1, -1, -1):
        para = doc.paragraphs[i]
        is_empty = not para.text.strip()

        if is_empty and prev_empty:
            p_element = para._element
            p_element.getparent().remove(p_element)
            removed += 1
        prev_empty = is_empty

    changes_log.append(f"删除 {removed} 个冗余空段落")

# 保存文档
try:
    doc.save(output_path)
    print(f"文档已保存: {output_path}")
except Exception as e:
    print(f"保存失败: {e}")
    sys.exit(1)

print("
" + "="*50)
print("整理报告")
print("="*50)
for log in changes_log:
    print(log)
print("="*50)
print("文档整理完成!")
```

### 步骤4: 验证输出
```bash
#!/bin/bash
if [ -f "${output_path}" ]; then
    file_size=$(ls -lh "${output_path}" | awk '{print $5}')
    echo "输出文件: ${output_path} (${file_size})"
    echo "提示:原文件已备份,如有问题可恢复"
else
    echo "错误:输出文件未生成"
    exit 1
fi
```

## 使用示例

### 示例1: 全面整理(推荐)
```
整理文档 C:/Users/Desktop/毕业论文.docx,使用学术模板,执行所有操作,输出到 C:/Users/Desktop/毕业论文_整理版.docx
```

### 示例2: 仅格式化和生成目录
```
格式化 C:/Docs/报告.docx,操作包括format,toc,模板用business
```

## 错误处理

| 错误场景 | 处理方式 |
|---------|---------|
| 文件不存在 | 提示检查路径,退出码1 |
| 文件格式不支持 | 提示仅支持docx/doc,退出码1 |
| 文件被Word占用 | 提示关闭Word后重试,退出码1 |
| 权限不足 | 提示以管理员身份运行,退出码1 |

## 安全说明

- **本地执行**: 所有操作在本地完成,不上传任何文件到云端
- **自动备份**: 每次执行自动创建带时间戳的备份
- **原子操作**: 失败时不会损坏原文件(先处理再保存)
- **权限最小化**: 仅需文件读写权限,无需网络或系统管理权限

「办公效率」分类下的热门技能

数据月份:2026-09 · 下载/星标/安装数聚合自公开技能注册库(ClawHub、SkillHub),按月更新。口径说明见数据方法。