Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


Hi Winfried,

I'm also mixing in some quotes from your previous mail of this topic

On Sunday, 2017-02-26 14:10:57 +0100, Winfried Donkers wrote:
On Wednesday, 2017-04-12 16:37:54 +0200, Winfried Donkers wrote:

I'm sort of stuck with tdf106013.

There is a group of Add-In functions that were newly defined in Excel 2013
(IMCOSH, IMCOT, IMCSC, IMCSCH, IMSEC, IMSECH, IMSINH and IMTAN, I'll call
them IMxx).

In Calc these functions are defined in scaddins and also mentioned in
sc/source/filter/oox/formulabase.cxx in saFuncTable2013[].


The problem is that the IMxx functions saved as xlsx by Calc won't open
correctly by Excel and vice versa.

Calc writes the IMxx functions in xlsx as =IMxx(...), just as on ods.

Excel writes the IMxx functions in xlsx as =_xlfn.IMxx(...), and in ods as
=IMxx(...).

The other Add-In functions are written by both Calc and Excel as
=FUNCTIONNAME(...).

This is due to that the functions defined in the Add-In were defined by
Excel long ago and are part of OOXML, and those Add-In functions are
treated accordingly during export. Unfortunately the exceptional IM*
cases don't seem to fit into the XclFunctionInfo tables of
sc/source/filter/excel/xlformula.cxx, only the case of writing an
internal function as Add-In is handled there (those with
EXC_FUNCFLAG_ADDINEQUIV set). But the lookup is done by OpCode in those
tables, so that doesn't work for ocExternal.

When I define the IMxx functions as regular functions, there are written as
=_xlfn.IMxx(...) in xlsx, but when written to xls, they give problems when
opening in Excel.

Where and how did you define them as regular functions? Were they also
written as _xlfn.IMxx to .xls? Or without _xlfn.? As macro calls? Or...?

Any suggestions for a solution?

I could imagine to define some extra range of OpCode for XclFunctionInfo
starting at 0xFF00 or any other unused high value and for
ocExternal/svExternal do an extra lookup depending on the value of the
XclExpScToken's aTokData.mpScToken->GetExternal() programmatical name,
that for example is "com.sun.star.sheet.addin.Analysis.getImcsch", using
a simple std:map like
opcodevalue["com.sun.star.sheet.addin.Analysis.getImcsch"] = 0xFF00;

The corresponding XclFunctionInfo entry then could be

    { 0xFF00,               255,    2,  2, V, { RO_E, RO }, EXC_FUNCFLAG_EXPORTONLY, EXC_FUNCNAME( 
"IMCSCH" ) },

Note that these 255-export-only definitions due to the BIFF .xls macro
call storage use minparam+1 and maxparam+1, so for IMCSCH that expects
one parameter the definition is 2,2

In XclExpFmlaCompImpl::ProcessFunction() there's

    maFuncProv.GetFuncInfoFromOpCode( eOpCode )

which for (eOpCode == ocExternal && rTokData.GetType() == svExternal)
would needed to be called with the new eOpCode according to the mapping.

I hope that helps.


I just noticed that tdf100450 regarding the Add-in function ACCRINT has a similar problem.
It currently reflects pre-Excel2013 behaviour, but does not comply with ODFF1.2 or with the 
current Excel.

Probably keep the 7 parameters ACCRINT as Add-In function but name it
ACCRINT_EXCEL or such, and for 8 parameters introduce a new ACCRINT
function that is stored as _xlfn.ACCRINT (or whatever Excel does? OOXML
only defines 7 parameters).

  Eike

-- 
LibreOffice Calc developer. Number formatter stricken i18n transpositionizer.
GPG key "ID" 0x65632D3A - 2265 D7F3 A7B0 95CC 3918  630B 6A6C D5B7 6563 2D3A
Better use 64-bit 0x6A6CD5B765632D3A here is why: https://evil32.com/
Care about Free Software, support the FSFE https://fsfe.org/support/?erack

Attachment: signature.asc
Description: PGP signature


Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.