Office ドキュメントの編集
EditableDocument は Document の read-modify-write 版です。変更されていない OPC パーツ — 画像、グラフ、スタイル、テーマ、リレーションシップ — をすべて温存するため、編集が周囲のコンテンツを再フローさせたり、下流の利用者を無効化したりしません。
編集は DOCX、XLSX、PPTX で利用可能。レガシー DOC、XLS、PPT は読み取り専用 — 編集が必要なら先に save_as で変換してください。
できること
| 操作 | DOCX | XLSX | PPTX | メソッド |
|---|---|---|---|---|
| 本文/プレースホルダのテキスト置換 | ✓ | — | ✓ | replace_text |
| セル値の設定(文字列/数値/真偽値/空) | — | ✓ | — | set_cell |
| ディスク保存 | ✓ | ✓ | ✓ | save |
| バイト保存 | ✓ | ✓ | ✓ | save_to_bytes |
replace_text は XLSX では 0 を返します(<w:t> や <a:t> 要素が存在しないため)。スプレッドシートには set_cell を使用。
開く、編集、保存
Python
from office_oxide import EditableDocument
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
ed.replace_text("{{date}}", "2026-04-19")
ed.save("filled.docx")
Rust
use office_oxide::edit::EditableDocument;
let mut ed = EditableDocument::open("template.docx")?;
ed.replace_text("{{name}}", "Alice");
ed.replace_text("{{date}}", "2026-04-19");
ed.save("filled.docx")?;
JavaScript
import { EditableDocument } from 'office-oxide';
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
ed.replaceText('{{date}}', '2026-04-19');
ed.save('filled.docx');
Go
ed, err := officeoxide.OpenEditable("template.docx")
defer ed.Close()
ed.ReplaceText("{{name}}", "Alice")
ed.ReplaceText("{{date}}", "2026-04-19")
ed.Save("filled.docx")
C#
using var ed = EditableDocument.Open("template.docx");
ed.ReplaceText("{{name}}", "Alice");
ed.ReplaceText("{{date}}", "2026-04-19");
ed.Save("filled.docx");
バイト保存(アップロード/ストリーミング用)
Python
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
bytes_out = ed.save_to_bytes()
# bytes_out を S3 にアップロード / HTTP で送信 / etc.
Rust
let mut ed = EditableDocument::open("template.docx")?;
ed.replace_text("{{name}}", "Alice");
let mut buf = std::io::Cursor::new(Vec::new());
ed.write_to(&mut buf)?;
let bytes: Vec<u8> = buf.into_inner();
JavaScript
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
const bytes = ed.saveToBytes(); // Uint8Array
「OPC パーツの温存」の実際の意味
OOXML ファイルは ZIP アーカイブで、数十の XML パーツ + バイナリパーツ(画像、フォント、埋め込みオブジェクト)を含みます。素朴なエディタは保存時にすべてのパーツを再シリアライズしますが、これは:
- リレーションシップを並べ替えてリンクを壊す
- エディタが理解しない拡張パーツ(カスタム XML、AlternateContent フォールバック)を捨てる
- 下流の差分や署名を壊すような形で XML を再フォーマットする
EditableDocument はあなたが触ったパーツのみ書き直します。それ以外はバイトごとコピーされます。結果は入力と出力の 可能な限り小さな差分 — バージョン管理、署名検証、他のツールへのラウンドトリップに優しい。
いつフォーマット固有の API を使うべきか
EditableDocument は 80% のケース(テンプレート、バッチ穴埋め、セル書き込み)をカバーします。よりリッチな編集 — 段落追加、テーブル挿入、スタイル調整、スライドをゼロから構築 — にはフォーマット別 API を使用:
use office_oxide::docx::edit::DocxEditor;
let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("新しいセクション", Some("Heading2"));
docx.save("report.docx")?;
各バインディングのリファレンス(Rust: docx::edit、xlsx::edit、pptx::edit)にフォーマット別エディタが文書化されています。
関連項目
- テキスト置換 —
replace_textAPI の詳細 - XLSX セルの設定 — セル型、フォーマット、エッジケース
- 変換 — レガシー DOC/XLS/PPT を編集可能な OOXML へまず変換