<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=LibreOffice_Calc_NumToWords_Extension_Complete_Guide</id>
	<title>LibreOffice Calc NumToWords Extension Complete Guide - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.comfac.net/index.php?action=history&amp;feed=atom&amp;title=LibreOffice_Calc_NumToWords_Extension_Complete_Guide"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=LibreOffice_Calc_NumToWords_Extension_Complete_Guide&amp;action=history"/>
	<updated>2026-06-05T10:57:49Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://mediawiki.comfac.net/index.php?title=LibreOffice_Calc_NumToWords_Extension_Complete_Guide&amp;diff=130&amp;oldid=prev</id>
		<title>Justinaquino: Imported from gi7b wiki</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.comfac.net/index.php?title=LibreOffice_Calc_NumToWords_Extension_Complete_Guide&amp;diff=130&amp;oldid=prev"/>
		<updated>2026-03-06T10:07:30Z</updated>

		<summary type="html">&lt;p&gt;Imported from gi7b wiki&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= LibreOffice Calc NumToWords Extension - Complete Solution &amp;amp; Troubleshooting Guide =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
A LibreOffice Calc add-in that converts numbers to their English word representation using the custom `=NUMTOWORDS()` spreadsheet function. This page documents the &amp;#039;&amp;#039;&amp;#039;working solution&amp;#039;&amp;#039;&amp;#039; and the &amp;#039;&amp;#039;&amp;#039;complete debugging journey&amp;#039;&amp;#039;&amp;#039; including all 15+ issues encountered and resolved.&lt;br /&gt;
&lt;br /&gt;
=== Quick Start - Working Solution ===&lt;br /&gt;
&lt;br /&gt;
The extension is available in two versions:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Working Python Version:&amp;#039;&amp;#039;&amp;#039; `libreoffice-calc-numbers-to-words/python/NumToWordsPy.oxt`&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Experimental Java Version:&amp;#039;&amp;#039;&amp;#039; `libreoffice-calc-numbers-to-words/java/dist/NumToWords.oxt` (for reference)&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
==== Option 1 - GUI (Recommended) ====&lt;br /&gt;
&lt;br /&gt;
1. Download `NumToWordsPy.oxt` from the repository&lt;br /&gt;
2. Open LibreOffice Calc&lt;br /&gt;
3. Go to &amp;#039;&amp;#039;&amp;#039;Tools → Extension Manager&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
4. Click &amp;#039;&amp;#039;&amp;#039;Add&amp;#039;&amp;#039;&amp;#039; and select `NumToWordsPy.oxt`&lt;br /&gt;
5. &amp;#039;&amp;#039;&amp;#039;Restart LibreOffice Calc completely&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
6. Test with: `=NUMTOWORDS(123)`&lt;br /&gt;
&lt;br /&gt;
==== Option 2 - Command Line ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Download the extension&lt;br /&gt;
curl -LO https://github.com/xunema/libreoffice-calc-numbers-to-words/releases/download/v2.0.0/NumToWordsPy.oxt&lt;br /&gt;
&lt;br /&gt;
# Close LibreOffice first!&lt;br /&gt;
pkill soffice&lt;br /&gt;
&lt;br /&gt;
# Clear cache (important!)&lt;br /&gt;
rm -rf ~/.config/libreoffice/4/user/uno_packages/cache/&lt;br /&gt;
rm -rf ~/.config/libreoffice/4/user/extensions/&lt;br /&gt;
&lt;br /&gt;
# Install&lt;br /&gt;
unopkg add NumToWordsPy.oxt&lt;br /&gt;
&lt;br /&gt;
# Verify&lt;br /&gt;
unopkg list | grep numtowords&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Usage ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
=NUMTOWORDS(number)&lt;br /&gt;
=NUMTOWORDS(number, formatStyle)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Format Styles&lt;br /&gt;
! formatStyle !! Mode !! Example Output&lt;br /&gt;
|-&lt;br /&gt;
| 0 (default) || Cardinal || one hundred and twenty-three&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Ordinal || forty-second&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Currency || ninety-nine dollars and ninety-nine cents&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
=NUMTOWORDS(123)            → one hundred and twenty-three&lt;br /&gt;
=NUMTOWORDS(42, 1)          → forty-second&lt;br /&gt;
=NUMTOWORDS(99.99, 2)       → ninety-nine dollars and ninety-nine cents&lt;br /&gt;
=NUMTOWORDS(-5)             → minus five&lt;br /&gt;
=NUMTOWORDS(1000000)        → one million&lt;br /&gt;
=NUMTOWORDS(12.34)          → twelve point three four&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== The Core Technique - Why This Works ==&lt;br /&gt;
&lt;br /&gt;
=== The &amp;quot;Invisible XPropertySet&amp;quot; Pattern ===&lt;br /&gt;
&lt;br /&gt;
This is the &amp;#039;&amp;#039;&amp;#039;critical secret&amp;#039;&amp;#039;&amp;#039; that makes LibreOffice Calc Add-Ins work:&lt;br /&gt;
&lt;br /&gt;
LibreOffice &amp;#039;&amp;#039;&amp;#039;auto-injects&amp;#039;&amp;#039;&amp;#039; the calling cell&amp;#039;s `XPropertySet` as the &amp;#039;&amp;#039;&amp;#039;first invisible argument&amp;#039;&amp;#039;&amp;#039; to your Python method. This is &amp;#039;&amp;#039;&amp;#039;NOT listed in the XCU file&amp;#039;&amp;#039;&amp;#039; and is handled transparently by the UNO bridge.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Python Method Signature:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def numToWords(self, number, formatStyle=None):&lt;br /&gt;
    # Receives: (self, XPropertySet, number, formatStyle)&lt;br /&gt;
    # But XPropertySet is INVISIBLE - LibreOffice injects it automatically!&lt;br /&gt;
    pass&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;XCU Parameters (ONLY list the visible ones):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;Parameters&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;number&amp;quot; oor:op=&amp;quot;replace&amp;quot;&amp;gt;...&amp;lt;/node&amp;gt;      &amp;lt;!-- Index 0 in XCU --&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;formatStyle&amp;quot; oor:op=&amp;quot;replace&amp;quot;&amp;gt;          &amp;lt;!-- Index 1 in XCU --&amp;gt;&lt;br /&gt;
    &amp;lt;prop oor:name=&amp;quot;IsOptional&amp;quot;&amp;gt;&amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&amp;lt;/prop&amp;gt;&lt;br /&gt;
  &amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Key Points:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* The Python method receives 3 arguments: `(self, XPropertySet, number, formatStyle)`&lt;br /&gt;
