Skip to content

@origints/xlsx

XLSX workbook parsing with cell predicates, cursor-based iteration, and header-relative column lookup.

Terminal window
npm install @origints/xlsx @origints/core
  • Parse XLSX from streams, buffers, or file paths
  • Navigate workbooks, sheets, ranges, and cells
  • Cell predicates for conditional extraction
  • eachSlice iteration with header-relative column access
  • Range-based row extraction
  • Cursor-based sequential processing
  • Full source location tracking for every cell
import { Planner, loadFile, run } from '@origints/core'
import { parseXlsx } from '@origints/xlsx'
const plan = new Planner()
.in(loadFile('data.xlsx'))
.mapIn(parseXlsx())
.emit((out, $) => out
.add('title', $.firstSheet().cell('A1').string())
.add('revenue', $.firstSheet().cell('B2').number())
)
.compile()
const result = await run(plan, { readFile, registry })
const plan = new Planner()
.in(loadFile('report.xlsx'))
.mapIn(parseXlsx())
.emit((out, $) => out
.add('totalSales', $.sheet('Sales').cell('B10').number())
.add('totalExpenses', $.sheet('Expenses').cell('B10').number())
)
.compile()
const plan = new Planner()
.in(loadFile('employees.xlsx'))
.mapIn(parseXlsx())
.emit((out, $) => out
.add('employees', $.firstSheet().range('A2:C4').rows(row => ({
kind: 'object',
properties: {
name: row.col(1).string(),
age: row.col(2).number(),
dept: row.col(3).string(),
},
})))
)
.compile()

Iterate rows from a starting cell while a predicate holds, with header-relative column access:

import { cell, rowCol } from '@origints/xlsx'
const hasData = rowCol(0, cell.isNotEmpty())
.and(rowCol(0, cell.startsWith('Total').not()))
const plan = new Planner()
.in(loadFile('report.xlsx'))
.mapIn(parseXlsx())
.emit((out, $) => {
const header = $.firstSheet().find(cell.equals('Name'))
return out.add('people',
header.down().eachSlice('down', hasData, row => ({
kind: 'object',
properties: {
name: row.colWhere(header, cell.equals('Name')).string(),
role: row.colWhere(header, cell.equals('Role')).string(),
},
}))
)
})
.compile()

Gather cells in a direction while a predicate matches:

import { cell } from '@origints/xlsx'
$.firstSheet()
.cell('B2')
.eachCell('down', cell.isNotEmpty(), c => c.number())
// [100, 200, 300, 400]
const topLeft = $.firstSheet().find(cell.equals('Name'))
const bottomRight = $.firstSheet().find(cell.equals('Total')).left()
$.firstSheet().range(topLeft, bottomRight).rows(row => ({ /* ... */ }))
import { cell } from '@origints/xlsx'
cell.equals('Total')
cell.contains('Revenue')
cell.startsWith('Q')
cell.isNotEmpty()
cell.gt(100)
// Composition
cell.isNotEmpty().and(cell.startsWith('Total').not())
import { parseXlsxAsyncImpl, XlsxWorkbook } from '@origints/xlsx'
const workbook = (await parseXlsxAsyncImpl.execute(buffer)) as XlsxWorkbook
const sheet = workbook.sheet('Sheet1')
if (sheet.ok) {
const cellVal = sheet.value.cell('A1')
if (cellVal.ok) console.log(cellVal.value.string().value)
}
ExportDescription
parseXlsx(options?)Transform AST for Planner.mapIn()
registerXlsxTransforms(registry)Register XLSX transforms
XlsxWorkbookWorkbook navigation
XlsxSheetSheet with cell/range access
XlsxRangeRange operations
XlsxCellCell value extraction
XlsxCursorSequential cursor-based iteration
cellCell predicate factory
rowColRow predicate factory

MIT