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 := 4472ドルC4; // Blue Sheet.Cell['B1'].AsString := 'Price'; Sheet.Cell['B1'].Bold := True; Sheet.Cell['B1'].BackgroundColor := 4472ドルC4; // 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 Win64
Source/
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