UNPKG

exceljs

Version:

Excel Workbook Manager - Read and Write xlsx and csv Files.

42 lines (38 loc) 1.39 kB
const colCache = require('./col-cache'); // const cellRefRegex = /(([a-z_\-0-9]*)!)?[$]?([a-z]+)[$]?([1-9][0-9]*)/i; const replacementCandidateRx = /(([a-z_\-0-9]*)!)?([a-z0-9_$]{2,})([(])?/gi; const CRrx = /^([$])?([a-z]+)([$])?([1-9][0-9]*)$/i; function slideFormula(formula, fromCell, toCell) { const offset = colCache.decode(fromCell); const to = colCache.decode(toCell); return formula.replace(replacementCandidateRx, (refMatch, sheet, sheetMaybe, addrPart, trailingParen) => { if (trailingParen) { return refMatch; } const match = CRrx.exec(addrPart); if (match) { const colDollar = match[1]; const colStr = match[2].toUpperCase(); const rowDollar = match[3]; const rowStr = match[4]; if (colStr.length > 3 || (colStr.length === 3 && colStr > 'XFD')) { // > XFD is the highest col number in excel 2007 and beyond, so this is a named range return refMatch; } let col = colCache.l2n(colStr); let row = parseInt(rowStr, 10); if (!colDollar) { col += to.col - offset.col; } if (!rowDollar) { row += to.row - offset.row; } const res = (sheet || '') + (colDollar || '') + colCache.n2l(col) + (rowDollar || '') + row; return res; } return refMatch; }); } module.exports = { slideFormula, };