1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: ConversionHelper.cxx,v $
13 * This file is part of OpenOffice.org.
15 * OpenOffice.org is free software: you can redistribute it and/or modify
16 * it under the terms of the GNU Lesser General Public License version 3
17 * only, as published by the Free Software Foundation.
19 * OpenOffice.org is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU Lesser General Public License version 3 for more details
23 * (a copy is included in the LICENSE file that accompanied this code).
25 * You should have received a copy of the GNU Lesser General Public License
26 * version 3 along with OpenOffice.org. If not, see
27 * <http://www.openoffice.org/license.html>
28 * for a copy of the LGPLv3 License.
30 ************************************************************************/
31 #include <ConversionHelper.hxx>
32 #include <com/sun/star/table/BorderLine.hpp>
33 #include <com/sun/star/lang/Locale.hpp>
34 #include <com/sun/star/text/HoriOrientation.hpp>
35 #include <com/sun/star/style/NumberingType.hpp>
36 #include <ooxml/resourceids.hxx>
37 #include <tools/color.hxx>
38 #include <rtl/ustrbuf.hxx>
42 using namespace com::sun::star
;
44 namespace writerfilter
{
46 namespace ConversionHelper
{
48 #define TWIP_TO_MM100(TWIP) ((TWIP) >= 0 ? (((TWIP)*127L+36L)/72L) : (((TWIP)*127L-36L)/72L))
50 //line definitions in 1/100 mm
51 #define LINE_WIDTH_0 2
52 #define LINE_WIDTH_1 36
53 #define LINE_WIDTH_2 89
54 #define LINE_WIDTH_3 142
55 #define LINE_WIDTH_4 177
56 #define LINE_WIDTH_5 18
58 #define DOUBLE_LINE0_OUT LINE_WIDTH_0
59 #define DOUBLE_LINE0_IN LINE_WIDTH_0
60 #define DOUBLE_LINE0_DIST LINE_WIDTH_1
62 #define DOUBLE_LINE1_OUT LINE_WIDTH_1
63 #define DOUBLE_LINE1_IN LINE_WIDTH_1
64 #define DOUBLE_LINE1_DIST LINE_WIDTH_1
66 #define DOUBLE_LINE2_OUT LINE_WIDTH_2
67 #define DOUBLE_LINE2_IN LINE_WIDTH_2
68 #define DOUBLE_LINE2_DIST LINE_WIDTH_2
70 #define DOUBLE_LINE3_OUT LINE_WIDTH_2
71 #define DOUBLE_LINE3_IN LINE_WIDTH_1
72 #define DOUBLE_LINE3_DIST LINE_WIDTH_2
74 #define DOUBLE_LINE4_OUT LINE_WIDTH_1
75 #define DOUBLE_LINE4_IN LINE_WIDTH_2
76 #define DOUBLE_LINE4_DIST LINE_WIDTH_1
78 #define DOUBLE_LINE5_OUT LINE_WIDTH_3
79 #define DOUBLE_LINE5_IN LINE_WIDTH_2
80 #define DOUBLE_LINE5_DIST LINE_WIDTH_2
82 #define DOUBLE_LINE6_OUT LINE_WIDTH_2
83 #define DOUBLE_LINE6_IN LINE_WIDTH_3
84 #define DOUBLE_LINE6_DIST LINE_WIDTH_2
86 #define DOUBLE_LINE7_OUT LINE_WIDTH_0
87 #define DOUBLE_LINE7_IN LINE_WIDTH_0
88 #define DOUBLE_LINE7_DIST LINE_WIDTH_2
90 #define DOUBLE_LINE8_OUT LINE_WIDTH_1
91 #define DOUBLE_LINE8_IN LINE_WIDTH_0
92 #define DOUBLE_LINE8_DIST LINE_WIDTH_2
94 #define DOUBLE_LINE9_OUT LINE_WIDTH_2
95 #define DOUBLE_LINE9_IN LINE_WIDTH_0
96 #define DOUBLE_LINE9_DIST LINE_WIDTH_2
98 #define DOUBLE_LINE10_OUT LINE_WIDTH_3
99 #define DOUBLE_LINE10_IN LINE_WIDTH_0
100 #define DOUBLE_LINE10_DIST LINE_WIDTH_2
102 sal_Int32
MakeBorderLine( sal_Int32 nSprmValue
, table::BorderLine
& rToFill
)
104 //TODO: Lines are always solid
106 //borders are defined as:
109 // || || || ---- Line width in 1/8 pt
111 // || || ------- Line type: 0 - none 1 - single ... 25 - engrave 3D and 64 - 230 page borders
113 // || ---------- Line color
115 // ------------- seven bits line space
116 // -------------- first bit: with shading
117 sal_Int16 nLineThicknessTwip
= (sal_Int16
)((nSprmValue
& 0xff) * 20)/8L ;
118 sal_Int32 nLineType
= ((nSprmValue
& 0xff00) >> 8);
119 sal_Int32 nLineColor
= (nSprmValue
& 0xff0000)>>16;
120 sal_Int32 nLineDistance
= (((nSprmValue
& 0x3f000000)>>24) * 2540 + 36)/72L;
121 sal_Int32 nLineThickness
= TWIP_TO_MM100(nLineThicknessTwip
);
122 MakeBorderLine( nLineThickness
, nLineType
, nLineColor
, rToFill
, false);
123 return nLineDistance
;
125 void MakeBorderLine( sal_Int32 nLineThickness
, sal_Int32 nLineType
,
126 sal_Int32 nLineColor
,
127 table::BorderLine
& rToFill
, bool bIsOOXML
)
129 static const sal_Int32 aBorderDefColor
[] =
131 COL_AUTO
, COL_BLACK
, COL_LIGHTBLUE
, COL_LIGHTCYAN
, COL_LIGHTGREEN
,
132 COL_LIGHTMAGENTA
, COL_LIGHTRED
, COL_YELLOW
, COL_WHITE
, COL_BLUE
,
133 COL_CYAN
, COL_GREEN
, COL_MAGENTA
, COL_RED
, COL_BROWN
, COL_GRAY
,
136 //no auto color for borders
139 if(!bIsOOXML
&& sal::static_int_cast
<sal_uInt32
>(nLineColor
) <
140 sizeof(aBorderDefColor
) / sizeof(nLineColor
))
141 nLineColor
= aBorderDefColor
[nLineColor
];
145 single0
, single1
, single2
, single3
, single4
, single5
,
146 double0
, double1
, double2
, double3
, double4
, double5
, double6
,
147 double7
, double8
, double9
, double10
,
151 // Map to our border types, we should use of one equal line
152 // thickness, or one of smaller thickness. If too small we
153 // can make the defecit up in additional white space or
157 // First the single lines
161 // and the unsupported special cases which we map to a single line
167 // or if in necessary by a double line
170 if( nLineThickness
< 10)
171 eCodeIdx
= single0
;// 1 Twip for us
172 else if( nLineThickness
< 20)
173 eCodeIdx
= single5
;// 10 Twips for us
174 else if (nLineThickness
< 50)
175 eCodeIdx
= single1
;// 20 Twips
176 else if (nLineThickness
< 80)
177 eCodeIdx
= single2
;// 50
178 else if (nLineThickness
< 100)
179 eCodeIdx
= single3
;// 80
180 else if (nLineThickness
< 150)
181 eCodeIdx
= single4
;// 100
182 // Hack: for the quite thick lines we must paint double lines,
183 // because our singles lines don't come thicker than 5 points.
184 else if (nLineThickness
< 180)
185 eCodeIdx
= double2
;// 150
187 eCodeIdx
= double5
;// 180
189 // then the shading beams which we represent by a double line
193 // then the double lines, for which we have good matches
195 case 10: //Don't have tripple so use double
196 if (nLineThickness
< 60)
197 eCodeIdx
= double0
;// 22 Twips for us
198 else if (nLineThickness
< 135)
199 eCodeIdx
= double7
;// some more space
200 else if (nLineThickness
< 180)
201 eCodeIdx
= double1
;// 60
203 eCodeIdx
= double2
;// 150
206 eCodeIdx
= double4
;// 90 Twips for us
209 case 13: //Don't have thin thick thin, so use thick thin
210 if (nLineThickness
< 87)
211 eCodeIdx
= double8
;// 71 Twips for us
212 else if (nLineThickness
< 117)
213 eCodeIdx
= double9
;// 101
214 else if (nLineThickness
< 166)
215 eCodeIdx
= double10
;// 131
217 eCodeIdx
= double5
;// 180
220 if (nLineThickness
< 46)
221 eCodeIdx
= double0
;// 22 Twips for us
222 else if (nLineThickness
< 76)
223 eCodeIdx
= double1
;// 60
224 else if (nLineThickness
< 121)
225 eCodeIdx
= double4
;// 90
226 else if (nLineThickness
< 166)
227 eCodeIdx
= double2
;// 150
229 eCodeIdx
= double6
;// 180
232 case 16: //Don't have thin thick thin, so use thick thin
233 if (nLineThickness
< 46)
234 eCodeIdx
= double0
;// 22 Twips for us
235 else if (nLineThickness
< 76)
236 eCodeIdx
= double1
;// 60
237 else if (nLineThickness
< 121)
238 eCodeIdx
= double3
;// 90
239 else if (nLineThickness
< 166)
240 eCodeIdx
= double2
;// 150
242 eCodeIdx
= double5
;// 180
245 if (nLineThickness
< 46)
246 eCodeIdx
= double0
;// 22 Twips for us
247 else if (nLineThickness
< 72)
248 eCodeIdx
= double7
;// 52
249 else if (nLineThickness
< 137)
250 eCodeIdx
= double4
;// 90
252 eCodeIdx
= double6
;// 180
255 case 19: //Don't have thin thick thin, so use thick thin
256 if (nLineThickness
< 46)
257 eCodeIdx
= double0
;// 22 Twips for us
258 else if (nLineThickness
< 62)
259 eCodeIdx
= double7
;// 52
260 else if (nLineThickness
< 87)
261 eCodeIdx
= double8
;// 71
262 else if (nLineThickness
< 117)
263 eCodeIdx
= double9
;// 101
264 else if (nLineThickness
< 156)
265 eCodeIdx
= double10
;// 131
267 eCodeIdx
= double5
;// 180
270 if (nLineThickness
< 46)
271 eCodeIdx
= single1
; // 20 Twips for us
273 eCodeIdx
= double1
;// 60
276 eCodeIdx
= double1
;// 60 Twips for us
282 struct BorderDefinition
290 static const BorderDefinition aLineTab
[] =
292 /* 0*/ { LINE_WIDTH_0
, 0, 0 },
293 /* 1*/ { LINE_WIDTH_1
, 0, 0 },
294 /* 2*/ { LINE_WIDTH_2
, 0, 0 },
295 /* 3*/ { LINE_WIDTH_3
, 0, 0 },
296 /* 4*/ { LINE_WIDTH_4
, 0, 0 },
297 /* 5*/ { LINE_WIDTH_5
, 0, 0 },
298 /* 6*/ { DOUBLE_LINE0_OUT
, DOUBLE_LINE0_IN
, DOUBLE_LINE0_DIST
},
299 /* 7*/ { DOUBLE_LINE1_OUT
, DOUBLE_LINE1_IN
, DOUBLE_LINE1_DIST
},
300 /* 8*/ { DOUBLE_LINE2_OUT
, DOUBLE_LINE2_IN
, DOUBLE_LINE2_DIST
},
301 /* 9*/ { DOUBLE_LINE3_OUT
, DOUBLE_LINE3_IN
, DOUBLE_LINE3_DIST
},
302 /*10*/ { DOUBLE_LINE4_OUT
, DOUBLE_LINE4_IN
, DOUBLE_LINE4_DIST
},
303 /*11*/ { DOUBLE_LINE5_OUT
, DOUBLE_LINE5_IN
, DOUBLE_LINE5_DIST
},
304 /*12*/ { DOUBLE_LINE6_OUT
, DOUBLE_LINE6_IN
, DOUBLE_LINE6_DIST
},
305 /*13*/ { DOUBLE_LINE7_OUT
, DOUBLE_LINE7_IN
, DOUBLE_LINE7_DIST
},
306 /*14*/ { DOUBLE_LINE8_OUT
, DOUBLE_LINE8_IN
, DOUBLE_LINE8_DIST
},
307 /*15*/ { DOUBLE_LINE9_OUT
, DOUBLE_LINE9_IN
, DOUBLE_LINE9_DIST
},
308 /*16*/ { DOUBLE_LINE10_OUT
,DOUBLE_LINE10_IN
,DOUBLE_LINE10_DIST
}
311 rToFill
.Color
= nLineColor
;
314 rToFill
.InnerLineWidth
= 0;
315 rToFill
.OuterLineWidth
= sal_Int16(nLineThickness
);
316 rToFill
.LineDistance
= 0;
321 rToFill
.InnerLineWidth
= aLineTab
[eCodeIdx
].nIn
;
322 rToFill
.OuterLineWidth
= aLineTab
[eCodeIdx
].nOut
;
323 rToFill
.LineDistance
= aLineTab
[eCodeIdx
].nDist
;
327 void lcl_SwapQuotesInField(::rtl::OUString
&rFmt
)
329 //Swap unescaped " and ' with ' and "
330 sal_Int32 nLen
= rFmt
.getLength();
331 ::rtl::OUStringBuffer
aBuffer( rFmt
.getStr() );
332 const sal_Unicode
* pFmt
= rFmt
.getStr();
333 for (sal_Int32 nI
= 0; nI
< nLen
; ++nI
)
335 if ((pFmt
[nI
] == '\"') && (!nI
|| pFmt
[nI
-1] != '\\'))
336 aBuffer
.setCharAt(nI
, '\'');
337 else if ((pFmt
[nI
] == '\'') && (!nI
|| pFmt
[nI
-1] != '\\'))
338 aBuffer
.setCharAt(nI
, '\"');
340 rFmt
= aBuffer
.makeStringAndClear();
342 bool lcl_IsNotAM(::rtl::OUString
& rFmt
, sal_Int32 nPos
)
345 (nPos
== rFmt
.getLength() - 1) ||
347 (rFmt
.getStr()[nPos
+1] != 'M') &&
348 (rFmt
.getStr()[nPos
+1] != 'm')
353 ::rtl::OUString
ConvertMSFormatStringToSO(
354 const ::rtl::OUString
& rFormat
, lang::Locale
& rLocale
, bool bHijri
)
356 ::rtl::OUString
sFormat(rFormat
);
357 lcl_SwapQuotesInField(sFormat
);
359 //#102782#, #102815#, #108341# & #111944# have to work at the same time :-)
360 bool bForceJapanese(false);
361 bool bForceNatNum(false);
362 sal_Int32 nLen
= sFormat
.getLength();
364 // const sal_Unicode* pFormat = sFormat.getStr();
365 ::rtl::OUStringBuffer
aNewFormat( sFormat
.getStr() );
368 if (aNewFormat
.charAt(nI
) == '\\')
370 else if (aNewFormat
.charAt(nI
) == '\"')
373 //While not at the end and not at an unescaped end quote
374 while ((nI
< nLen
) && (!(aNewFormat
.charAt(nI
) == '\"') && (aNewFormat
.charAt(nI
-1) != '\\')))
377 else //normal unquoted section
379 sal_Unicode nChar
= aNewFormat
.charAt(nI
);
382 aNewFormat
.setCharAt(nI
, 'M');
385 else if (nChar
== 'o')
387 aNewFormat
.setCharAt(nI
, 'm');
390 else if ((nChar
== 'A') && lcl_IsNotAM(sFormat
, nI
))
392 aNewFormat
.setCharAt(nI
, 'D');
395 else if ((nChar
== 'g') || (nChar
== 'G'))
396 bForceJapanese
= true;
397 else if ((nChar
== 'a') && lcl_IsNotAM(sFormat
, nI
))
398 bForceJapanese
= true;
399 else if (nChar
== 'E')
401 if ((nI
!= nLen
-1) && (aNewFormat
.charAt(nI
+1) == 'E'))
403 //todo: this cannot be the right way to replace a part of the string!
404 aNewFormat
.setCharAt( nI
, 'Y' );
405 aNewFormat
.setCharAt( nI
+ 1, 'Y' );
406 aNewFormat
.insert(nI
+ 2, ::rtl::OUString::createFromAscii("YY"));
410 bForceJapanese
= true;
412 else if (nChar
== 'e')
414 if ((nI
!= nLen
-1) && (aNewFormat
.charAt(nI
+1) == 'e'))
416 //todo: this cannot be the right way to replace a part of the string!
417 aNewFormat
.setCharAt( nI
, 'y' );
418 aNewFormat
.setCharAt( nI
+ 1, 'y' );
419 aNewFormat
.insert(nI
+ 2, ::rtl::OUString::createFromAscii("yy"));
423 bForceJapanese
= true;
425 else if (nChar
== '/')
427 // MM We have to escape '/' in case it's used as a char
428 //todo: this cannot be the right way to replace a part of the string!
429 aNewFormat
.setCharAt( nI
, '\\' );
430 aNewFormat
.insert(nI
+ 1, ::rtl::OUString::createFromAscii("/"));
439 bForceJapanese
= true;
443 rLocale
.Language
= ::rtl::OUString::createFromAscii("ja");
444 rLocale
.Country
= ::rtl::OUString::createFromAscii("JP");
449 aNewFormat
.insert( 0, ::rtl::OUString::createFromAscii("[NatNum1][$-411]"));
454 aNewFormat
.insert( 0, ::rtl::OUString::createFromAscii("[~hijri]"));
456 return aNewFormat
.makeStringAndClear();
459 /*-------------------------------------------------------------------------
461 -----------------------------------------------------------------------*/
462 sal_Int32
convertTwipToMM100(sal_Int32 _t
)
464 return TWIP_TO_MM100( _t
);
466 /*-- 09.08.2007 09:34:44---------------------------------------------------
468 -----------------------------------------------------------------------*/
469 sal_Int32
convertEMUToMM100(sal_Int32 _t
)
474 /*-- 21.11.2006 08:47:12---------------------------------------------------
475 contains a color from 0xTTRRGGBB to 0xTTRRGGBB
476 -----------------------------------------------------------------------*/
477 sal_Int32
ConvertColor(sal_Int32 nWordColor
)
480 r(static_cast<sal_uInt8
>(nWordColor
&0xFF)),
481 g(static_cast<sal_uInt8
>(((nWordColor
)>>8)&0xFF)),
482 b(static_cast<sal_uInt8
>((nWordColor
>>16)&0xFF)),
483 t(static_cast<sal_uInt8
>((nWordColor
>>24)&0xFF));
484 sal_Int32 nRet
= (t
<<24) + (r
<<16) + (g
<<8) + b
;
487 /*-- 27.06.2007 13:42:32---------------------------------------------------
489 -----------------------------------------------------------------------*/
490 sal_Int16
convertTableJustification( sal_Int32 nIntValue
)
492 sal_Int16 nOrient
= text::HoriOrientation::LEFT_AND_WIDTH
;
495 case 1 : nOrient
= text::HoriOrientation::CENTER
; break;
496 case 2 : nOrient
= text::HoriOrientation::RIGHT
; break;
504 /*-- 06.08.2007 15:27:30---------------------------------------------------
505 conversion form xsd::DateTime
506 [-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]
507 -----------------------------------------------------------------------*/
508 com::sun::star::util::DateTime
convertDateTime( const ::rtl::OUString
& rDateTimeString
)
510 util::DateTime
aRet( 0, 0, 0, 0, 1, 1, 1901 );
512 sal_Int32 nIndex
= 0;
513 ::rtl::OUString
sDate( rDateTimeString
.getToken( 0, 'T', nIndex
));
514 sal_Int32 nDateIndex
= 0;
515 aRet
.Year
= (sal_uInt16
)sDate
.getToken( 0, '-', nDateIndex
).toInt32();
517 aRet
.Month
= (sal_uInt16
)sDate
.getToken( 0, '-', nDateIndex
).toInt32();
519 aRet
.Day
= (sal_uInt16
)sDate
.getToken( 0, '-', nDateIndex
).toInt32();
520 ::rtl::OUString sTime
;
523 sTime
= ( rDateTimeString
.getToken( 0, 'Z', nIndex
));
524 sal_Int32 nTimeIndex
= 0;
525 aRet
.Hours
= (sal_uInt16
)sTime
.getToken( 0, ':', nTimeIndex
).toInt32();
527 aRet
.Minutes
= (sal_uInt16
)sTime
.getToken( 0, ':', nTimeIndex
).toInt32();
530 ::rtl::OUString sSeconds
= sTime
.getToken( 0, ':', nTimeIndex
);
532 aRet
.Seconds
= (sal_uInt16
)sSeconds
.getToken( 0, '.', nTimeIndex
).toInt32();
533 aRet
.HundredthSeconds
= (sal_uInt16
)sSeconds
.getToken( 0, '.', nTimeIndex
).toInt32();
536 // todo: ignore time offset for a while - there's no time zone available
538 // ::rtl::OUString sOffset( rDateTimeString.getToken( 1, 'Z', nIndex ));
539 // if( sOffset.getLength() )
541 // add hour and minute offset and increase/decrease date if necessary
546 /*-- 05.03.2008 09:10:13---------------------------------------------------
548 -----------------------------------------------------------------------*/
549 sal_Int16
ConvertNumberingType(sal_Int32 nNFC
)
554 case NS_ooxml::LN_Value_ST_NumberFormat_decimal
:
555 case 0: nRet
= style::NumberingType::ARABIC
; break;
556 case NS_ooxml::LN_Value_ST_NumberFormat_upperRoman
:
557 case 1: nRet
= style::NumberingType::ROMAN_UPPER
; break;
558 case NS_ooxml::LN_Value_ST_NumberFormat_lowerRoman
:
559 case 2: nRet
= style::NumberingType::ROMAN_LOWER
; break;
560 case 3: nRet
= style::NumberingType::CHARS_UPPER_LETTER_N
; break;
561 case 4: nRet
= style::NumberingType::CHARS_LOWER_LETTER_N
; break;
562 case 5: nRet
= style::NumberingType::ARABIC
; break;//ORDINAL
563 case NS_ooxml::LN_Value_ST_NumberFormat_bullet
:
566 nRet
= style::NumberingType::CHAR_SPECIAL
;
568 case 255: nRet
= style::NumberingType::NUMBER_NONE
; break;
569 case NS_ooxml::LN_Value_ST_NumberFormat_upperLetter
:
570 nRet
= style::NumberingType::CHARS_UPPER_LETTER
;
572 case NS_ooxml::LN_Value_ST_NumberFormat_lowerLetter
:
573 nRet
= style::NumberingType::CHARS_LOWER_LETTER
;
575 default: nRet
= style::NumberingType::ARABIC
;
577 /* TODO: Lots of additional values are available - some are supported in the I18 framework
578 NS_ooxml::LN_Value_ST_NumberFormat_ordinal = 91682;
579 NS_ooxml::LN_Value_ST_NumberFormat_cardinalText = 91683;
580 NS_ooxml::LN_Value_ST_NumberFormat_ordinalText = 91684;
581 NS_ooxml::LN_Value_ST_NumberFormat_hex = 91685;
582 NS_ooxml::LN_Value_ST_NumberFormat_chicago = 91686;
583 NS_ooxml::LN_Value_ST_NumberFormat_ideographDigital = 91687;
584 NS_ooxml::LN_Value_ST_NumberFormat_japaneseCounting = 91688;
585 NS_ooxml::LN_Value_ST_NumberFormat_aiueo = 91689;
586 NS_ooxml::LN_Value_ST_NumberFormat_iroha = 91690;
587 NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth = 91691;
588 NS_ooxml::LN_Value_ST_NumberFormat_decimalHalfWidth = 91692;
589 NS_ooxml::LN_Value_ST_NumberFormat_japaneseLegal = 91693;
590 NS_ooxml::LN_Value_ST_NumberFormat_japaneseDigitalTenThousand = 91694;
591 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircle = 91695;
592 NS_ooxml::LN_Value_ST_NumberFormat_decimalFullWidth2 = 91696;
593 NS_ooxml::LN_Value_ST_NumberFormat_aiueoFullWidth = 91697;
594 NS_ooxml::LN_Value_ST_NumberFormat_irohaFullWidth = 91698;
595 NS_ooxml::LN_Value_ST_NumberFormat_decimalZero = 91699;
596 NS_ooxml::LN_Value_ST_NumberFormat_ganada = 91701;
597 NS_ooxml::LN_Value_ST_NumberFormat_chosung = 91702;
598 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedFullstop = 91703;
599 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedParen = 91704;
600 NS_ooxml::LN_Value_ST_NumberFormat_decimalEnclosedCircleChinese = 91705;
601 NS_ooxml::LN_Value_ST_NumberFormat_ideographEnclosedCircle = 91706;
602 NS_ooxml::LN_Value_ST_NumberFormat_ideographTraditional = 91707;
603 NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiac = 91708;
604 NS_ooxml::LN_Value_ST_NumberFormat_ideographZodiacTraditional = 91709;
605 NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCounting = 91710;
606 NS_ooxml::LN_Value_ST_NumberFormat_ideographLegalTraditional = 91711;
607 NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseCountingThousand = 91712;
608 NS_ooxml::LN_Value_ST_NumberFormat_taiwaneseDigital = 91713;
609 NS_ooxml::LN_Value_ST_NumberFormat_chineseCounting = 91714;
610 NS_ooxml::LN_Value_ST_NumberFormat_chineseLegalSimplified = 91715;
611 NS_ooxml::LN_Value_ST_NumberFormat_chineseCountingThousand = 91716;
612 NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital = 91717;
613 NS_ooxml::LN_Value_ST_NumberFormat_koreanCounting = 91718;
614 NS_ooxml::LN_Value_ST_NumberFormat_koreanLegal = 91719;
615 NS_ooxml::LN_Value_ST_NumberFormat_koreanDigital2 = 91720;
616 NS_ooxml::LN_Value_ST_NumberFormat_vietnameseCounting = 91721;
617 NS_ooxml::LN_Value_ST_NumberFormat_russianLower = 91722;
618 NS_ooxml::LN_Value_ST_NumberFormat_russianUpper = 91723;
619 NS_ooxml::LN_Value_ST_NumberFormat_none = 91724;
620 NS_ooxml::LN_Value_ST_NumberFormat_numberInDash = 91725;
621 NS_ooxml::LN_Value_ST_NumberFormat_hebrew1 = 91726;
622 NS_ooxml::LN_Value_ST_NumberFormat_hebrew2 = 91727;
623 NS_ooxml::LN_Value_ST_NumberFormat_arabicAlpha = 91728;
624 NS_ooxml::LN_Value_ST_NumberFormat_arabicAbjad = 91729;
625 NS_ooxml::LN_Value_ST_NumberFormat_hindiVowels = 91730;
626 NS_ooxml::LN_Value_ST_NumberFormat_hindiConsonants = 91731;
627 NS_ooxml::LN_Value_ST_NumberFormat_hindiNumbers = 91732;
628 NS_ooxml::LN_Value_ST_NumberFormat_hindiCounting = 91733;
629 NS_ooxml::LN_Value_ST_NumberFormat_thaiLetters = 91734;
630 NS_ooxml::LN_Value_ST_NumberFormat_thaiNumbers = 91735;
631 NS_ooxml::LN_Value_ST_NumberFormat_thaiCounting = 91736;*/
636 } // namespace ConversionHelper
637 } //namespace dmapper
638 } //namespace writerfilter