xref: /trunk/main/xmloff/source/style/numehelp.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*63bba73cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*63bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*63bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*63bba73cSAndrew Rist  * distributed with this work for additional information
6*63bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*63bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*63bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
9*63bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*63bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*63bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*63bba73cSAndrew Rist  * software distributed under the License is distributed on an
15*63bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*63bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*63bba73cSAndrew Rist  * specific language governing permissions and limitations
18*63bba73cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*63bba73cSAndrew Rist  *************************************************************/
21*63bba73cSAndrew Rist 
22*63bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "xmloff/numehelp.hxx"
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <xmloff/nmspmap.hxx>
30cdf0e10cSrcweir #include "xmloff/xmlnmspe.hxx"
31cdf0e10cSrcweir #include <xmloff/xmluconv.hxx>
32cdf0e10cSrcweir #include <xmloff/xmltoken.hxx>
33cdf0e10cSrcweir #include <xmloff/xmlexp.hxx>
34cdf0e10cSrcweir #include <com/sun/star/uno/Reference.h>
35cdf0e10cSrcweir #include <rtl/ustring.hxx>
36cdf0e10cSrcweir #include <svl/zforlist.hxx>
37cdf0e10cSrcweir #include <com/sun/star/util/NumberFormat.hpp>
38cdf0e10cSrcweir #include <rtl/math.hxx>
39cdf0e10cSrcweir #include <tools/debug.hxx>
40cdf0e10cSrcweir #include <rtl/ustrbuf.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir using namespace com::sun::star;
43cdf0e10cSrcweir using namespace xmloff::token;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #define XML_TYPE "Type"
46cdf0e10cSrcweir #define XML_CURRENCYSYMBOL "CurrencySymbol"
47cdf0e10cSrcweir #define XML_CURRENCYABBREVIATION "CurrencyAbbreviation"
48cdf0e10cSrcweir #define XML_STANDARDFORMAT "StandardFormat"
49cdf0e10cSrcweir 
XMLNumberFormatAttributesExportHelper(::com::sun::star::uno::Reference<::com::sun::star::util::XNumberFormatsSupplier> & xTempNumberFormatsSupplier)50cdf0e10cSrcweir XMLNumberFormatAttributesExportHelper::XMLNumberFormatAttributesExportHelper(
51cdf0e10cSrcweir             ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >& xTempNumberFormatsSupplier)
52cdf0e10cSrcweir     : xNumberFormats(xTempNumberFormatsSupplier.is() ? xTempNumberFormatsSupplier->getNumberFormats() : ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormats > ()),
53cdf0e10cSrcweir     pExport(NULL),
54cdf0e10cSrcweir     sStandardFormat(RTL_CONSTASCII_USTRINGPARAM(XML_STANDARDFORMAT)),
55cdf0e10cSrcweir     sType(RTL_CONSTASCII_USTRINGPARAM(XML_TYPE)),
56cdf0e10cSrcweir     msCurrencySymbol(RTL_CONSTASCII_USTRINGPARAM(XML_CURRENCYSYMBOL)),
57cdf0e10cSrcweir     msCurrencyAbbreviation(RTL_CONSTASCII_USTRINGPARAM(XML_CURRENCYABBREVIATION)),
58cdf0e10cSrcweir     aNumberFormats()
59cdf0e10cSrcweir {
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
XMLNumberFormatAttributesExportHelper(::com::sun::star::uno::Reference<::com::sun::star::util::XNumberFormatsSupplier> & xTempNumberFormatsSupplier,SvXMLExport & rTempExport)62cdf0e10cSrcweir XMLNumberFormatAttributesExportHelper::XMLNumberFormatAttributesExportHelper(
63cdf0e10cSrcweir             ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >& xTempNumberFormatsSupplier,
64cdf0e10cSrcweir             SvXMLExport& rTempExport )
65cdf0e10cSrcweir :   xNumberFormats(xTempNumberFormatsSupplier.is() ? xTempNumberFormatsSupplier->getNumberFormats() : ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormats > ()),
66cdf0e10cSrcweir     pExport(&rTempExport),
67cdf0e10cSrcweir     sStandardFormat(RTL_CONSTASCII_USTRINGPARAM(XML_STANDARDFORMAT)),
68cdf0e10cSrcweir     sType(RTL_CONSTASCII_USTRINGPARAM(XML_TYPE)),
69cdf0e10cSrcweir     sAttrValueType(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_VALUE_TYPE))),
70cdf0e10cSrcweir     sAttrValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_VALUE))),
71cdf0e10cSrcweir     sAttrDateValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_DATE_VALUE))),
72cdf0e10cSrcweir     sAttrTimeValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_TIME_VALUE))),
73cdf0e10cSrcweir     sAttrBooleanValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_BOOLEAN_VALUE))),
74cdf0e10cSrcweir     sAttrStringValue(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_STRING_VALUE))),
75cdf0e10cSrcweir     sAttrCurrency(rTempExport.GetNamespaceMap().GetQNameByKey( XML_NAMESPACE_OFFICE, GetXMLToken(XML_CURRENCY))),
76cdf0e10cSrcweir     msCurrencySymbol(RTL_CONSTASCII_USTRINGPARAM(XML_CURRENCYSYMBOL)),
77cdf0e10cSrcweir     msCurrencyAbbreviation(RTL_CONSTASCII_USTRINGPARAM(XML_CURRENCYABBREVIATION)),
78cdf0e10cSrcweir     aNumberFormats()
79cdf0e10cSrcweir {
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
~XMLNumberFormatAttributesExportHelper()82cdf0e10cSrcweir XMLNumberFormatAttributesExportHelper::~XMLNumberFormatAttributesExportHelper()
83cdf0e10cSrcweir {
84cdf0e10cSrcweir }
85cdf0e10cSrcweir 
GetCellType(const sal_Int32 nNumberFormat,rtl::OUString & sCurrency,sal_Bool & bIsStandard)86cdf0e10cSrcweir sal_Int16 XMLNumberFormatAttributesExportHelper::GetCellType(const sal_Int32 nNumberFormat, rtl::OUString& sCurrency, sal_Bool& bIsStandard)
87cdf0e10cSrcweir {
88cdf0e10cSrcweir     XMLNumberFormat aFormat(sEmpty, nNumberFormat, 0);
89cdf0e10cSrcweir     XMLNumberFormatSet::iterator aItr(aNumberFormats.find(aFormat));
90cdf0e10cSrcweir     XMLNumberFormatSet::iterator aEndItr(aNumberFormats.end());
91cdf0e10cSrcweir     if (aItr != aEndItr)
92cdf0e10cSrcweir     {
93cdf0e10cSrcweir         bIsStandard = aItr->bIsStandard;
94cdf0e10cSrcweir         sCurrency = aItr->sCurrency;
95cdf0e10cSrcweir         return aItr->nType;
96cdf0e10cSrcweir     }
97cdf0e10cSrcweir     else
98cdf0e10cSrcweir     {
99cdf0e10cSrcweir         aFormat.nType = GetCellType(nNumberFormat, bIsStandard);
100cdf0e10cSrcweir         aFormat.bIsStandard = bIsStandard;
101cdf0e10cSrcweir         if ((aFormat.nType & ~util::NumberFormat::DEFINED) == util::NumberFormat::CURRENCY)
102cdf0e10cSrcweir             if (GetCurrencySymbol(nNumberFormat, aFormat.sCurrency))
103cdf0e10cSrcweir                 sCurrency = aFormat.sCurrency;
104cdf0e10cSrcweir         aNumberFormats.insert(aFormat);
105cdf0e10cSrcweir         return aFormat.nType;
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
WriteAttributes(SvXMLExport & rXMLExport,const sal_Int16 nTypeKey,const double & rValue,const rtl::OUString & rCurrency,sal_Bool bExportValue)109cdf0e10cSrcweir void XMLNumberFormatAttributesExportHelper::WriteAttributes(SvXMLExport& rXMLExport,
110cdf0e10cSrcweir                                 const sal_Int16 nTypeKey,
111cdf0e10cSrcweir                                 const double& rValue,
112cdf0e10cSrcweir                                 const rtl::OUString& rCurrency,
113cdf0e10cSrcweir                                 sal_Bool bExportValue)
114cdf0e10cSrcweir {
115cdf0e10cSrcweir     sal_Bool bWasSetTypeAttribute = sal_False;
116cdf0e10cSrcweir     switch(nTypeKey & ~util::NumberFormat::DEFINED)
117cdf0e10cSrcweir     {
118cdf0e10cSrcweir     case 0:
119cdf0e10cSrcweir     case util::NumberFormat::NUMBER:
120cdf0e10cSrcweir     case util::NumberFormat::SCIENTIFIC:
121cdf0e10cSrcweir     case util::NumberFormat::FRACTION:
122cdf0e10cSrcweir         {
123cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
124cdf0e10cSrcweir             {
125cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_FLOAT);
126cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
127cdf0e10cSrcweir             }
128cdf0e10cSrcweir         }       // No Break
129cdf0e10cSrcweir     case util::NumberFormat::PERCENT:
130cdf0e10cSrcweir         {
131cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
132cdf0e10cSrcweir             {
133cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_PERCENTAGE);
134cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
135cdf0e10cSrcweir             }
136cdf0e10cSrcweir         }       // No Break
137cdf0e10cSrcweir     case util::NumberFormat::CURRENCY:
138cdf0e10cSrcweir         {
139cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
140cdf0e10cSrcweir             {
141cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_CURRENCY);
142cdf0e10cSrcweir                 if (rCurrency.getLength() > 0)
143cdf0e10cSrcweir                     rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_CURRENCY, rCurrency);
144cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
145cdf0e10cSrcweir             }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir             if (bExportValue)
148cdf0e10cSrcweir             {
149cdf0e10cSrcweir                 rtl::OUString sValue( ::rtl::math::doubleToUString( rValue,
150cdf0e10cSrcweir                             rtl_math_StringFormat_Automatic,
151cdf0e10cSrcweir                             rtl_math_DecimalPlaces_Max, '.', sal_True));
152cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE, sValue);
153cdf0e10cSrcweir             }
154cdf0e10cSrcweir         }
155cdf0e10cSrcweir         break;
156cdf0e10cSrcweir     case util::NumberFormat::DATE:
157cdf0e10cSrcweir     case util::NumberFormat::DATETIME:
158cdf0e10cSrcweir         {
159cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
160cdf0e10cSrcweir             {
161cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_DATE);
162cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
163cdf0e10cSrcweir             }
164cdf0e10cSrcweir             if (bExportValue)
165cdf0e10cSrcweir             {
166cdf0e10cSrcweir                 if ( rXMLExport.SetNullDateOnUnitConverter() )
167cdf0e10cSrcweir                 {
168cdf0e10cSrcweir                     rtl::OUStringBuffer sBuffer;
169cdf0e10cSrcweir                     rXMLExport.GetMM100UnitConverter().convertDateTime(sBuffer, rValue);
170cdf0e10cSrcweir                     rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_DATE_VALUE, sBuffer.makeStringAndClear());
171cdf0e10cSrcweir                 }
172cdf0e10cSrcweir             }
173cdf0e10cSrcweir         }
174cdf0e10cSrcweir         break;
175cdf0e10cSrcweir     case util::NumberFormat::TIME:
176cdf0e10cSrcweir         {
177cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
178cdf0e10cSrcweir             {
179cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_TIME);
180cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
181cdf0e10cSrcweir             }
182cdf0e10cSrcweir             if (bExportValue)
183cdf0e10cSrcweir             {
184cdf0e10cSrcweir                 rtl::OUStringBuffer sBuffer;
185cdf0e10cSrcweir                 rXMLExport.GetMM100UnitConverter().convertTime(sBuffer, rValue);
186cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_TIME_VALUE, sBuffer.makeStringAndClear());
187cdf0e10cSrcweir             }
188cdf0e10cSrcweir         }
189cdf0e10cSrcweir         break;
190cdf0e10cSrcweir     case util::NumberFormat::LOGICAL:
191cdf0e10cSrcweir         {
192cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
193cdf0e10cSrcweir             {
194cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_BOOLEAN);
195cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
196cdf0e10cSrcweir             }
197cdf0e10cSrcweir             if (bExportValue)
198cdf0e10cSrcweir             {
199cdf0e10cSrcweir                 double fTempValue = rValue;
200cdf0e10cSrcweir                 if (::rtl::math::approxEqual( fTempValue, 1.0 ))
201cdf0e10cSrcweir                 {
202cdf0e10cSrcweir                     rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_BOOLEAN_VALUE, XML_TRUE);
203cdf0e10cSrcweir                 }
204cdf0e10cSrcweir                 else
205cdf0e10cSrcweir                 {
206cdf0e10cSrcweir                     if (::rtl::math::approxEqual( rValue, 0.0 ))
207cdf0e10cSrcweir                     {
208cdf0e10cSrcweir                         rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_BOOLEAN_VALUE, XML_FALSE);
209cdf0e10cSrcweir                     }
210cdf0e10cSrcweir                     else
211cdf0e10cSrcweir                     {
212cdf0e10cSrcweir                         rtl::OUString sValue( ::rtl::math::doubleToUString(
213cdf0e10cSrcweir                                     fTempValue,
214cdf0e10cSrcweir                                     rtl_math_StringFormat_Automatic,
215cdf0e10cSrcweir                                     rtl_math_DecimalPlaces_Max, '.',
216cdf0e10cSrcweir                                     sal_True));
217cdf0e10cSrcweir                         rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_BOOLEAN_VALUE, sValue);
218cdf0e10cSrcweir                     }
219cdf0e10cSrcweir                 }
220cdf0e10cSrcweir             }
221cdf0e10cSrcweir         }
222cdf0e10cSrcweir         break;
223cdf0e10cSrcweir     case util::NumberFormat::TEXT:
224cdf0e10cSrcweir         {
225cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
226cdf0e10cSrcweir             {
227cdf0e10cSrcweir                 rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_FLOAT);
228cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
229cdf0e10cSrcweir                 if (bExportValue)
230cdf0e10cSrcweir                 {
231cdf0e10cSrcweir                     rtl::OUString sValue( ::rtl::math::doubleToUString( rValue,
232cdf0e10cSrcweir                                 rtl_math_StringFormat_Automatic,
233cdf0e10cSrcweir                                 rtl_math_DecimalPlaces_Max, '.', sal_True));
234cdf0e10cSrcweir                     rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE, sValue);
235cdf0e10cSrcweir                 }
236cdf0e10cSrcweir             }
237cdf0e10cSrcweir         }
238cdf0e10cSrcweir         break;
239cdf0e10cSrcweir     }
240cdf0e10cSrcweir }
241cdf0e10cSrcweir 
GetCurrencySymbol(const sal_Int32 nNumberFormat,rtl::OUString & sCurrencySymbol,uno::Reference<util::XNumberFormatsSupplier> & xNumberFormatsSupplier)242cdf0e10cSrcweir sal_Bool XMLNumberFormatAttributesExportHelper::GetCurrencySymbol(const sal_Int32 nNumberFormat, rtl::OUString& sCurrencySymbol,
243cdf0e10cSrcweir     uno::Reference <util::XNumberFormatsSupplier>& xNumberFormatsSupplier)
244cdf0e10cSrcweir {
245cdf0e10cSrcweir     if (xNumberFormatsSupplier.is())
246cdf0e10cSrcweir     {
247cdf0e10cSrcweir         uno::Reference <util::XNumberFormats> xNumberFormats(xNumberFormatsSupplier->getNumberFormats());
248cdf0e10cSrcweir         if (xNumberFormats.is())
249cdf0e10cSrcweir         {
250cdf0e10cSrcweir             try
251cdf0e10cSrcweir             {
252cdf0e10cSrcweir                 uno::Reference <beans::XPropertySet> xNumberPropertySet(xNumberFormats->getByKey(nNumberFormat));
253cdf0e10cSrcweir                 if ( xNumberPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_CURRENCYSYMBOL))) >>= sCurrencySymbol)
254cdf0e10cSrcweir                 {
255cdf0e10cSrcweir                     rtl::OUString sCurrencyAbbreviation;
256cdf0e10cSrcweir                     if ( xNumberPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_CURRENCYABBREVIATION))) >>= sCurrencyAbbreviation)
257cdf0e10cSrcweir                     {
258cdf0e10cSrcweir                         if ( sCurrencyAbbreviation.getLength() != 0 )
259cdf0e10cSrcweir                             sCurrencySymbol = sCurrencyAbbreviation;
260cdf0e10cSrcweir                         else
261cdf0e10cSrcweir                         {
262cdf0e10cSrcweir                             if ( sCurrencySymbol.getLength() == 1 && sCurrencySymbol.toChar() == NfCurrencyEntry::GetEuroSymbol() )
263cdf0e10cSrcweir                                 sCurrencySymbol = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EUR"));
264cdf0e10cSrcweir                         }
265cdf0e10cSrcweir                     }
266cdf0e10cSrcweir                     return sal_True;
267cdf0e10cSrcweir                 }
268cdf0e10cSrcweir             }
269cdf0e10cSrcweir             catch ( uno::Exception& )
270cdf0e10cSrcweir             {
271cdf0e10cSrcweir                 DBG_ERROR("Numberformat not found");
272cdf0e10cSrcweir             }
273cdf0e10cSrcweir         }
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir     return sal_False;
276cdf0e10cSrcweir }
277cdf0e10cSrcweir 
278cdf0e10cSrcweir 
GetCellType(const sal_Int32 nNumberFormat,sal_Bool & bIsStandard,uno::Reference<util::XNumberFormatsSupplier> & xNumberFormatsSupplier)279cdf0e10cSrcweir sal_Int16 XMLNumberFormatAttributesExportHelper::GetCellType(const sal_Int32 nNumberFormat, sal_Bool& bIsStandard,
280cdf0e10cSrcweir     uno::Reference <util::XNumberFormatsSupplier>& xNumberFormatsSupplier)
281cdf0e10cSrcweir {
282cdf0e10cSrcweir     if (xNumberFormatsSupplier.is())
283cdf0e10cSrcweir     {
284cdf0e10cSrcweir         uno::Reference <util::XNumberFormats> xNumberFormats(xNumberFormatsSupplier->getNumberFormats());
285cdf0e10cSrcweir         if (xNumberFormats.is())
286cdf0e10cSrcweir         {
287cdf0e10cSrcweir             try
288cdf0e10cSrcweir             {
289cdf0e10cSrcweir                 uno::Reference <beans::XPropertySet> xNumberPropertySet(xNumberFormats->getByKey(nNumberFormat));
290cdf0e10cSrcweir                 xNumberPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_STANDARDFORMAT))) >>= bIsStandard;
291cdf0e10cSrcweir                 sal_Int16 nNumberType = sal_Int16();
292cdf0e10cSrcweir                 if ( xNumberPropertySet->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(XML_TYPE))) >>= nNumberType )
293cdf0e10cSrcweir                 {
294cdf0e10cSrcweir                     return nNumberType;
295cdf0e10cSrcweir                 }
296cdf0e10cSrcweir             }
297cdf0e10cSrcweir             catch ( uno::Exception& )
298cdf0e10cSrcweir             {
299cdf0e10cSrcweir                 DBG_ERROR("Numberformat not found");
300cdf0e10cSrcweir             }
301cdf0e10cSrcweir         }
302cdf0e10cSrcweir     }
303cdf0e10cSrcweir     return 0;
304cdf0e10cSrcweir }
305cdf0e10cSrcweir 
SetNumberFormatAttributes(SvXMLExport & rXMLExport,const sal_Int32 nNumberFormat,const double & rValue,sal_Bool bExportValue)306cdf0e10cSrcweir void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes(SvXMLExport& rXMLExport,
307cdf0e10cSrcweir     const sal_Int32 nNumberFormat, const double& rValue, sal_Bool bExportValue)
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     sal_Bool bIsStandard;
310cdf0e10cSrcweir     sal_Int16 nTypeKey = GetCellType(nNumberFormat, bIsStandard, rXMLExport.GetNumberFormatsSupplier());
311cdf0e10cSrcweir     rtl::OUString sCurrency;
312cdf0e10cSrcweir     if ((nTypeKey & ~util::NumberFormat::DEFINED) == util::NumberFormat::CURRENCY)
313cdf0e10cSrcweir         GetCurrencySymbol(nNumberFormat, sCurrency, rXMLExport.GetNumberFormatsSupplier());
314cdf0e10cSrcweir     WriteAttributes(rXMLExport, nTypeKey, rValue, sCurrency, bExportValue);
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
SetNumberFormatAttributes(SvXMLExport & rXMLExport,const rtl::OUString & rValue,const rtl::OUString & rCharacters,sal_Bool bExportValue,sal_Bool bExportTypeAttribute)317cdf0e10cSrcweir void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes(SvXMLExport& rXMLExport,
318cdf0e10cSrcweir     const rtl::OUString& rValue, const rtl::OUString& rCharacters,
319cdf0e10cSrcweir     sal_Bool bExportValue, sal_Bool bExportTypeAttribute)
320cdf0e10cSrcweir {
321cdf0e10cSrcweir     if (bExportTypeAttribute)
322cdf0e10cSrcweir         rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_VALUE_TYPE, XML_STRING);
323cdf0e10cSrcweir     if (bExportValue && rValue.getLength() && (rValue != rCharacters))
324cdf0e10cSrcweir         rXMLExport.AddAttribute(XML_NAMESPACE_OFFICE, XML_STRING_VALUE, rValue);
325cdf0e10cSrcweir }
326cdf0e10cSrcweir 
GetCurrencySymbol(const sal_Int32 nNumberFormat,rtl::OUString & rCurrencySymbol)327cdf0e10cSrcweir sal_Bool XMLNumberFormatAttributesExportHelper::GetCurrencySymbol(const sal_Int32 nNumberFormat, rtl::OUString& rCurrencySymbol)
328cdf0e10cSrcweir {
329cdf0e10cSrcweir     if (!xNumberFormats.is() && pExport && pExport->GetNumberFormatsSupplier().is())
330cdf0e10cSrcweir         xNumberFormats.set(pExport->GetNumberFormatsSupplier()->getNumberFormats());
331cdf0e10cSrcweir 
332cdf0e10cSrcweir     if (xNumberFormats.is())
333cdf0e10cSrcweir     {
334cdf0e10cSrcweir         try
335cdf0e10cSrcweir         {
336cdf0e10cSrcweir             uno::Reference <beans::XPropertySet> xNumberPropertySet(xNumberFormats->getByKey(nNumberFormat));
337cdf0e10cSrcweir             if ( xNumberPropertySet->getPropertyValue(msCurrencySymbol) >>= rCurrencySymbol)
338cdf0e10cSrcweir             {
339cdf0e10cSrcweir                 rtl::OUString sCurrencyAbbreviation;
340cdf0e10cSrcweir                 if ( xNumberPropertySet->getPropertyValue(msCurrencyAbbreviation) >>= sCurrencyAbbreviation)
341cdf0e10cSrcweir                 {
342cdf0e10cSrcweir                     if ( sCurrencyAbbreviation.getLength() != 0 )
343cdf0e10cSrcweir                         rCurrencySymbol = sCurrencyAbbreviation;
344cdf0e10cSrcweir                     else
345cdf0e10cSrcweir                     {
346cdf0e10cSrcweir                         if ( rCurrencySymbol.getLength() == 1 && rCurrencySymbol.toChar() == NfCurrencyEntry::GetEuroSymbol() )
347cdf0e10cSrcweir                             rCurrencySymbol = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EUR"));
348cdf0e10cSrcweir                     }
349cdf0e10cSrcweir                 }
350cdf0e10cSrcweir                 return sal_True;
351cdf0e10cSrcweir             }
352cdf0e10cSrcweir         }
353cdf0e10cSrcweir         catch ( uno::Exception& )
354cdf0e10cSrcweir         {
355cdf0e10cSrcweir             DBG_ERROR("Numberformat not found");
356cdf0e10cSrcweir         }
357cdf0e10cSrcweir     }
358cdf0e10cSrcweir     return sal_False;
359cdf0e10cSrcweir }
360cdf0e10cSrcweir 
GetCellType(const sal_Int32 nNumberFormat,sal_Bool & bIsStandard)361cdf0e10cSrcweir sal_Int16 XMLNumberFormatAttributesExportHelper::GetCellType(const sal_Int32 nNumberFormat, sal_Bool& bIsStandard)
362cdf0e10cSrcweir {
363cdf0e10cSrcweir     if (!xNumberFormats.is() && pExport && pExport->GetNumberFormatsSupplier().is())
364cdf0e10cSrcweir         xNumberFormats.set(pExport->GetNumberFormatsSupplier()->getNumberFormats());
365cdf0e10cSrcweir 
366cdf0e10cSrcweir     if (xNumberFormats.is())
367cdf0e10cSrcweir     {
368cdf0e10cSrcweir         try
369cdf0e10cSrcweir         {
370cdf0e10cSrcweir             uno::Reference <beans::XPropertySet> xNumberPropertySet(xNumberFormats->getByKey(nNumberFormat));
371cdf0e10cSrcweir             if (xNumberPropertySet.is())
372cdf0e10cSrcweir             {
373cdf0e10cSrcweir                 xNumberPropertySet->getPropertyValue(sStandardFormat) >>= bIsStandard;
374cdf0e10cSrcweir                 sal_Int16 nNumberType = sal_Int16();
375cdf0e10cSrcweir                 if ( xNumberPropertySet->getPropertyValue(sType) >>= nNumberType )
376cdf0e10cSrcweir                 {
377cdf0e10cSrcweir                     return nNumberType;
378cdf0e10cSrcweir                 }
379cdf0e10cSrcweir             }
380cdf0e10cSrcweir         }
381cdf0e10cSrcweir         catch ( uno::Exception& )
382cdf0e10cSrcweir         {
383cdf0e10cSrcweir             DBG_ERROR("Numberformat not found");
384cdf0e10cSrcweir         }
385cdf0e10cSrcweir     }
386cdf0e10cSrcweir     return 0;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir 
WriteAttributes(const sal_Int16 nTypeKey,const double & rValue,const rtl::OUString & rCurrency,sal_Bool bExportValue)389cdf0e10cSrcweir void XMLNumberFormatAttributesExportHelper::WriteAttributes(
390cdf0e10cSrcweir                                 const sal_Int16 nTypeKey,
391cdf0e10cSrcweir                                 const double& rValue,
392cdf0e10cSrcweir                                 const rtl::OUString& rCurrency,
393cdf0e10cSrcweir                                 sal_Bool bExportValue)
394cdf0e10cSrcweir {
395cdf0e10cSrcweir     if (!pExport)
396cdf0e10cSrcweir         return;
397cdf0e10cSrcweir 
398cdf0e10cSrcweir     sal_Bool bWasSetTypeAttribute = sal_False;
399cdf0e10cSrcweir     switch(nTypeKey & ~util::NumberFormat::DEFINED)
400cdf0e10cSrcweir     {
401cdf0e10cSrcweir     case 0:
402cdf0e10cSrcweir     case util::NumberFormat::NUMBER:
403cdf0e10cSrcweir     case util::NumberFormat::SCIENTIFIC:
404cdf0e10cSrcweir     case util::NumberFormat::FRACTION:
405cdf0e10cSrcweir         {
406cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
407cdf0e10cSrcweir             {
408cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_FLOAT);
409cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
410cdf0e10cSrcweir             }
411cdf0e10cSrcweir         }       // No Break
412cdf0e10cSrcweir     case util::NumberFormat::PERCENT:
413cdf0e10cSrcweir         {
414cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
415cdf0e10cSrcweir             {
416cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_PERCENTAGE);
417cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
418cdf0e10cSrcweir             }
419cdf0e10cSrcweir         }       // No Break
420cdf0e10cSrcweir     case util::NumberFormat::CURRENCY:
421cdf0e10cSrcweir         {
422cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
423cdf0e10cSrcweir             {
424cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_CURRENCY);
425cdf0e10cSrcweir                 if (rCurrency.getLength() > 0)
426cdf0e10cSrcweir                     pExport->AddAttribute(sAttrCurrency, rCurrency);
427cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
428cdf0e10cSrcweir             }
429cdf0e10cSrcweir 
430cdf0e10cSrcweir             if (bExportValue)
431cdf0e10cSrcweir             {
432cdf0e10cSrcweir                 rtl::OUString sValue( ::rtl::math::doubleToUString( rValue,
433cdf0e10cSrcweir                             rtl_math_StringFormat_Automatic,
434cdf0e10cSrcweir                             rtl_math_DecimalPlaces_Max, '.', sal_True));
435cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValue, sValue);
436cdf0e10cSrcweir             }
437cdf0e10cSrcweir         }
438cdf0e10cSrcweir         break;
439cdf0e10cSrcweir     case util::NumberFormat::DATE:
440cdf0e10cSrcweir     case util::NumberFormat::DATETIME:
441cdf0e10cSrcweir         {
442cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
443cdf0e10cSrcweir             {
444cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_DATE);
445cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
446cdf0e10cSrcweir             }
447cdf0e10cSrcweir             if (bExportValue)
448cdf0e10cSrcweir             {
449cdf0e10cSrcweir                 if ( pExport->SetNullDateOnUnitConverter() )
450cdf0e10cSrcweir                 {
451cdf0e10cSrcweir                     rtl::OUStringBuffer sBuffer;
452cdf0e10cSrcweir                     pExport->GetMM100UnitConverter().convertDateTime(sBuffer, rValue);
453cdf0e10cSrcweir                     pExport->AddAttribute(sAttrDateValue, sBuffer.makeStringAndClear());
454cdf0e10cSrcweir                 }
455cdf0e10cSrcweir             }
456cdf0e10cSrcweir         }
457cdf0e10cSrcweir         break;
458cdf0e10cSrcweir     case util::NumberFormat::TIME:
459cdf0e10cSrcweir         {
460cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
461cdf0e10cSrcweir             {
462cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_TIME);
463cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
464cdf0e10cSrcweir             }
465cdf0e10cSrcweir             if (bExportValue)
466cdf0e10cSrcweir             {
467cdf0e10cSrcweir                 rtl::OUStringBuffer sBuffer;
468cdf0e10cSrcweir                 pExport->GetMM100UnitConverter().convertTime(sBuffer, rValue);
469cdf0e10cSrcweir                 pExport->AddAttribute(sAttrTimeValue, sBuffer.makeStringAndClear());
470cdf0e10cSrcweir             }
471cdf0e10cSrcweir         }
472cdf0e10cSrcweir         break;
473cdf0e10cSrcweir     case util::NumberFormat::LOGICAL:
474cdf0e10cSrcweir         {
475cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
476cdf0e10cSrcweir             {
477cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_BOOLEAN);
478cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
479cdf0e10cSrcweir             }
480cdf0e10cSrcweir             if (bExportValue)
481cdf0e10cSrcweir             {
482cdf0e10cSrcweir                 double fTempValue = rValue;
483cdf0e10cSrcweir                 if (::rtl::math::approxEqual( fTempValue, 1.0 ))
484cdf0e10cSrcweir                 {
485cdf0e10cSrcweir                     pExport->AddAttribute(sAttrBooleanValue, XML_TRUE);
486cdf0e10cSrcweir                 }
487cdf0e10cSrcweir                 else
488cdf0e10cSrcweir                 {
489cdf0e10cSrcweir                     if (::rtl::math::approxEqual( rValue, 0.0 ))
490cdf0e10cSrcweir                     {
491cdf0e10cSrcweir                         pExport->AddAttribute(sAttrBooleanValue, XML_FALSE);
492cdf0e10cSrcweir                     }
493cdf0e10cSrcweir                     else
494cdf0e10cSrcweir                     {
495cdf0e10cSrcweir                         rtl::OUString sValue( ::rtl::math::doubleToUString(
496cdf0e10cSrcweir                                     fTempValue,
497cdf0e10cSrcweir                                     rtl_math_StringFormat_Automatic,
498cdf0e10cSrcweir                                     rtl_math_DecimalPlaces_Max, '.',
499cdf0e10cSrcweir                                     sal_True));
500cdf0e10cSrcweir                         pExport->AddAttribute(sAttrBooleanValue, sValue);
501cdf0e10cSrcweir                     }
502cdf0e10cSrcweir                 }
503cdf0e10cSrcweir             }
504cdf0e10cSrcweir         }
505cdf0e10cSrcweir         break;
506cdf0e10cSrcweir     case util::NumberFormat::TEXT:
507cdf0e10cSrcweir         {
508cdf0e10cSrcweir             if (!bWasSetTypeAttribute)
509cdf0e10cSrcweir             {
510cdf0e10cSrcweir                 pExport->AddAttribute(sAttrValueType, XML_FLOAT);
511cdf0e10cSrcweir                 bWasSetTypeAttribute = sal_True;
512cdf0e10cSrcweir                 if (bExportValue)
513cdf0e10cSrcweir                 {
514cdf0e10cSrcweir                     rtl::OUString sValue( ::rtl::math::doubleToUString( rValue,
515cdf0e10cSrcweir                                 rtl_math_StringFormat_Automatic,
516cdf0e10cSrcweir                                 rtl_math_DecimalPlaces_Max, '.', sal_True));
517cdf0e10cSrcweir                     pExport->AddAttribute(sAttrValue, sValue);
518cdf0e10cSrcweir                 }
519cdf0e10cSrcweir             }
520cdf0e10cSrcweir         }
521cdf0e10cSrcweir         break;
522cdf0e10cSrcweir     }
523cdf0e10cSrcweir }
524cdf0e10cSrcweir 
SetNumberFormatAttributes(const sal_Int32 nNumberFormat,const double & rValue,sal_Bool bExportValue)525cdf0e10cSrcweir void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes(
526cdf0e10cSrcweir     const sal_Int32 nNumberFormat, const double& rValue, sal_Bool bExportValue)
527cdf0e10cSrcweir {
528cdf0e10cSrcweir     if (pExport)
529cdf0e10cSrcweir     {
530cdf0e10cSrcweir         sal_Bool bIsStandard;
531cdf0e10cSrcweir         rtl::OUString sCurrency;
532cdf0e10cSrcweir         sal_Int16 nTypeKey = GetCellType(nNumberFormat, sCurrency, bIsStandard);
533cdf0e10cSrcweir         WriteAttributes(nTypeKey, rValue, sCurrency, bExportValue);
534cdf0e10cSrcweir     }
535cdf0e10cSrcweir     else {
536cdf0e10cSrcweir         DBG_ERROR("no SvXMLExport given");
537cdf0e10cSrcweir     }
538cdf0e10cSrcweir }
539cdf0e10cSrcweir 
SetNumberFormatAttributes(const rtl::OUString & rValue,const rtl::OUString & rCharacters,sal_Bool bExportValue,sal_Bool bExportTypeAttribute)540cdf0e10cSrcweir void XMLNumberFormatAttributesExportHelper::SetNumberFormatAttributes(
541cdf0e10cSrcweir     const rtl::OUString& rValue, const rtl::OUString& rCharacters,
542cdf0e10cSrcweir     sal_Bool bExportValue, sal_Bool bExportTypeAttribute)
543cdf0e10cSrcweir {
544cdf0e10cSrcweir     if (pExport)
545cdf0e10cSrcweir     {
546cdf0e10cSrcweir         if (bExportTypeAttribute)
547cdf0e10cSrcweir             pExport->AddAttribute(sAttrValueType, XML_STRING);
548cdf0e10cSrcweir         if (bExportValue && rValue.getLength() && (rValue != rCharacters))
549cdf0e10cSrcweir             pExport->AddAttribute(sAttrStringValue, rValue);
550cdf0e10cSrcweir     }
551cdf0e10cSrcweir     else {
552cdf0e10cSrcweir         DBG_ERROR("no SvXMLExport given");
553cdf0e10cSrcweir     }
554cdf0e10cSrcweir }
555