<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jakub Melka</title>
    <description>The latest articles on DEV Community by Jakub Melka (@jakub_melka_0109).</description>
    <link>https://dev.to/jakub_melka_0109</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4073586%2F55d0a6ed-8352-4801-99b5-ceab7ae85565.png</url>
      <title>DEV Community: Jakub Melka</title>
      <link>https://dev.to/jakub_melka_0109</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jakub_melka_0109"/>
    <language>en</language>
    <item>
      <title>Introducing ExyokiOffice: An Open-Source C++ Library for Word, Excel and PowerPoint</title>
      <dc:creator>Jakub Melka</dc:creator>
      <pubDate>Thu, 20 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/jakub_melka_0109/introducing-exyokioffice-an-open-source-c-library-for-word-excel-and-powerpoint-38aa</link>
      <guid>https://dev.to/jakub_melka_0109/introducing-exyokioffice-an-open-source-c-library-for-word-excel-and-powerpoint-38aa</guid>
      <description>&lt;h2&gt;
  
  
  What is ExyokiOffice?
&lt;/h2&gt;

&lt;p&gt;When I needed to create and edit DOCX / XLSX / PPTX documents from native C++, I ran into a surprisingly difficult problem: which open-source library should I use? There are libraries for .NET (Open-XML-SDK) and Java (Apache POI) but there aren't any feature-rich C++ libraries that cover all three document formats. There are some libraries for XLSX (OpenXLSX, QXlsx and libxlsxwriter among others),&lt;br&gt;
but they have their limits. So, last year, I decided to write the library myself.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I wanted from an Office library
&lt;/h2&gt;

&lt;p&gt;It was an ambitious goal for a one-person project. I wanted to create a feature-rich open source library under the MIT license that&lt;br&gt;
would offer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a small native C++ library without external dependencies (standard C++ library is an exception)&lt;/li&gt;
&lt;li&gt;DOM-like low-level API similar to Open-XML-SDK (.NET), which will allow advanced users to modify the DOM tree directly&lt;/li&gt;
&lt;li&gt;high-level API to comfortably process DOCX /XLSX / PPTX documents even for people not aware of the underlying specifications&lt;/li&gt;
&lt;li&gt;robust representation preserving data not recognized by the library (preservation is important, so no data are accidentally deleted)&lt;/li&gt;
&lt;li&gt;useful CLI tool for command-line automation (document validation, conversion to other formats, searching text in documents and much more) &lt;/li&gt;
&lt;li&gt;MCP servers (actually, they are in an experimental mode) for each document type&lt;/li&gt;
&lt;li&gt;a Docker image, which is easy to install and use (only about 30 MB of compressed size) containing the CLI tool and MCP servers&lt;/li&gt;
&lt;li&gt;conversion between formats (for example, DOCX to Markdown document and vice versa)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is very important to me to develop a powerful library that will address some of the limitations I have encountered in existing projects. I designed it so&lt;br&gt;
that all unrecognized data are preserved - elements and attributes the library does not understand are retained in the internal XML DOM&lt;br&gt;
and written back when the document is saved. Another very important issue is to avoid using managed runtimes (such as .NET Framework and Java), which will make my library small and fast. No .NET, no Java Virtual Machine, just pure C++.&lt;/p&gt;

&lt;p&gt;I was actually surprised by how small the resulting library was, despite its scope, thanks to its self-containment and pure C++ implementation.&lt;br&gt;
The compressed packages, including the Docker image, have size under 30 MB. &lt;/p&gt;

&lt;p&gt;Because I wanted to keep up with modern technologies, I have created MCP servers and a Docker image containing the CLI tool and these MCP servers.&lt;br&gt;
This is my first attempt to create MCP servers, so they are now in experimental mode. The CLI tool was tested and it works.&lt;/p&gt;
&lt;h2&gt;
  
  
  A quick example
&lt;/h2&gt;

&lt;p&gt;I designed the high-level API as easy to use as possible. Here is a small Word example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"ExyokiOffice/Word/WordDocument.hpp"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;ExyokiOffice&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Word&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WordDocumentEditor&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CreateNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;AddHeading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;AddParagraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"This document was created by ExyokiOffice."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SaveToFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello.docx"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And here is a small Excel example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"ExyokiOffice/Excel/ExcelDocument.hpp"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="n"&gt;ExyokiOffice&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Excel&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ExcelDocumentEditor&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CreateNew&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;FirstWorksheet&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SetCellText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello world"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SetCellText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"This workbook was created by ExyokiOffice."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;SaveToFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello.xlsx"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Why another Office library?
&lt;/h2&gt;

