This is an automated email from the ASF dual-hosted git repository.
damjan pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/openoffice.git
The following commit(s) were added to refs/heads/trunk by this push:
new b045a72bbf Use the correct namespace when converting ODF formulas to
MS Excel 2003 XML, so that R1C1 formula is used instead of leaving broken
"of:=[.A1]" style references.
b045a72bbf is described below
commit b045a72bbf8ebfd2ea5838734aa14f879ef23ec9
Author: Damjan Jovanovic <[email protected]>
AuthorDate: Sun Nov 16 21:30:03 2025 +0200
Use the correct namespace when converting ODF formulas to MS Excel 2003 XML,
so that R1C1 formula is used instead of leaving broken "of:=[.A1]" style
references.
Patch by: me
Fixes: https://bz.apache.org/ooo/show_bug.cgi?id=96018
---
.../source/xslt/export/spreadsheetml/formular.xsl | 11 ++-
.../fvt/uno/sc/formula/TestFormulaRoundTrip.java | 101 +++++++++++++++++++++
2 files changed, 107 insertions(+), 5 deletions(-)
diff --git a/main/filter/source/xslt/export/spreadsheetml/formular.xsl
b/main/filter/source/xslt/export/spreadsheetml/formular.xsl
index 39a343a026..b33afbab7e 100644
--- a/main/filter/source/xslt/export/spreadsheetml/formular.xsl
+++ b/main/filter/source/xslt/export/spreadsheetml/formular.xsl
@@ -47,8 +47,9 @@
xmlns:xt="http://www.jclark.com/xt"
xmlns:common="http://exslt.org/common"
xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2"
xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"
xmlns:html="http://www.w3.org/TR/REC-html40"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- exclude-result-prefixes="chart config dc dom dr3d draw fo form math
meta number office ooo oooc ooow script style svg table text xlink xt common
xalan">
+ exclude-result-prefixes="chart config dc dom dr3d draw fo form math
meta number office ooo oooc ooow script style svg table text xlink xt common
xalan of">
<!-- Mapping @table:formula to @ss:Formula translating the expression
syntax -->
@@ -85,14 +86,14 @@
<xsl:when test="$expression != ''">
<xsl:choose>
<!-- OASIS Open Document XML formular
expressions -->
- <xsl:when
test="starts-with($expression,'oooc:')">
- <!-- giving out the '=', which
will be removed with 'oooc:=' to enable recursive string parsing -->
+ <xsl:when
test="starts-with($expression,'of:')">
+ <!-- giving out the '=', which
will be removed with 'of:=' to enable recursive string parsing -->
<xsl:text>=</xsl:text>
<xsl:call-template
name="function-parameter-mapping">
<xsl:with-param
name="rowPos" select="$rowPos" />
<xsl:with-param
name="columnPos" select="$columnPos" />
- <!-- 1) remove 'oooc:='
prefix and exchange ';' with ',' -->
- <xsl:with-param
name="expression" select="translate(substring($expression,7),';',',')"/>
+ <!-- 1) remove 'of:='
prefix and exchange ';' with ',' -->
+ <xsl:with-param
name="expression" select="translate(substring($expression,5),';',',')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
diff --git a/test/testuno/source/fvt/uno/sc/formula/TestFormulaRoundTrip.java
b/test/testuno/source/fvt/uno/sc/formula/TestFormulaRoundTrip.java
new file mode 100644
index 0000000000..a1c2894732
--- /dev/null
+++ b/test/testuno/source/fvt/uno/sc/formula/TestFormulaRoundTrip.java
@@ -0,0 +1,101 @@
+/**************************************************************
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ *************************************************************/
+
+
+package fvt.uno.sc.formula;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import org.openoffice.test.common.Testspace;
+import org.openoffice.test.uno.UnoApp;
+
+import testlib.uno.SCUtil;
+import static testlib.uno.TestUtil.*;
+
+import com.sun.star.beans.PropertyValue;
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.frame.XStorable;
+import com.sun.star.lang.XComponent;
+import com.sun.star.sheet.XSpreadsheet;
+import com.sun.star.sheet.XSpreadsheetDocument;
+import com.sun.star.sheet.XSpreadsheets;
+import com.sun.star.table.XCell;
+
+public class TestFormulaRoundTrip {
+ private UnoApp unoApp = new UnoApp();
+
+ private XSpreadsheetDocument scDocument = null;
+ private XComponent scComponent = null;
+
+ @Before
+ public void setUp() throws Exception {
+ unoApp.start();
+ scComponent = unoApp.newDocument("scalc");
+ scDocument = SCUtil.getSCDocument(scComponent);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ unoApp.closeDocument(scComponent);
+ unoApp.close();
+ }
+
+ @Test
+ public void testMSExcel2003XMLFormulaRoundTrip() throws Exception {
+ XSpreadsheet sheet = SCUtil.getCurrentSheet(scDocument);
+ SCUtil.setTextToCell(sheet, 0, 0, "Hello world");
+ SCUtil.setFormulaToCell(sheet, 0, 1, "=A1");
+ String formulaValue = SCUtil.getTextFromCell(sheet, 0, 1);
+ assertEquals("Hello world", formulaValue);
+
+ String storeUrl = Testspace.getUrl("output/sc/temp.xml");
+ PropertyValue[] storeProps = new PropertyValue[2];
+ storeProps[0] = new PropertyValue();
+ storeProps[0].Name = "FilterName";
+ storeProps[0].Value = "MS Excel 2003 XML";
+ storeProps[1] = new PropertyValue();
+ storeProps[1].Name = "Overwrite";
+ storeProps[1].Value = new Boolean(true);
+ XStorable scStorable =
+ (XStorable) UnoRuntime.queryInterface(XStorable.class,
scComponent);
+ scStorable.storeAsURL(storeUrl, storeProps);
+
+ unoApp.closeDocument(scComponent);
+
+ scDocument = (XSpreadsheetDocument) UnoRuntime.queryInterface(
+ XSpreadsheetDocument.class,
unoApp.loadDocument(Testspace.getPath("output/sc/temp.xml")));
+ sheet = SCUtil.getCurrentSheet(scDocument);
+ String formulaValue2 = SCUtil.getTextFromCell(sheet, 0, 1);
+ assertEquals("Hello world", formulaValue2);
+ String formula2 = SCUtil.getFormulaFromCell(sheet, 0, 1);
+ assertEquals("=A1", formula2);
+ }
+}