Trabajando con Archivos de Excel en Node.js

Los archivos de Excel son ampliamente utilizados para almacenar y manipular datos en diversas aplicaciones. En este artículo, aprenderás a trabajar con archivos de Excel en Node.js utilizando la biblioteca xlsx-populate. Exploraremos cómo:

  • Crear archivos de Excel desde código.
  • Leer y manipular hojas de cálculo.
  • Agregar múltiples hojas y filas dinámicamente.
  • Aplicar protección con contraseña a un archivo.
  • Utilizar otras bibliotecas alternativas.

Si necesitas generar reportes, importar/exportar datos o realizar análisis en Excel desde una aplicación en Node.js, este artículo te dará las herramientas necesarias.

¡Comencemos! 🚀

Recomendaciones

Antes de comenzar a trabajar con archivos de Excel en Node.js, ten en cuenta las siguientes recomendaciones:

  • Instalar la extensión de Excel en VS Code: Esto te permitirá visualizar y editar archivos de Excel directamente desde el editor.
  • Asegurar que Node.js esté instalado: Necesitarás un entorno de Node.js configurado para ejecutar los ejemplos de código.
  • Instalar la biblioteca xlsx-populate: Es la herramienta principal que utilizaremos para manejar archivos de Excel en este artículo. Para instalarla, usa el siguiente comando:
npm i xlsx-populate

Crear un Archivo de Excel

Para crear un archivo de Excel en Node.js con xlsx-populate, puedes utilizar el siguiente código. Este ejemplo genera un archivo de Excel en blanco y escribe "Hello World!" en la celda A1.

import XlsxPopulate from "xlsx-populate";

XlsxPopulate.fromBlankAsync().then((workbook) => {
  workbook.sheet(0).cell("A1").value("Hello World!");
  workbook.toFileAsync("./out2.xlsx");
});

También puedes estructurar el código dentro de una función async para mayor claridad:

import XlsxPopulate from "xlsx-populate";

async function main() {
  const workbook = await XlsxPopulate.fromBlankAsync();
  workbook.sheet(0).cell("A1").value("Hello World!");
  workbook.toFileAsync("./out.xlsx");
}

main();

Crear Múltiples Columnas

Para crear un archivo de Excel con múltiples columnas y filas en Node.js usando xlsx-populate, podemos definir los encabezados de las columnas y agregar datos en filas consecutivas.

Ejemplo

import XlsxPopulate from "xlsx-populate";

async function main() {
  const workbook = await XlsxPopulate.fromBlankAsync();
  
  // Definir los encabezados
  workbook.sheet(0).cell("A1").value("Name");
  workbook.sheet(0).cell("B1").value("Age");
  workbook.sheet(0).cell("C1").value("Country");

  // Agregar datos en las filas
  workbook.sheet(0).cell("A2").value("John");
  workbook.sheet(0).cell("B2").value(20);
  workbook.sheet(0).cell("C2").value("USA");

  workbook.sheet(0).cell("A3").value("Bob");
  workbook.sheet(0).cell("B3").value(25);
  workbook.sheet(0).cell("C3").value("Canada");

  workbook.sheet(0).cell("A4").value("Alice");
  workbook.sheet(0).cell("B4").value(30);
  workbook.sheet(0).cell("C4").value("France");

  // Guardar el archivo
  workbook.toFileAsync("./out.xlsx");
}

main();

Este método es útil cuando necesitas estructurar datos en columnas para reportes o bases de datos. En la siguiente sección, veremos cómo leer archivos de Excel en Node.js.

Leer Archivos de Excel

Para leer un archivo de Excel en Node.js con xlsx-populate, cargamos el archivo existente y accedemos a los valores de las celdas.

import XlsxPopulate from "xlsx-populate";

async function main() {
  // Cargar el archivo de Excel existente
  const workbook = await XlsxPopulate.fromFileAsync("./out.xlsx");

  // Leer valores de celdas específicas
  const value = workbook.sheet("Sheet1").cell("A1").value();
  const value2 = workbook.sheet("Sheet1").cell("A2").value();

  // Mostrar los valores en la consola
  console.log(value);
  console.log(value2);
}

main();

Lo que estamos haciendo aqui es lo siguiente:

  • Se carga el archivo out.xlsx usando fromFileAsync().
  • Se accede a la hoja llamada "Sheet1" y se obtiene el valor de las celdas "A1" y "A2".
  • Se imprimen los valores en la consola.

Este enfoque es útil para leer datos específicos de un archivo de Excel. En la siguiente sección, veremos cómo leer todos los valores de una hoja de cálculo.

Leer Todos los Valores

Si necesitas leer todos los valores de una hoja de Excel en Node.js, puedes utilizar el método usedRange().value() de xlsx-populate. Esto devolverá un arreglo bidimensional con todos los datos utilizados en la hoja.

import XlsxPopulate from "xlsx-populate";

async function main() {
  // Cargar el archivo de Excel existente
  const workbook = await XlsxPopulate.fromFileAsync("./test.xlsx");

  // Obtener todos los valores utilizados en la hoja "Sheet1"
  const values = workbook.sheet("Sheet1").usedRange().value();

  // Mostrar los valores en la consola
  console.log(values);
}

main();

En este ultimo codigo lo podemos entender asi:

  • Se carga el archivo test.xlsx con fromFileAsync().
  • Se obtiene el rango de celdas utilizadas en "Sheet1" usando usedRange().value().
  • Se imprimen todos los valores en la consola como un array bidimensional.

