Skip to content

Complete rewrite of go-docx: Production-grade Word document creation with domain-driven architecture, full OOXML compliance, and comprehensive error handling.

License

Notifications You must be signed in to change notification settings

mmonterroca/docxgo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

docxgo

Production-grade Microsoft Word .docx (OOXML) file manipulation in Go.

Go Reference License: MIT Go Report Card

Overview

docxgo is a powerful, clean-architecture library for creating Microsoft Word documents in Go. Built with production-grade code quality, comprehensive documentation, and modern design patterns.

Key Features

  • βœ… Clean Architecture - Interface-based design, dependency injection, separation of concerns
  • βœ… Type Safety - No interface{}, explicit error handling throughout
  • βœ… Builder Pattern - Fluent API for easy document construction
  • βœ… Thread-Safe - Concurrent access supported with atomic operations
  • βœ… Production Ready - EXCELLENT error handling, comprehensive validation
  • βœ… Well Documented - Complete godoc, examples, and architecture docs
  • βœ… Open Source - MIT License, use in commercial and private projects

Status

Current Version: v2.0.0-beta (95% complete)
Stability: Beta - Production Ready
Target Stable Release: Q1 2026
Test Coverage: 50.7% (improvement plan ready β†’ 95%)

Completed Phases: 1-9, 11 (10 phases complete, 2 remaining)

Note: This library underwent a complete architectural rewrite in 2024-2025, implementing clean architecture principles, comprehensive testing, and modern Go practices. Phase 11 (Code Quality & Optimization) completed October 2025.


Installation

go get github.com/mmonterroca/docxgo

Requirements

  • Go 1.21 or higher
  • No external C dependencies
  • Works on Linux, macOS, Windows

Quick Start

Option 1: Simple API (Direct Domain Interfaces)

package main

import (
    "log"
    docx "github.com/mmonterroca/docxgo"
)

func main() {
    // Create document
    doc := docx.NewDocument()
    
    // Add paragraph with formatted text
    para, _ := doc.AddParagraph()
    run, _ := para.AddRun()
    run.SetText("Hello, World!")
    run.SetBold(true)
    run.SetColor(docx.Red)
    
    // Save document
    if err := doc.SaveAs("simple.docx"); err != nil {
        log.Fatal(err)
    }
}

Option 2: Builder API (Fluent, Chainable - Recommended)

package main

import (
    "log"
    docx "github.com/mmonterroca/docxgo"
    "github.com/mmonterroca/docxgo/domain"
)

func main() {
    // Create builder with options
    builder := docx.NewDocumentBuilder(
        docx.WithTitle("My Report"),
        docx.WithAuthor("John Doe"),
        docx.WithDefaultFont("Calibri"),
        docx.WithDefaultFontSize(22), // 11pt in half-points
        docx.WithPageSize(docx.A4),
        docx.WithMargins(docx.NormalMargins),
    )
    
    // Add content using fluent API
    builder.AddParagraph().
        Text("Project Report").
        Bold().
        FontSize(16).
        Color(docx.Blue).
        Alignment(domain.AlignmentCenter).
        End()
    
    builder.AddParagraph().
        Text("This is bold text").Bold().
        Text(" and this is ").
        Text("colored text").Color(docx.Red).FontSize(14).
        End()
    
    // Build and save
    doc, err := builder.Build()
    if err != nil {
        log.Fatal(err)
    }
    
    if err := doc.SaveAs("report.docx"); err != nil {
        log.Fatal(err)
    }
}

Option 3: Read and Modify Existing Documents πŸ†•

package main

import (
    "log"
    docx "github.com/mmonterroca/docxgo"
)

func main() {
    // Open existing document
    doc, err := docx.OpenDocument("template.docx")
    if err != nil {
        log.Fatal(err)
    }
    
    // Read existing content
    paragraphs := doc.Paragraphs()
    for _, para := range paragraphs {
        // Modify existing text
        runs := para.Runs()
        for _, run := range runs {
            if run.Text() == "PLACEHOLDER" {
                run.SetText("Updated Value")
                run.SetBold(true)
            }
        }
    }
    
    // Add new content
    newPara, _ := doc.AddParagraph()
    newRun, _ := newPara.AddRun()
    newRun.SetText("This paragraph was added by the reader")
    
    // Save modified document
    if err := doc.SaveAs("modified.docx"); err != nil {
        log.Fatal(err)
    }
}

More Examples

See the examples/ directory for comprehensive examples (11 working examples):


Architecture

This library follows clean architecture principles with clear separation of concerns:

