libxlsxwriter clib Office

libxlsxwriter Excel writer. Create .xlsx workbooks, sheets, formats, formulas, charts, images.

ppm install libxlsxwriter

Overview

libxlsxwriter is a C library for creating Excel .xlsx files compatible with Excel 2007+, LibreOffice, and Google Sheets. Supports multiple worksheets, cell formatting (fonts, colors, borders), formulas, merged cells, freeze panes, charts, and embedded images.

CLib package

Ubuntu/Debian: sudo apt install libxlsxwriter-dev

Create a Workbook

uses libxlsxwriter;

var wb := NewWorkbook('/tmp/report.xlsx');
var ws := AddWorksheet(wb, 'Sales');

{ write header row }
WriteString(ws, 0, 0, 'Product', 0);
WriteString(ws, 0, 1, 'Units',   0);
WriteString(ws, 0, 2, 'Revenue', 0);

{ write data }
WriteString(ws, 1, 0, 'Widget A', 0);
WriteNumber(ws, 1, 1, 1200,       0);
WriteNumber(ws, 1, 2, 36000.0,    0);

WriteString(ws, 2, 0, 'Widget B', 0);
WriteNumber(ws, 2, 1, 850,        0);
WriteNumber(ws, 2, 2, 29750.0,    0);

{ write a formula }
WriteFormula(ws, 3, 2, '=SUM(C2:C3)', 0);

CloseWorkbook(wb);

Cell Formatting

uses libxlsxwriter;

var wb := NewWorkbook('/tmp/styled.xlsx');
var ws := AddWorksheet(wb, 'Report');

{ header format: bold, centered, blue background }
var hdrFmt := NewFormat(wb);
SetBold(hdrFmt);
SetAlign(hdrFmt, xlsxAlignCenter);
SetBgColor(hdrFmt, $4472C4);
SetFontColor(hdrFmt, $FFFFFF);
SetFontSize(hdrFmt, 12.0);

{ number format with 2 decimals and thousands separator }
var numFmt := NewFormat(wb);
SetNumFormat(numFmt, '#,##0.00');
SetBorder(numFmt, xlsxBorderThin);

WriteString(ws, 0, 0, 'Revenue', hdrFmt);
WriteNumber(ws, 1, 0, 1234567.89, numFmt);

{ date format }
var dateFmt := NewFormat(wb);
SetNumFormat(dateFmt, 'dd/mm/yyyy');
WriteString(ws, 2, 0, '2026-03-13', dateFmt);

CloseWorkbook(wb);

Column Sizing & Freeze Panes

uses libxlsxwriter;

var wb := NewWorkbook('/tmp/layout.xlsx');
var ws := AddWorksheet(wb, 'Data');

{ set column widths }
SetColumnWidth(ws, 0, 0, 20.0);   { column A: 20 chars }
SetColumnWidth(ws, 1, 3, 12.0);   { columns B-D: 12 chars }

{ freeze the first row (header stays visible when scrolling) }
FreezePane(ws, 1, 0);

{ set row height }
SetRowHeight(ws, 0, 24.0);   { header row taller }

{ color the tab }
SetTabColor(ws, $70AD47);   { green }

CloseWorkbook(wb);

Charts

uses libxlsxwriter;

var wb := NewWorkbook('/tmp/chart.xlsx');
var ws := AddWorksheet(wb, 'Data');

{ write data for the chart }
var i: Integer;
for i := 0 to 4 do begin
  WriteNumber(ws, i, 0, i + 1,       0);   { month }
  WriteNumber(ws, i, 1, 100 + i*23,  0);   { sales }
end;

{ create column chart }
var chart := AddChart(wb, xlsxChartColumn);
ChartAddSeries(chart, 'Data!$A$1:$A$5', 'Data!$B$1:$B$5');
ChartSetTitle(chart, 'Monthly Sales');

{ insert chart at cell E1 }
InsertChart(ws, 0, 4, chart);

CloseWorkbook(wb);

Merge & URLs

uses libxlsxwriter;

var wb := NewWorkbook('/tmp/misc.xlsx');
var ws := AddWorksheet(wb, 'Sheet1');

{ merge cells A1:D1 with centered text }
var mergeFmt := NewFormat(wb);
SetAlign(mergeFmt, xlsxAlignCenter);
SetBold(mergeFmt);
MergeRange(ws, 'A1:D1', 'Annual Report 2026', mergeFmt);

{ write a clickable URL }
WriteUrl(ws, 2, 0, 'https://pascalai.org', 'PascalAI', 0);

{ insert image }
InsertImage(ws, 4, 0, '/tmp/logo.png');

CloseWorkbook(wb);

Package Info

Version1.0.0
Typeclib
CategoryOffice
Authorgustavo
Format.xlsx (write only)

API

  • NewWorkbook(path)
  • CloseWorkbook(wb)
  • AddWorksheet(wb,name)
  • SetActiveSheet(ws)
  • FreezePane(ws,row,col)
  • SetTabColor(ws,color)
  • WriteString(ws,r,c,v,fmt)
  • WriteNumber(ws,r,c,v,fmt)
  • WriteFormula(ws,r,c,f,fmt)
  • WriteBoolean(ws,r,c,v,fmt)
  • WriteUrl(ws,r,c,url,txt,fmt)
  • MergeRange(ws,range,v,fmt)
  • SetColumnWidth(ws,c1,c2,w)
  • SetRowHeight(ws,row,h)
  • NewFormat(wb)
  • SetBold/Italic/Underline
  • SetFontSize/Name/Color
  • SetBgColor/Border/Align
  • SetNumFormat(fmt,str)
  • AddChart(wb,type)
  • InsertChart(ws,r,c,chart)
  • InsertImage(ws,r,c,path)
Write-only

libxlsxwriter creates .xlsx files from scratch. To read existing .xlsx files use xlsxio; for legacy .xls use libxls.