FIX: Python add load/from bytes

This commit is contained in:
Nicolás Hatcher
2025-06-02 20:21:33 +02:00
parent abaeb3284a
commit 7bf36959ca
9 changed files with 32 additions and 13 deletions

View File

@@ -1,6 +1,6 @@
[package]
name = "pyroncalc"
version = "0.5.2"
version = "0.5.3"
edition = "2021"
@@ -14,6 +14,7 @@ serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
xlsx = { package= "ironcalc", path = "../../xlsx", version = "0.5.0" }
pyo3 = { version = "0.25", features = ["extension-module"] }
bitcode = "0.6.3"
[features]

View File

@@ -1,6 +1,6 @@
[project]
name = "ironcalc"
version = "0.5.2"
version = "0.5.3"
description = "Create, edit and evaluate Excel spreadsheets"
requires-python = ">=3.10"
keywords = [

View File

@@ -2,7 +2,7 @@ use pyo3::exceptions::PyException;
use pyo3::{create_exception, prelude::*, wrap_pyfunction};
use types::{PySheetProperty, PyStyle};
use xlsx::base::types::Style;
use xlsx::base::types::{Style, Workbook};
use xlsx::base::{Model, UserModel};
use xlsx::export::{save_to_icalc, save_to_xlsx};
@@ -81,6 +81,12 @@ impl PyModel {
save_to_icalc(&self.model, file).map_err(|e| WorkbookError::new_err(e.to_string()))
}
/// To bytes
pub fn to_bytes(&self) -> PyResult<Vec<u8>> {
let bytes = self.model.to_bytes();
Ok(bytes)
}
/// Evaluates the workbook
pub fn evaluate(&mut self) {
self.model.evaluate()
@@ -298,6 +304,15 @@ pub fn load_from_icalc(file_name: &str) -> PyResult<PyModel> {
Ok(PyModel { model })
}
#[pyfunction]
pub fn load_from_bytes(bytes: &[u8]) -> PyResult<PyModel> {
let workbook: Workbook =
bitcode::decode(bytes).map_err(|e| WorkbookError::new_err(e.to_string()))?;
let model =
Model::from_workbook(workbook).map_err(|e| WorkbookError::new_err(e.to_string()))?;
Ok(PyModel { model })
}
/// Creates an empty model
#[pyfunction]
pub fn create(name: &str, locale: &str, tz: &str) -> PyResult<PyModel> {
@@ -348,6 +363,7 @@ fn ironcalc(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_function(wrap_pyfunction!(create, m)?)?;
m.add_function(wrap_pyfunction!(load_from_xlsx, m)?)?;
m.add_function(wrap_pyfunction!(load_from_icalc, m)?)?;
m.add_function(wrap_pyfunction!(load_from_bytes, m)?)?;
m.add_function(wrap_pyfunction!(test_panic, m)?)?;
// User model functions

View File

@@ -7,6 +7,12 @@ def test_simple():
assert model.get_formatted_cell_value(0, 1, 1) == "3"
bytes = model.to_bytes()
model2 = ic.load_from_bytes(bytes)
assert model2.get_formatted_cell_value(0, 1, 1) == "3"
def test_simple_user():
model = ic.create_user_model("model", "en", "UTC")
model.set_user_input(0, 1, 1, "=1+2")
@@ -20,4 +26,4 @@ def test_simple_user():
model2 = ic.create_user_model("model", "en", "UTC")
model2.apply_external_diffs(diffs)
assert model2.get_formatted_cell_value(0, 1, 1) == "3"
assert model2.get_formatted_cell_value(0, 1, 2) == "6"
assert model2.get_formatted_cell_value(0, 1, 2) == "6"