IronCalc: Motor de Hojas de Cálculo Moderno en Rust

Publicado por


Spreadsheet Engine

IronCalc: Motor de Hojas de Cálculo Moderno en Rust

Motor de spreadsheet de alto rendimiento con soporte para XLSX, WASM y múltiples lenguajes de programación

Vídeo tutorial en YouTube

Mira el vídeo completo sobre cómo instalar y usar IronCalc: Motor de Hojas de Cálculo Moderno en Rust en el canal GENBYTE:

¿Qué es IronCalc: Motor de Hojas de Cálculo Moderno en Rust?

IronCalc es un motor de hojas de cálculo moderno, en desarrollo activo, programado en Rust. Proporciona el núcleo del ecosistema IronCalc e incluye lector y escritor de archivos XLSX. Diseñado para ser utilizado desde diversos lenguajes como Python, JavaScript (WebAssembly), Node.js y potencialmente R, Julia o Go. El proyecto permite construir diferentes interfaces: terminal, aplicación de escritorio o integración en aplicaciones web propias. Se distribuye bajo licencias MIT y Apache-2.0 a elección del usuario.

Motor de spreadsheet escrito en Rust con bindings WebAssembly, lector/escritor XLSX nativo y arquitectura preparada para múltiples frontends (web, terminal, escritorio).

Características principales

Motor de cálculo en Rust

Núcleo de alto rendimiento programado en Rust que evalúa fórmulas y gestiona modelos de hojas de cálculo con soporte para múltiples hojas y referencias cruzadas.

Lector y escritor XLSX nativo

Capacidad para leer y escribir archivos Excel (.xlsx) sin dependencias externas, incluyendo conversión a formato interno .ic para carga rápida.

Bindings WebAssembly

Compilación a WASM mediante wasm-pack para uso directo en navegadores y entornos JavaScript/TypeScript, permitiendo ejecución del motor en el cliente.

Soporte multi-lenguaje

API accesible desde Python, JavaScript (WASM), Node.js y con planes para R, Julia y Go a través de bindings nativos.

Arquitectura multi-frontend

Diseñado para servir como backend de diferentes skins: aplicación web (React), interfaz de terminal, aplicación de escritorio (Tauri/Electron) o integración en SaaS propio.

Despliegue con Docker y Caddy

Incluye Dockerfile multi-etapa y docker-compose con servidor Rust (Rocket) en puerto 8000 y proxy inverso Caddy sirviendo frontend en puerto 2080.

Licencia dual permisiva

Disponible bajo licencia MIT o Apache-2.0 a elección, facilitando integración en proyectos propietarios y open source.

Requisitos del sistema

  • Docker y Docker Compose para despliegue en contenedores
  • Rust toolchain (stable) para compilación nativa
  • Node.js 24 y pnpm 9.15.4 para construcción del frontend y bindings WASM
  • Herramientas de sistema: bash, curl, ca-certificates, make
  • Objetivo wasm32-unknown-unknown para compilación WebAssembly

Instalación con Docker Compose

Despliegue con Docker Compose

Clonar el repositorio y levantar los servicios definidos en docker-compose.yml. Esto construye la imagen del servidor Rust (ironcalc-server) y el proxy Caddy (ironcalc-caddy), exponiendo la aplicación en el puerto 2080.

git clone https://github.com/ironcalc/IronCalc.git
cd IronCalc
docker compose up –build

Compilación nativa del motor

Compilar el motor y herramientas de línea de comandos directamente con Cargo en modo release. Requiere toolchain Rust instalado.

cargo build –release

Construcción completa (frontend + WASM + servidor)

El Dockerfile documenta la construcción completa: dependencias de sistema, toolchain WASM, Node.js vía nvm, compilación del servidor Rocket, bindings WASM, widget React y frontend de la aplicación web. Para desarrollo local sin Docker, replicar estos pasos manualmente.

# Instalar dependencias de sistema y toolchains
rustup target add wasm32-unknown-unknown
cargo install wasm-pack
# Instalar Node.js 24 y pnpm 9.15.4
# Compilar servidor
cargo build –release –manifest-path webapp/app.ironcalc.com/server/Cargo.toml
# Compilar WASM
make -C bindings/wasm
# Compilar widget y frontend
cd webapp/IronCalc && npm install && npm run build
cd ../app.ironcalc.com/frontend && npm install && npm run build

Acceder al proyecto

Aplicación web (Docker Compose)

Tras ejecutar docker compose up –build, la interfaz web está disponible en http://localhost:2080. Caddy sirve el frontend estático y hace proxy inverso al servidor Rust en /api.

