office-to-md

office-to-md

熱門

>

310星標
68分支
更新於 2026/1/31
SKILL.md
唯讀
名稱
office-to-md
描述

>

版本
1.0

Office 轉 Markdown 技能

概述

本技能可將各種 Office 格式轉換為 Markdown,使用 markitdown——微軟開源的檔案轉 Markdown 工具。非常適合讓 Office 內容可搜尋、可版本控制,並利於 AI 處理。

使用方式

  1. 提供 Office 檔案(Word、Excel、PowerPoint、PDF 等)
  2. 可選指定轉換選項
  3. 我會將其轉換為乾淨的 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 投影片以章節呈現
PDF .pdf 文字擷取
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')

最佳實務

  1. 檢查輸出品質:檢視轉換後的 Markdown 是否準確
  2. 處理表格:複雜表格可能需要手動調整
  3. 保留結構:在來源文件中使用一致的標題層級
  4. 圖片處理:重要圖片可考慮使用視覺模型
  5. 版本控制:將轉換後的 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]   # 音訊轉文字

資源