github.com/mmonterroca/docxgo/
β”œβ”€β”€ domain/          # Core interfaces (public API)
β”‚   β”œβ”€β”€ document.go  # Document interface
β”‚   β”œβ”€β”€ paragraph.go # Paragraph interface
β”‚   β”œβ”€β”€ run.go       # Run interface
β”‚   β”œβ”€β”€ table.go     # Table interfaces
β”‚   └── section.go   # Section interfaces
β”‚
β”œβ”€β”€ internal/        # Internal implementations
β”‚   β”œβ”€β”€ core/        # Core domain implementations
β”‚   β”‚   β”œβ”€β”€ document.go
β”‚   β”‚   β”œβ”€β”€ paragraph.go
β”‚   β”‚   β”œβ”€β”€ run.go
β”‚   β”‚   └── table.go
β”‚   β”œβ”€β”€ manager/     # Service managers
β”‚   β”‚   β”œβ”€β”€ id.go           # Thread-safe ID generation
β”‚   β”‚   β”œβ”€β”€ relationship.go # Relationship management
β”‚   β”‚   └── media.go        # Media file management
β”‚   β”œβ”€β”€ serializer/  # XML serialization
β”‚   β”œβ”€β”€ writer/      # .docx file writing
β”‚   └── xml/         # OOXML structures
β”‚
β”œβ”€β”€ pkg/             # Public utilities
β”‚   β”œβ”€β”€ errors/      # Structured error types
β”‚   β”œβ”€β”€ constants/   # OOXML constants
β”‚   β”œβ”€β”€ color/       # Color utilities
β”‚   └── document/    # Document I/O utilities
β”‚
└── examples/        # Usage examples
    └── basic/       # Basic example

Design Principles

  1. Interface Segregation - Small, focused interfaces
  2. Dependency Injection - No global state
  3. Explicit Errors - Errors returned immediately, not silently ignored
  4. Immutability - Defensive copies to prevent external mutation
  5. Type Safety - Strong typing, no interface{}
  6. Thread Safety - Concurrent access supported
  7. Documentation - Every public method documented

Features

βœ… Fully Implemented

Core Document Structure

  • Document creation with metadata (title, author, subject, keywords)
  • Paragraphs with comprehensive formatting
  • Text runs with character-level styling
  • Tables with rows, cells, and styling
  • Sections with page layout control

Text Formatting

  • Bold, italic, underline, strikethrough
  • Font color (RGB), size, and family
  • Highlight colors (15 options)
  • Alignment (left, center, right, justify)
  • Line spacing (single, 1.5, double, custom)
  • Indentation (left, right, first-line, hanging)

Advanced Table Features (Phase 9 - Complete)

  • Cell Merging: Horizontal (colspan) and vertical (rowspan)
  • Nested Tables: Tables within table cells
  • 8 Built-in Styles: Normal, Grid, Plain, MediumShading, LightShading, Colorful, Accent1, Accent2
  • Row height control
  • Cell width and alignment
  • Borders and shading

Images & Media (Phase 8 - Complete)

  • 9 Image Formats: PNG, JPEG, GIF, BMP, TIFF, SVG, WEBP, ICO, EMF
  • Inline and floating images
  • Custom dimensions (pixels, inches, EMUs)
  • Positioning (left, center, right, custom coordinates)
  • Automatic format detection
  • Relationship management

Fields & Dynamic Content (Phase 6 - Complete)

  • Table of Contents (TOC): Auto-generated with styles
  • Page Numbers: Current page, total pages
  • Hyperlinks: External URLs and internal bookmarks
  • StyleRef: Dynamic text from heading styles
  • Date/Time: Document creation/modification dates
  • Custom Fields: Extensible field system

Headers & Footers (Phase 6 - Complete)

  • Default, first page, and even/odd page headers/footers
  • Page numbering in footers
  • Dynamic content with fields
  • Per-section customization

Styles System (Phase 6 - Complete)

  • 40+ Built-in Styles: All standard Word paragraph styles
  • Character Styles: For inline formatting
  • Custom Styles: Create and apply user-defined styles
  • Style inheritance and cascading

Builder Pattern (Phase 6.5 - Complete)

  • Fluent API for easy document construction
  • Error accumulation (no intermediate error checking)
  • Chainable methods for all operations
  • Functional options for configuration

Quality & Reliability (Phase 11 - Complete)

  • EXCELLENT Error Handling: Structured errors with rich context
  • Comprehensive validation at every layer
  • Thread-safe ID generation (atomic counters)
  • 50.7% Test Coverage (improvement plan ready: β†’ 95%)
  • 0 Linter Warnings (golangci-lint with 30+ linters)
  • Complete godoc documentation