* The XCU only declares 2 parameters: `number` and `formatStyle`&lt;br /&gt;
* The `XPropertySet` is injected by LibreOffice &amp;#039;&amp;#039;&amp;#039;invisibly&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* The XCU parameter count must match the &amp;#039;&amp;#039;&amp;#039;visible&amp;#039;&amp;#039;&amp;#039; parameters only!&lt;br /&gt;
&lt;br /&gt;
=== Architecture Pattern (Following libnumbertext) ===&lt;br /&gt;
&lt;br /&gt;
The working extension follows the &amp;#039;&amp;#039;&amp;#039;hybrid Python+Java pattern&amp;#039;&amp;#039;&amp;#039; from the proven [https://github.com/Numbertext/libnumbertext libnumbertext] project:&lt;br /&gt;
&lt;br /&gt;
1. &amp;#039;&amp;#039;&amp;#039;Python UNO Bridge&amp;#039;&amp;#039;&amp;#039; (`numtowords.uno.py`)&lt;br /&gt;
   * Handles UNO registration via `unohelper.ImplementationHelper`&lt;br /&gt;
   * Provides `g_ImplementationHelper.addImplementation()`&lt;br /&gt;
   * No complex factory methods needed&lt;br /&gt;
&lt;br /&gt;
2. &amp;#039;&amp;#039;&amp;#039;Plain Python Logic&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   * Core conversion in pure Python (no Java required!)&lt;br /&gt;
   * Simple algorithm, no UNO dependencies in logic&lt;br /&gt;
&lt;br /&gt;
3. &amp;#039;&amp;#039;&amp;#039;XCU Registration&amp;#039;&amp;#039;&amp;#039; (`CalcAddIns.xcu`)&lt;br /&gt;
   * Declares function to Calc&amp;#039;s formula engine&lt;br /&gt;
   * Uses `IsOptional` flag for optional parameters&lt;br /&gt;
   * CompatibilityName matches implementation exactly&lt;br /&gt;
