Skip to content

XLSX セルの設定

set_cell(sheet_index, cell_ref, value) は、ワークシートにシートの 0 始まりインデックスと標準 A1 形式のセル参照(A1B12AA42)で値を書き込みます。Office Oxide は文字列、数値、真偽値、空値を受け付けます。

周囲のワークシート — 書式、結合、条件付き書式、名前付き範囲、グラフ — はそのまま温存されます。

基本型を書き込む

Python

from office_oxide import EditableDocument

with EditableDocument.open("budget.xlsx") as ed:
    ed.set_cell(0, "A1", "Total")     # 文字列
    ed.set_cell(0, "B1", 42.5)        # 数値(int も可)
    ed.set_cell(0, "C1", True)        # 真偽値
    ed.set_cell(0, "D1", None)        # 空
    ed.save("budget.xlsx")

Rust

use office_oxide::edit::EditableDocument;
use office_oxide::xlsx::edit::CellValue;

let mut wb = EditableDocument::open("budget.xlsx")?;
wb.set_cell(0, "A1", CellValue::String("Total".into()))?;
wb.set_cell(0, "B1", CellValue::Number(42.5))?;
wb.set_cell(0, "C1", CellValue::Boolean(true))?;
wb.set_cell(0, "D1", CellValue::Empty)?;
wb.save("budget.xlsx")?;

JavaScript

import { EditableDocument } from 'office-oxide';

using wb = EditableDocument.open('budget.xlsx');

wb.setCell(0, 'A1', 'Total');   // 文字列
wb.setCell(0, 'B1', 42.5);      // 数値
wb.setCell(0, 'C1', true);      // 真偽値
wb.setCell(0, 'D1', null);      // 空

wb.save('budget.xlsx');

Go

ed, _ := officeoxide.OpenEditable("budget.xlsx")
defer ed.Close()

ed.SetCell(0, "A1", officeoxide.NewStringCell("Total"))
ed.SetCell(0, "B1", officeoxide.NewNumberCell(42.5))
ed.SetCell(0, "C1", officeoxide.NewBoolCell(true))
ed.SetCell(0, "D1", officeoxide.NewEmptyCell())

ed.Save("budget.xlsx")

C#

using var wb = EditableDocument.Open("budget.xlsx");

wb.SetCell(0u, "A1", "Total");        // 文字列オーバーロード
wb.SetCell(0u, "B1", 42.5);           // double オーバーロード
wb.SetCell(0u, "C1", true);           // bool オーバーロード
wb.SetCellEmpty(0u, "D1");            // セルをクリア

wb.Save("budget.xlsx");

バルク更新

1 度の open/save サイクルで多くの書き込みを組み合わせます。

Python

rows = [
    ("Acme",    120_000, True),
    ("Globex",   85_000, False),
    ("Initech",  62_500, True),
]

with EditableDocument.open("dashboard.xlsx") as ed:
    for i, (name, revenue, active) in enumerate(rows):
        row = i + 2  # 行 1 はヘッダ用
        ed.set_cell(0, f"A{row}", name)
        ed.set_cell(0, f"B{row}", revenue)
        ed.set_cell(0, f"C{row}", active)
    ed.save("dashboard.xlsx")

Rust

let rows = [
    ("Acme",    120_000.0, true),
    ("Globex",   85_000.0, false),
    ("Initech",  62_500.0, true),
];

let mut ed = EditableDocument::open("dashboard.xlsx")?;
for (i, (name, revenue, active)) in rows.iter().enumerate() {
    let row = i + 2;
    ed.set_cell(0, &format!("A{row}"), CellValue::String((*name).into()))?;
    ed.set_cell(0, &format!("B{row}"), CellValue::Number(*revenue))?;
    ed.set_cell(0, &format!("C{row}"), CellValue::Boolean(*active))?;
}
ed.save("dashboard.xlsx")?;

他のシートを対象に

sheet_index はワークブック内の 0 始まりの位置 — シート名ではありません。名前からインデックスを解決するには、まずワークブックを読みます:

Python

from office_oxide import Document, EditableDocument

with Document.open("budget.xlsx") as doc:
    sheet_names = [s.name() for s in doc.as_xlsx().sheets()]
print(sheet_names)   # ['Summary', 'Q1', 'Q2', 'Q3', 'Q4']

idx = sheet_names.index("Q3")
with EditableDocument.open("budget.xlsx") as ed:
    ed.set_cell(idx, "B5", 42_000)
    ed.save("budget.xlsx")

set_cell が何を触って、何を触らないか

set_cell はセルの <v> 値と <t> 型を書きます。次のことは 行いません:

  • 数式の再評価。再計算をトリガーするには Excel でファイルを開くか、計算エンジンを使用。
  • 新しい文字列の追加以外で shared-strings テーブルを変更しません。既存の文字列は共有されたまま。
  • セル書式、条件付き書式、名前付き範囲を変更しません。

セルが現在数式を持っている場合、set_cell は数式を静的な値で上書きします。数式を明示的に書くには、フォーマット固有の xlsx::edit API を使用。

エラー

症状 原因
OfficeError::Sheet(idx)(Rust)/ IndexError(Python) sheet_index がワークブックのシート数以上
OfficeError::CellRef("...") セル参照が有効な A1 記法ではない
Number(value) 後に Excel でセルが空に見える セルが以前テキストとして書式設定されていた — Excel で書式をクリアするかフォーマット固有 API 経由で書く

関連項目