🚧 In Development

Phase 10: Document Reading (60% Complete - Core Features Working βœ…)

  • βœ… Open and read existing .docx files
  • βœ… Parse document structure (paragraphs, runs, tables)
  • βœ… Modify existing documents (edit text, formatting, add content)
  • βœ… Style preservation (Title, Subtitle, Headings, Quote, Normal)
  • 🚧 Advanced features (headers/footers, complex tables, images in existing docs)

Phase 12: Beta Testing & Release (In Progress)

  • Community feedback integration
  • Performance tuning
  • Final documentation review
  • v2.0.0 stable release preparation

πŸ“‹ Planned Features

  • Comments and change tracking
  • Custom XML parts
  • Advanced drawing shapes
  • Mail merge and templates
  • Document comparison
  • Content controls

Error Handling

All operations return explicit errors - no silent failures. The error system was rated EXCELLENT in Phase 11 review:

// Structured errors with full context
para, err := doc.AddParagraph()
if err != nil {
    // Error contains: operation, code, message, and context
    // Example: "operation=Document.AddParagraph | code=VALIDATION_ERROR | ..."
    log.Fatal(err)
}

// Validation errors with detailed information
err := run.SetSize(10000) // Invalid size
if err != nil {
    // Returns: ValidationError with field, value, and constraint details
    var validationErr *errors.ValidationError
    if errors.As(err, &validationErr) {
        fmt.Printf("Field '%s' failed: %s\n", validationErr.Field, validationErr.Message)
    }
}

// Builder pattern accumulates errors
builder := docx.NewDocumentBuilder()
builder.AddParagraph().
    Text("Hello").
    FontSize(9999). // Invalid - error recorded
    Bold().
    End()

// All errors surface at Build()
doc, err := builder.Build()
if err != nil {
    // Returns first accumulated error with full context
    log.Fatal(err)
}

Error System Features:

  • βœ… DocxError: Structured errors with operation context
  • βœ… ValidationError: Domain-specific validation errors
  • βœ… BuilderError: Error accumulation for fluent API
  • βœ… 7 Error Codes: Well-defined error categories
  • βœ… 10+ Helper Functions: Easy error creation
  • βœ… 100% Best Practices: Proper wrapping, context, no panics

See docs/ERROR_HANDLING.md for comprehensive review.


Testing

# Run all tests
go test ./...

# Run with coverage
go test -cover ./...

# Generate coverage report
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out

# Run specific package
go test -v ./internal/core

# Run benchmarks
go test -bench=. ./...

Current Test Coverage: 50.7%
Target Coverage: 95% (4-week improvement plan ready)

See docs/COVERAGE_ANALYSIS.md for detailed coverage analysis and improvement roadmap.


Documentation

πŸ“– Complete Documentation Suite

For Users:

For Developers:

Quick Links:


Performance

Optimized for real-world usage:

  • Pre-allocated slices with sensible defaults (paragraphs: 32, tables: 8)
  • Thread-safe atomic counters for ID generation
  • Lazy loading of relationships and media
  • Efficient string building for text extraction
  • Memory-conscious defensive copies only when necessary

Benchmarks (coming in Phase 11.5):

  • Simple document creation: target < 1ms
  • Complex document (100 paragraphs, 10 tables): target < 50ms
  • Image insertion: target < 5ms per image

Phase 11: Code Quality & Optimization βœ…

Status: 100% Complete (October 2025)

Phase 11 delivered production-ready code quality:

Achievements:

  • βœ… Removed 95 files (5.5MB legacy code)
  • βœ… Fixed 100+ linter warnings β†’ 0 warnings
  • βœ… Complete godoc with 60+ const comments
  • βœ… EXCELLENT error handling (production-ready)
  • βœ… Coverage analysis with 4-week improvement plan
  • βœ… Documentation overhaul - Complete v2 API guide and cleanup
  • βœ… 8 commits, ~3,500 lines of documentation

Quality Metrics:

  • Code cleanliness: 99% (1 non-critical optimization TODO)
  • Linting compliance: 100% (0 warnings with 30+ linters)
  • Documentation: EXCELLENT (3,500+ lines, v2-only, well organized)
  • Error handling: EXCELLENT (production-ready)
  • Test coverage plan: Ready (50.7% β†’ 95%)
  • TODOs cleaned: 8 β†’ 1 (87% reduction)

See docs/V2_DESIGN.md#phase-11 for complete statistics.


Contributing

We welcome contributions! Please see CONTRIBUTING.md for:

  • Code of conduct
  • Development workflow (Git Flow)
  • Testing requirements
  • Pull request process

