--- name: libreoffice-calc description: Use when creating, editing, formatting, exporting, or extracting LibreOffice Calc (.ods) spreadsheets via UNO, including session-based cell and range edits, sheets, named ranges, validation, charts, patch workflows, and snapshots. --- # LibreOffice Calc Use the bundled `calc` modules for UNO-backed Calc spreadsheet work. All paths must be **absolute**. Bundled modules live under `scripts/` in this skill directory, so set `PYTHONPATH=/scripts`. If setup or runtime issues appear, check `references/troubleshooting.md`. ## API Surface ```python # Non-session utilities create_spreadsheet(path) export_spreadsheet(path, output_path, format) # formats: "pdf", "xlsx", "csv" snapshot_area(doc_path, output_path, sheet="Sheet1", row=0, col=0, width=None, height=None, dpi=150) # Session (primary editing API) open_calc_session(path) -> CalcSession CalcSession methods: read_cell(target: CalcTarget) -> dict[str, object] write_cell(target: CalcTarget, value, value_type="auto") read_range(target: CalcTarget) -> list[list[dict[str, object]]] write_range(target: CalcTarget, data) format_range(target: CalcTarget, formatting: CellFormatting) list_sheets() -> list[dict[str, object]] add_sheet(name, index=None) rename_sheet(target: CalcTarget, new_name) delete_sheet(target: CalcTarget) define_named_range(name, target: CalcTarget) get_named_range(target: CalcTarget) -> dict[str, object] delete_named_range(target: CalcTarget) set_validation(target: CalcTarget, rule: ValidationRule) clear_validation(target: CalcTarget) create_chart(target: CalcTarget, spec: ChartSpec) update_chart(target: CalcTarget, spec: ChartSpec) delete_chart(target: CalcTarget) recalculate() patch(patch_text, mode="atomic") -> PatchApplyResult export(output_path, format) reset() close(save=True) # Standalone patch utility patch(path, patch_text, mode="atomic") -> PatchApplyResult ``` ## Structured Targets: `CalcTarget` ```python from calc import CalcTarget CalcTarget( kind="cell" | "range" | "sheet" | "named_range" | "chart", sheet=None, sheet_index=None, row=None, col=None, end_row=None, end_col=None, name=None, index=None, ) ``` ### Target kinds | Kind | Supported fields | Use | |---|---|---| | `cell` | `sheet` or `sheet_index`, `row`, `col` | Read or write one cell | | `range` | `sheet` or `sheet_index`, `row`, `col`, `end_row`, `end_col` | Read, write, format, validate, or chart a rectangular range | | `sheet` | `sheet` or `sheet_index` | Rename or delete one sheet | | `named_range` | `name` | Inspect or delete one named range | | `chart` | `sheet` or `sheet_index`, plus `name` or `index` | Update or delete one chart | ### Resolution rules - Coordinates are zero-based and must be non-negative. - `sheet` and `sheet_index` are mutually exclusive. - `name` and `index` are mutually exclusive. - Range targets must keep `end_row >= row` and `end_col >= col`. - Chart targets must identify one sheet plus one chart selector. - Calc does not auto-convert a one-cell range into a cell target; keep those shapes explicit. ## Cell Read Results `read_cell()` and `read_range()` return cell dictionaries with the same shape: ```python { "value": 100.0, "formula": None, "error": None, "type": "number", "raw": 100.0, } ``` Formula cells use `type="formula"`; when Calc reports a formula error, `error` is populated and `value` becomes `None`. ## Formatting Payload: `CellFormatting` ```python from calc import CellFormatting CellFormatting( bold=None, italic=None, font_name=None, font_size=None, color=None, # named color or integer number_format=None, # "currency" | "percentage" | "date" | "time" ) ``` Notes: - At least one formatting field must be set. - `color` accepts a named color or `0xRRGGBB` integer. - `format_range()` works for both a `cell` target and a rectangular `range` target. ## Validation Payload: `ValidationRule` ```python from calc import ValidationRule ValidationRule( type="whole", condition="between", value1=1, value2=10, show_error=True, error_message="Enter a value from 1 to 10.", show_input=True, input_title="Allowed values", input_message="Only integers from 1 to 10 are valid.", ignore_blank=True, error_style=0, ) ``` Supported `type` values: - `any` - `whole` - `decimal` - `date` - `time` - `text_length` - `list` Supported `condition` values: - `between` - `not_between` - `equal` - `not_equal` - `greater_than` - `less_than` - `greater_or_equal` - `less_or_equal` ## Chart Payload: `ChartSpec` ```python from calc import CalcTarget, ChartSpec ChartSpec( chart_type="line", data_range=CalcTarget( kind="range", sheet="Data", row=0, col=0, end_row=5, end_col=1, ), anchor_row=7, anchor_col=0, width=10000, height=7000, title="Revenue Trend", ) ``` Notes: - `chart_type` must be one of `bar`, `line`, `pie`, or `scatter`. - `width` and `height` use Calc chart rectangle units (the same units the packaged API already accepts). - Create charts by targeting a sheet; update or delete charts by targeting a chart. ## Patch DSL Use `patch()` or `session.patch()` to apply ordered spreadsheet operations. ```ini [operation] type = write_range target.kind = range target.sheet = Revenue Data target.row = 0 target.col = 0 target.end_row = 2 target.end_col = 1 data <