19#include <com/sun/star/beans/XPropertySet.hpp>
20#include <com/sun/star/table/XCellRange.hpp>
21#include <com/sun/star/beans/XIntrospectionAccess.hpp>
22#include <com/sun/star/sheet/XFunctionAccess.hpp>
23#include <com/sun/star/sheet/XCellRangeAddressable.hpp>
24#include <ooo/vba/excel/XRange.hpp>
27#include <compiler.hxx>
34void lclConvertDoubleToBoolean(
uno::Any& rAny )
36 if( rAny.has<
double >() )
38 double fValue = rAny.get<
double >();
41 else if( fValue == 1.0 )
47void lclConvertBooleanToDouble(
uno::Any& rAny )
50 if ( rAny >>= bValue )
66uno::Reference< beans::XIntrospectionAccess >
69 return uno::Reference<beans::XIntrospectionAccess>();
73ScVbaWSFunction::invoke(
const OUString& FunctionName,
const uno::Sequence< uno::Any >& Params, uno::Sequence< sal_Int16 >& , uno::Sequence< uno::Any >& )
76 uno::Sequence< uno::Any > aParamTemp( Params );
77 if( aParamTemp.hasElements() )
79 for(
uno::Any & rArray : asNonConstRange(aParamTemp) )
81 switch( rArray.getValueType().getTypeClass() )
83 case uno::TypeClass_BOOLEAN:
84 lclConvertBooleanToDouble( rArray );
86 case uno::TypeClass_INTERFACE:
88 uno::Reference< excel::XRange > myRange( rArray, uno::UNO_QUERY );
90 rArray = myRange->getCellRange();
93 case uno::TypeClass_SEQUENCE:
97 if ( aType.equals(
cppu::UnoType<uno::Sequence<sal_Int16>>::get() ) )
99 uno::Sequence< uno::Sequence< sal_Int16 > > aTmp(1);
100 rArray >>= aTmp.getArray()[ 0 ];
103 else if ( aType.equals(
cppu::UnoType<uno::Sequence<sal_Int32>>::get() ) )
105 uno::Sequence< uno::Sequence< sal_Int32 > > aTmp(1);
106 rArray >>= aTmp.getArray()[ 0 ];
109 else if ( aType.equals(
cppu::UnoType<uno::Sequence<double>>::get() ) )
111 uno::Sequence< uno::Sequence< double > > aTmp(1);
112 rArray >>= aTmp.getArray()[ 0 ];
115 else if ( aType.equals(
cppu::UnoType<uno::Sequence<OUString>>::get() ) )
117 uno::Sequence< uno::Sequence< OUString > > aTmp(1);
118 rArray >>= aTmp.getArray()[ 0 ];
121 else if ( aType.equals(
cppu::UnoType<uno::Sequence<uno::Any>>::get() ) )
123 uno::Sequence< uno::Sequence<uno::Any > > aTmp(1);
124 rArray >>= aTmp.getArray()[ 0 ];
136 bool bAsArray =
true;
146 if( aParamTemp.getLength() != 1 )
147 throw lang::IllegalArgumentException();
148 const uno::Any& rParam = aParamTemp[ 0 ];
149 if( rParam.has<
bool >() )
153 else if( rParam.has< uno::Reference< table::XCellRange > >() )
try
155 uno::Reference< sheet::XCellRangeAddressable > xRangeAddr( rParam, uno::UNO_QUERY_THROW );
156 table::CellRangeAddress aRangeAddr = xRangeAddr->getRangeAddress();
157 bAsArray = (aRangeAddr.StartColumn != aRangeAddr.EndColumn) || (aRangeAddr.StartRow != aRangeAddr.EndRow);
159 catch( uno::Exception& )
169 uno::Reference< lang::XMultiComponentFactory >
xSMgr(
mxContext->getServiceManager(), uno::UNO_SET_THROW );
170 uno::Reference< sheet::XFunctionAccess > xFunctionAccess(
xSMgr->createInstanceWithContext(
171 "com.sun.star.sheet.FunctionAccess",
mxContext ),
172 uno::UNO_QUERY_THROW );
173 uno::Reference< beans::XPropertySet > xPropSet( xFunctionAccess, uno::UNO_QUERY_THROW );
174 xPropSet->setPropertyValue(
"IsArrayFunction",
uno::Any( bAsArray ) );
175 aRet = xFunctionAccess->callFunction( FunctionName, aParamTemp );
180 typedef uno::Sequence< uno::Sequence< uno::Any > > AnySeqSeq;
186 if( aRet.has< AnySeqSeq >() )
188 AnySeqSeq aAnySeqSeq = aRet.get< AnySeqSeq >();
189 for(
auto& rAnySeq : asNonConstRange(aAnySeqSeq) )
190 for(
auto& rAny : asNonConstRange(rAnySeq) )
191 lclConvertDoubleToBoolean( rAny );
196 lclConvertDoubleToBoolean( aRet );
202 if( aRet.has< AnySeqSeq >() )
204 AnySeqSeq aAnySeqSeq = aRet.get< AnySeqSeq >();
205 if( aAnySeqSeq.getLength() == 1 )
208 aRet = aAnySeqSeq[ 0 ][ 0 ];
210 aRet <<= aAnySeqSeq[ 0 ];
217 OUString aUpper( FunctionName.toAsciiUpperCase() );
225 uno::Sequence< uno::Sequence< uno::Any > > aSequence;
226 if( !( ( aRet >>= aSequence ) && ( aSequence.getLength() > 0 ) &&
227 ( aSequence[0].getLength() > 0 ) && ( aSequence[0][0] >>= fVal ) ) )
228 throw uno::RuntimeException();
239 throw beans::UnknownPropertyException();
245 throw beans::UnknownPropertyException();
251 bool bIsFound =
false;
260 catch( uno::Exception& )
276 OUString
sName = aApproximateName.toAsciiUpperCase();
285 return "ScVbaWSFunction";
288uno::Sequence< OUString >
293 "ooo.vba.excel.WorksheetFunction"
css::uno::Reference< css::uno::XComponentContext > mxContext
static bool IsEnglishSymbol(const OUString &rName)
virtual OUString SAL_CALL getExactName(const OUString &aApproximateName) override
virtual void SAL_CALL setValue(const OUString &PropertyName, const css::uno::Any &Value) override
virtual sal_Bool SAL_CALL hasProperty(const OUString &Name) override
virtual css::uno::Reference< css::beans::XIntrospectionAccess > SAL_CALL getIntrospection() override
virtual OUString getServiceImplName() override
virtual css::uno::Sequence< OUString > getServiceNames() override
ScVbaWSFunction(const css::uno::Reference< ov::XHelperInterface > &xParent, const css::uno::Reference< css::uno::XComponentContext > &xContext)
virtual css::uno::Any SAL_CALL getValue(const OUString &PropertyName) override
virtual sal_Bool SAL_CALL hasMethod(const OUString &Name) override
virtual css::uno::Any SAL_CALL invoke(const OUString &FunctionName, const css::uno::Sequence< css::uno::Any > &Params, css::uno::Sequence< sal_Int16 > &OutParamIndex, css::uno::Sequence< css::uno::Any > &OutParam) override
Reference< XMultiServiceFactory > xSMgr
Sequence< OUString > aServiceNames
double getLength(const B2DPolygon &rCandidate)