Запись ячеек XLSX
set_cell(sheet_index, cell_ref, value) пишет значение в worksheet по нулевому индексу листа и стандартной A1-ссылке (A1, B12, AA42). Office Oxide принимает строки, числа, булево и пустые значения.
Окружение листа — форматы, merges, условное форматирование, именованные диапазоны, диаграммы — сохраняется дословно.
Запись базовых типов
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"); // string-перегрузка
wb.SetCell(0u, "B1", 42.5); // double-перегрузка
wb.SetCell(0u, "C1", true); // bool-перегрузка
wb.SetCellEmpty(0u, "D1"); // очистить
wb.Save("budget.xlsx");
Пакетные обновления
Объедините много записей в один цикл 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 — это позиция листа в книге (с нуля), а не имя. Чтобы получить индекс по имени, прочитайте книгу:
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> ячейки; он не:
- Пересчитывает формулы. Чтобы запустить recalc — откройте файл в Excel или используйте calc-движок.
- Меняет таблицу shared-strings дальше простого добавления новой строки. Уже заведённые строки остаются общими.
- Меняет форматы ячеек, условное форматирование и именованные диапазоны.
Если в ячейке формула, set_cell перепишет её статическим значением. Чтобы писать формулы явно, используйте формат-специфичный xlsx::edit-API.
Ошибки
| Симптом | Причина |
|---|---|
OfficeError::Sheet(idx) (Rust) / IndexError (Python) |
sheet_index ≥ числа листов в книге |
OfficeError::CellRef("...") |
Ссылка на ячейку — не валидная A1-нотация |
После Number(value) ячейка выглядит пустой в Excel |
Ранее ячейка была отформатирована как текст — очистите формат в Excel или пишите через формат-специфичный API |
Смотрите также
- Замена текста в DOCX/PPTX
- Обзор редактирования
- Переход с openpyxl — то же покрытие XLSX, сильно быстрее