Cara Mengurai Jadual dalam Fail OneNote Menggunakan Python

Cara Mengurai Jadual dalam Fail OneNote Menggunakan Python

Microsoft OneNote membenarkan pengguna menyematkan jadual data berstruktur secara langsung dalam halaman. Aspose.Note FOSS untuk Python mendedahkan setiap jadual melalui hierarki Table → TableRow → TableCell, memberikan anda akses programatik kepada semua kandungan sel, metadata lajur, dan tag jadual.

Manfaat

  1. Akses berstruktur: kiraan baris dan lajur, kandungan sel individu, lebar lajur
  2. Tiada aplikasi hamparan diperlukan: ekstrak data jadual dari OneNote pada mana-mana platform
  3. Percuma dan sumber terbuka: lesen MIT, tiada kunci API

Panduan Langkah demi Langkah

Langkah 1: Pasang Aspose.Note FOSS untuk Python

pip install aspose-note

Langkah 2: Muat Fail .one

from aspose.note import Document

doc = Document("MyNotes.one")
print(f"Pages: {len(list(doc))}")

Langkah 3: Cari Semua Jadual

Gunakan GetChildNodes(Table) untuk mendapatkan setiap jadual dari keseluruhan dokumen secara rekursif:

from aspose.note import Document, Table

doc = Document("MyNotes.one")
tables = doc.GetChildNodes(Table)
print(f"Found {len(tables)} table(s)")

Langkah 4: Baca Nilai Baris dan Sel

Ulangi nod TableRow dan TableCell. Setiap sel mengandungi nod RichText yang sifat .Text‑nya memberikan kandungan teks biasa:

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}")

Langkah 5: Baca Lebar Lajur

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}")

Langkah 6: Eksport ke 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")

Isu Umum dan Penyelesaian

Jadual kelihatan kosong

Punca: Sel mengandungi nod Image dan bukannya nod RichText.

Semak:

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)")

Bilangan lajur tidak sepadan Columns

table.Columns mencerminkan metadata lajur yang disimpan dalam fail. Bilangan sebenar sel per baris mungkin berbeza jika baris mempunyai sel yang digabungkan (format fail menyimpan ini pada peringkat binari; API awam tidak mendedahkan bendera gabungan).

ImportError: Tiada modul bernama ‘aspose’

pip install aspose-note
pip show aspose-note  # confirm it is installed in the active environment

Soalan Lazim

Bolehkah saya mengedit data jadual dan menyimpannya kembali? Tidak. Menulis kembali ke format .one tidak disokong. Perubahan yang dibuat dalam memori (contohnya melalui RichText.Replace()) tidak dapat dipertahankan ke fail sumber.

Adakah sel yang digabung dikesan? API CompositeNode tidak mendedahkan metadata gabungan. Setiap TableCell dianggap sebagai sel berasingan tanpa mengira penggabungan visual.

Bolehkah saya mengira berapa baris dalam jadual? Ya: len(table.GetChildNodes(TableRow)).


Sumber Berkaitan:

 Bahasa Melayu