SKILL.md
唯讀
名稱
office-to-md
描述
>
版本
1.0
Office 轉 Markdown 技能
概述
本技能可將各種 Office 格式轉換為 Markdown,使用 markitdown——微軟開源的檔案轉 Markdown 工具。非常適合讓 Office 內容可搜尋、可版本控制,並利於 AI 處理。
使用方式
- 提供 Office 檔案(Word、Excel、PowerPoint、PDF 等)
- 可選指定轉換選項
- 我會將其轉換為乾淨的 Markdown
範例提示:
- 「將這個 Word 文件轉成 Markdown」
- 「把這個 PowerPoint 轉成 Markdown 筆記」
- 「將這個 PDF 的內容擷取為 Markdown」
- 「把這個 Excel 檔案轉成 Markdown 表格」
領域知識
markitdown 基礎
from markitdown import MarkItDown
# 初始化轉換器
md = MarkItDown()
# 轉換檔案
result = md.convert("document.docx")
print(result.text_content)
# 儲存到檔案
with open("output.md", "w") as f:
f.write(result.text_content)
支援的格式
| 格式 | 副檔名 | 備註 |
|---|---|---|
| Word | .docx | 完整文字、表格、基本格式 |
| Excel | .xlsx | 轉換為 Markdown 表格 |
| PowerPoint | .pptx | 投影片以章節呈現 |
| 文字擷取 | ||
| HTML | .html | 乾淨的 Markdown |
| 圖片 | .jpg, .png | 搭配視覺模型進行 OCR |
| 音訊 | .mp3, .wav | 語音轉文字 |
| ZIP | .zip | 處理壓縮檔內的檔案 |
基本用法
Python API
from markitdown import MarkItDown
# 簡單轉換
md = MarkItDown()
result = md.convert("document.docx")
# 存取內容
markdown_text = result.text_content
# 搭配選項
md = MarkItDown(
llm_client=None, # 可選 LLM 以強化處理
llm_model=None # 使用 LLM 時的模型名稱
)
命令列
# 安裝
pip install markitdown
# 轉換檔案
markitdown document.docx > output.md
# 或指定輸出檔案
markitdown document.docx -o output.md
Word 文件轉換
from markitdown import MarkItDown
md = MarkItDown()
# 轉換 Word 文件
result = md.convert("report.docx")
# 輸出保留:
# - 標題(以 # 標題呈現)
# - 粗體/斜體格式
# - 清單(項目符號與編號)
# - 表格(以 Markdown 表格呈現)
# - 超連結
print(result.text_content)
範例輸出:
# 2024 年度報告
## 摘要
本報告總結了主要的成就與挑戰……
### 關鍵指標
| 指標 | 2023 | 2024 | 變動 |
|--------|------|------|--------|
| 營收 | $10M | $12M | +20% |
| 使用者 | 50K | 75K | +50% |
## 詳細分析
以下章節提供……
Excel 轉換
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("data.xlsx")
# 每個工作表成為一個章節
# 資料轉為 Markdown 表格
print(result.text_content)
範例輸出:
## Sheet1
| 姓名 | 部門 | 薪資 |
|------|------------|--------|
| John | 工程 | $80,000 |
| Jane | 行銷 | $75,000 |
## Sheet2
| 產品 | Q1 | Q2 | Q3 | Q4 |
|---------|----|----|----|----|
| Widget A | 100 | 120 | 150 | 180 |
PowerPoint 轉換
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("presentation.pptx")
# 每張投影片成為一個章節
# 若有備忘稿則一併包含
print(result.text_content)
範例輸出:
# 投影片 1:公司概覽
我們的使命是……
## 重點
- 創新優先
- 客戶導向
- 全球佈局
---
# 投影片 2:市場分析
市場機會相當可觀……
**備註:** 此處提及競爭者分析
PDF 轉換
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("document.pdf")
# 擷取文字內容
# 偵測到的表格會轉換
print(result.text_content)
圖片轉換(搭配視覺模型)
from markitdown import MarkItDown
import anthropic
# 使用 Claude 進行圖片描述
client = anthropic.Anthropic()
md = MarkItDown(
llm_client=client,
llm_model="claude-sonnet-4-20250514"
)
result = md.convert("diagram.png")
print(result.text_content)
# 輸出:圖片內容的描述
批次轉換
from markitdown import MarkItDown
from pathlib import Path
def batch_convert(input_dir, output_dir):
"""將所有 Office 檔案轉換為 Markdown。"""
md = MarkItDown()
input_path = Path(input_dir)
output_path = Path(output_dir)
output_path.mkdir(exist_ok=True)
extensions = ['.docx', '.xlsx', '.pptx', '.pdf']
for ext in extensions:
for file in input_path.glob(f'*{ext}'):
try:
result = md.convert(str(file))
output_file = output_path / f"{file.stem}.md"
with open(output_file, 'w') as f:
f.write(result.text_content)
print(f"已轉換:{file.name}")
except Exception as e:
print(f"轉換 {file.name} 時發生錯誤:{e}")
batch_convert('./documents', './markdown')
最佳實務
- 檢查輸出品質:檢視轉換後的 Markdown 是否準確
- 處理表格:複雜表格可能需要手動調整
- 保留結構:在來源文件中使用一致的標題層級
- 圖片處理:重要圖片可考慮使用視覺模型
- 版本控制:將轉換後的 Markdown 存入 Git 以利追蹤
常見模式
文件歸檔
import os
from datetime import datetime
from markitdown import MarkItDown
def archive_document(doc_path, archive_dir):
"""將 Office 文件轉換並歸檔為 Markdown。"""
md = MarkItDown()
result = md.convert(doc_path)
# 建立歸檔結構
date_str = datetime.now().strftime('%Y-%m-%d')
filename = os.path.basename(doc_path)
base_name = os.path.splitext(filename)[0]
# 儲存並附帶元資料
output_content = f"""---
source: {filename}
converted: {date_str}
---
{result.text_content}
"""
output_path = os.path.join(archive_dir, f"{base_name}.md")
with open(output_path, 'w') as f:
f.write(output_content)
return output_path
AI 就緒語料庫
from markitdown import MarkItDown
from pathlib import Path
import json
def create_ai_corpus(doc_folder, output_file):
"""將文件轉換為 JSON 語料庫,供 AI 訓練/RAG 使用。"""
md = MarkItDown()
corpus = []
for doc in Path(doc_folder).glob('**/*'):
if doc.suffix in ['.docx', '.pdf', '.pptx', '.xlsx']:
try:
result = md.convert(str(doc))
corpus.append({
'source': str(doc),
'filename': doc.name,
'content': result.text_content,
'type': doc.suffix[1:]
})
except Exception as e:
print(f"略過 {doc.name}:{e}")
with open(output_file, 'w') as f:
json.dump(corpus, f, indent=2)
print(f"已建立語料庫,共 {len(corpus)} 份文件")
return corpus
範例
範例 1:轉換文件套件
from markitdown import MarkItDown
from pathlib import Path
def convert_docs_to_wiki(docs_folder, wiki_folder):
"""將所有 Office 文件轉換為 Markdown wiki 結構。"""
md = MarkItDown()
docs_path = Path(docs_folder)
wiki_path = Path(wiki_folder)
# 建立 wiki 結構
wiki_path.mkdir(exist_ok=True)
# 建立索引
index_content = "# 文件索引\n\n"
for doc in sorted(docs_path.glob('**/*.docx')):
try:
result = md.convert(str(doc))
# 在 wiki 中建立相對路徑
rel_path = doc.relative_to(docs_path)
output_file = wiki_path / rel_path.with_suffix('.md')
output_file.parent.mkdir(parents=True, exist_ok=True)
# 寫入 Markdown
with open(output_file, 'w') as f:
f.write(result.text_content)
# 加入索引
link = str(rel_path.with_suffix('.md')).replace('\\', '/')
index_content += f"- [{doc.stem}]({link})\n"
print(f"已轉換:{doc.name}")
except Exception as e:
print(f"錯誤:{doc.name} - {e}")
# 寫入索引
with open(wiki_path / 'index.md', 'w') as f:
f.write(index_content)
convert_docs_to_wiki('./company_docs', './wiki')
範例 2:會議記錄處理器
from markitdown import MarkItDown
import re
from datetime import datetime
def process_meeting_notes(pptx_path):
"""從 PowerPoint 中擷取並結構化會議記錄。"""
md = MarkItDown()
result = md.convert(pptx_path)
# 解析 Markdown
content = result.text_content
# 擷取章節
sections = {
'attendees': [],
'agenda': [],
'decisions': [],
'action_items': []
}
current_section = None
for line in content.split('\n'):
line_lower = line.lower()
if 'attendee' in line_lower or 'participant' in line_lower:
current_section = 'attendees'
elif 'agenda' in line_lower:
current_section = 'agenda'
elif 'decision' in line_lower:
current_section = 'decisions'
elif 'action' in line_lower:
current_section = 'action_items'
elif line.strip().startswith(('-', '*', '•')) and current_section:
sections[current_section].append(line.strip()[1:].strip())
# 產生結構化輸出
output = f"""# 會議記錄
**日期:** {datetime.now().strftime('%Y-%m-%d')}
**來源:** {pptx_path}
## 與會者
{chr(10).join('- ' + a for a in sections['attendees'])}
## 議程
{chr(10).join('- ' + a for a in sections['agenda'])}
## 決議事項
{chr(10).join('- ' + d for d in sections['decisions'])}
## 待辦事項
{chr(10).join('- [ ] ' + a for a in sections['action_items'])}
"""
return output
notes = process_meeting_notes('team_meeting.pptx')
print(notes)
範例 3:Excel 轉文件
from markitdown import MarkItDown
def excel_to_data_dictionary(xlsx_path):
"""將 Excel 資料模型轉換為資料字典文件。"""
md = MarkItDown()
result = md.convert(xlsx_path)
# 加入文件結構
doc = f"""# 資料字典
產生自:`{xlsx_path}`
{result.text_content}
## 使用說明
- 所有表格皆源自來源 Excel 檔案
- 使用前請檢核資料型別與限制
- 如有疑問請聯絡資料團隊
## 變更記錄
| 日期 | 變更 | 作者 |
|------|--------|--------|
| {datetime.now().strftime('%Y-%m-%d')} | 初始產生 | 自動 |
"""
return doc
documentation = excel_to_data_dictionary('data_model.xlsx')
with open('data_dictionary.md', 'w') as f:
f.write(documentation)
限制
- 複雜格式可能被簡化
- 圖片不會內嵌(請使用視覺模型取得描述)
- 部分表格結構可能無法完美轉換
- Word 的追蹤修訂不會保留
- 註解可能無法擷取
安裝
pip install markitdown
# 若需圖片/音訊處理
pip install markitdown[all]
# 特定功能
pip install markitdown[images] # 圖片 OCR
pip install markitdown[audio] # 音訊轉文字