&lt;p&gt;You may ask: why do we need another office library? Well, there are several important differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Content preservation as a contract&lt;/strong&gt;: When you open a document with charts, SmartArt or custom extensions, the usual question using open source libraries is, what will I lose? In ExyokiOffice, unknown content is preserved in the internal XML DOM tree during the modification and then saved back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment without dependencies&lt;/strong&gt;: Permissive MIT license and dependency only on the standard C++ library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;All-in-one library&lt;/strong&gt;: All three document formats are covered by a single library. One API for all three types!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-level API and low-level DOM united&lt;/strong&gt;: You can easily use the high-level API editors for common operations and when they aren't sufficient, you just simply switch to the low-level API to gain more control&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema and semantic validation&lt;/strong&gt;: ExyokiOffice is capable of validation of documents against a specific Office version&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI tool exyoki&lt;/strong&gt;: Usable for shell and scripts. Validation, conversion into other formats, fulltext search, redaction without the need to write a single line of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt;: Although experimental, they are there to be used with AI agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security model&lt;/strong&gt;: External resources are curated by a security policy - by default, access to external resources is prohibited.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verifiability&lt;/strong&gt;: Code is covered by unit tests, corpus of real documents as a proof of round-trip preservation, fuzzing, code review and manual testing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-friendly&lt;/strong&gt;: The CLI tool can produce machine-readable output (JSON, XML), which is easier to process using scripts, automation tools and AI agents&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  CLI tool example
&lt;/h2&gt;

&lt;p&gt;The command-line tool is designed to be simple and easy to use:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;exyoki info corpus/word/The_United_States_of_America.docx
exyoki search corpus/word/Open_Source_Software.docx &lt;span class="s2"&gt;"license"&lt;/span&gt; &lt;span class="nt"&gt;--ignore-case&lt;/span&gt;
exyoki validate corpus/excel/Formulas.xlsx
exyoki &lt;span class="nb"&gt;stat &lt;/span&gt;corpus/powerpoint/Yellowstone.pptx
exyoki convert corpus/word/The_United_States_of_America.docx usa.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Current state and limitations
&lt;/h2&gt;

&lt;p&gt;All major parts of the library are finished and covered by unit tests. Now, I am using a code coverage tool to catch gaps and fix some bugs.&lt;br&gt;
Of course, I feel I am only at the start of a long journey. The library has some important limitations: it cannot do rendering or conversion to raster or SVG images.&lt;br&gt;
No legacy binary formats such as DOC, PPT, XLS. The MCP servers are still experimental and need more real-world testing. &lt;/p&gt;
&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;

&lt;p&gt;ExyokiOffice is available on GitHub under the MIT license.&lt;br&gt;
For all who are working with Office documents using C++, I'd love to get your feedback.&lt;br&gt;
Are you missing a feature that is important to you? Just write an issue!&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/JakubMelka" rel="noopener noreferrer"&gt;
        JakubMelka
      &lt;/a&gt; / &lt;a href="https://github.com/JakubMelka/ExyokiOffice" rel="noopener noreferrer"&gt;
        ExyokiOffice
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A modern, MIT-licensed native C++ library for creation and modification of Open XML documents (DOCX, XLSX, PPTX), designed for cross-platform and dependency-free use.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ExyokiOffice&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/JakubMelka/ExyokiOffice/actions/workflows/smoke.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/JakubMelka/ExyokiOffice/actions/workflows/smoke.yml/badge.svg?branch=master" alt="Smoke"&gt;&lt;/a&gt;
&lt;a href="https://github.com/JakubMelka/ExyokiOffice/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/7013272bd27ece47364536a221edb554cd69683b68a46fc0ee96881174c4214c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://github.com/JakubMelka/ExyokiOffice#build-and-install" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/5c844762c775aebc5c564ae6006fd089af6d5ebf48298350db7f0509be7605d4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f432532422532422d32302d626c75652e737667" alt="C++20"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/JakubMelka/ExyokiOffice/LOGO.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2FJakubMelka%2FExyokiOffice%2FHEAD%2FLOGO.png" alt="ExyokiOffice logo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A native C++20 toolkit for creating and editing Word, Excel, and PowerPoint
documents.&lt;/strong&gt; Work with &lt;code&gt;.docx&lt;/code&gt;, &lt;code&gt;.xlsx&lt;/code&gt;, and &lt;code&gt;.pptx&lt;/code&gt; through high-level editors
or a typed OpenXML DOM, without Microsoft Office, .NET, Java, or Python at build
time or runtime.&lt;/p&gt;
&lt;p&gt;ExyokiOffice is designed for applications that need to generate or modify
Office documents while retaining access to the underlying package. Content
outside the high-level editing model is preserved instead of being silently
dropped.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/JakubMelka/ExyokiOffice#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt; · &lt;a href="https://github.com/JakubMelka/ExyokiOffice#choose-an-interface" rel="noopener noreferrer"&gt;Choose an API&lt;/a&gt; ·
&lt;a href="https://github.com/JakubMelka/ExyokiOffice/docs/Compatibility.md" rel="noopener noreferrer"&gt;Compatibility&lt;/a&gt; · &lt;a href="https://github.com/JakubMelka/ExyokiOffice/docs/README.md" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; ·
&lt;a href="https://github.com/JakubMelka/ExyokiOffice/docs/comparison.md" rel="noopener noreferrer"&gt;Comparison&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why ExyokiOffice&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One native library for all three Office formats.&lt;/strong&gt; Create and edit Word
documents, Excel workbooks, and PowerPoint presentations from C++20.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start high-level, go low-level when needed.&lt;/strong&gt; Friendly editors cover common
authoring tasks; the generated typed DOM and OPC packaging layer remain
available for precise OpenXML work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preserve what you do not edit.&lt;/strong&gt; The compatibility matrix distinguishes
features the library can create…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/JakubMelka/ExyokiOffice" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>showdev</category>
      <category>cpp</category>
      <category>programming</category>
      <category>news</category>
    </item>
  </channel>
</rss>
