Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - GDKsoftware/OfficeXML4D: Delphi library for reading and writing Office Open XML documents · GitHub
Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GDKsoftware/OfficeXML4D: Delphi library for reading and writing Office Open XML documents · GitHub
Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GDKsoftware/OfficeXML4D: Delphi library for reading and writing Office Open XML documents · GitHub
Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - GDKsoftware/OfficeXML4D: Delphi library for reading and writing Office Open XML documents · GitHub
Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - GDKsoftware/OfficeXML4D: Delphi library for reading and writing Office Open XML documents · GitHub
Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - GDKsoftware/OfficeXML4D: Delphi library for reading and writing Office Open XML documents · GitHub
Skip to content

Repository files navigation

OfficeXML4D logo

Office4D

ReleaseLicense: MITDelphiPlatforms

Pure Delphi library for reading and writing Microsoft Office Open XML documents (.docx, .xlsx, .pptx).

Features

  • 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

Supported Formats

FormatExtensionReadWrite
Word.docxYesYes
Excel.xlsxYesYes
PowerPoint.pptxText extractionYes (basic)

Installation

  1. Clone the repository
  2. Add Source folder and subfolders to your Delphi library path
  3. Add units to your uses clause

Usage

Reading Word Documents

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 paragraphsforvar I := 0to Doc.ParagraphCount - 1do
WriteLn(Doc.Paragraphs[I].Text);
end;

Creating Word Documents

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 tablevar 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;

Reading Excel Workbooks

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('data.xlsx');
// Access sheetsforvar I := 0to Workbook.SheetCount - 1dobegin
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 formulaif Sheet.Cell['E1'].HasFormula then
WriteLn('Formula: ' + Sheet.Cell['E1'].Formula);
end;

Creating Excel Workbooks

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');
// Font, border and cell styling
Sheet.Cell['A4'].AsString := 'Computer';
Sheet.Cell['A4'].Italic := True;
Sheet.Cell['A4'].FontStyle := Sheet.Cell['A4'].FontStyle + [TExcelFontStyle.Strikeout];
Sheet.Cell['A4'].BorderStyle[AllBorderSides] := TExcelBorderStyle.Thin;
Sheet.Cell['B5'].AsFloat := -999.00;
Sheet.Cell['B5'].FontColor := $FF0000;
Sheet.Cell['B5'].NumberFormat := '"$"#,##0.00';
Sheet.Cell['B5'].BorderColor[[TExcelBorderSide.Bottom, TExcelBorderSide.Top]] := $00FF00;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Top]] := TExcelBorderStyle.Medium;
Sheet.Cell['B5'].BorderStyle[[TExcelBorderSide.Bottom]] := TExcelBorderStyle.Double;
Workbook.SaveToFile('output.xlsx');
end;

Editing Sheets, Columns and Rows

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Workbook.LoadFromFile('report.xlsx');
// Remove a whole sheet (by index or by name)
Workbook.RemoveSheetByName('Scratch');
Sheet := Workbook.SheetByName('Data');
// Clear a column or row: removes cell contents and styling, but leaves the// structure (column widths, row heights, merged ranges) in place.
Sheet.ClearColumn('D');
Sheet.ClearRow(5);
// Delete a column or row: everything past it shifts back by one. Column widths,// row heights, merged ranges and frozen panes move with it, and every formula// reference is rewritten (absolute refs and ranges included). A reference to a// deleted line becomes #REF!, exactly as Excel does.
Sheet.DeleteColumn('C');
Sheet.DeleteRow(2);
Workbook.SaveToFile('report.xlsx');
end;

Cell Notes

Attach a plain-text note (a legacy cell comment) to any cell:

uses
Office4D.Excel;
var
Workbook: IExcelWorkbook;
Sheet: IExcelSheet;
begin
Workbook := TExcelWorkbookFactory.Create;
Sheet := Workbook.AddSheet('Data');
Sheet.Cell['B2'].AsFloat := 1234.50;
Sheet.Note['B2'] := 'Please double-check this figure';
// Read a note back (empty string if the cell has none)
WriteLn(Sheet.Note['B2']);
// Clear a note by assigning an empty string
Sheet.Note['B2'] := '';
Workbook.SaveToFile('output.xlsx');
end;

Notes move with the cell when columns or rows are deleted, and are cleared along with the column or row.

Stream Support

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;

Building

# Build and run tests
./build.bat Release Win64 Tests
# Build library only
./build.bat Release Win64

Project Structure

Source/
Core/ - ZIP package handling, relationships, types
Common/ - Metadata, shared interfaces
Word/ - Word document implementation
Excel/ - Excel workbook implementation
PowerPoint/ - PowerPoint presentation implementation
Tests/
Source/ - DUnitX test suite
Samples/ - Sample documents for testing
Examples/ - Demo application

Word Features

  • 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)

Excel Features

  • Multiple worksheets
  • Sheet visibility (visible, hidden, very hidden)
  • Add and remove sheets
  • Clear a column or row (contents only, structure preserved)
  • Delete a column or row with reflow and formula-reference rewriting (#REF! on deleted lines)
  • Cell data types: string, number, boolean, datetime
  • Cell styling: background color, border style, border color
  • Text formatting: bold, italic, underline, strikeout
  • Number formats (currency, percentage, custom)
  • Formulas with calculated values
  • Column widths
  • Merged cells
  • Freeze panes
  • Cell notes (legacy comments, plain text)
  • Shared strings optimization
  • Metadata (author, title, dates)

PowerPoint Features

  • Creating presentations with multiple slides
  • Slide titles and body text with paragraphs
  • Bullet lists with indent levels
  • Run formatting: bold, italic, underline, font name, size, color
  • Reading text back from presentations (title, paragraphs, formatting)
  • Metadata (author, title, dates)
uses Office4D.PowerPoint;
var Presentation := TPowerPointPresentationFactory.CreatePresentation;
var Slide := Presentation.AddSlide('Quarterly Report');
var Bullet := Slide.AddParagraph('Revenue up 12%');
Bullet.Bullet := True;
Presentation.SaveToFile('report.pptx');

Requirements

  • Delphi 10.3 Rio or later (for inline variable declarations)
  • No additional components or libraries required

License

MIT License - see LICENSE file

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Submit a pull request

Commercial Support

This library is MIT licensed and free to use. For companies that depend on it commercially we offer support and maintenance agreements with guaranteed response times, and sponsored development of features you need. Contact us at gdksoftware.com/contact-us or open an issue to get in touch.

About

Delphi library for reading and writing Office Open XML documents

Topics

Resources

Stars

69 stars

Watchers

5 watching

Forks

Releases

Packages

Contributors

Languages