<?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>C++ has no Apache POI. So I wrote one.</title>
      <dc:creator>Jakub Melka</dc:creator>
      <pubDate>Mon, 07 Sep 2026 13:12:00 +0000</pubDate>
      <link>https://dev.to/jakub_melka_0109/c-has-no-apache-poi-so-i-wrote-one-3471</link>
      <guid>https://dev.to/jakub_melka_0109/c-has-no-apache-poi-so-i-wrote-one-3471</guid>
      <description>&lt;p&gt;If you need to read or write DOCX, XLSX and PPTX files from native C++, there is no good answer. .NET has Open-XML-SDK. Java has Apache POI. C++ has a few XLSX-only libraries - OpenXLSX, QXlsx, libxlsxwriter among them - and nothing feature-rich that covers all three formats.&lt;/p&gt;

&lt;p&gt;I hit that wall last year on my own project. After searching long enough to be confident I was not simply missing something, I decided to write the library myself. It is called ExyokiOffice, it is MIT licensed, and it now covers Word, Excel and PowerPoint behind one API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The part I care about most: nothing gets silently dropped&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open a document containing charts, SmartArt or a vendor extension with most open-source Office libraries, save it, and the honest question is: what did I just lose? Usually nothing tells you. The elements the library does not understand are simply gone, and you find out when someone opens the file.&lt;/p&gt;

&lt;p&gt;I designed ExyokiOffice so that content preservation is a contract. Elements and attributes the library does not recognize are retained in the internal XML DOM and written back when the document is saved. Round-trip preservation is checked against a corpus of real documents, not only synthetic ones.&lt;/p&gt;

&lt;p&gt;That is the difference between a library you can put in a production pipeline and one you can only safely use on documents you created yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  No managed runtime, no external dependencies
&lt;/h2&gt;

&lt;p&gt;No .NET Framework. No Java Virtual Machine. The only dependency is the standard C++ library.&lt;/p&gt;

&lt;p&gt;Given the scope I expected the result to be big, and I was surprised that it is not. The compressed packages, including a Docker image containing the CLI tool and the MCP servers, come in under 30 MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two APIs, because you will need both
&lt;/h2&gt;

&lt;p&gt;The high-level API is built for the common case and does not ask you to know the underlying specifications.&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;p&gt;When the high-level API is not enough, you drop into a DOM-like low-level API similar to Open-XML-SDK and modify the tree directly. You do not have to choose between them up front.&lt;/p&gt;
&lt;h2&gt;
  
  
  What else is in it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;exyoki, a CLI tool: validation, conversion, full-text search, redaction and statistics, without writing a line of code&lt;/li&gt;
&lt;li&gt;Schema and semantic validation against a specific Office version&lt;/li&gt;
&lt;li&gt;Format conversion, including DOCX to Markdown and back&lt;/li&gt;
&lt;li&gt;A security model where access to external resources is denied by default&lt;/li&gt;
&lt;li&gt;Machine-readable CLI output in JSON or XML, for scripts, automation and AI agents&lt;/li&gt;
&lt;li&gt;MCP servers for each document type, one per format - experimental, and I would rather say so than imply otherwise
&lt;/li&gt;
&lt;/ul&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;
  
  
  What it cannot do
&lt;/h2&gt;

&lt;p&gt;No rendering, and no conversion to raster or SVG images. No legacy binary formats - DOC, XLS, PPT. The MCP servers are experimental and need real-world testing.&lt;/p&gt;

&lt;p&gt;All the major parts of the library are finished and covered by unit tests. I am currently running coverage tooling to find the gaps and fix what it turns up.&lt;/p&gt;
&lt;h2&gt;
  
  
  If you work with Office documents in C++
&lt;/h2&gt;

&lt;p&gt;This is a one-person project and I am at the start of a long road. If there is a feature you need and it is not there, open an issue. For a library like this, that is genuinely the most useful thing you can do.&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>opensource</category>
    </item>
    <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>