&lt;br /&gt;
4. &amp;#039;&amp;#039;&amp;#039;RDB Type Library&amp;#039;&amp;#039;&amp;#039; (`NumToWords.rdb`)&lt;br /&gt;
   * Compiled IDL interface&lt;br /&gt;
   * Tells LibreOffice the exact parameter types&lt;br /&gt;
   &amp;#039;&amp;#039;&amp;#039;Critical for avoiding Err:504!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
5. &amp;#039;&amp;#039;&amp;#039;Legacy Manifest&amp;#039;&amp;#039;&amp;#039; (`META-INF/manifest.xml`)&lt;br /&gt;
   * Uses `type=Python` (not modern `.components`)&lt;br /&gt;
   * Includes RDB entry for type library&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Complete Debugging Chronicle - All 15+ Issues Encountered ==&lt;br /&gt;
&lt;br /&gt;
=== Issue 1: Inner Class $ Notation Problem ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Cannot determine registration class!`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Using Java inner class with `$` notation in `.components` file:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- WRONG --&amp;gt;&lt;br /&gt;
&amp;lt;implementation name=&amp;quot;com.numbertext.converter.NumToWords$_NumToWords&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Use top-level class only, no inner classes:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- CORRECT --&amp;gt;&lt;br /&gt;
&amp;lt;implementation name=&amp;quot;com.numbertext.converter.NumToWordsImpl&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 2: Disconnected Factory Methods ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Cannot determine registration class!`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; `__getComponentFactory` and `__writeRegistryServiceInfo` were in `NumToWords.java`, but `.components` pointed to `NumToWordsImpl.java`. LibreOffice looks for these methods via reflection on the class named in the `&amp;lt;implementation&amp;gt;` tag.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Move factory methods into the implementation class:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class NumToWordsImpl extends WeakBase implements ... {&lt;br /&gt;
    public static XSingleComponentFactory __getComponentFactory(String sImplName) {&lt;br /&gt;
        // Factory logic here&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static boolean __writeRegistryServiceInfo(XRegistryKey regKey) {&lt;br /&gt;
        // Registration logic here&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 3: Java Version Mismatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Cannot determine registration class!` (silent failure)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Compiling with Java 21 (default in Ubuntu 24.04) but LibreOffice configured to use Java 11 JRE. The `UnsupportedClassVersionError` manifests as generic registration failure.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Detection:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
javap -verbose NumToWordsImpl.class | grep &amp;quot;major version&amp;quot;&lt;br /&gt;
# major version 65 = Java 21 ❌&lt;br /&gt;
# major version 55 = Java 11 ✅&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Compile with `--release 11` flag:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
javac --release 11 -d build ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 4: Corrupted Registry Cache ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Insert duplicate implementation name` or `Cannot determine registration class!`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Previous broken installations left zombie entries in `~/.config/libreoffice/4/user/uno_packages/cache/`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Aggressive cache clearing:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
pkill soffice&lt;br /&gt;
sleep 2&lt;br /&gt;
rm -rf ~/.config/libreoffice/4/user/uno_packages/cache/*&lt;br /&gt;
rm -rf ~/.config/libreoffice/4/user/extensions/tmp/*&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 5: Conflicting Manifest Entries (The &amp;quot;Final Boss&amp;quot;) ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Cannot determine registration class!`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; `META-INF/manifest.xml` contained BOTH:&lt;br /&gt;
* Legacy: `application/vnd.sun.star.uno-component;type=Java`&lt;br /&gt;
* Modern: `application/vnd.sun.star.uno-components`&lt;br /&gt;
&lt;br /&gt;
LibreOffice processes legacy first, finds no `RegistrationClassName`, aborts before reaching modern entry.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Use ONLY the legacy Python approach:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;manifest:file-entry&lt;br /&gt;
    manifest:media-type=&amp;quot;application/vnd.sun.star.uno-component;type=Python&amp;quot;&lt;br /&gt;
    manifest:full-path=&amp;quot;numtowords.uno.py&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 6: Missing RDB Type Library ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Err:504` (Error in parameter list)&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; No `.rdb` file included in extension. LibreOffice has no type map, cannot hand cell values to Python.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Create IDL and compile to RDB:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Create IDL&lt;br /&gt;
# Compile&lt;br /&gt;
unoidl-write types.rdb offapi.rdb XOcNumToWords.idl oc_numtowords.rdb&lt;br /&gt;
&lt;br /&gt;
# Add to manifest&lt;br /&gt;
&amp;lt;manifest:file-entry&lt;br /&gt;
    manifest:media-type=&amp;quot;application/vnd.sun.star.uno-typelibrary;type=RDB&amp;quot;&lt;br /&gt;
    manifest:full-path=&amp;quot;oc_numtowords.rdb&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 7: Incorrect Python *args Pattern ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Err:504` or `#NAME?`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Attempted to use `*args` to handle variable arguments:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# WRONG - LibreOffice doesn&amp;#039;t support *args&lt;br /&gt;
def ocnumtowords(self, *args):&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Use explicit parameters matching IDL exactly:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# CORRECT - Explicit signature&lt;br /&gt;
def numToWords(self, number, formatStyle=None):&lt;br /&gt;
    # XPropertySet is injected invisibly before &amp;#039;number&amp;#039;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 8: XCU Parameter Count Mismatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Err:504`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Listed all 3 parameters in XCU (including invisible XPropertySet):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- WRONG --&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;Parameters&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;prop&amp;quot;/&amp;gt;    &amp;lt;!-- Don&amp;#039;t list this! --&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;number&amp;quot;/&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;formatStyle&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Only list visible parameters:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- CORRECT --&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;Parameters&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;number&amp;quot;/&amp;gt;        &amp;lt;!-- Visible param 1 --&amp;gt;&lt;br /&gt;
  &amp;lt;node oor:name=&amp;quot;formatStyle&amp;quot;/&amp;gt;  &amp;lt;!-- Visible param 2 --&amp;gt;&lt;br /&gt;
&amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 9: Missing IsOptional Flag ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Err:504` when calling with single argument&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Optional parameter not marked as optional in XCU:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- WRONG --&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;formatStyle&amp;quot; oor:op=&amp;quot;replace&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!-- No IsOptional property --&amp;gt;&lt;br /&gt;
&amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Add `IsOptional` property:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- CORRECT --&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;formatStyle&amp;quot; oor:op=&amp;quot;replace&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;prop oor:name=&amp;quot;IsOptional&amp;quot; oor:type=&amp;quot;xs:boolean&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;value&amp;gt;true&amp;lt;/value&amp;gt;&lt;br /&gt;
  &amp;lt;/prop&amp;gt;&lt;br /&gt;
&amp;lt;/node&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 10: Method Name Case Sensitivity ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `#NAME?` or function not found&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; XCU node name doesn&amp;#039;t match Python method name exactly:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- WRONG --&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;ocnumtowords&amp;quot;&amp;gt;  &amp;lt;!-- lowercase --&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Python method&lt;br /&gt;
def ocNumToWords(self, ...):  # camelCase - mismatch!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Names must match exactly (case-sensitive):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- CORRECT --&amp;gt;&lt;br /&gt;
&amp;lt;node oor:name=&amp;quot;numToWords&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# Python method&lt;br /&gt;
def numToWords(self, ...):  # Exact match!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 11: CompatibilityName Format ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; Function not appearing in Calc&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Incorrect `CompatibilityName` format:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- WRONG --&amp;gt;&lt;br /&gt;
&amp;lt;prop oor:name=&amp;quot;CompatibilityName&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;value&amp;gt;AutoAddIn.NumToWords.numToWords&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/prop&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Use simple dotted format:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- CORRECT --&amp;gt;&lt;br /&gt;
&amp;lt;prop oor:name=&amp;quot;CompatibilityName&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;value&amp;gt;com.numbertext.converter.NumToWordsPy.numToWords&amp;lt;/value&amp;gt;&lt;br /&gt;
&amp;lt;/prop&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 12: IDL Parameter Naming (Underscores vs CamelCase) ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; RDB compilation fails&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Using underscores in IDL parameter names:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;idl&amp;quot;&amp;gt;&lt;br /&gt;
// WRONG&lt;br /&gt;
string numToWords([in] any format_style);  // Underscore not allowed!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Use camelCase in IDL:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;idl&amp;quot;&amp;gt;&lt;br /&gt;
// CORRECT&lt;br /&gt;
string numToWords([in] any formatStyle);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 13: RDB Not Included in OXT ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; `Err:504` even with correct IDL&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Build script didn&amp;#039;t include `.rdb` in the OXT package:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# WRONG - Missing rdb/&lt;br /&gt;
zip -r extension.oxt oc_reg.uno.py oc_CalcAddIn.xcu META-INF/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Include RDB directory:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# CORRECT&lt;br /&gt;
zip -r extension.oxt oc_reg.uno.py oc_CalcAddIn.xcu META-INF/ rdb/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 14: Headless Test Environment Limitations ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; Extension registers but functions return `Err:504`&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Testing via `unopkg` and headless Python UNO connection doesn&amp;#039;t fully initialize the AddIn service. Calc&amp;#039;s formula engine needs complete GUI context.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Must test in real LibreOffice Calc GUI:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
1. Install via Extension Manager GUI&lt;br /&gt;
2. Full restart of LibreOffice&lt;br /&gt;
3. Test in actual spreadsheet&lt;br /&gt;
&lt;br /&gt;
The CLI test environment cannot fully validate AddIn functionality!&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
=== Issue 15: Service Name Mismatch ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Error:&amp;#039;&amp;#039;&amp;#039; Extension installs but not recognized as AddIn&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Cause:&amp;#039;&amp;#039;&amp;#039; Service name doesn&amp;#039;t include `com.sun.star.sheet.AddIn`:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# WRONG&lt;br /&gt;
SERVICE_NAME = &amp;quot;com.numbertext.converter&amp;quot;  # Missing AddIn service!&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Solution:&amp;#039;&amp;#039;&amp;#039; Must include AddIn service:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# CORRECT&lt;br /&gt;
SERVICE_NAME = &amp;quot;com.sun.star.sheet.AddIn&amp;quot;&lt;br /&gt;
# Or tuple of services:&lt;br /&gt;
(&amp;quot;com.numbertext.converter&amp;quot;, &amp;quot;com.sun.star.sheet.AddIn&amp;quot;)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Project Structure ==&lt;br /&gt;
&lt;br /&gt;
=== Working Python Extension ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
libreoffice-calc-numbers-to-words/python/&lt;br /&gt;
├── NumToWordsPy.oxt              # Ready-to-install OXT&lt;br /&gt;
├── numtowords.uno.py            # Python UNO component&lt;br /&gt;
├── CalcAddIns.xcu               # Calc function registration&lt;br /&gt;
├── NumToWords.rdb               # Compiled UNO type library&lt;br /&gt;
├── description.xml              # Extension metadata&lt;br /&gt;
└── META-INF/manifest.xml        # OXT manifest (legacy Python type)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Key Files Explained ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;numtowords.uno.py:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Implements `XAddIn`, `XServiceInfo`, `XLocalizable`&lt;br /&gt;
* Uses `unohelper.ImplementationHelper` for registration&lt;br /&gt;
* Core conversion logic in pure Python&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Method receives invisible XPropertySet!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;CalcAddIns.xcu:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Registers function with Calc&amp;#039;s formula engine&lt;br /&gt;
* Only declares &amp;#039;&amp;#039;&amp;#039;visible&amp;#039;&amp;#039;&amp;#039; parameters&lt;br /&gt;
* Uses `IsOptional` for optional arguments&lt;br /&gt;
* CompatibilityName matches implementation&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NumToWords.rdb:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Compiled from `NumToWords.idl`&lt;br /&gt;
* Provides type information for UNO bridge&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Critical for parameter passing!&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;META-INF/manifest.xml:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Legacy Python component type&lt;br /&gt;
* Includes RDB reference&lt;br /&gt;
* No modern `.components` approach&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Complete Build Commands ==&lt;br /&gt;
&lt;br /&gt;
=== For Python Extension (Working) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Create IDL&lt;br /&gt;
# 2. Compile IDL to RDB&lt;br /&gt;
unoidl-write /usr/lib/libreoffice/program/types.rdb \&lt;br /&gt;
    /usr/lib/libreoffice/program/types/offapi.rdb \&lt;br /&gt;
    idl/XNumToWords.idl \&lt;br /&gt;
    NumToWords.rdb&lt;br /&gt;
&lt;br /&gt;
# 3. Package OXT&lt;br /&gt;
zip -r NumToWordsPy.oxt \&lt;br /&gt;
    numtowords.uno.py \&lt;br /&gt;
    CalcAddIns.xcu \&lt;br /&gt;
    NumToWords.rdb \&lt;br /&gt;
    description.xml \&lt;br /&gt;
    META-INF/&lt;br /&gt;
&lt;br /&gt;
# 4. Install&lt;br /&gt;
unopkg add NumToWordsPy.oxt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
=== Verification Steps ===&lt;br /&gt;
&lt;br /&gt;
1. &amp;#039;&amp;#039;&amp;#039;Check extension is registered:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
unopkg list | grep numtowords&lt;br /&gt;
# Should show: com.numbertext.converter.NumToWordsPy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. &amp;#039;&amp;#039;&amp;#039;Check RDB is loaded:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Look for RDB in bundled packages&lt;br /&gt;
unopkg list | grep -A 10 numtowords | grep &amp;quot;uno-typelibrary&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. &amp;#039;&amp;#039;&amp;#039;Test in LibreOffice Calc GUI:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
=NUMTOWORDS(123)      # Should return: one hundred and twenty-three&lt;br /&gt;
=NUMTOWORDS(42, 1)    # Should return: forty-second&lt;br /&gt;
=NUMTOWORDS(99, 2)    # Should return: ninety-nine dollars&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Lessons Learned ==&lt;br /&gt;
&lt;br /&gt;
=== Key Takeaways ===&lt;br /&gt;
&lt;br /&gt;
1. &amp;#039;&amp;#039;&amp;#039;Python is easier than Java&amp;#039;&amp;#039;&amp;#039; for LibreOffice extensions&lt;br /&gt;
   * `unohelper.ImplementationHelper` handles registration&lt;br /&gt;
   * No complex factory methods needed&lt;br /&gt;
   * No Java version compatibility issues&lt;br /&gt;
&lt;br /&gt;
2. &amp;#039;&amp;#039;&amp;#039;The invisible XPropertySet is critical&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   * LibreOffice injects it automatically&lt;br /&gt;
   * Don&amp;#039;t list it in XCU&lt;br /&gt;
   * Don&amp;#039;t try to handle it with `*args`&lt;br /&gt;
&lt;br /&gt;
3. &amp;#039;&amp;#039;&amp;#039;RDB type library is mandatory&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   * Without it, you get `Err:504`&lt;br /&gt;
   * Compile IDL to RDB using `unoidl-write`&lt;br /&gt;
   * Include RDB in OXT manifest&lt;br /&gt;
&lt;br /&gt;
4. &amp;#039;&amp;#039;&amp;#039;CLI testing has limitations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   * `unopkg` can install but not fully test&lt;br /&gt;
   * AddIn functions need GUI context&lt;br /&gt;
   * Always test in real LibreOffice Calc&lt;br /&gt;
&lt;br /&gt;
5. &amp;#039;&amp;#039;&amp;#039;Match names exactly&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
   * Python method name ↔ XCU node name&lt;br /&gt;
   * Case-sensitive!&lt;br /&gt;
   * CompatibilityName format matters&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Working Extension:&amp;#039;&amp;#039;&amp;#039; [https://github.com/xunema/libreoffice-calc-numbers-to-words python/NumToWordsPy.oxt]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pattern Reference:&amp;#039;&amp;#039;&amp;#039; [https://github.com/Numbertext/libnumbertext libnumbertext]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;LibreOffice Wiki:&amp;#039;&amp;#039;&amp;#039; [https://wiki.documentfoundation.org/Documentation/SDKGuide/Calc_Add-ins Calc Add-ins Documentation]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;UNO Bridge:&amp;#039;&amp;#039;&amp;#039; [https://api.libreoffice.org/ LibreOffice API]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
== Version History ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;v2.0.0&amp;#039;&amp;#039;&amp;#039; - Working Python implementation (current)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;v1.0.0&amp;#039;&amp;#039;&amp;#039; - Original Python attempt (failed registration)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Java attempts&amp;#039;&amp;#039;&amp;#039; - Multiple iterations (all failed, documented above)&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Documentation created by OpenCode AI Agent (kimi-k2.5)&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;Last updated: February 27, 2026&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Development &amp;amp; Tools]]&lt;br /&gt;
[[Category:Open Source]]&lt;br /&gt;
[[Category:LibreOffice]]&lt;br /&gt;
[[Category:Python]]&lt;br /&gt;
[[Category:Troubleshooting]]&lt;/div&gt;</summary>
		<author><name>Justinaquino</name></author>
	</entry>
</feed>