diff --git a/Cargo.lock b/Cargo.lock index 48b2d81..282e323 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -783,8 +783,9 @@ dependencies = [ [[package]] name = "pyroncalc" -version = "0.5.2" +version = "0.5.3" dependencies = [ + "bitcode", "ironcalc", "pyo3", "serde", diff --git a/bindings/python/Cargo.toml b/bindings/python/Cargo.toml index 21eefa2..1531256 100644 --- a/bindings/python/Cargo.toml +++ b/bindings/python/Cargo.toml @@ -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] diff --git a/bindings/python/pyproject.toml b/bindings/python/pyproject.toml index d652e63..8774fdc 100644 --- a/bindings/python/pyproject.toml +++ b/bindings/python/pyproject.toml @@ -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 = [ diff --git a/bindings/python/src/lib.rs b/bindings/python/src/lib.rs index 4a188c2..b6eaa45 100644 --- a/bindings/python/src/lib.rs +++ b/bindings/python/src/lib.rs @@ -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> { + 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 { Ok(PyModel { model }) } +#[pyfunction] +pub fn load_from_bytes(bytes: &[u8]) -> PyResult { + 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 { @@ -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 diff --git a/bindings/python/tests/test_create.py b/bindings/python/tests/test_create.py index 02e5048..ca029e5 100644 --- a/bindings/python/tests/test_create.py +++ b/bindings/python/tests/test_create.py @@ -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" \ No newline at end of file + assert model2.get_formatted_cell_value(0, 1, 2) == "6" diff --git a/webapp/IronCalc/package-lock.json b/webapp/IronCalc/package-lock.json index 068ac2b..01ae3be 100644 --- a/webapp/IronCalc/package-lock.json +++ b/webapp/IronCalc/package-lock.json @@ -1,12 +1,12 @@ { "name": "@ironcalc/workbook", - "version": "0.5.4", + "version": "0.5.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@ironcalc/workbook", - "version": "0.5.4", + "version": "0.5.5", "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", diff --git a/webapp/IronCalc/package.json b/webapp/IronCalc/package.json index 584dc6c..2a38092 100644 --- a/webapp/IronCalc/package.json +++ b/webapp/IronCalc/package.json @@ -1,6 +1,6 @@ { "name": "@ironcalc/workbook", - "version": "0.5.4", + "version": "0.5.5", "type": "module", "main": "./dist/ironcalc.js", "module": "./dist/ironcalc.js", diff --git a/webapp/IronCalc/src/IronCalc.tsx b/webapp/IronCalc/src/IronCalc.tsx index 7efae09..38d4bad 100644 --- a/webapp/IronCalc/src/IronCalc.tsx +++ b/webapp/IronCalc/src/IronCalc.tsx @@ -11,10 +11,6 @@ interface IronCalcProperties { } function IronCalc(properties: IronCalcProperties) { - properties.model.setUsers([ - { id: "john@doe.com", sheet: 0, row: 5, column: 6 }, - { id: "micheal@doe.com", sheet: 0, row: 1, column: 6 }, - ]); return ( diff --git a/webapp/IronCalc/src/components/WorksheetCanvas/worksheetCanvas.ts b/webapp/IronCalc/src/components/WorksheetCanvas/worksheetCanvas.ts index f700c2d..2c443ec 100644 --- a/webapp/IronCalc/src/components/WorksheetCanvas/worksheetCanvas.ts +++ b/webapp/IronCalc/src/components/WorksheetCanvas/worksheetCanvas.ts @@ -1257,7 +1257,6 @@ export default class WorksheetCanvas { ".user-selection-ironcalc", )) handle.remove(); - const colors = []; users.forEach((user, index) => { const { sheet, row, column } = user; if (sheet !== this.model.getSelectedSheet()) {