Skip to content

Office ドキュメントの編集

EditableDocumentDocument の 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::editxlsx::editpptx::edit)にフォーマット別エディタが文書化されています。

関連項目