Servidor API directo

El servidor Rocket expone su API en el puerto 8000 dentro del contenedor (variable ROCKET_PORT=8000). En despliegue Docker Compose, Caddy enruta el tráfico de /api hacia este puerto.

Vista previa online

Versión de prueba temprana ejecutándose completamente en el navegador: https://app.ironcalc.com

Casos de uso

  • Integración de motor de spreadsheet en aplicaciones SaaS propias con licencia permisiva
  • Desarrollo de aplicaciones web de hojas de cálculo con backend Rust y frontend React
  • Procesamiento y conversión automatizada de archivos XLSX en pipelines de datos
  • Ejecución de cálculos de spreadsheet en el navegador vía WebAssembly sin servidor
  • Creación de herramientas de línea de comandos para manipulación de hojas de cálculo
  • Investigación y desarrollo de algoritmos de evaluación de fórmulas en Rust

Configuración avanzada

Uso del motor como biblioteca Rust

Añadir ironcalc como dependencia en Cargo.toml desde el repositorio Git y utilizar el modelo para crear hojas, establecer valores, evaluar fórmulas y exportar a XLSX. El ejemplo oficial muestra creación de modelo, población de celdas, adición de hoja con fórmula SUM y guardado a disco.

[dependencies]
ironcalc = { git = "https://github.com/ironcalc/IronCalc", version = "0.8"}

// Ejemplo de uso en main.rs
use ironcalc::{
base::{expressions::utils::number_to_column, Model},
export::save_to_xlsx,
};

fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut model = Model::new_empty("hello-calc.xlsx", "en", "UTC", "en")?;
for row in 1..100 {
for column in 1..100 {
let value = row * column;
model.set_user_input(0, row, column, format!("{}", value));
}
}
model.add_sheet("Calculation")?;
let last_column = number_to_column(100).unwrap();
let formula = format!("=SUM(Sheet1!A1:{}100)", last_column);
model.set_user_input(1, 1, 1, formula);
model.evaluate();
save_to_xlsx(&model, "hello-calc.xlsx")?;
Ok(())
}

Generación de documentación local

Generar la documentación de la API con cargo doc y servirla localmente para consulta offline.

make docs
cd target/doc
python -m http.server
# Visitar http://0.0.0.0:8000/ironcalc/

Conversión de plantillas XLSX a formato interno .ic

El binario xlsx_2_icalc (compilado en el Dockerfile) convierte archivos XLSX de prueba y plantillas al formato binario .ic para carga rápida en el frontend. El proceso se ejecuta automáticamente durante la construcción de la imagen Docker.

# Compilar la herramienta
cargo build –manifest-path xlsx/Cargo.toml
# Convertir archivos
./target/debug/xlsx_2_icalc archivo.xlsx salida.ic

Gestión y mantenimiento

Ejecución de pruebas completas

El Makefile incluye objetivo 'tests' que ejecuta pruebas unitarias, de integración, linter (clippy) y formateo (rustfmt). Requiere toolchain Rust completo.

make tests

Cobertura de código

Generar informe de cobertura con 'make coverage' y servir el reporte HTML localmente para análisis.

make coverage
cd target/coverage/html
python -m http.server

Actualización de dependencias

Las dependencias Rust se gestionan vía Cargo.lock/Cargo.toml. Las dependencias Node.js (frontend, widget) usan package.json y pnpm-lock.yaml en sus respectivos directorios. Actualizar con cargo update y pnpm update según corresponda.

Limpieza de artefactos de construcción

Eliminar directorios target/, dist/, node_modules/ y cachés de Docker para reconstrucción limpia.

cargo clean
rm -rf dist
rm -rf webapp/IronCalc/node_modules
rm -rf webapp/app.ironcalc.com/frontend/node_modules
docker system prune -f

Stack técnico

  • Rust (motor principal, servidor Rocket, CLI)
  • WebAssembly (wasm32-unknown-unknown, wasm-pack)
  • React (frontend webapp, widget)
  • TypeScript/JavaScript (bindings WASM, tooling)
  • Node.js 24 / pnpm 9.15.4 (build frontend)
  • Docker (multi-stage build, runtime)
  • Docker Compose (orquestación server + caddy)
  • Caddy (proxy inverso, servidor estático, TLS automático)
  • Debian bookworm-slim (imagen base runtime servidor)
  • SQLite (base de datos embebida del servidor)
  • Make (automatización de tareas: test, coverage, docs)

Referencias oficiales

Apoya el canal GENBYTE

Sígueme en mis redes sociales

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *