Add Excel processing functionality with merge pattern application
Supa-backup / run_db_backup (push) Successful in 1m34s

- Introduced `index.ts` to read an Excel file and apply merge patterns to specified ranges.
- Created `lib.ts` with utility functions for column number conversion and merge pattern application.
- Updated execution counts in `carbone.ipynb` to reflect the new code structure.
This commit is contained in:
Your Name
2026-03-17 11:06:52 -06:00
parent b766cbf125
commit 6a56356c39
3 changed files with 108 additions and 8 deletions
+8 -8
View File
@@ -2,7 +2,7 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 1,
"id": "76919cba", "id": "76919cba",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -16,7 +16,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 2,
"id": "20231839", "id": "20231839",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -68,7 +68,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 3,
"id": "9950c1f7", "id": "9950c1f7",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -400,7 +400,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": 4,
"id": "95b24436", "id": "95b24436",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -489,7 +489,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 19, "execution_count": null,
"id": "caf8bc20", "id": "caf8bc20",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
@@ -520,7 +520,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 31, "execution_count": null,
"id": "929883b9", "id": "929883b9",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -575,7 +575,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 33, "execution_count": null,
"id": "29cdb42f", "id": "29cdb42f",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
@@ -640,7 +640,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 32, "execution_count": null,
"id": "18fec251", "id": "18fec251",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
+43
View File
@@ -0,0 +1,43 @@
import ExcelJS from "exceljs";
import { applyMergePattern } from "./lib";
/* const inputFile = Bun.file("mapa.xlsx");
const inputBuffer = await inputFile.arrayBuffer();
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.load(inputBuffer); */
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.readFile("mapa.xlsx");
const sheetName = 'RÍGIDO-Anexo 2 (A)'
const sheet = workbook.getWorksheet(sheetName)
if (!sheet) {
throw new Error(`Workbook has no sheet named: ${sheetName}`);
}
const CICLOS = 9;
const matrizAsignaturas = {
startColumns: ["C", "I", "O", "U", "AA"],
firstStartRow: 8,
mergeWidthInColumns: 5,
mergeHeightInRows: 3,
mergeBlockCount: CICLOS,
rowStepBetweenBlocks: 14 - 8,
} as const;
const semestres = {
startColumns: ["A"],
firstStartRow: 7,
mergeWidthInColumns: 1,
mergeHeightInRows: 5,
mergeBlockCount: CICLOS,
rowStepBetweenBlocks: 13 - 7,
} as const;
applyMergePattern(sheet, matrizAsignaturas);
applyMergePattern(sheet, semestres);
const outputBuffer = await workbook.xlsx.writeBuffer();
await Bun.write("excel2.xlsx", outputBuffer);
const end = Bun.nanoseconds();
+57
View File
@@ -0,0 +1,57 @@
import { type Worksheet } from "exceljs";
/**
* Converts an Excel column label to a 1-based number.
* Example: A -> 1, Z -> 26, AA -> 27
*/
function columnToNumber(label: string): number {
let n = 0;
for (let i = 0; i < label.length; i++) {
n = n * 26 + label.charCodeAt(i) - 64;
}
return n;
}
/**
* Generates merge ranges like:
* C8:G10, I8:M10, ...
* then C14:G16, I14:M16, ...
*/
type MergeRangePattern = {
startColumns: readonly string[];
firstStartRow: number;
mergeWidthInColumns: number;
mergeHeightInRows: number;
mergeBlockCount: number;
rowStepBetweenBlocks: number;
};
export function applyMergePattern(sheet: Worksheet, config: MergeRangePattern) {
const {
startColumns,
firstStartRow,
mergeWidthInColumns,
mergeHeightInRows,
mergeBlockCount,
rowStepBetweenBlocks
} = config;
for (let block = 0; block < mergeBlockCount; block++) {
const rowStart = firstStartRow + block * rowStepBetweenBlocks;
const rowEnd = rowStart + mergeHeightInRows - 1;
for (const column of startColumns) {
const colStart = columnToNumber(column);
const colEnd = colStart + mergeWidthInColumns - 1;
sheet.mergeCells(rowStart, colStart, rowEnd, colEnd);
}
}
}