Overview
xlsxio is a lightweight C library for both reading and writing .xlsx files. The reader uses a forward-only streaming API (low memory, fast for large files). The writer creates files row by row. Based on libzip and expat — no dependency on Excel or LibreOffice.
CLib package
Ubuntu/Debian: sudo apt install libxlsxio-dev
Read a Spreadsheet
uses xlsxio;
var reader := OpenReader('/data/sales.xlsx');
var sheet := OpenFirstSheet(reader);
{ iterate rows and cells }
while NextRow(sheet) do begin
var cell: TXlsxCell;
while NextCell(sheet, cell) do begin
Write('[', cell.Row, ',', cell.Col, '] ');
case cell.CellType of
xlsxCellString: WriteLn(cell.StrValue);
xlsxCellNumber: WriteLn(cell.NumValue);
xlsxCellBoolean: WriteLn(cell.NumValue <> 0);
end;
end;
end;
CloseSheet(sheet);
CloseReader(reader);
Quick Read — All Rows
uses xlsxio;
var reader := OpenReader('/data/report.xlsx');
{ list available sheets }
WriteLn(GetSheetNames(reader)); { Sheet1\nSummary\n... }
{ read entire sheet as tab-separated rows }
var rows := ReadAllRows(reader, 'Sheet1');
var i: Integer;
for i := 0 to Length(rows) - 1 do
WriteLn(rows[i]); { col1 TAB col2 TAB col3 }
CloseReader(reader);
Write a Spreadsheet
uses xlsxio;
var writer := OpenWriter('/tmp/output.xlsx');
AddSheet(writer, 'Inventory');
{ header row }
AddRow(writer);
AddCellString(writer, 'SKU');
AddCellString(writer, 'Description');
AddCellString(writer, 'Price');
AddCellString(writer, 'Stock');
{ data rows }
AddRow(writer);
AddCellString(writer, 'WGT-001');
AddCellString(writer, 'Widget Pro');
AddCellNumber(writer, 29.99);
AddCellNumber(writer, 542.0);
AddRow(writer);
AddCellString(writer, 'WGT-002');
AddCellString(writer, 'Widget Lite');
AddCellNumber(writer, 9.99);
AddCellNumber(writer, 1280.0);
CloseWriter(writer);
Multiple Sheets
uses xlsxio;
var writer := OpenWriter('/tmp/multi.xlsx');
{ first sheet }
AddSheet(writer, 'Q1');
AddRow(writer); AddCellString(writer, 'Jan'); AddCellNumber(writer, 45000.0);
AddRow(writer); AddCellString(writer, 'Feb'); AddCellNumber(writer, 51000.0);
AddRow(writer); AddCellString(writer, 'Mar'); AddCellNumber(writer, 48500.0);
{ second sheet }
AddSheet(writer, 'Q2');
AddRow(writer); AddCellString(writer, 'Apr'); AddCellNumber(writer, 53000.0);
AddRow(writer); AddCellString(writer, 'May'); AddCellNumber(writer, 61000.0);
AddRow(writer); AddCellString(writer, 'Jun'); AddCellNumber(writer, 58000.0);
CloseWriter(writer);
Sheet Info
uses xlsxio;
var reader := OpenReader('data.xlsx');
var info := GetSheetInfo(reader, 'Sheet1');
WriteLn('Rows: ', info.RowCount);
WriteLn('Cols: ', info.ColCount);
{ row-by-row quick scan }
var sheet := OpenSheet(reader, 'Sheet1');
while NextRow(sheet) do
WriteLn(ReadRowAsString(sheet)); { tab-separated }
CloseSheet(sheet);
CloseReader(reader);
Package Info
Version1.0.0
Typeclib
CategoryOffice
Authorgustavo
Format.xlsx read + write
Reader API
- OpenReader(path)
- CloseReader(r)
- GetSheetNames(r)
- GetSheetInfo(r,name)
- OpenSheet(r,name)
- OpenFirstSheet(r)
- CloseSheet(s)
- NextRow(s)
- NextCell(s, cell)
- ReadRowAsString(s)
- ReadAllRows(r,name)
Writer API
- OpenWriter(path)
- CloseWriter(w)
- AddSheet(w,name)
- AddRow(w)
- AddCellString(w,v)
- AddCellNumber(w,v)
- AddCellDate(w,iso)
- AddCellBoolean(w,v)
- AddCellEmpty(w)
vs libxlsxwriter
xlsxio is simpler and bidirectional (read + write). libxlsxwriter is write-only but supports formatting, charts, and images.