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
+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);
}
}
}