onenote-to-obsidianlisted
Install: claude install-skill Linearl/reasonix_skill_repo
# OneNote .one 文件 → Obsidian Markdown 导入
把 OneNote 分区文件(.one,本地导出或缓存副本)解析为 Markdown,按季度/分区组织导入 Obsidian vault。**不依赖 OneNote 同步状态**——适合同步失败、分区被服务器删除、importer 漏导等场景的本地恢复。
## 核心原理
- 用 **OneNote 桌面版 COM API**(`OneNote.Application`,PowerShell 调用)打开本地 .one 文件:
- `OpenHierarchy(path, '', [ref]hier, 0)` —— **第 4 参数必须 0(cftLocal)**,其他值报 0x80042018
- `GetHierarchy(hier, 1, [ref]xml)` —— **scope 必须 1(hsChildren)**,3 会返回 0 页面,2 报 0x80042014
- 逐页 `GetPageContent(pageId, [ref]xml, 1)` —— **第 3 参数必须 1(piBinaryData)才有 `<one:Data>` base64 图片**;0(piBasic)只有 `<one:Image>` 空壳(图片在 .one 文件块里但拿不到)。2026-08-12 实战确认:所有"页面有 Image 但 0 Data"的谜团都是这个参数用错——8-7 管线成功提取 1527 张图就是用了 `-PageInfo 1`
- PowerShell 逐页导出为 XML 文件 + index.tsv,Python 解析 XML → Markdown(剥 span 富文本、checkbox 还原、嵌套缩进)
## 前置条件(本机已具备)
- OneNote 桌面版(`C:\Program Files\Microsoft Office\root\Office16\ONENOTE.EXE`)
- PowerShell 5.1+(Windows 自带)
- Python 3(标准库即可)
## 常见故障:导出 .one 不完整(页面缺失)
**现象**:导出的 .one 文件页面数远少于客户端显示的页面数(如 759MB 文件只有 11 页;同步报错的分区导出后缺大量周报)。
**根因(实战确认)**:**未同步(0xE0000063/0xE000006A)的页面在迁移/导出流程中被跳过**——剪贴分区时同步失败的页面不会迁移成功,导出 .one 时这些页面连页面条目都不会写入文件(不只是内容缺失)。客户端能看到(缓存)≠ 文件里有。
**解决**:
1. 先修复同步:OneNote 中右键分区 → 立即同步,等报错消失(或把内容剪贴到同步健康的新分区,待新分区完全同步)
2. **重新导出 .one** 后再解析——同步修复后重新导出的文件才是完整的(实战:19-20.one 28 页 → 重新导出 169 页;21~23Q1.one 1 页 → 305 页)
3. 判断导出是否完整:`GetHierarchy` 页面数 ≈ 客户端显示的页面数;或抽查报错列表中的页面名是否出现在页面列表里
**教训**:文件大小与内容完整性无关(759MB 空壳 vs 72MB 完整);"客户端能看到"不能证明导出文件完整。
## 常见故障:在线分区图片未下载(页面有 Image 但 Data 全空 / 页面索引缺失)
**现象**:分区能