libxls clib Office

libxls Excel .xls reader. Read legacy Excel 97-2003 files, sheets, rows, cells, types.

ppm install libxls

Overview

libxls reads Excel 97–2003 binary (.xls / BIFF8) files — the format used before .xlsx existed. Use this when processing legacy data exports, old financial archives, or files from systems that still output .xls. Read-only: use libxlsxwriter to create spreadsheets.

CLib package

Ubuntu/Debian: sudo apt install libxls-dev

Open & Inspect

uses libxls;

var wb := OpenFile('/data/legacy.xls');

{ workbook info }
var info := GetWorkbookInfo(wb);
WriteLn('Sheets: ', info.SheetCount);
WriteLn('Author: ', info.Author);

{ list all sheet names }
WriteLn(GetSheetNames(wb));   { Sheet1\nData\nSummary\n... }

{ sheet metadata }
var si := GetSheetInfo(wb, 0);   { index 0 = first sheet }
WriteLn('Name: ', si.Name, '  Rows: ', si.RowCount, '  Cols: ', si.ColCount);

CloseFile(wb);

Read Cells

uses libxls;

var wb    := OpenFile('/data/report.xls');
var sheet := OpenFirstSheet(wb);

var rows := GetRowCount(sheet);
var cols := GetColCount(sheet);
WriteLn('Grid: ', rows, ' x ', cols);

{ read cell by cell }
var r, c: Integer;
for r := 0 to rows - 1 do begin
  for c := 0 to cols - 1 do begin
    var cell := GetCell(sheet, r, c);
    case cell.CellType of
      xlsCellString:  Write(cell.StrValue, #9);
      xlsCellNumber:  Write(cell.NumValue:0:2, #9);
      xlsCellBoolean: Write(cell.NumValue <> 0, #9);
    end;
  end;
  WriteLn;
end;

CloseSheet(sheet);
CloseFile(wb);

Quick Row Scan

uses libxls;

var wb    := OpenFile('data.xls');
var sheet := OpenSheetByName(wb, 'Sales');

{ read each row as a tab-separated string }
var rows := ReadAllRows(sheet);
var i: Integer;
for i := 0 to Length(rows) - 1 do
  WriteLn(rows[i]);

CloseSheet(sheet);
CloseFile(wb);

Multiple Sheets

uses libxls;

var wb := OpenFile('workbook.xls');
var n  := GetSheetCount(wb);

var i: Integer;
for i := 0 to n - 1 do begin
  var si    := GetSheetInfo(wb, i);
  var sheet := OpenSheetByIndex(wb, i);
  WriteLn('=== ', si.Name, ' (', si.RowCount, ' rows) ===');
  WriteLn(GetRowAsString(sheet, 0));   { header row }
  CloseSheet(sheet);
end;

CloseFile(wb);

In-Memory Open

uses libxls;

{ open from bytes (e.g. downloaded from network) }
var xlsBytes := FetchBytes('http://example.com/data.xls');
var wb       := OpenBytes(xlsBytes);

var sheet := OpenFirstSheet(wb);
WriteLn('Rows: ', GetRowCount(sheet));
CloseSheet(sheet);
CloseFile(wb);

Package Info

Version1.0.0
Typeclib
CategoryOffice
Authorgustavo
Format.xls read only

API

  • OpenFile(path)
  • OpenBytes(data)
  • CloseFile(wb)
  • GetWorkbookInfo(wb)
  • GetSheetCount(wb)
  • GetSheetInfo(wb,idx)
  • GetSheetNames(wb)
  • OpenSheetByIndex(wb,i)
  • OpenSheetByName(wb,name)
  • OpenFirstSheet(wb)
  • CloseSheet(s)
  • GetRowCount(s)
  • GetColCount(s)
  • GetCell(s,r,c)
  • GetCellString(s,r,c)
  • GetCellNumber(s,r,c)
  • GetCellType(s,r,c)
  • GetRowAsString(s,row)
  • ReadAllRows(s)
  • IsXls(data)
Legacy format only

For modern .xlsx files use xlsxio (read+write) or libxlsxwriter (write with full formatting).