On 27.10.2024 5:27, Regina Henschel wrote:
Hi Mike, hi all,
Mike Kaganski schrieb am 21.10.2024 um 09:19:
Hi Regina!
On 20.10.2024 23:20, Regina Henschel wrote:
it would be necessary to write ORG.OFFICE.EASTERSUNDAY when writing
in ODF versions 1.3 and before and write pure EASTERSUNDAY in case
of ODF 1.4. But I see no way to distinguish between ODF 1.3 and ODF
1.4 in the export filter. I see only a general mxSymbols->isODFF()
in ScCompiler::ParseOpCode().
It seems to me, that the export of formula is done in
ScXMLExport::WriteCell (sc/source/filter/xml/xmlexprt.cxx); and
there, you have access to getSaneDefaultVersion().
Hope this helps.
You can indeed get the version to be saved to in xmlexprt.cxx. But
where to evaluate it?
Evaluating it directly in sc/source/filter/xml/xmlexprt.cxx would
mean, that you have to tweak the result of
#3218 OUString aFormula =
pFormulaCell->GetFormula(*mpCompileFormulaCxt);
so that each occurrence of EASTERSUNDAY is replaced by
ORG.OPENOFFICE.EASTERSUNDAY.
Besides the fact that EASTERSUNDAY as text and not as formula name
would be replaced too, I think it is not a good idea to check each
formula in a spreadsheet to catch the EASTERSUNDAY cases.
Such approach seems completely wrong to me also because we will get
the same problem again with the new functions XLOOKUP, FILTER, UNIQUE,
etc. when the change from ODF 1.4 to ODF 1.5 is made.
I would prefer a solution, that corrects the string, when the string
is created from the opcode ocEasterSunday.
When you look where the string is generated, you get the steps:
ScFormulaCell::GetFormula() in sc/source/core/data/formulacell.cxx
FormulaCompiler::CreateStringFromTokenArray() in
formula/source/core/api/FormulaCompiler.cxx
FormulaCompiler::CreateStringFromToken()
mxSymbols->getSymbol(eOp), which uses the map in
formula/inc/core_resource.hrc.
You could pass on the ODF version and the fact that you are exporting
to ODF to the method GetFormula(). That could be done as new parameter
or by adding members to CompileFormulaContext.
I believe that this (the version of the ODF, or extending the
FormulaGrammar enum) would be the correct approach.
But the method CreateStringFromTokenArray() is not only called from
export, but in other, totally unrelated situations, e.g. when the
window with the sheet gets focus.
It needs that new argument (the ODF version), too.
Do we need a totally new method CreateStringFromTokenArrayForODFExport()?
I'm still looking for your ideas.
Kind regards,
Regina