Este método es útil cuando necesitas leer grandes volúmenes de datos sin especificar celdas individuales. En la siguiente sección, veremos cómo leer un rango específico de celdas.

Leer por Rango

Si necesitas obtener un conjunto específico de celdas dentro de un archivo de Excel, puedes utilizar el método range() para definir un rango y extraer sus valores.

import XlsxPopulate from "xlsx-populate";

async function main() {
  // Cargar el archivo de Excel existente
  const workbook = await XlsxPopulate.fromFileAsync("./test.xlsx");

  // Seleccionar el rango de celdas A1:B2
  const range = workbook.sheet("Sheet1").range("A1:B2");

  // Mostrar los valores en la consola
  console.log(range.value());
}

main();

Lo que se está haciendo aquí:

  • Se carga el archivo test.xlsx con fromFileAsync().
  • Se selecciona un rango específico ("A1:B2") dentro de la hoja "Sheet1".
  • Se imprimen los valores de ese rango en la consola.

Este enfoque es útil cuando solo necesitas extraer datos de un área específica en lugar de leer toda la hoja. En la siguiente sección, aprenderemos cómo crear múltiples filas dinámicamente.

Crear Múltiples Filas

Si necesitas agregar múltiples filas de datos en un archivo de Excel, puedes pasar un arreglo bidimensional a value(), lo que permite insertar varias filas de una sola vez.

import XlsxPopulate from "xlsx-populate";

async function main() {
  const workbook = await XlsxPopulate.fromBlankAsync();

  // Insertar múltiples filas en la celda A1
  workbook
    .sheet(0)
    .cell("A1")
    .value([
      [1, 2, 3],               // Fila 1
      ["Name", "Age", "Country"], // Fila 2
      ["John", 20, "USA"],     // Fila 3
      ["Bob", 25, "Japan"],    // Fila 4
    ]);

  // Guardar el archivo
  workbook.toFileAsync("./test.xlsx");
}

main();

Este código quiere decir:

  • Se crea un archivo de Excel en blanco.
  • Se insertan varias filas comenzando desde A1, donde cada subarreglo representa una fila.
  • Se guardan los datos en test.xlsx.

Este método es ideal cuando se trabaja con grandes conjuntos de datos y se requiere una inserción eficiente. En la siguiente sección, veremos cómo añadir, eliminar y editar hojas de un archivo de Excel.

Añadir, Eliminar y Editar Hojas (Sheets)

Es posible manipular las hojas de un archivo de Excel en Node.js usando xlsx-populate. Podemos listar, añadir, renombrar o eliminar hojas según nuestras necesidades.

import XlsxPopulate from "xlsx-populate";

async function main() {
  // Cargar el archivo de Excel existente
  const workbook = await XlsxPopulate.fromFileAsync("./test.xlsx");

  // Listar todas las hojas del archivo
  // console.log(workbook.sheets().map((sheet) => sheet.name()));

  // Crear una nueva hoja
  // workbook.addSheet("new sheet");
  // workbook.toFileAsync("./new.xlsx");

  // Renombrar una hoja existente
  // workbook.sheet("Sheet1").name("new sheet 2");
  // workbook.toFileAsync("./new.xlsx");

  // Eliminar una hoja existente y añadir otra nueva
  workbook.addSheet("new sheet 3");
  workbook.deleteSheet("Sheet1");
  workbook.toFileAsync("./new.xlsx");
}

main();

Lo que se está haciendo aquí:

  • Se carga el archivo test.xlsx.
  • Se listan todas las hojas disponibles (línea comentada).
  • Se crea una nueva hoja llamada "new sheet" (línea comentada).
  • Se renombra "Sheet1" a "new sheet 2" (línea comentada).
  • Se añade una nueva hoja "new sheet 3" y se elimina "Sheet1".
  • Se guardan los cambios en un nuevo archivo new.xlsx.

Este método es útil cuando necesitas organizar datos en múltiples hojas o modificar archivos existentes sin perder información clave. En la siguiente sección, aprenderemos cómo proteger un archivo de Excel con contraseña.

Contraseña

Si necesitas proteger un archivo de Excel con una contraseña en xlsx-populate, puedes hacerlo al momento de guardarlo usando la opción password.

import XlsxPopulate from "xlsx-populate";

async function main() {
  const workbook = await XlsxPopulate.fromBlankAsync();

  // Agregar un valor de prueba
  workbook.sheet(0).cell("A1").value("Datos protegidos");

  // Guardar el archivo con contraseña
  workbook.toFileAsync("./test2.xlsx", {
    password: "123456",
  });
}

main();

Lo que se está haciendo aquí:

  • Se crea un archivo de Excel en blanco.
  • Se inserta un valor en la celda A1.
  • Se guarda el archivo test2.xlsx con la contraseña "123456".

Este método es útil cuando necesitas restringir el acceso a los datos en un archivo de Excel. En la siguiente sección, exploraremos otras bibliotecas que puedes usar para trabajar con archivos de Excel en Node.js.

Otras Bibliotecas

Además de xlsx-populate, existen otras bibliotecas en Node.js que permiten manipular archivos de Excel con diferentes enfoques y características. Algunas opciones recomendadas son:

Si bien xlsx-populate es una opción sencilla y potente, estas bibliotecas pueden ser más adecuadas dependiendo de los requisitos específicos del proyecto.

Con esto finalizamos la guía sobre cómo manejar archivos de Excel en Node.js. ¡Espero que te haya sido útil! 🚀