xlsxio clib Office

xlsxio Excel reader/writer. Read and write .xlsx files, iterate sheets/rows/cells.

ppm install xlsxio

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.