如何使用 Python 解析 OneNote 文件中的表格
Microsoft OneNote 允许用户直接在页面中嵌入结构化数据表格。Aspose.Note FOSS for Python 通过一个 Table → TableRow → TableCell 层级结构,使您能够以编程方式访问所有单元格内容、列元数据和表格标签。.
优势
- 结构化访问: 行数和列数、单元格内容、列宽度
- 无需电子表格应用: 在任何平台上从 OneNote 提取表格数据
- 免费且开源: MIT 许可证,无需 API 密钥
分步指南
步骤 1:安装 Aspose.Note FOSS for Python
pip install aspose-note步骤 2:加载 .one 文件
from aspose.note import Document
doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")步骤 3:查找所有表格
使用 GetChildNodes(Table) 递归检索整个文档中的所有表格::
from aspose.note import Document, Table
doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")步骤 4:读取行和单元格值
遍历 TableRow 和 TableCell 节点。每个单元格包含 RichText 节点,其 .Text 属性提供纯文本内容::
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
for t, table in enumerate(doc.GetChildNodes(Table), start=1):
print(f"\nTable {t}: {len(table.Columns)} column(s)")
for r, row in enumerate(table.GetChildNodes(TableRow), start=1):
cell_values = []
for cell in row.GetChildNodes(TableCell):
text = " ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
cell_values.append(text)
print(f" Row {r}: {cell_values}")步骤 5:读取列宽
from aspose.note import Document, Table
doc = Document("MyNotes.one")
for i, table in enumerate(doc.GetChildNodes(Table), start=1):
print(f"Table {i} column widths (pts): {[col.Width for col in table.Columns]}")
print(f"Borders visible: {table.IsBordersVisible}")步骤 6:导出为 CSV
import csv, io
from aspose.note import Document, Table, TableRow, TableCell, RichText
doc = Document("MyNotes.one")
buf = io.StringIO()
writer = csv.writer(buf)
for table in doc.GetChildNodes(Table):
for row in table.GetChildNodes(TableRow):
values = [
" ".join(rt.Text for rt in cell.GetChildNodes(RichText)).strip()
for cell in row.GetChildNodes(TableCell)
]
writer.writerow(values)
writer.writerow([]) # blank row between tables
with open("tables.csv", "w", encoding="utf-8", newline="") as f:
f.write(buf.getvalue())
print("Saved tables.csv")常见问题及解决方案
表格显示为空
原因: 单元格包含 Image 节点而不是 RichText 节点。.
检查:
from aspose.note import Document, Table, TableRow, TableCell, RichText, Image
doc = Document("MyNotes.one")
for table in doc.GetChildNodes(Table):
for row in table.GetChildNodes(TableRow):
for cell in row.GetChildNodes(TableCell):
texts = cell.GetChildNodes(RichText)
images = cell.GetChildNodes(Image)
print(f" Cell: {len(texts)} text(s), {len(images)} image(s)")列计数不匹配 Columns
table.Columns 反映了文件中存储的列元数据。如果行中存在合并单元格,实际每行的单元格数量可能会不同(文件格式在二进制层面存储此信息;公共 API 并未公开合并标志)。.
ImportError: 没有名为 ‘aspose’ 的模块
pip install aspose-note
pip show aspose-note # confirm it is installed in the active environment常见问答
我可以编辑表格数据并保存回去吗?? 不。写回到 .one 格式不受支持。内存中所做的更改(例如通过 RichText.Replace()) 无法持久化到源文件。.
合并的单元格会被检测到吗?? 该 CompositeNode API 未公开合并元数据。每个 TableCell 被视为独立的单元格,无论视觉上是否合并。.
我可以统计表格有多少行吗?? 是的:: len(table.GetChildNodes(TableRow)).
相关资源::