Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx).
- No external dependencies - Uses only Delphi built-in units (System.Zip, Xml.XMLDoc)
- Full read/write support - Create new documents or modify existing ones
- Interface-based API - Clean, testable design
- Rich formatting - Bold, italic, underline, fonts, colors, alignment, hyperlinks, lists, tables
- Cell styling - Background colors, number formats, formulas, column widths, merged cells
| Format | Extension | Read | Write |
|---|---|---|---|
| Word | .docx | Yes | Yes |
| Excel | .xlsx | Yes | Yes |
| PowerPoint | .pptx | Planned | Planned |
- Clone the repository
- Add
Sourcefolder and subfolders to your Delphi library path - Add units to your uses clause
uses
Office4D.Word;
var
Doc: IWordDocument;
begin
Doc := TWordDocumentFactory.CreateDocument;
Doc.LoadFromFile('report.docx');
// Get plain text
Memo1.Text := Doc.Text;
// Get metadata
ShowMessage('Author: ' + Doc.Metadata.Author);
ShowMessage('Title: ' + Doc.Metadata.Title);
// Access paragraphs
for var I := 0 to Doc.ParagraphCount - 1 do
WriteLn(Doc.Paragraphs[I].Text);
end;uses
Office4D.Word;
var
Doc: IWordDocument;
Para: IWordParagraph;
Run: IWordRun;
begin
Doc := TWordDocumentFactory.CreateDocument;
// Page settings
Doc.PageOrientation := TPageOrientation.Portrait;
Doc.PageMargins := TPageMargins.Create(1440, 1440, 1440, 1440); // 1 inch
// Header and footer
Doc.Header.Text := 'Document Header';
Doc.Footer.Text := 'Page 1';
// Add formatted paragraph
Para := Doc.AddParagraph;
Run := Para.AddRun('Bold text');
Run.Bold := True;
Para.AddRun(' and ');
Run := Para.AddRun('italic text');
Run.Italic := True;
// Font formatting
Para := Doc.AddParagraph;
Run := Para.AddRun('Custom Font');
Run.FontName := 'Arial';
Run.FontSize := 24; // half-points (24 = 12pt)
Run.FontColor := 'FF0000'; // Red
// Paragraph alignment
Para := Doc.AddParagraph;
Para.Alignment := TParagraphAlignment.Center;
Para.AddRun('Centered text');
// Add hyperlink
Para := Doc.AddParagraph;
Run := Para.AddRun('Click here');
Run.Hyperlink := 'https://example.com';
Run.Underline := True;
// Add bullet list
Para := Doc.AddParagraph;
Para.ListStyle := TListStyle.Bullet;
Para.AddRun('First item');
Para := Doc.AddParagraph;
Para.ListStyle := TListStyle.Bullet;
Para.AddRun('Second item');
// Add table
var Table := Doc.AddTable(3, 2);
Table.Cells[0, 0].Text := 'Header 1';
Table.Cells[0, 1].Text := 'Header 2';
Table.Cells[1, 0].Text := 'Data 1';
Table.Cells[1, 1].Text := 'Data 2';
Doc.SaveToFile('output.docx');
end;uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheets
for var I := 0 to Workbook.SheetCount - 1 do
begin
Sheet := Workbook.Sheets[I];
WriteLn('Sheet: ' + Sheet.Name);
end;
// Get sheet by name
Sheet := Workbook.SheetByName('Sheet1');
// Read cell values
WriteLn(Sheet.Cell['A1'].AsString);
WriteLn(FloatToStr(Sheet.Cell['B1'].AsFloat));
WriteLn(BoolToStr(Sheet.Cell['C1'].AsBoolean, True));
WriteLn(DateTimeToStr(Sheet.Cell['D1'].AsDateTime));
// Check for formula
if Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
// Add sheet
Sheet := Workbook.AddSheet('Products');
// Header row with styling
Sheet.Cell['A1'].AsString := 'Product';
Sheet.Cell['A1'].Bold := True;
Sheet.Cell['A1'].BackgroundColor := $4472C4; // Blue
Sheet.Cell['B1'].AsString := 'Price';
Sheet.Cell['B1'].Bold := True;
Sheet.Cell['B1'].BackgroundColor := $4472C4;
// Data rows
Sheet.Cell['A2'].AsString := 'Laptop';
Sheet.Cell['B2'].AsFloat := 999.00;
Sheet.Cell['B2'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['A3'].AsString := 'Mouse';
Sheet.Cell['B3'].AsFloat := 29.95;
Sheet.Cell['B3'].NumberFormat := '"$"#,##0.00';
// Formula with calculated value
Sheet.Cell['B4'].SetFormula('SUM(B2:B3)', 1028.95);
Sheet.Cell['B4'].Bold := True;
Sheet.Cell['B4'].NumberFormat := '"$"#,##0.00';
// Boolean and DateTime
Sheet.Cell['C2'].AsBoolean := True;
Sheet.Cell['D2'].AsDateTime := Now;
// Column widths
Sheet.SetColumnWidth('A', 20);
Sheet.SetColumnWidth('B', 15);
// Merged cells
Sheet.Cell['E1'].AsString := 'Merged Header';
Sheet.MergeCells('E1:G1');
Workbook.SaveToFile('output.xlsx');
end;Both Word and Excel support stream-based I/O:
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
// Save to stream
Doc.SaveToStream(Stream);
// Load from stream
Stream.Position := 0;
Doc.LoadFromStream(Stream);
finally
Stream.Free;
end;
end;# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
Tests/ - DUnitX test suite (135 tests)
Samples/ - Sample documents for testing
Examples/ - Demo application
- Paragraphs with multiple runs
- Text formatting: bold, italic, underline
- Font formatting: name, size, color
- Paragraph alignment: left, center, right, justify
- Hyperlinks
- Bullet and numbered lists
- Tables
- Headers and footers
- Page orientation and margins
- Metadata (author, title, dates)
- Multiple worksheets
- Cell data types: string, number, boolean, datetime
- Cell styling: bold, background color
- Number formats (currency, percentage, custom)
- Formulas with calculated values
- Column widths
- Merged cells
- Shared strings optimization
- Metadata (author, title, dates)
- Delphi 10.3 Rio or later (for inline variable declarations)
- No additional components or libraries required
MIT License - see LICENSE file
- Fork the repository
- Create a feature branch
- Write tests for new features
- Submit a pull request