You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
koffice/filters/kspread/excel/import/excelimport.cc

2133 lines
79 KiB

/* This file is part of the KDE project
Copyright (C) 2003-2006 Ariya Hidayat <ariya@kde.org>
Copyright (C) 2006 Marijn Kruisselbrink <m.kruisselbrink@student.tue.nl>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include <config.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <excelimport.h>
#include <excelimport.moc>
#include <tqbuffer.h>
#include <tqcstring.h>
#include <tqdatetime.h>
#include <tqfile.h>
#include <tqmap.h>
#include <tqstring.h>
#include <tqtextstream.h>
#include <kdebug.h>
#include <KoFilterChain.h>
#include <KoGlobal.h>
#include <KoUnit.h>
#include <kgenericfactory.h>
#include <KoXmlWriter.h>
#include <KoOasisStore.h>
#include "swinder.h"
#include <iostream>
typedef KGenericFactory<ExcelImport, KoFilter> ExcelImportFactory;
K_EXPORT_COMPONENT_FACTORY( libexcelimport, ExcelImportFactory( "kofficefilters" ) )
// UString -> TQConstString conversion. Use .string() to get the TQString.
// Always store the TQConstString into a variable first, to avoid a deep copy.
inline TQConstString string( const Swinder::UString& str ) {
// Let's hope there's no copying of the TQConstString happening...
return TQConstString( reinterpret_cast<const TQChar*>( str.data() ), str.length() );
}
using namespace Swinder;
class ExcelImport::Private
{
public:
TQString inputFile;
TQString outputFile;
Workbook *workbook;
bool createStyles( KoOasisStore* store );
bool createContent( KoOasisStore* store );
bool createManifest( KoOasisStore* store );
int sheetFormatIndex;
int columnFormatIndex;
int rowFormatIndex;
TQMap<int,bool> styleFormats;
TQMap<int,bool> isPercentageStyle;
TQMap<int,bool> isDateStyle;
TQMap<int,bool> isTimeStyle;
void processWorkbookForBody( Workbook* workbook, KoXmlWriter* xmlWriter );
void processWorkbookForStyle( Workbook* workbook, KoXmlWriter* xmlWriter );
void processSheetForBody( Sheet* sheet, KoXmlWriter* xmlWriter );
void processSheetForStyle( Sheet* sheet, KoXmlWriter* xmlWriter );
void processColumnForBody( Column* column, int repeat, KoXmlWriter* xmlWriter );
void processColumnForStyle( Column* column, int repeat, KoXmlWriter* xmlWriter );
void processRowForBody( Row* row, int repeat, KoXmlWriter* xmlWriter );
void processRowForStyle( Row* row, int repeat, KoXmlWriter* xmlWriter );
void processCellForBody( Cell* cell, KoXmlWriter* xmlWriter );
void processCellForStyle( Cell* cell, KoXmlWriter* xmlWriter );
void processFormat( const Format* format, KoXmlWriter* xmlWriter );
void processValueFormat( TQString valueFormat, TQString refName, KoXmlWriter* xmlWriter );
};
ExcelImport::ExcelImport ( TQObject*, const char*, const TQStringList& )
: KoFilter()
{
d = new Private;
}
ExcelImport::~ExcelImport()
{
delete d;
}
KoFilter::ConversionStatus ExcelImport::convert( const TQCString& from, const TQCString& to )
{
if ( from != "application/msexcel" )
return KoFilter::NotImplemented;
if ( to != "application/vnd.oasis.opendocument.spreadsheet" )
return KoFilter::NotImplemented;
d->inputFile = m_chain->inputFile();
d->outputFile = m_chain->outputFile();
TQTime time;
time.start();
// open inputFile
d->workbook = new Swinder::Workbook;
if( !d->workbook->load( d->inputFile.local8Bit() ) )
{
delete d->workbook;
d->workbook = 0;
return KoFilter::StupidError;
}
if( d->workbook->isPasswordProtected() )
{
delete d->workbook;
d->workbook = 0;
return KoFilter::PasswordProtected;
}
kdDebug(30511) << "File " << d->inputFile << " loaded. Time: " << time.elapsed() << " ms " << endl;
time.restart();
// create output store
KoStore* storeout;
storeout = KoStore::createStore( d->outputFile, KoStore::Write,
"application/vnd.oasis.opendocument.spreadsheet", KoStore::Zip );
if ( !storeout )
{
kdWarning() << "Couldn't open the requested file." << endl;
delete d->workbook;
return KoFilter::FileNotFound;
}
// Tell KoStore not to touch the file names
storeout->disallowNameExpansion();
KoOasisStore oasisStore( storeout );
// store document styles
d->sheetFormatIndex = 1;
d->columnFormatIndex = 1;
d->rowFormatIndex = 1;
if ( !d->createStyles( &oasisStore ) )
{
kdWarning() << "Couldn't open the file 'styles.xml'." << endl;
delete d->workbook;
delete storeout;
return KoFilter::CreationError;
}
// store document content
d->sheetFormatIndex = 1;
d->columnFormatIndex = 1;
d->rowFormatIndex = 1;
if ( !d->createContent( &oasisStore ) )
{
kdWarning() << "Couldn't open the file 'content.xml'." << endl;
delete d->workbook;
delete storeout;
return KoFilter::CreationError;
}
// store document manifest
if ( !d->createManifest( &oasisStore ) )
{
kdWarning() << "Couldn't open the file 'META-INF/manifest.xml'." << endl;
delete d->workbook;
delete storeout;
return KoFilter::CreationError;
}
kdDebug(30511) << "Converted to " << d->outputFile << ". Time: " << time.elapsed() << " ms " << endl;
// we are done!
delete d->workbook;
delete storeout;
d->inputFile = TQString();
d->outputFile = TQString();
d->workbook = 0;
return KoFilter::OK;
}
bool ExcelImport::Private::createContent( KoOasisStore* store )
{
KoXmlWriter* bodyWriter = store->bodyWriter();
KoXmlWriter* contentWriter = store->contentWriter();
if ( !bodyWriter || !contentWriter )
return false;
// FIXME this is dummy and hardcoded, replace with real font names
contentWriter->startElement( "office:font-face-decls" );
contentWriter->startElement( "style:font-face" );
contentWriter->addAttribute( "style:name", "Arial" );
contentWriter->addAttribute( "svg:font-family", "Arial" );
contentWriter->endElement(); // style:font-face
contentWriter->startElement( "style:font-face" );
contentWriter->addAttribute( "style:name", "Times New Roman" );
contentWriter->addAttribute( "svg:font-family", "&apos;Times New Roman&apos;" );
contentWriter->endElement(); // style:font-face
contentWriter->endElement(); // office:font-face-decls
// important: reset all indexes
sheetFormatIndex = 1;
columnFormatIndex = 1;
rowFormatIndex = 1;
// office:automatic-styles
contentWriter->startElement( "office:automatic-styles" );
processWorkbookForStyle( workbook, contentWriter );
contentWriter->endElement(); // office:automatic-style
// important: reset all indexes
sheetFormatIndex = 1;
columnFormatIndex = 1;
rowFormatIndex = 1;
// office:body
bodyWriter->startElement( "office:body" );
processWorkbookForBody( workbook, bodyWriter );
bodyWriter->endElement(); // office:body
return store->closeContentWriter();
}
bool ExcelImport::Private::createStyles( KoOasisStore* store )
{
if ( !store->store()->open( "styles.xml" ) )
return false;
KoStoreDevice dev( store->store() );
KoXmlWriter* stylesWriter = new KoXmlWriter( &dev );
// FIXME this is dummy default, replace if necessary
stylesWriter->startDocument( "office:document-styles" );
stylesWriter->startElement( "office:document-styles" );
stylesWriter->addAttribute( "xmlns:office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0" );
stylesWriter->addAttribute( "xmlns:style", "urn:oasis:names:tc:opendocument:xmlns:style:1.0" );
stylesWriter->addAttribute( "xmlns:text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0" );
stylesWriter->addAttribute( "xmlns:table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0" );
stylesWriter->addAttribute( "xmlns:draw", "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" );
stylesWriter->addAttribute( "xmlns:fo", "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" );
stylesWriter->addAttribute( "xmlns:svg","urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" );
stylesWriter->addAttribute( "office:version","1.0" );
stylesWriter->startElement( "office:styles" );
stylesWriter->startElement( "style:default-style" );
stylesWriter->addAttribute( "style:family", "table-cell" );
stylesWriter->startElement( "style:table-cell-properties" );
stylesWriter->addAttribute( "style:decimal-places", "2" );
stylesWriter->endElement(); // style:table-cell-properties
stylesWriter->startElement( "style:paragraph-properties" );
stylesWriter->addAttribute( "style:tab-stop-distance", "0.5in" );
stylesWriter->endElement(); // style:paragraph-properties
stylesWriter->startElement( "style:text-properties" );
stylesWriter->addAttribute( "style:font-name", "Albany AMT" );
stylesWriter->addAttribute( "fo:language", "en" );
stylesWriter->addAttribute( "fo:country", "US" );
stylesWriter->addAttribute( "style:font-name-asian", "Albany AMT1" );
stylesWriter->addAttribute( "style:country-asian", "none" );
stylesWriter->addAttribute( "style:font-name-complex", "Lucidasans" );
stylesWriter->addAttribute( "style:language-complex", "none" );
stylesWriter->addAttribute( "style:country-complex", "none" );
stylesWriter->endElement(); // style:text-properties
stylesWriter->endElement(); // style:default-style
stylesWriter->startElement( "style:style" );
stylesWriter->addAttribute( "style:name", "Default" );
stylesWriter->addAttribute( "style:family", "table-cell" );
stylesWriter->endElement(); // style:style
stylesWriter->endElement(); // office:styles
// office:automatic-styles
stylesWriter->startElement( "office:automatic-styles" );
stylesWriter->endElement(); // office:automatic-styles
stylesWriter->endElement(); // office:document-styles
stylesWriter->endDocument();
delete stylesWriter;
return store->store()->close();
}
bool ExcelImport::Private::createManifest( KoOasisStore* store )
{
KoXmlWriter* manifestWriter = store->manifestWriter( "application/vnd.oasis.opendocument.spreadsheet" );
manifestWriter->addManifestEntry( "styles.xml", "text/xml" );
manifestWriter->addManifestEntry( "content.xml", "text/xml" );
return store->closeManifestWriter();
}
void ExcelImport::Private::processWorkbookForBody( Workbook* workbook, KoXmlWriter* xmlWriter )
{
if( !workbook ) return;
if( !xmlWriter ) return;
xmlWriter->startElement( "office:spreadsheet" );
for( unsigned i=0; i < workbook->sheetCount(); i++ )
{
Sheet* sheet = workbook->sheet( i );
processSheetForBody( sheet, xmlWriter );
}
xmlWriter->endElement(); // office:spreadsheet
}
void ExcelImport::Private::processWorkbookForStyle( Workbook* workbook, KoXmlWriter* xmlWriter )
{
if( !workbook ) return;
if( !xmlWriter ) return;
for( unsigned i=0; i < workbook->sheetCount(); i++ )
{
Sheet* sheet = workbook->sheet( i );
processSheetForStyle( sheet, xmlWriter );
}
}
void ExcelImport::Private::processSheetForBody( Sheet* sheet, KoXmlWriter* xmlWriter )
{
if( !sheet ) return;
if( !xmlWriter ) return;
xmlWriter->startElement( "table:table" );
xmlWriter->addAttribute( "table:name", string( sheet->name() ).string() );
xmlWriter->addAttribute( "table:print", "false" );
xmlWriter->addAttribute( "table:protected", "false" );
xmlWriter->addAttribute( "table:style-name", TQString("ta%1").arg(sheetFormatIndex));
sheetFormatIndex++;
unsigned ci = 0;
while( ci <= sheet->maxColumn() )
{
Column* column = sheet->column( ci, false );
if( column )
{
// forward search for columns with same properties
unsigned cj = ci + 1;
while( cj <= sheet->maxColumn() )
{
const Column* nextColumn = sheet->column( cj, false );
if( !nextColumn ) break;
if( column->width() != nextColumn->width() ) break;
if( column->visible() != nextColumn->visible() ) break;
if( column->formatIndex() != nextColumn->formatIndex() ) break;
cj++;
}
int repeated = cj - ci;
processColumnForBody( column, repeated, xmlWriter );
ci += repeated;
}
else {
ci++;
xmlWriter->startElement( "table:table-column" );
xmlWriter->endElement();
}
}
for( unsigned i = 0; i <= sheet->maxRow(); i++ )
{
// FIXME optimized this when operator== in Swinder::Format is implemented
processRowForBody( sheet->row( i, false ), 1, xmlWriter );
}
xmlWriter->endElement(); // table:table
}
void ExcelImport::Private::processSheetForStyle( Sheet* sheet, KoXmlWriter* xmlWriter )
{
if( !sheet ) return;
if( !xmlWriter ) return;
xmlWriter->startElement( "style:style" );
xmlWriter->addAttribute( "style:family", "table" );
xmlWriter->addAttribute( "style:master-page-name", "Default" );
xmlWriter->addAttribute( "style:name", TQString("ta%1").arg(sheetFormatIndex) );
sheetFormatIndex++;
xmlWriter->startElement( "style:table-properties" );
xmlWriter->addAttribute( "table:display", sheet->visible() ? "true" : "false" );
xmlWriter->addAttribute( "table:writing-mode", "lr-tb" );
xmlWriter->endElement(); // style:table-properties
xmlWriter->endElement(); // style:style
unsigned ci = 0;
while( ci <= sheet->maxColumn() )
{
Column* column = sheet->column( ci, false );
if( column )
{
// forward search for similar column
unsigned cj = ci + 1;
while( cj <= sheet->maxColumn() )
{
Column* nextColumn = sheet->column( cj, false );
if( !nextColumn ) break;
if( column->width() != nextColumn->width() ) break;
if( column->visible() != nextColumn->visible() ) break;
if( column->formatIndex() != nextColumn->formatIndex() ) break;
cj++;
}
int repeated = cj - ci;
processColumnForStyle( column, repeated, xmlWriter );
ci += repeated;
}
else
ci++;
}
for( unsigned i = 0; i <= sheet->maxRow(); i++ )
{
Row* row = sheet->row( i, false );
// FIXME optimized this when operator== in Swinder::Format is implemented
processRowForStyle( row, 1, xmlWriter );
}
}
void ExcelImport::Private::processColumnForBody( Column* column, int repeat, KoXmlWriter* xmlWriter )
{
if( !column ) return;
if( !xmlWriter ) return;
xmlWriter->startElement( "table:table-column" );
xmlWriter->addAttribute( "table:default-style-name", "Default" );
xmlWriter->addAttribute( "table:visibility", column->visible() ? "visible" : "collapse" );
if(repeat > 1) xmlWriter->addAttribute( "table:number-columns-repeated", repeat );
xmlWriter->addAttribute( "table:style-name", TQString("co%1").arg(columnFormatIndex) );
columnFormatIndex++;
xmlWriter->endElement(); // table:table-column
}
void ExcelImport::Private::processColumnForStyle( Column* column, int /*repeat*/, KoXmlWriter* xmlWriter )
{
if( !column ) return;
if( !xmlWriter ) return;
xmlWriter->startElement( "style:style" );
xmlWriter->addAttribute( "style:family", "table-column" );
xmlWriter->addAttribute( "style:name", TQString("co%1").arg(columnFormatIndex) );
columnFormatIndex++;
xmlWriter->startElement( "style:table-column-properties" );
xmlWriter->addAttribute( "fo:break-before", "auto" );
xmlWriter->addAttribute( "style:column-width", TQString("%1in").arg(column->width()/27) );
xmlWriter->endElement(); // style:table-column-properties
xmlWriter->endElement(); // style:style
}
void ExcelImport::Private::processRowForBody( Row* row, int /*repeat*/, KoXmlWriter* xmlWriter )
{
if( !xmlWriter ) return;
if( !row ) {
xmlWriter->startElement( "table:table-row" );
xmlWriter->endElement();
return;
}
if( !row->sheet() ) return;
// find the column of the rightmost cell (if any)
int lastCol = -1;
Sheet* sheet= row->sheet();
unsigned rowIndex = row->index();
for( unsigned i = 0; i <= sheet->maxColumn(); i++ )
if( sheet->cell( i, rowIndex, false ) )
lastCol = i;
xmlWriter->startElement( "table:table-row" );
xmlWriter->addAttribute( "table:visibility", row->visible() ? "visible" : "collapse" );
xmlWriter->addAttribute( "table:style-name", TQString("ro%1").arg(rowFormatIndex) );
rowFormatIndex++;
for( int i = 0; i <= lastCol; i++ )
{
Cell* cell = sheet->cell( i, rowIndex, false );
if( cell )
processCellForBody( cell, xmlWriter );
else
{
// empty cell
xmlWriter->startElement( "table:table-cell" );
xmlWriter->endElement();
}
}
xmlWriter->endElement(); // table:table-row
}
void ExcelImport::Private::processRowForStyle( Row* row, int repeat, KoXmlWriter* xmlWriter )
{
if( !row ) return;
if( !row->sheet() ) return;
if( !xmlWriter ) return;
// find the column of the rightmost cell (if any)
int lastCol = -1;
Sheet* sheet= row->sheet();
unsigned rowIndex = row->index();
for( unsigned i = 0; i <= sheet->maxColumn(); i++ )
if( sheet->cell( i, rowIndex, false ) )
lastCol = i;
xmlWriter->startElement( "style:style" );
xmlWriter->addAttribute( "style:family", "table-row" );
if(repeat > 1) xmlWriter->addAttribute( "table:number-rows-repeated", repeat );
xmlWriter->addAttribute( "style:name", TQString("ro%1").arg(rowFormatIndex) );
rowFormatIndex++;
xmlWriter->startElement( "style:table-row-properties" );
xmlWriter->addAttribute( "fo:break-before", "auto" );
xmlWriter->addAttribute( "style:row-height", TQString("%1pt").arg(row->height()) );
xmlWriter->endElement(); // style:table-row-properties
xmlWriter->endElement(); // style:style
for( int i = 0; i <= lastCol; i++ )
{
Cell* cell = sheet->cell( i, rowIndex, false );
if( cell )
processCellForStyle( cell, xmlWriter );
}
}
static bool isPercentageFormat( const TQString& valueFormat )
{
if( valueFormat.isEmpty() ) return false;
if( valueFormat.length() < 1 ) return false;
return valueFormat[valueFormat.length()-1] == TQChar('%');
}
static bool isDateFormat( const TQString& valueFormat )
{
TQString vfu = valueFormat.upper();
if( vfu == "M/D/YY" ) return true;
if( vfu == "M/D/YYYY" ) return true;
if( vfu == "MM/DD/YY" ) return true;
if( vfu == "MM/DD/YYYY" ) return true;
if( vfu == "D-MMM-YY" ) return true;
if( vfu == "D\\-MMM\\-YY" ) return true;
if( vfu == "D-MMM-YYYY" ) return true;
if( vfu == "D\\-MMM\\-YYYY" ) return true;
if( vfu == "D-MMM" ) return true;
if( vfu == "D\\-MMM" ) return true;
if( vfu == "D-MM" ) return true;
if( vfu == "D\\-MM" ) return true;
if( vfu == "MMM/DD" ) return true;
if( vfu == "MMM/D" ) return true;
if( vfu == "MM/DD" ) return true;
if( vfu == "MM/D" ) return true;
if( vfu == "MM/DD/YY" ) return true;
if( vfu == "MM/DD/YYYY" ) return true;
if( vfu == "YYYY/MM/D" ) return true;
if( vfu == "YYYY/MM/DD" ) return true;
if( vfu == "YYYY-MM-D" ) return true;
if( vfu == "YYYY\\-MM\\-D" ) return true;
if( vfu == "YYYY-MM-DD" ) return true;
if( vfu == "YYYY\\-MM\\-DD" ) return true;
return false;
}
static bool isTimeFormat( const TQString& valueFormat )
{
TQString vf = valueFormat;
if( vf == "h:mm AM/PM" ) return true;
if( vf == "h:mm:ss AM/PM" ) return true;
if( vf == "h:mm" ) return true;
if( vf == "h:mm:ss" ) return true;
if( vf == "[h]:mm:ss" ) return true;
if( vf == "[h]:mm" ) return true;
if( vf == "[mm]:ss" ) return true;
if( vf == "M/D/YY h:mm" ) return true;
if( vf == "[ss]" ) return true;
if( vf == "mm:ss" ) return true;
if( vf == "mm:ss.0" ) return true;
if( vf == "[mm]:ss" ) return true;
if( vf == "[ss]" ) return true;
return false;
}
static TQString convertDate( double serialNo )
{
// reference is midnight 30 Dec 1899
TQDate dd( 1899, 12, 30 );
dd = dd.addDays( (int) serialNo );
return dd.toString( "yyyy-MM-dd" );
}
static TQString convertTime( double serialNo )
{
// reference is midnight 30 Dec 1899
TQTime tt;
tt = tt.addMSecs( tqRound( (serialNo-(int)serialNo) * 86400 * 1000 ) );
return tt.toString( "PThhHmmMss,zzz0S" );
}
void ExcelImport::Private::processCellForBody( Cell* cell, KoXmlWriter* xmlWriter )
{
if( !cell ) return;
if( !xmlWriter ) return;
int formatIndex = cell->formatIndex();
TQString styleName("ce");
styleName.append( TQString::number( formatIndex ) );
xmlWriter->startElement( "table:table-cell" );
xmlWriter->addAttribute( "table:style-name", styleName );
if( !cell->formula().isEmpty() )
{
TQString formula = string( cell->formula() ).string();
xmlWriter->addAttribute( "table:formula", formula.prepend("=") );
}
const Value& value = cell->value();
if( value.isBoolean() )
{
xmlWriter->addAttribute( "office:value-type", "boolean" );
xmlWriter->addAttribute( "office:boolean-value", value.asBoolean() ? "true" : "false" );
}
else if( value.isFloat() || value.isInteger() )
{
if( isPercentageStyle[formatIndex] )
{
xmlWriter->addAttribute( "office:value-type", "percentage" );
xmlWriter->addAttribute( "office:value", TQString::number( value.asFloat(), 'g', 15 ) );
}
else if( isDateStyle[formatIndex] )
{
xmlWriter->addAttribute( "office:value-type", "date" );
xmlWriter->addAttribute( "office:date-value", convertDate( value.asFloat() ) );
}
else if( isTimeStyle[formatIndex] )
{
xmlWriter->addAttribute( "office:value-type", "time" );
xmlWriter->addAttribute( "office:time-value", convertTime( value.asFloat() ) );
}
else
{
// fallback, just write as normal number
xmlWriter->addAttribute( "office:value-type", "float" );
xmlWriter->addAttribute( "office:value", TQString::number( value.asFloat(), 'g', 15 ) );
}
}
else if( value.isString() )
{
TQString str = string( value.asString() ).string();
xmlWriter->addAttribute( "office:value-type", "string" );
xmlWriter->addAttribute( "office:string-value", str );
xmlWriter->startElement( "text:p" );
xmlWriter->addTextNode( str );
xmlWriter->endElement(); // text:p
}
xmlWriter->endElement(); // table:table-cell
}
void ExcelImport::Private::processCellForStyle( Cell* cell, KoXmlWriter* xmlWriter )
{
if( !cell ) return;
if( !xmlWriter ) return;
// only IF automatic style for this format has not been already created yet
if( !styleFormats.contains( cell->formatIndex() ) )
{
styleFormats[ cell->formatIndex() ] = true;
const Format& format = cell->sheet()->workbook()->format( cell->formatIndex() );
// handle data format, e.g. number style
TQString refName;
const UString& valueFormat = format.valueFormat();
if( !valueFormat.isEmpty() )
{
refName = TQString("N%1").arg(cell->formatIndex());
TQString numformat = string( valueFormat ).string();
processValueFormat( numformat, refName, xmlWriter );
}
// later for writing the value
TQString numformat = string( valueFormat ).string();
isPercentageStyle[ cell->formatIndex() ] = isPercentageFormat( numformat );
isDateStyle[ cell->formatIndex() ] = isDateFormat( numformat );
isTimeStyle[ cell->formatIndex() ] = isTimeFormat( numformat );
// now the real table-cell
xmlWriter->startElement( "style:style" );
xmlWriter->addAttribute( "style:family", "table-cell" );
xmlWriter->addAttribute( "style:name", TQString("ce%1").arg( cell->formatIndex() ) );
if( !refName.isEmpty() )
xmlWriter->addAttribute( "style:data-style-name", refName );
processFormat( &format, xmlWriter );
xmlWriter->endElement(); // style:style
}
}
TQString convertColor( const Color& color )
{
char buf[8];
sprintf( buf, "#%02x%02x%02x", color.red, color.green, color.blue );
return TQString( buf );
}
TQString convertBorder( const Pen& pen )
{
if( pen.style == Pen::NoLine || pen.width == 0 ) return "none";
TQString result = TQString::number( pen.width );
result += "pt ";
switch( pen.style )
{
case Pen::SolidLine: result += "solid "; break;
case Pen::DashLine: result += "dashed "; break;
case Pen::DotLine: result += "dotted "; break;
case Pen::DashDotLine: result += "dot-dash "; break;
case Pen::DashDotDotLine: result += "dot-dot-dash "; break;
}
return result + convertColor( pen.color );
}
void ExcelImport::Private::processFormat( const Format* format, KoXmlWriter* xmlWriter )
{
if( !format ) return;
if( !xmlWriter ) return;
const FormatFont& font = format->font();
const FormatAlignment& align = format->alignment();
const FormatBackground& back = format->background();
const FormatBorders& borders = format->borders();
if( !font.isNull() )
{
xmlWriter->startElement( "style:text-properties" );
if( font.bold() )
xmlWriter->addAttribute( "fo:font-weight", "bold" );
if( font.italic() )
xmlWriter->addAttribute( "fo:font-style", "italic" );
if( font.underline() )
{
xmlWriter->addAttribute( "style:text-underline-style", "solid" );
xmlWriter->addAttribute( "style:text-underline-width", "auto" );
xmlWriter->addAttribute( "style:text-underline-color", "font-color" );
}
if( font.strikeout() )
xmlWriter->addAttribute( "style:text-line-through-style", "solid" );
if( font.subscript() )
xmlWriter->addAttribute( "style:text-position", "sub" );
if( font.superscript() )
xmlWriter->addAttribute( "style:text-position", "super" );
if( !font.fontFamily().isEmpty() )
xmlWriter->addAttribute( "style:font-name", string(font.fontFamily()).string() );
xmlWriter->addAttribute( "fo:font-size", TQString("%1pt").arg(font.fontSize()) );
xmlWriter->addAttribute( "fo:color", convertColor( font.color() ) );
xmlWriter->endElement(); // style:text-properties
}
xmlWriter->startElement( "style:table-cell-properties" );
if( !align.isNull() )
{
switch( align.alignY() ) {
case Format::Top: xmlWriter->addAttribute( "style:vertical-align", "top" ); break;
case Format::Middle: xmlWriter->addAttribute( "style:vertical-align", "middle" ); break;
case Format::Bottom: xmlWriter->addAttribute( "style:vertical-align", "bottom" ); break;
}
xmlWriter->addAttribute( "fo:wrap-option", align.wrap() ? "wrap" : "no-wrap" );
//TODO rotation
//TODO stacked letters
}
if( !borders.isNull() )
{
xmlWriter->addAttribute( "fo:border-left", convertBorder( borders.leftBorder() ) );
xmlWriter->addAttribute( "fo:border-right", convertBorder( borders.rightBorder() ) );
xmlWriter->addAttribute( "fo:border-top", convertBorder( borders.topBorder() ) );
xmlWriter->addAttribute( "fo:border-bottom", convertBorder( borders.bottomBorder() ) );
//TODO diagonal 'borders'
}
if( !back.isNull() && back.pattern() != FormatBackground::EmptyPattern )
{
Color backColor = back.backgroundColor();
if( back.pattern() == FormatBackground::SolidPattern )
backColor = back.foregroundColor();
xmlWriter->addAttribute( "fo:background-color", convertColor( backColor ) );
//TODO patterns
}
xmlWriter->endElement(); // style:table-cell-properties
xmlWriter->startElement( "style:paragraph-properties" );
if( !align.isNull() )
{
switch( align.alignX() ) {
case Format::Left: xmlWriter->addAttribute( "fo:text-align", "start" ); break;
case Format::Center: xmlWriter->addAttribute( "fo:text-align", "center" ); break;
case Format::Right: xmlWriter->addAttribute( "fo:text-align", "end" ); break;
}
if( align.indentLevel() != 0 )
xmlWriter->addAttribute( "fo:margin-left", TQString::number( align.indentLevel() ) + "0pt" );
}
xmlWriter->endElement(); // style:paragraph-properties
}
void ExcelImport::Private::processValueFormat( TQString valueFormat, TQString refName,
KoXmlWriter* xmlWriter )
{
/*int decimalPlaces = 2;
int leadingZeroes = 1;
int exponentDigits = -1;
bool percentage = false;*/
// TODO: someday we need a real MS Excel to OpenDocument format paraser
// this just catches the most common format, not covers all possible cases
if( valueFormat == "0")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 0 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 1 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 2 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 3 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 4 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 5 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 6 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 7 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 8 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 9 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 10 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 11 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 12 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 13 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 14 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 15 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000000000000")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 16 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 0 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 1 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 2 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 3 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 4 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 5 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 6 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 7 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 8 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 9 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 10 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 11 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 12 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 13 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.00000000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 14 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.000000000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 16 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0.0000000000000000E+00")
{
xmlWriter->startElement( "number:number-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:scientific-number" );
xmlWriter->addAttribute( "number:decimal-places", 17 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->addAttribute( "number:min-exponent-digits", 2 );
xmlWriter->endElement(); // number:scientific-number
xmlWriter->endElement(); // number:number-style
}
else if( valueFormat == "0%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 0 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.0%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 1 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.00%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 2 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 3 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.0000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 4 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.00000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 5 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 6 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.0000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 7 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.00000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 8 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 9 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.0000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 10 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.00000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 11 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.000000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 12 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.0000000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 13 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.00000000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 14 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.000000000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 15 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat == "0.0000000000000000%")
{
xmlWriter->startElement( "number:percentage-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->startElement( "number:number" );
xmlWriter->addAttribute( "number:decimal-places", 16 );
xmlWriter->addAttribute( "number:min-integer-digits", 1 );
xmlWriter->endElement(); // number:number
xmlWriter->startElement( "number:text" );
xmlWriter->addTextNode( "%" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:percentage-style
}
else if( valueFormat.lower() == "m/d/yy")
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:year
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "m/d/yyyy")
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->endElement(); // number:date-style
}
else if( (valueFormat.lower() == "d-mmm-yy") || (valueFormat.lower() == "d\\-mmm\\-yy") )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "true" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:year
xmlWriter->endElement(); // number:date-style
}
else if( (valueFormat.lower() == "d-mmm-yyyy") || (valueFormat.lower() == "d\\-mmm\\-yyyy") )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "true" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->endElement(); // number:date-style
}
else if( (valueFormat.lower() == "d-mmm") || (valueFormat.lower() == "d\\-mmm") )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "true" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->endElement(); // number:date-style
}
else if( (valueFormat.lower() == "d-mm") || (valueFormat.lower() == "d\\-mm") )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "mmm/d" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "true" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "mmm/dd" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "true" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "mm/d" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "mm/dd" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "mm/dd/yy" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:year
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "mm/dd/yyyy" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:day
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "yyyy/mm/dd" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat.lower() == "yyyy/mm/d" )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "/" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( (valueFormat.lower() == "yyyy-mm-dd") || (valueFormat.lower() == "yyyy\\-mm\\-dd") )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( (valueFormat.lower() == "yyyy-mm-d") || (valueFormat.lower() == "yyyy\\-mm\\-d") )
{
xmlWriter->startElement( "number:date-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:year" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:year
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:month" );
xmlWriter->addAttribute( "number:textual", "false" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:month
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( "-" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:day" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:day
xmlWriter->endElement(); // number:date-style
}
else if( valueFormat == "h:mm AM/PM" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:hours" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:hour
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( " " );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:am-pm" );
xmlWriter->endElement(); // number:am-pm
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "h:mm:ss AM/PM" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:hours" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:hour
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( " " );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:am-pm" );
xmlWriter->endElement(); // number:am-pm
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "h:mm" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:hours" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:hour
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "h:mm:ss" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:hours" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:hour
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "[h]:mm" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->addAttribute( "number:truncate-on-overflow", "false" );
xmlWriter->startElement( "number:hours" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:hour
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "[h]:mm:ss" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->addAttribute( "number:truncate-on-overflow", "false" );
xmlWriter->startElement( "number:hours" );
xmlWriter->addAttribute( "number:style", "short" );
xmlWriter->endElement(); // number:hour
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "mm:ss" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "mm:ss.0" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ".0" );
xmlWriter->endElement(); // number:text
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "[mm]:ss" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->addAttribute( "number:truncate-on-overflow", "false" );
xmlWriter->startElement( "number:minutes" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->startElement( "number:text");
xmlWriter->addTextNode( ":" );
xmlWriter->endElement(); // number:text
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
else if( valueFormat == "[ss]" )
{
xmlWriter->startElement( "number:time-style" );
xmlWriter->addAttribute( "style:name", refName );
xmlWriter->addAttribute( "style:family", "data-style" );
xmlWriter->addAttribute( "number:truncate-on-overflow", "false" );
xmlWriter->startElement( "number:seconds" );
xmlWriter->addAttribute( "number:style", "long" );
xmlWriter->endElement(); // number:minutes
xmlWriter->endElement(); // number:time-style
}
}