Spreadsheet +
A comprehensive and fluent way to interact with spreadsheets with BoxLang
A powerful BoxLang module for creating, reading, and manipulating Excel spreadsheet files.
This module is only available to +/++ subscribers only but can be installed in conjunction with the bx-plus Module with a limited tria.
Copyright Since 2023 by Ortus Solutions, Corp www.boxlang.io | www.ortussolutions.com
Table of Contents
Overview
The BoxLang Spreadsheet Module (bx-spreadsheet) is a comprehensive library for Excel file manipulation in BoxLang. It offers three distinct APIs to suit different coding styles:
🎯 Three Ways to Work with Spreadsheets
Fluent API ✨
Spreadsheet()
Modern chainable interface (recommended)
Spreadsheet("data.xlsx").toArray()
BIF Functions 📚
SpreadsheetNew(), etc.
Traditional function-based approach
SpreadsheetRead("data.xlsx")
Component Tag 🏷️
<bx:spreadsheet>
Declarative CFML-compatible syntax
<bx:spreadsheet action="read" src="data.xlsx">
💡 Recommended: Use the Fluent API (
Spreadsheet()) for the most modern, readable, and maintainable code.
Features
✨ Fluent Method Chaining - Intuitive, readable code with chainable methods
📊 Multiple Formats - Support for
.xls(binary) and.xlsx(XML) formatss🎨 Rich Formatting - Fonts, colors, borders, alignments, and cell styles
🔢 Formula Support - Set, evaluate, and recalculate Excel formulas
📈 Data Import/Export - Convert to/from JSON, CSV, Query, and Array formats
🖼️ Image Embedding - Add images to spreadsheets with positioning control
🔐 Password Protection - Secure spreadsheet files with passwords
📄 Multi-Sheet Support - Create, manage, copy, and manipulate multiple worksheets
🚀 High Performance - Built on Apache POI for reliable, efficient processing
🔧 Comprehensive API - 85+ BIF functions and full component support
🤖 Automatic Resource Management - No need to manually close workbooks
❄️ Freeze Panes - Lock rows/columns for better viewing
📐 Auto-sizing - Automatically adjust column widths
🔗 Hyperlinks - Add and manage cell hyperlinks
💬 Comments - Add cell comments with rich formatting
📎 Merge Cells - Combine cells for better layout
Requirements
BoxLang Runtime 1.0.0 or higher
BoxLang+ License - This module requires a BoxLang+ license
Installation
Using CommandBox just run:
box install bx-spreadsheet@ortusQuick Start
Fluent API (Recommended)
The fluent API provides a modern, chainable interface for elegant spreadsheet manipulation:
// Create a new spreadsheet and populate it
Spreadsheet( "sales-report.xlsx" )
.createAndSelectSheet( "Sales Report" )
.setRowData( 1, [ "Product", "Q1", "Q2", "Q3", "Q4", "Total" ] )
.addRow( [ "Widget A", 1000, 1200, 1100, 1300, 4600 ] )
.addRow( [ "Widget B", 800, 900, 950, 1050, 3700 ] )
.setCellFormula( 2, 6, "SUM(B2:E2)" )
.setCellFormula( 3, 6, "SUM(B3:E3)" )
.formatRow( 1, { bold: true, fgcolor: "blue", fontColor: "white" } )
.autoSizeColumns()
.save();
// Read an existing spreadsheet
data = Spreadsheet( "sales-data.xlsx" )
.selectSheet( "Sheet1" )
.toArray();
// Export to different formats
csvData = Spreadsheet( "report.xlsx" ).toCSV();
jsonData = Spreadsheet( "report.xlsx" ).toJson();
queryData = Spreadsheet( "report.xlsx" ).toQuery();Traditional BIF Functions
For those familiar with CFML-style functions:
// Create a new spreadsheet
spreadsheet = SpreadsheetNew( "My Report", true ); // true = .xlsx format
// Add data
SpreadsheetSetCellValue( spreadsheet, "Product", 1, 1 );
SpreadsheetSetCellValue( spreadsheet, "Price", 1, 2 );
SpreadsheetAddRow( spreadsheet, "Widget A,29.99" );
SpreadsheetAddRow( spreadsheet, "Widget B,39.99" );
// Format and save
SpreadsheetFormatRow( spreadsheet, { bold: true }, 1 );
SpreadsheetWrite( spreadsheet, "products.xlsx", true );
// Read a spreadsheet
data = SpreadsheetRead( "products.xlsx" );
info = SpreadsheetInfo( data );Components
You can also use the Spreadsheet component for a declarative approach in either the templating language or scripting language:
Templating
<!-- Create and populate a spreadsheet -->
<bx:spreadsheet action="create" name="mySheet" sheetname="Report" />
<bx:spreadsheet action="setCellValue" name="#mySheet#" row="1" column="1" value="Name" />
<bx:spreadsheet action="addRow" name="#mySheet#" data="#['John Doe', 'Engineer']#" />
<bx:spreadsheet action="write" name="#mySheet#" filename="output.xlsx" overwrite="true" />
<!-- Read a spreadsheet -->
<bx:spreadsheet action="read" src="data.xlsx" name="importedData" sheet="Sheet1" />Scripting
// Create and manipulate with component in script
bx:spreadsheet action="create" name="mySheet" sheetname="Report";
bx:spreadsheet action="setCellValue" name="#mySheet#" row="1" column="1" value="Name";
bx:spreadsheet action="addRow" name="#mySheet#" data="#['John Doe', 'Engineer']#";
bx:spreadsheet action="write" name="#mySheet#" filename="output.xlsx" overwrite="true";
// Read a spreadsheet
bx:spreadsheet action="read" src="data.xlsx" name="importedData" sheet="Sheet1";Fluent API Guide
The fluent API starts off by calling the Spreadsheet() BIF, which returns a SpreadsheetFile object. You can then chain methods to perform various operations.
BIF Arguments
path
String
Path to an existing or new spreadsheet file
N/A
sheetName
String
Name of the initial sheet to create
"Sheet1"
xmlFormat
Boolean
Use XML (.xlsx) format if true, binary (.xls) if false
true
password
String
Password for encrypted files
N/A
Method Reference by Category
📁 File Operations
load(), save(), saveAndClose(), overwrite(), setPath(), getPath(), autoCloseOnSave(), isAutoCloseOnSave()
Load/save files, manage paths, auto-cleanup
📄 Sheet Management
createSheet(), createAndSelectSheet(), selectSheet(), removeSheet(), renameSheet(), copySheet(), hideSheet(), unhideSheet(), moveSheet()
Create, select, and manipulate worksheets
📝 Cell Operations
setCellValue(), getCellValue(), clearCell(), getCellType(), getCellFormat(), getCellAddress(), getActiveCell(), setActiveCell()
Read/write individual cell values
📊 Row Operations
setRowData(), getRowData(), addRow(), addRows(), removeRow(), setRowHeight(), hideRow(), showRow(), isRowHidden(), shiftRows(), getRowCount(), getLastRowNumber()
Manipulate entire rows
📋 Column Operations
deleteColumn(), deleteColumns(), setColumnWidth(), hideColumn(), showColumn(), isColumnHidden(), shiftColumns(), getColumnCount(), getColumnNames(), getColumnTypes(), autoSizeColumn(), autoSizeColumns()
Manipulate entire columns
🎨 Formatting
formatCell(), formatRow(), formatRows(), formatColumn(), formatColumns(), formatCellRange()
Apply visual styling to cells/ranges
🔢 Formulas
setCellFormula(), getCellFormula(), getAllFormulas(), recalculateAllFormulas(), getAutoCalculate(), setAutoCalculate(), getRecalculateFormulasOnNextOpen(), setRecalculateFormulasOnNextOpen()
Work with Excel formulas
📤 Data Export
toArray(), toQuery(), toJson(), toCSV(), toMatrix(), getAllData(), getDataAsQuery()
Export data to various formats
🔗 Hyperlinks & Comments
setCellHyperlink(), getCellHyperlink(), setCellComment(), getCellComment(), getAllCellComments()
Add links and annotations
🖼️ Images & Media
addImage(), setHeader(), setFooter(), setHeaderImage(), setFooterImage()
Embed images and headers/footers
🎯 Advanced Features
mergeCells(), addAutofilter(), addFreezePane(), addSplitPane(), setRepeatingRows(), setRepeatingColumns(), groupRows(), groupColumns(), ungroupRows(), ungroupColumns()
Cell merging, filters, panes, grouping
🖨️ Print Settings
setSheetPrintOrientation(), getPrintOrientation(), setFitToPage(), addPrintGridlines(), removePrintGridlines(), setRowBreak(), removeRowBreak(), setColumnBreak(), removeColumnBreak()
Configure printing options
🔍 Inspection
info(), getActiveSheetName(), getSheetCount(), getSheetNames(), getSheetsVisibility(), hasSheet(), isXmlFormat(), isBinaryFormat(), isOverwriteEnabled()
Query workbook information
🗑️ Data Clearing
clearCell(), clearSheet(), clearCellRange(), setCellRangeValue()
Remove or bulk-set cell content
ℹ️ Metadata
setInfo()
Set document properties
Creating Spreadsheets
// Create a new blank .xlsx file
sheet = Spreadsheet();
// Create with a specific sheet name
sheet = Spreadsheet( sheetName = "MySheet" );
// Create with .xls format (binary)
sheet = Spreadsheet( xmlFormat = false );
// Create with a file path - loads if exists, sets path if not
sheet = Spreadsheet( "reports/monthly.xlsx" );
// Path to existing file - automatically loads it
sheet = Spreadsheet( "data/existing.xlsx" );
// Path to new file - sets the path for later save()
sheet = Spreadsheet( "output/new-report.xlsx" );💡 Pro Tips:
When you pass a path to
Spreadsheet():If the file exists, it's automatically loaded
If the file doesn't exist, the path is set for when you call
save()No need to call
load()orsetPath()separately!
No manual cleanup needed - Resources are automatically managed for you, no need to call
close()
Loading & Saving
// RECOMMENDED: Pass path directly to Spreadsheet()
sheet = Spreadsheet( "data.xlsx" ); // Auto-loads if exists, sets path if not
// Alternative: Load explicitly with load()
sheet = Spreadsheet().load( "data.xlsx" );
// Load with password
sheet = Spreadsheet().load( "protected.xlsx", "password123" );
// Save to a file
sheet.save( "output.xlsx" );
// Save with password protection
sheet.save( "protected.xlsx", "secret123" );
// When path is already set, just call save()
sheet = Spreadsheet( "output.xlsx" )
.addRow( [ "Name", "Age" ] )
.addRow( [ "John", 30 ] )
.save(); // Saves to "output.xlsx"
// Enable overwrite mode (won't throw error if file exists)
sheet.overwrite( true ).save( "output.xlsx" );
// Set path and save later
sheet.setPath( "reports/monthly.xlsx" );
// ... do work ...
sheet.save(); // Saves to previously set path
// Save and close in one operation
sheet.saveAndClose(); // Uses current path
sheet.saveAndClose( "output.xlsx" );
sheet.saveAndClose( "protected.xlsx", "password123" );
// Auto-close on save - workbook closes automatically after save()
sheet.autoCloseOnSave( true )
.addRow( [ "Data" ] )
.save( "output.xlsx" ); // Workbook is automatically closed after save💡 Pro Tips:
autoCloseOnSave() is useful for long-lived objects that should cleanup after saving
Use
saveAndClose()when you want to explicitly save and close in one callNo need to manually call
close()in these patterns
Working with Sheets
// Create a new sheet
sheet.createSheet( "Q1 Data" );
// Create and immediately select a sheet
sheet.createAndSelectSheet( "Q2 Data" );
// Select an existing sheet by name
sheet.selectSheet( "Summary" );
// Select a sheet by index (1-based)
sheet.selectSheet( 1 );
// Rename a sheet
sheet.renameSheet( "Old Name", "New Name" );
// Copy a sheet
sheet.copySheet( "Template", "January" );
// Remove a sheet
sheet.removeSheet( "Temporary" );
sheet.removeSheet( 2 ); // By index
// Hide/unhide sheets
sheet.hideSheet( "Internal Data" );
sheet.unhideSheet( "Public Report" );
// Move a sheet
sheet.moveSheet( "Summary", 1 ); // Move to first position
sheet.moveSheet( 3, 1 ); // Move sheet at index 3 to index 1
// Get sheet information
sheetNames = sheet.getSheetNames(); // Returns array of sheet names
activeSheet = sheet.getActiveSheetName();
visibility = sheet.getSheetsVisibility(); // Returns struct with sheet visibility
hasSheet = sheet.hasSheet( "Data" ); // Boolean checkCell Operations
// Set cell values
sheet.setCellValue( row = 1, col = 1, value = "Name" );
sheet.setCellValue( 1, 2, "Age" );
// Set cell value on a specific sheet
sheet.setCellValue( "Sheet2", 5, 3, "Value" );
// Get cell value
value = sheet.getCellValue( 1, 1 );
// Set cell formulas
sheet.setCellFormula( 2, 5, "SUM(B2:D2)" );
sheet.setCellFormula( 3, 5, "AVERAGE(B3:D3)" );
// Get cell formula
formula = sheet.getCellFormula( 2, 5 );
// Get all formulas in the sheet
formulas = sheet.getAllFormulas();
// Clear cells
sheet.clearCell( 1, 1 );
sheet.clearCellRange( startRow = 1, startCol = 1, endRow = 10, endCol = 5 );
// Set the same value to a range of cells
sheet.setCellRangeValue( value = "N/A", startRow = 5, startCol = 1, endRow = 10, endCol = 3 );
// Get cell type (returns "blank", "numeric", "string", "formula", "boolean", "error")
type = sheet.getCellType( 2, 3 );
// Get cell address (e.g., "A1", "B5")
address = sheet.getCellAddress( 1, 1 ); // Returns "A1"
// Active cell operations
sheet.setActiveCell( 5, 3 );
activeInfo = sheet.getActiveCell(); // Returns struct with row and columnRow Operations
// Set row data
sheet.setRowData( row = 1, values = [ "Name", "Age", "City" ] );
// Get row data
rowData = sheet.getRowData( 2 );
// Add rows
sheet.addRow( [ "John Doe", 30, "NYC" ] );
sheet.addRow( "Value1,Value2,Value3" ); // Comma-delimited string
// Add row at specific position
sheet.addRow( values = [ "Data" ], row = 5, column = 1, insert = true );
// Add multiple rows from an array of arrays
data = [
[ "John", 30 ],
[ "Jane", 25 ],
[ "Bob", 35 ]
];
sheet.addRows( data );
// Add rows with column names
sheet.addRows( data, includeColumnNames = true );
// Remove a row
sheet.removeRow( 5 );
// Shift rows up or down
sheet.shiftRows( start = 5, end = 10, n = 2 ); // Shift rows 5-10 down by 2
// Hide/show rows
sheet.hideRow( 5 );
sheet.showRow( 5 );
sheet.setRowHidden( 5, true );
isHidden = sheet.isRowHidden( 5 );
// Set row height
sheet.setRowHeight( row = 1, height = 30 );
// Group rows (for collapsible outlines)
sheet.groupRows( startRow = 5, endRow = 10 );
sheet.groupRows( 5, 10, true ); // Collapsed by default
sheet.ungroupRows( 5, 10 );
// Set repeating rows (for printing)
sheet.setRepeatingRows( startRow = 1, endRow = 2 );
// Set row break (for printing)
sheet.setRowBreak( 10 );
sheet.removeRowBreak( 10 );Column Operations
// Delete columns
sheet.deleteColumn( 3 );
sheet.deleteColumns( startColumn = 2, endColumn = 4 );
// Add columns
SpreadsheetAddColumn( sheet.workbook, data = "Value1,Value2,Value3" );
// Shift columns left or right
sheet.shiftColumns( start = 3, end = 5, n = 2 );
// Hide/show columns
sheet.hideColumn( 3 );
sheet.showColumn( 3 );
sheet.setColumnHidden( 3, true );
isHidden = sheet.isColumnHidden( 3 );
// Set column width
sheet.setColumnWidth( column = 1, width = 20 );
// Auto-size columns
sheet.autoSizeColumn( 1 );
sheet.autoSizeColumns(); // All columns in active sheet
// Get column information
columnNames = sheet.getColumnNames();
columnTypes = sheet.getColumnTypes();
columnCount = sheet.getColumnCount();
// Group columns (for collapsible outlines)
sheet.groupColumns( startColumn = 3, endColumn = 6 );
sheet.groupColumns( 3, 6, true ); // Collapsed by default
sheet.ungroupColumns( 3, 6 );
// Set repeating columns (for printing)
sheet.setRepeatingColumns( startCol = 1, endCol = 2 );
// Set column break (for printing)
sheet.setColumnBreak( 5 );
sheet.removeColumnBreak( 5 );Formatting
// Format a single cell
formatStruct = {
bold: true,
italic: false,
underline: false,
fontsize: 12,
font: "Arial",
fgcolor: "yellow",
fontColor: "black",
alignment: "center",
verticalalignment: "top",
textwrap: true,
dataformat: "0.00"
};
sheet.formatCell( row = 1, col = 1, format = formatStruct );
// Format a row
sheet.formatRow( 1, { bold: true, fgcolor: "blue", fontColor: "white" } );
// Format multiple rows (comma-delimited)
sheet.formatRows( "1,3,5", { italic: true } );
// Format a column
sheet.formatColumn( 1, { alignment: "right", dataformat: "0.00" } );
// Format multiple columns
sheet.formatColumns( "1,2,3", { bold: true } );
// Format a cell range
sheet.formatCellRange(
format = { bold: true, fgcolor: "lightgray" },
startRow = 1,
startCol = 1,
endRow = 1,
endCol = 10
);
// Get cell format
cellFormat = sheet.getCellFormat( 1, 1 );
// Available format options:
// - bold, italic, underline, strikeout
// - font, fontsize, fontColor
// - alignment (left, center, right, justify)
// - verticalalignment (top, center, bottom, justify)
// - fgcolor (background color)
// - textwrap
// - dataformat (Excel format string like "0.00", "mm/dd/yyyy")
// - leftborder, rightborder, topborder, bottomborder
// - leftbordercolor, rightbordercolor, topbordercolor, bottombordercolorFormulas
// Set formulas
sheet.setCellFormula( 5, 5, "SUM(A1:A4)" );
sheet.setCellFormula( 2, 10, "IF(A2>100,'High','Low')" );
// Get a specific formula
formula = sheet.getCellFormula( 5, 5 );
// Get all formulas in the active sheet
allFormulas = sheet.getAllFormulas();
// Recalculate all formulas
sheet.recalculateAllFormulas();
// Control formula calculation
sheet.setAutoCalculate( true ); // Auto-calculate on edit
isAutoCalc = sheet.getAutoCalculate();
// Force recalculation on next open
sheet.setRecalculateFormulasOnNextOpen( true );
willRecalc = sheet.getRecalculateFormulasOnNextOpen();Data Export
// Export to array of arrays (matrix)
matrix = sheet.toMatrix();
matrix = sheet.toMatrix( "Sheet2" );
// Export to array of structs (column names as keys)
arrayData = sheet.toArray();
arrayData = sheet.toArray( "Sheet2" );
// Export to Query object
queryData = sheet.toQuery();
queryData = sheet.toQuery( "Sheet2" );
// Export to JSON
json = sheet.toJson();
json = sheet.toJson( pretty = true );
json = sheet.toJson( sheetName = "Data", pretty = true );
// Export to CSV
csv = sheet.toCSV();
csv = sheet.toCSV( { delimiter: "|", includeHeaderRow: true } );
csv = sheet.toCSV( "Sheet2", { delimiter: "\t" } );
// Get all data as array
allData = sheet.getAllData();
allData = sheet.getAllData( "Sheet2" );
// Get specific row data
rowData = sheet.getRowData( 5 );Advanced Features
Merge Cells
sheet.mergeCells( startRow = 1, startColumn = 1, endRow = 1, endColumn = 5 );Add Images
// Add image at specific cell
sheet.addImage( filepath = "logo.png", row = 1, column = 1 );
// Add image spanning multiple cells
sheet.addImage(
filepath = "chart.png",
startRow = 5,
startCol = 1,
endRow = 15,
endCol = 5
);Hyperlinks
// Set hyperlink
sheet.setCellHyperlink( row = 1, column = 1, hyperlink = "https://boxlang.io", label = "BoxLang" );
sheet.setCellHyperlink( 2, 1, "mailto:[email protected]" );
// Get hyperlink
linkInfo = sheet.getCellHyperlink( 1, 1 );Comments
// Simple comment
sheet.setCellComment( row = 1, col = 1, comment = "This is a note" );
// Comment with author
sheet.setCellComment( 1, 2, "Review this value", "John Doe" );
// Rich comment with formatting
commentStruct = {
comment: "Important!",
author: "Manager",
bold: true,
fontsize: 12,
fontcolor: "red"
};
sheet.setCellComment( 1, 3, commentStruct );
// Get comment
comment = sheet.getCellComment( 1, 1 );
// Get all comments
allComments = sheet.getAllCellComments();Freeze & Split Panes
// Freeze panes (lock rows/columns in place)
sheet.addFreezePane( column = 1, row = 2 ); // Freeze first column and first row
// Split panes
sheet.addSplitPane(
xSplitPos = 2000,
ySplitPos = 1000,
leftmostColumn = 0,
topRow = 0,
activePane = 0
);Autofilter
// Add autofilter to a range
sheet.addAutofilter(
startRow = 1,
startColumn = 1,
endRow = 100,
endColumn = 5
);Print Settings
// Set print orientation
sheet.setSheetPrintOrientation( "landscape" ); // or "portrait"
orientation = sheet.getPrintOrientation();
// Fit to page
sheet.setFitToPage( fitToPage = true, pagesWide = 1, pagesHigh = 1 );
// Print gridlines
sheet.addPrintGridlines();
sheet.removePrintGridlines();
// Headers and footers
sheet.setHeader( { left: "Confidential", center: "&A", right: "&D" } );
sheet.setFooter( { left: "&F", center: "Page &P of &N", right: "&T" } );
// Header/footer images
sheet.setHeaderImage( alignment = "center", imagePath = "logo.png" );
sheet.setFooterImage( alignment = "right", imagePath = "watermark.png" );Workbook Metadata
// Set workbook properties
sheet.setInfo( {
author: "John Doe",
title: "Sales Report 2024",
subject: "Q1 Sales Data",
keywords: "sales, quarterly, report",
comments: "Generated automatically"
} );
// Get workbook info
info = sheet.info();Utilities
// Check file format
isXml = sheet.isXmlFormat(); // .xlsx
isBinary = sheet.isBinaryFormat(); // .xls
// Get row/column counts
rowCount = sheet.getRowCount();
colCount = sheet.getColumnCount();
// Close workbook (release resources)
sheet.close();
// Get file path
path = sheet.getPath();
// Clear entire sheet
sheet.clearSheet( "Sheet1" );BIF Reference
The module provides 85+ BIF functions for traditional function-based programming. All functions are prefixed with Spreadsheet except for utility functions like IsSpreadsheetFile and IsSpreadsheetObject.
📋 Complete BIF List
Creation & Loading
SpreadsheetNew, SpreadsheetRead, SpreadsheetReadBinary, SpreadsheetFile
Saving & Writing
SpreadsheetWrite
Sheet Management
SpreadsheetCreateSheet, SpreadsheetSetActiveSheet, SpreadsheetSetActiveSheetNumber, SpreadsheetRemoveSheet, SpreadsheetRemoveSheetNumber, SpreadsheetRenameSheet
Cell Operations
SpreadsheetSetCellValue, SpreadsheetGetCellValue, SpreadsheetSetCellFormula, SpreadsheetGetCellFormula, SpreadsheetGetCellType, SpreadsheetClearCell, SpreadsheetSetCellRangeValue, SpreadsheetClearCellRange, SpreadsheetSetCellComment, SpreadsheetGetCellComment, SpreadsheetSetCellHyperlink, SpreadsheetGetCellHyperlink, SpreadsheetSetActiveCell, SpreadsheetGetActiveCell
Row Operations
SpreadsheetAddRow, SpreadsheetAddRows, SpreadsheetDeleteRow, SpreadsheetDeleteRows, SpreadsheetShiftRows, SpreadsheetSetRowHeight, SpreadsheetSetRowHidden, SpreadsheetSetRowBreak, SpreadsheetRemoveRowBreak, SpreadsheetGroupRows, SpreadsheetUngroupRows, SpreadsheetisRowHidden
Column Operations
SpreadsheetAddColumn, SpreadsheetDeleteColumn, SpreadsheetDeleteColumns, SpreadsheetShiftColumns, SpreadsheetSetColumnWidth, SpreadsheetGetColumnWidth, SpreadsheetSetColumnHidden, SpreadsheetSetColumnBreak, SpreadsheetRemoveColumnBreak, SpreadsheetGroupColumns, SpreadsheetUngroupColumns, SpreadsheetisColumnHidden, SpreadsheetGetColumnCount
Formatting
SpreadsheetFormatCell, SpreadsheetFormatRow, SpreadsheetFormatRows, SpreadsheetFormatColumn, SpreadsheetFormatColumns, SpreadsheetFormatCellRange, SpreadsheetGetCellFormat
Advanced Features
SpreadsheetMergeCells, SpreadsheetAddImage, SpreadsheetAddAutofilter, SpreadsheetAddFreezePane, SpreadsheetAddSplitPane, SpreadsheetAddPageBreaks, SpreadsheetAddInfo
Print Settings
SpreadsheetSetPrintOrientation, SpreadsheetGetPrintOrientation, SpreadsheetSetFitToPage, SpreadsheetAddPrintGridlines, SpreadsheetRemovePrintGridlines, SpreadsheetSetHeader, SpreadsheetSetFooter, SpreadsheetSetHeaderImage, SpreadsheetSetFooterImage, SpreadsheetSetRepeatingRows, SpreadsheetSetRepeatingColumns
Formulas
SpreadsheetSetAutoCalculate, SpreadsheetGetAutoCalculate, SpreadsheetSetForceFormulaRecalculation, SpreadsheetGetForceFormulaRecalculation
Information
SpreadsheetInfo, SpreadsheetGetLastRowNumber, IsSpreadsheetFile, IsSpreadsheetObject, SpreadsheetIsBinaryFormat, SpreadsheetIsXMLFormat
Usage Examples
// Create and manipulate with BIFs
sheet = SpreadsheetNew( "Report", true );
SpreadsheetAddRow( sheet, "Name,Age,City" );
SpreadsheetAddRow( sheet, "John,30,NYC" );
SpreadsheetFormatRow( sheet, { bold: true }, 1 );
SpreadsheetWrite( sheet, "output.xlsx", true );
// Read and inspect
data = SpreadsheetRead( "input.xlsx" );
info = SpreadsheetInfo( data );
colCount = SpreadsheetGetColumnCount( data );
// Check file types
if ( IsSpreadsheetFile( "data.xlsx" ) ) {
isXlsx = SpreadsheetIsXMLFormat( "data.xlsx" );
}
// Formula operations
SpreadsheetSetCellFormula( sheet, "SUM(A1:A10)", 11, 1 );
SpreadsheetSetAutoCalculate( sheet, true );Component Reference
The Spreadsheet component provides a declarative, or a tag-based approach to spreadsheet manipulation. It can be used in both templating and scripting contexts.
📋 Supported Actions
read
Read a spreadsheet file
src, name
sheet, sheetindex, headerrow, rows, columns, columnnames, password
write
Write spreadsheet to file
name, filename
overwrite, password
create
Create new spreadsheet object
name
sheetname, xmlformat
delete
Delete a sheet
name
sheetname, sheetindex
addColumn
Add column data
name, data
column, startrow
addRow
Add row data
name, data
row, column
addRows
Add multiple rows
name, data
startrow, startcolumn
deleteColumn
Delete a column
name, column
deleteRow
Delete a row
name, row
formatCell
Format a cell
name, formatstruct, row, column
formatColumn
Format a column
name, formatstruct, column
formatRow
Format a row
name, formatstruct, row
formatCells
Format cell range
name, formatstruct, startrow, startcolumn, endrow, endcolumn
mergeCells
Merge cells
name, startrow, startcolumn, endrow, endcolumn
setActiveSheet
Set active sheet
name
sheetname, sheetindex
setCellValue
Set cell value
name, value, row, column
setCellFormula
Set cell formula
name, formula, row, column
info
Get spreadsheet info
name
Usage Examples
<!-- Read a spreadsheet -->
<bx:spreadsheet action="read" src="data.xlsx" name="myData" sheet="Sheet1" />
<!-- Create and populate -->
<bx:spreadsheet action="create" name="report" sheetname="Sales" xmlformat="true" />
<bx:spreadsheet action="setCellValue" name="#report#" row="1" column="1" value="Product" />
<bx:spreadsheet action="addRow" name="#report#" data="#['Widget A', 100, 29.99]#" />
<!-- Format and save -->
<bx:spreadsheet action="formatRow" name="#report#" row="1" formatstruct="{ bold: true }" />
<bx:spreadsheet action="write" name="#report#" filename="sales.xlsx" overwrite="true" />
<!-- Script syntax -->
<bx:script>
bx:spreadsheet action="read" src="data.xlsx" name="data";
bx:spreadsheet action="formatCell" name=data row=1 column=1 formatstruct={ bold: true };
</bx:script>Examples
Example 1: Sales Report Generator
// Create a comprehensive sales report
Spreadsheet()
.createSheet( "Q1 Sales" )
.selectSheet( "Q1 Sales" )
.setRowData( 1, [ "Month", "Revenue", "Expenses", "Profit", "Margin %" ] )
.addRow( [ "January", 50000, 30000, 20000, "=D2/B2" ] )
.addRow( [ "February", 55000, 32000, 23000, "=D3/B3" ] )
.addRow( [ "March", 60000, 35000, 25000, "=D4/B4" ] )
.addRow( [ "Total", "=SUM(B2:B4)", "=SUM(C2:C4)", "=SUM(D2:D4)", "=D5/B5" ] )
.formatRow( 1, { bold: true, fgcolor: "blue", fontColor: "white" } )
.formatRow( 5, { bold: true, fgcolor: "lightgray" } )
.formatColumn( 2, { dataformat: "$#,##0.00" } )
.formatColumn( 3, { dataformat: "$#,##0.00" } )
.formatColumn( 4, { dataformat: "$#,##0.00" } )
.formatColumn( 5, { dataformat: "0.0%" } )
.autoSizeColumns()
.recalculateAllFormulas()
.save( "q1-sales-report.xlsx" );Example 2: Data Import and Analysis
// Read CSV-like data and create Excel report
importData = [
[ "Name", "Department", "Salary" ],
[ "John Doe", "Engineering", 95000 ],
[ "Jane Smith", "Marketing", 85000 ],
[ "Bob Johnson", "Sales", 75000 ]
];
Spreadsheet( sheetName = "Employees" )
.addRows( importData, includeColumnNames = true )
.formatRow( 1, { bold: true } )
.addRow( [ "AVERAGE", "", "=AVERAGE(C2:C4)" ] )
.formatCell( 5, 3, { bold: true, dataformat: "$#,##0" } )
.autoSizeColumns()
.save( "employee-report.xlsx" );Example 3: Multi-Sheet Workbook
// Create workbook with multiple sheets
workbook = Spreadsheet()
.createSheet( "Summary" )
.createSheet( "Details" )
.createSheet( "Charts" )
// Populate Summary
.selectSheet( "Summary" )
.setRowData( 1, [ "Report Summary" ] )
.mergeCells( 1, 1, 1, 5 )
.formatCell( 1, 1, { bold: true, fontsize: 16, alignment: "center" } )
// Populate Details
.selectSheet( "Details" )
.addRows( detailData, includeColumnNames = true )
.autoSizeColumns()
// Copy sheet
.copySheet( "Details", "Details Backup" )
.save( "multi-sheet-report.xlsx" );Example 4: Export to Multiple Formats
// Load and export to different formats
sheet = Spreadsheet( "source-data.xlsx" );
// Export to JSON file
fileWrite( "data.json", sheet.toJson( pretty = true ) );
// Export to CSV file
fileWrite( "data.csv", sheet.toCSV() );
// Get as Query object for database operations
queryData = sheet.toQuery();
// Get as array for manipulation
arrayData = sheet.toArray();Example 5: Template-Based Report
// Load template and fill with data
report = Spreadsheet( "report-template.xlsx" )
.selectSheet( "Data" )
.setCellValue( 2, 1, "Acme Corp" )
.setCellValue( 2, 2, dateFormat( now(), "yyyy-mm-dd" ) )
.addRows( getData(), startRow = 5, startColumn = 1 )
.recalculateAllFormulas()
.save( "filled-report-#dateFormat(now(),'yyyymmdd')#.xlsx" );🚀 Advanced Usage
Freeze Panes
// Freeze first row and first column
spreadsheet = SpreadsheetNew();
SpreadsheetAddRow( spreadsheet, [ "Name", "Q1", "Q2", "Q3", "Q4" ] );
SpreadsheetAddFreezePane( spreadsheet, 1, 1 );
// Freeze first 2 rows
SpreadsheetAddFreezePane( spreadsheet, 0, 2 );Auto Filters
// Add auto filter to header row
spreadsheet = SpreadsheetNew();
SpreadsheetAddRow( spreadsheet, [ "Product", "Region", "Sales" ] );
SpreadsheetAddRow( spreadsheet, [ "Widget A", "North", 1000 ] );
SpreadsheetAddRow( spreadsheet, [ "Widget B", "South", 800 ] );
SpreadsheetAddAutofilter( spreadsheet, 1 ); // Filter on row 1Shifting Rows
// Shift rows down to insert space
spreadsheet = SpreadsheetNew();
SpreadsheetAddRow( spreadsheet, [ "Row 1" ] );
SpreadsheetAddRow( spreadsheet, [ "Row 2" ] );
SpreadsheetAddRow( spreadsheet, [ "Row 3" ] );
// Shift rows 2-3 down by 2 positions
SpreadsheetShiftRows( spreadsheet, 2, 3, 2 );Complex Fluent API Examples
Creating a Report with Multiple Sheets
// Build a complete financial report
SpreadsheetFile()
// Summary Sheet
.createSheet( "Summary" )
.selectSheet( "Summary" )
.setRowData( 1, [ "Metric", "Value" ] )
.addRow( [ "Total Revenue", 150000 ] )
.addRow( [ "Total Expenses", 95000 ] )
.addRow( [ "Net Profit", 55000 ] )
// Revenue Details Sheet
.createSheet( "Revenue Details" )
.selectSheet( "Revenue Details" )
.setRowData( 1, [ "Product", "Q1", "Q2", "Q3", "Q4", "Total" ] )
.addRow( [ "Product A", 25000, 30000, 28000, 32000, 115000 ] )
.addRow( [ "Product B", 15000, 18000, 20000, 22000, 75000 ] )
// Format and save
.autoSizeColumns()
.save( "reports/financial-report.xlsx" );Loading, Modifying, and Saving
// Load existing file, make changes, save to new location
SpreadsheetFile()
.load( "templates/report-template.xlsx" )
.selectSheet( "Data" )
.setCellValue( 1, 1, "Updated: " & now() )
.addRow( [ "New Entry", 12345 ] )
.selectSheet( "Summary" )
.setCellValue( 2, 2, "Status: Complete" )
.overwrite( true )
.save( "output/completed-report.xlsx" );Working with Query Results
// Convert query results to spreadsheet
qData = queryExecute( "SELECT name, email, status FROM users" );
spreadsheet = SpreadsheetNew();
SpreadsheetAddRow( spreadsheet, [ "Name", "Email", "Status" ] );
SpreadsheetAddRows( spreadsheet, qData, 2, 1 );
SpreadsheetWrite( spreadsheet, "users-export.xlsx" );Reading Spreadsheet Information
// Get spreadsheet metadata
spreadsheet = SpreadsheetRead( "report.xlsx" );
info = SpreadsheetInfo( spreadsheet );
// info structure contains:
// - SHEETCOUNT: number of sheets
// - CURRENTSHEET: name of active sheet
// - SHEETNAMES: array of all sheet names
// Get column count
columnCount = SpreadsheetGetColumnCount( spreadsheet );Binary Operations
// Read spreadsheet as binary
binaryData = SpreadsheetReadBinary( "document.xlsx" );
// This is useful for:
// - Sending files as HTTP responses
// - Storing in databases
// - Processing in memoryChaining Multiple Operations
The fluent API really shines when chaining operations:
// Build an invoice in one fluid expression
invoice = SpreadsheetFile()
.createSheet( "Invoice" )
.selectSheet( "Invoice" )
// Header
.setRowData( 1, [ "INVOICE", "", "", "" ] )
.setRowData( 2, [ "Invoice #: INV-001", "", "Date: " & dateFormat( now(), "mm/dd/yyyy" ), "" ] )
// Line items
.setRowData( 4, [ "Item", "Description", "Quantity", "Price", "Total" ] )
.addRow( [ "001", "Professional Services", 10, 150.00, 1500.00 ] )
.addRow( [ "002", "Software License", 1, 500.00, 500.00 ] )
.addRow( [ "003", "Support Contract", 12, 100.00, 1200.00 ] )
// Total
.setRowData( 8, [ "", "", "", "Subtotal:", 3200.00 ] )
.setRowData( 9, [ "", "", "", "Tax (10%):", 320.00 ] )
.setRowData( 10, [ "", "", "", "Total:", 3520.00 ] )
// Format
.autoSizeColumns()
.save( "invoices/INV-001.xlsx" );📖 BIF Reference
BX:Spreadsheet Component
The bx:spreadsheet component provides a declarative approach for spreadsheet operations, compatible with CFML's cfspreadsheet tag. This component can be used in both templating language (XML-style tags) and script (declarative component syntax), offering a more expressive alternative to functional BIF calls.
💡 Note: The component approach is declarative rather than functional. Use it when you prefer a configuration-style syntax over chained method calls.
Common Attributes
action (required, string) - The operation to perform
name (string) - Variable name for the spreadsheet object
src (string) - Source file path (for read action)
filename (string) - Destination file path (for write action)
sheetname (string) - Name of the sheet to work with
sheetindex (numeric) - Index of the sheet (1-based)
format (string) - File format (xlsx, xls)
overwrite (boolean) - Whether to overwrite existing files
password (string) - Password for encrypted files
xmlformat (boolean) - True for .xlsx format, false for .xls (default: true)
Supported Actions
create
Creates a new spreadsheet object.
Attributes:
name(required) - Variable name for the new spreadsheetsheetname(optional) - Name of the initial sheetxmlformat(optional) - File format (default: true for .xlsx)
Template Example:
<bx:spreadsheet action="create" name="mySpreadsheet" sheetname="Data" />Script Example:
bx:spreadsheet action="create" name="mySpreadsheet" sheetname="Data";read
Reads a spreadsheet file into a variable.
Attributes:
src(required) - Path to the spreadsheet filename(required) - Variable name to store the spreadsheetsheet(optional) - Sheet name or index to readpassword(optional) - Password for encrypted files
Template Example:
<bx:spreadsheet action="read" src="data.xlsx" name="mySpreadsheet" sheet="Sales" />Script Example:
bx:spreadsheet action="read" src="data.xlsx" name="mySpreadsheet" sheet="Sales";write
Writes a spreadsheet object to a file.
Attributes:
name(required) - Spreadsheet object to writefilename(required) - Output file pathoverwrite(optional) - Whether to overwrite existing filespassword(optional) - Password to protect the file
Template Example:
<bx:spreadsheet action="write" name="#mySpreadsheet#" filename="output.xlsx" overwrite="true" />Script Example:
bx:spreadsheet action="write" name=mySpreadsheet filename="output.xlsx" overwrite=true;update
Updates an existing spreadsheet file (same as write).
Attributes: Same as write action.
delete
Deletes a sheet from a spreadsheet.
Attributes:
name(required) - Spreadsheet objectsheetname(required) - Name of the sheet to delete
Template Example:
<bx:spreadsheet action="delete" name="#mySpreadsheet#" sheetname="OldSheet" />Script Example:
bx:spreadsheet action="delete" name=mySpreadsheet sheetname="OldSheet";addRow
Adds a row of data to the spreadsheet.
Attributes:
name(required) - Spreadsheet objectdata(required) - Array of values for the rowrow(optional) - Row number where to insertcolumn(optional) - Starting column number
Template Example:
<bx:spreadsheet action="addRow" name="#mySpreadsheet#" data="#['John', 30, 'NYC']#" />Script Example:
bx:spreadsheet action="addRow" name=mySpreadsheet data=['John', 30, 'NYC'];addRows
Adds multiple rows to the spreadsheet.
Attributes:
name(required) - Spreadsheet objectdata(required) - Array of arrays or query objectrow(optional) - Starting row numbercolumn(optional) - Starting column number
Template Example:
<bx:spreadsheet action="addRows" name="#mySpreadsheet#" data="#dataArray#" row="2" />addColumn
Adds a column of data to the spreadsheet.
Attributes:
name(required) - Spreadsheet objectdata(required) - Array of values for the columncolumn(optional) - Column numberrow(optional) - Starting row number
Template Example:
<bx:spreadsheet action="addColumn" name="#mySpreadsheet#" data="#['Q1', 1000, 1200]#" column="2" />deleteRow
Deletes a row from the spreadsheet.
Attributes:
name(required) - Spreadsheet objectrow(required) - Row number to delete
Template Example:
<bx:spreadsheet action="deleteRow" name="#mySpreadsheet#" row="5" />deleteColumn
Deletes a column from the spreadsheet.
Attributes:
name(required) - Spreadsheet objectcolumn(required) - Column number to delete
Template Example:
<bx:spreadsheet action="deleteColumn" name="#mySpreadsheet#" column="3" />setCellValue
Sets the value of a specific cell.
Attributes:
name(required) - Spreadsheet objectrow(required) - Row numbercolumn(required) - Column numbervalue(required) - Value to set
Template Example:
<bx:spreadsheet action="setCellValue" name="#mySpreadsheet#" row="1" column="1" value="Hello" />setCellFormula
Sets a formula in a specific cell.
Attributes:
name(required) - Spreadsheet objectrow(required) - Row numbercolumn(required) - Column numberformula(required) - Excel formula
Template Example:
<bx:spreadsheet action="setCellFormula" name="#mySpreadsheet#" row="10" column="1" formula="SUM(A1:A9)" />formatCell
Formats a specific cell.
Attributes:
name(required) - Spreadsheet objectrow(required) - Row numbercolumn(required) - Column numberformatStruct(required) - Struct with formatting options
Template Example:
<bx:set formatOptions = { bold: true, fontsize: 14, color: "blue" } />
<bx:spreadsheet action="formatCell" name="#mySpreadsheet#" row="1" column="1" formatStruct="#formatOptions#" />mergeCells
Merges a range of cells.
Attributes:
name(required) - Spreadsheet objectstartrow(required) - Starting row numberendrow(required) - Ending row numberstartcolumn(required) - Starting column numberendcolumn(required) - Ending column number
Template Example:
<bx:spreadsheet action="mergeCells" name="#mySpreadsheet#" startrow="1" endrow="1" startcolumn="1" endcolumn="3" />setActiveSheet
Sets the active sheet by name or index.
Attributes:
name(required) - Spreadsheet objectsheetnameorsheetindex(required) - Sheet identifier
Template Example:
<bx:spreadsheet action="setActiveSheet" name="#mySpreadsheet#" sheetname="Summary" />info
Gets information about the spreadsheet.
Attributes:
name(required) - Spreadsheet object
Template Example:
<bx:spreadsheet action="info" name="#mySpreadsheet#" />
<!-- Info stored in 'info' variable -->📖 BIF Reference (Functions)
Core Functions
SpreadsheetFile( [path] )
Returns a fluent SpreadsheetFile object for creating or manipulating spreadsheet files.
Parameters:
path(optional, string) - Path to load an existing file or where the file will be saved
Returns: SpreadsheetFile object
Example:
// Create new
spreadsheet = SpreadsheetFile();
// Load existing
spreadsheet = SpreadsheetFile( "data.xlsx" );SpreadsheetNew( [sheetname], [xmlformat] )
Creates a new BoxLang spreadsheet object.
Parameters:
sheetname(optional, string) - Name of the initial sheet (default: "Sheet1")xmlformat(optional, boolean) - True for .xlsx, false for .xls (default: true)
Returns: Spreadsheet object
Example:
spreadsheet = SpreadsheetNew( "MySheet", true );SpreadsheetRead( src, [sheet], [format], [headerrow], [password] )
Reads a spreadsheet file into a BoxLang spreadsheet object.
Parameters:
src(required, string) - Path to the spreadsheet filesheet(optional, string|number) - Sheet name or index to readformat(optional, string) - Format (auto-detected, included for compatibility)headerrow(optional, number) - Row number to start reading from (default: 1)password(optional, string) - Password for encrypted files
Returns: Spreadsheet object
Example:
spreadsheet = SpreadsheetRead( "data.xlsx", sheet="Sales", password="secret" );SpreadsheetWrite( spreadsheetObj, filename, [password], [overwrite] )
Writes a spreadsheet object to a file.
Parameters:
spreadsheetObj(required) - The spreadsheet objectfilename(required, string) - Output file pathpassword(optional, string) - Password to protect the fileoverwrite(optional, boolean) - Whether to overwrite existing files (default: false)
Returns: void
Example:
SpreadsheetWrite( spreadsheet, "output.xlsx", "", true );Sheet Management
SpreadsheetCreateSheet( spreadsheetObj, sheetName )
Creates a new sheet in the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet objectsheetName(required, string) - Name of the new sheet
Example:
SpreadsheetCreateSheet( spreadsheet, "NewSheet" );SpreadsheetSetActiveSheet( spreadsheetObj, sheetName )
Sets a sheet as the active sheet by name.
Parameters:
spreadsheetObj(required) - The spreadsheet objectsheetName(required, string) - Name of the sheet
Example:
SpreadsheetSetActiveSheet( spreadsheet, "Sales" );SpreadsheetSetActiveSheetNumber( spreadsheetObj, sheetNumber )
Sets a sheet as the active sheet by index.
Parameters:
spreadsheetObj(required) - The spreadsheet objectsheetNumber(required, number) - Sheet index (1-based)
Example:
SpreadsheetSetActiveSheetNumber( spreadsheet, 2 );SpreadsheetRemoveSheet( spreadsheetObj, sheetName )
Removes a sheet from the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet objectsheetName(required, string) - Name of the sheet to remove
Example:
SpreadsheetRemoveSheet( spreadsheet, "OldSheet" );Cell Operations
SpreadsheetSetCellValue( spreadsheetObj, value, row, column )
Sets the value of a specific cell.
Parameters:
spreadsheetObj(required) - The spreadsheet objectvalue(required) - Value to set (string, number, date, etc.)row(required, number) - Row number (1-based)column(required, number) - Column number (1-based)
Example:
SpreadsheetSetCellValue( spreadsheet, "Hello", 1, 1 );
SpreadsheetSetCellValue( spreadsheet, 42, 1, 2 );SpreadsheetGetCellValue( spreadsheetObj, row, column )
Gets the value from a specific cell.
Parameters:
spreadsheetObj(required) - The spreadsheet objectrow(required, number) - Row number (1-based)column(required, number) - Column number (1-based)
Returns: Cell value
Example:
value = SpreadsheetGetCellValue( spreadsheet, 1, 1 );SpreadsheetSetCellFormula( spreadsheetObj, formula, row, column )
Sets a formula for a cell.
Parameters:
spreadsheetObj(required) - The spreadsheet objectformula(required, string) - Excel formula (e.g., "=SUM(A1:A10)")row(required, number) - Row number (1-based)column(required, number) - Column number (1-based)
Example:
SpreadsheetSetCellFormula( spreadsheet, "=SUM(A1:A10)", 11, 1 );SpreadsheetGetCellFormula( spreadsheetObj, [row], [column] )
Gets the formula from a cell, or all formulas if row/column not specified.
Parameters:
spreadsheetObj(required) - The spreadsheet objectrow(optional, number) - Row number (1-based)column(optional, number) - Column number (1-based)
Returns: Formula string or struct of all formulas
Example:
formula = SpreadsheetGetCellFormula( spreadsheet, 11, 1 );SpreadsheetFormatCell( spreadsheetObj, format, row, column )
Applies formatting to a cell.
Parameters:
spreadsheetObj(required) - The spreadsheet objectformat(required, struct) - Format specificationrow(required, number) - Row number (1-based)column(required, number) - Column number (1-based)
Format Structure Keys:
dataformat- Number/date format patternbold- Bold text (boolean)italic- Italic text (boolean)underline- Underline text (boolean)fontsize- Font sizecolor- Font colorbgcolor- Background coloralignment- Text alignment (left, center, right)
Example:
format = {
dataformat: "$#,##0.00",
bold: true,
fontsize: 12,
color: "blue"
};
SpreadsheetFormatCell( spreadsheet, format, 1, 1 );Row and Column Operations
SpreadsheetAddRow( spreadsheetObj, data, [row], [column] )
Adds a row of data to the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet objectdata(required, array) - Array of values for the rowrow(optional, number) - Starting row number (default: next empty row)column(optional, number) - Starting column number (default: 1)
Example:
SpreadsheetAddRow( spreadsheet, [ "Name", "Age", "City" ] );SpreadsheetAddRows( spreadsheetObj, data, [row], [column] )
Adds multiple rows from an array or query.
Parameters:
spreadsheetObj(required) - The spreadsheet objectdata(required, array|query) - Array of arrays or query objectrow(optional, number) - Starting row number (default: 1)column(optional, number) - Starting column number (default: 1)
Example:
data = [
[ "John", 30, "NY" ],
[ "Jane", 25, "LA" ]
];
SpreadsheetAddRows( spreadsheet, data, 2, 1 );SpreadsheetAddColumn( spreadsheetObj, data, [column], [row] )
Adds a column of data to the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet objectdata(required, array) - Array of values for the columncolumn(optional, number) - Column number (default: 1)row(optional, number) - Starting row number (default: 1)
Example:
SpreadsheetAddColumn( spreadsheet, [ "Q1", 1000, 1200, 1100 ], 2, 1 );SpreadsheetDeleteRow( spreadsheetObj, row )
Deletes data in a row (does not remove the row itself).
Parameters:
spreadsheetObj(required) - The spreadsheet objectrow(required, number) - Row number to delete
Example:
SpreadsheetDeleteRow( spreadsheet, 5 );SpreadsheetDeleteColumn( spreadsheetObj, column )
Deletes a column from the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet objectcolumn(required, number) - Column number to delete
Example:
SpreadsheetDeleteColumn( spreadsheet, 3 );SpreadsheetShiftRows( spreadsheetObj, start, end, offset )
Shifts rows up or down in the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet objectstart(required, number) - Starting row numberend(required, number) - Ending row numberoffset(required, number) - Number of rows to shift (positive=down, negative=up)
Example:
SpreadsheetShiftRows( spreadsheet, 5, 10, 2 ); // Shift rows 5-10 down by 2Formatting Operations
SpreadsheetSetColumnWidth( spreadsheetObj, column, width )
Sets the width of a column.
Parameters:
spreadsheetObj(required) - The spreadsheet objectcolumn(required, number) - Column numberwidth(required, number) - Width in characters
Example:
SpreadsheetSetColumnWidth( spreadsheet, 1, 25 );SpreadsheetSetRowHeight( spreadsheetObj, row, height )
Sets the height of a row.
Parameters:
spreadsheetObj(required) - The spreadsheet objectrow(required, number) - Row numberheight(required, number) - Height in points
Example:
SpreadsheetSetRowHeight( spreadsheet, 1, 30 );SpreadsheetMergeCells( spreadsheetObj, startRow, endRow, startColumn, endColumn )
Merges a range of cells.
Parameters:
spreadsheetObj(required) - The spreadsheet objectstartRow(required, number) - Starting rowendRow(required, number) - Ending rowstartColumn(required, number) - Starting columnendColumn(required, number) - Ending column
Example:
SpreadsheetMergeCells( spreadsheet, 1, 1, 1, 3 ); // Merge A1:C1Advanced Features
SpreadsheetAddFreezePane( spreadsheetObj, column, row )
Adds a freeze pane to lock rows and/or columns.
Parameters:
spreadsheetObj(required) - The spreadsheet objectcolumn(required, number) - Number of columns to freezerow(required, number) - Number of rows to freeze
Example:
SpreadsheetAddFreezePane( spreadsheet, 1, 1 ); // Freeze first row and columnSpreadsheetAddAutofilter( spreadsheetObj, [row] )
Adds auto-filter functionality to a row.
Parameters:
spreadsheetObj(required) - The spreadsheet objectrow(optional, number) - Row to apply filter to (default: 1)
Example:
SpreadsheetAddAutofilter( spreadsheet, 1 );Information Functions
SpreadsheetInfo( spreadsheetObj )
Gets information about the spreadsheet.
Parameters:
spreadsheetObj(required) - The spreadsheet object
Returns: Struct containing:
SHEETCOUNT- Number of sheetsCURRENTSHEET- Name of active sheetSHEETNAMES- Array of all sheet names
Example:
info = SpreadsheetInfo( spreadsheet );
writeOutput( "Sheet count: " & info.SHEETCOUNT );SpreadsheetGetColumnCount( spreadsheetObj )
Gets the number of columns in the active sheet.
Parameters:
spreadsheetObj(required) - The spreadsheet object
Returns: Number of columns
Example:
columnCount = SpreadsheetGetColumnCount( spreadsheet );SpreadsheetReadBinary( src )
Reads a spreadsheet file as binary data.
Parameters:
src(required, string) - Path to the spreadsheet file
Returns: Binary data
Example:
binaryData = SpreadsheetReadBinary( "report.xlsx" );🤝 Contributing
We ❤️ contributions! The BoxLang Spreadsheet module is open source and we welcome your involvement.
How to Contribute
Fork the Repository 📝
Click the "Fork" button
Clone Your Fork 💻
git clone https://github.com/YOUR-USERNAME/bx-spreadsheet.git cd bx-spreadsheetCreate a Feature Branch 🌿
git checkout -b feature/my-awesome-feature developmentMake Your Changes ✏️
Write clean, well-documented code
Follow the Ortus Coding Standards
Add tests for new functionality
Test Your Changes 🧪
./gradlew downloadBoxLang # First time only ./gradlew testFormat Your Code 🎨
./gradlew spotlessApplyCommit Your Changes 💾
git add . git commit -m "feat: Add awesome new feature"Push and Create a Pull Request 🚀
git push origin feature/my-awesome-featureGo to GitHub and create a Pull Request against the
developmentbranchLink any related issues in your PR description
Development Setup
Prerequisites
JDK 21 or higher
Gradle (included via wrapper)
Building the Module
# Download BoxLang binary (first time only)
./gradlew downloadBoxLang
# Build the module
./gradlew build
# Run tests
./gradlew test
# Format code
./gradlew spotlessApply
# Check code formatting
./gradlew spotlessCheckProject Structure
bx-spreadsheet/
├── src/
│ ├── main/
│ │ ├── java/ # Java source code
│ │ │ └── ortus/boxlang/spreadsheet/
│ │ │ ├── SpreadsheetFile.java # Main fluent API class
│ │ │ └── bifs/ # BIF implementations
│ │ └── resources/
│ └── test/
│ ├── java/ # Java tests
│ └── resources/
├── build.gradle # Build configuration
├── readme.md # This file
└── CONTRIBUTING.md # Detailed contribution guidelinesTypes of Contributions
🐛 Bug Reports
Found a bug? Please open an issue with:
A clear description of the problem
Steps to reproduce
Expected vs actual behavior
BoxLang version and environment details
✨ Feature Requests
Have an idea? We'd love to hear it! Open an issue describing:
The feature you'd like to see
Why it would be useful
Any implementation ideas
📝 Documentation
Documentation improvements are always welcome:
Fix typos or clarify existing docs
Add examples
Improve code comments
Write tutorials or blog posts
💻 Code Contributions
When contributing code:
Keep changes focused and atomic
Write or update tests
Update documentation
Follow existing code style
Include meaningful commit messages
Code Style
We use:
Java Code: Ortus Java Style (
.ortus-java-style.xml)BoxLang Code: CFFormat (
.cfformat.json)
The spotlessApply Gradle task will automatically format your code.
Testing
All new features and bug fixes should include tests:
Write JUnit tests for Java code
Place tests in
src/test/javaEnsure all tests pass before submitting a PR
Getting Help
Need help contributing?
📧 Email: [email protected]
Code of Conduct
We follow the Golden Rule: Do to others as you want them to do to you.
Be respectful and considerate
Welcome newcomers warmly
Assume good intentions
Focus on constructive feedback
See our full Code of Conduct for details.
Recognition
All contributors will be recognized in our:
Contributors graph
Release notes
Project documentation
Thank you for making BoxLang Spreadsheet better! 🎉
📄 License
Apache License, Version 2.0
Directory Structure
Here is a brief overview of the directory structure:
.github/workflows- These are the github actions to test and build the module via CIgradle- The gradle wrapper and configurationsrc- Where your module source code livesbuild.gradle- The gradle build file for the modulechangelog.md- A nice changelog tracking fileCONTRIBUTING.md- Detailed contribution guidelinesreadme.md- This file
Here is a brief overview of the source directory structure:
src/main/java- Java source codeortus/boxlang/spreadsheet/- Main packageSpreadsheetFile.java- The fluent API implementationbifs/- BoxLang built-in function implementationsutil/- Utility classes
src/test/java- Java test code
Gradle Tasks
Before you get started, you need to run the downloadBoxLang task in order to download the latest BoxLang binary until we publish to Maven.
gradle downloadBoxLangThis will store the binary under /src/test/resources/libs for you to use in your tests and compiler. Here are some basic tasks:
build
The default lifecycle task that triggers the build process, including tasks like clean, assemble, and others.
clean
Deletes the build folders. It helps ensure a clean build by removing any previously generated artifacts.
compileJava
Compiles Java source code files located in the src/main/java directory
compileTestJava
Compiles Java test source code files located in the src/test/java directory
dependencyUpdates
Checks for updated versions of all dependencies
downloadBoxLang
Downloads the latest BoxLang binary for testing
jar
Packages your project's compiled classes and resources into a JAR file build/libs folder
javadoc
Generates the Javadocs for your project and places them in the build/docs/javadoc folder
spotlessApply
Runs the Spotless plugin to format the code
spotlessCheck
Runs the Spotless plugin to check the formatting of the code
test
Executes the unit tests in your project and produces the reports in the build/reports/tests folder
💰 Support & Sponsorship
BoxLang is a professional open-source project and it is completely funded by the community and Ortus Solutions, Corp.
Last updated
Was this helpful?