Quick Contribution Guide

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make your changes with tests
  4. Ensure tests pass (go test ./...)
  5. Commit your changes (follow commit message conventions)
  6. Push to your fork
  7. Open a Pull Request

License

MIT License

This means:

  • βœ… Free to use in any project (commercial or personal)
  • βœ… No copyleft - modifications don't need to be shared
  • βœ… Permissive - do almost anything you want
  • βœ… Attribution required - keep copyright notices

See LICENSE for full text.

Copyright

Copyright (C) 2024-2025 Misael Monterroca
Copyright (C) 2022-2024 fumiama (original enhancements)
Copyright (C) 2020-2022 Gonzalo FernΓ‘ndez-Victorio (original library)

See CREDITS.md for complete project history.


Credits & History

This project evolved through multiple stages:

  1. gonfva/docxlib (2020-2022) - Original library by Gonzalo FernΓ‘ndez-Victorio
  2. fumiama/go-docx (2022-2024) - Enhanced fork with images, tables, shapes
  3. mmonterroca/docxgo v1 (2023-2024) - Professional features (headers, TOC, links)
  4. mmonterroca/docxgo v2 (2024-2025) - Complete architectural rewrite

Current Maintainer: Misael Monterroca (misael@monterroca.com)
GitHub: @mmonterroca

V2 Rewrite:

  • 10 phases completed (95% done)
  • 6,646+ lines of production code
  • 1,500+ lines of documentation
  • Clean architecture implementation
  • Production-grade quality

For complete project genealogy, see CREDITS.md.


Roadmap

βœ… Completed Phases (10/12)

  • Phase 1: Foundation (Interfaces, package structure)
  • Phase 2: Core Domain (Document, Paragraph, Run, Table)
  • Phase 3: Managers (Relationship, Media, ID, Style)
  • Phase 4: Builders (DocumentBuilder, ParagraphBuilder, TableBuilder)
  • Phase 5: Serialization (pack/unpack, OOXML generation)
  • Phase 6: Advanced Features (Headers/Footers, Fields, Styles)
  • Phase 6.5: Builder Pattern & API Polish (Fluent API, functional options)
  • Phase 7: Documentation & Release (API docs, examples, README)
  • Phase 8: Images & Media (9 formats, inline/floating positioning)
  • Phase 9: Advanced Tables (cell merging, nested tables, 8 styles)
  • Phase 11: Code Quality & Optimization (0 warnings, EXCELLENT errors)

Progress: ~95% complete (10 phases done, 2 remaining)

🚧 Remaining Phases (2/12)

Phase 10: Document Reading (Not Started - ~15-20 hours)

  • Open existing .docx files
  • Parse document structure
  • Modify existing documents
  • Roundtrip testing

Phase 12: Beta Testing & Release (In Progress)

  • Community feedback
  • Final documentation review
  • v2.0.0 stable release

Release Timeline

  • v2.0.0-beta (Q4 2025 - Current)

    • Phase 10 (Document Reading) - estimated Dec 2025
    • Final API polish
    • Performance optimizations
  • v2.0.0-rc (Q1 2026)

    • Beta testing feedback
    • Bug fixes
    • Migration tooling
  • v2.0.0 stable (Q1 2026 - Target: March 2026)

    • Production ready
    • Long-term support
    • Backward compatibility guarantee

See docs/V2_DESIGN.md for detailed phase breakdown.


Support & Community

Reporting Bugs

Please include:

  • Go version (go version)
  • OS and architecture
  • Minimal reproduction code
  • Expected vs actual behavior

Related Projects

Why Choose docxgo?

  • βœ… Free & Open Source - MIT License, no restrictions
  • βœ… Clean Architecture - Production-grade code quality
  • βœ… Feature Complete - 95% of planned features implemented
  • βœ… EXCELLENT Error Handling - Structured errors, rich context
  • βœ… Well Documented - Complete godoc, examples, architecture docs
  • βœ… Active Development - Regular updates, responsive to issues
  • βœ… Modern Go - Follows current best practices (Go 1.21+)
  • βœ… Builder Pattern - Fluent API for easy document construction

Comparison:

  • UniOffice - Commercial ($$$), more features, heavier
  • gingfrederik/docx - Write-only, simpler, less features
  • docxgo - Free, balanced features, production-ready

Made with ❀️ by Misael Monterroca

Star ⭐ this repo if you find it useful!

About

Complete rewrite of go-docx: Production-grade Word document creation with domain-driven architecture, full OOXML compliance, and comprehensive error handling.

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Contributors 15