summaryrefslogtreecommitdiff
path: root/oox/source/xls/worksheetfragment.cxx
diff options
context:
space:
mode:
authorKurt Zenker <kz@openoffice.org>2008-03-05 18:09:27 +0000
committerKurt Zenker <kz@openoffice.org>2008-03-05 18:09:27 +0000
commit803b2f5ddae7e5169cfdb420ab54dffc7e506d0f (patch)
tree09538957503b324251de7375c26a98249bce7f90 /oox/source/xls/worksheetfragment.cxx
parentc8dd5af0b9a4ea0c710cd7a00ea56ba61fed608e (diff)
INTEGRATION: CWS xmlfilter03_DEV300 (1.2.4); FILE MERGED
2008/02/12 11:33:16 dr 1.2.4.16: handle drawing fragment in WorksheetHelper 2008/02/12 10:55:13 dr 1.2.4.15: import chart sheet fragment 2008/02/11 10:28:09 dr 1.2.4.14: comments 2008/02/07 14:47:18 dr 1.2.4.13: more page background graphic 2008/02/07 13:41:52 dr 1.2.4.12: add fragment base path to relations, import page background 2008/02/07 10:36:06 dr 1.2.4.11: more sheet types 2008/02/06 16:12:08 dr 1.2.4.10: fix BIFF hyperlink import 2008/02/05 14:08:07 dr 1.2.4.9: oox::core::ContextHandler2 and oox::core::FragmentHandler2 for convenience 2008/02/04 13:33:19 dr 1.2.4.8: rework of fragment handler/context handler base classes 2008/02/01 09:55:36 dr 1.2.4.7: addShape() code cleanup, started xlsx drawing import 2008/01/28 15:40:55 dr 1.2.4.6: BIFF stream handling 2008/01/28 14:33:40 dr 1.2.4.5: load macro enabled spreadsheets, and xm:macrosheet sheets 2008/01/25 12:53:11 dr 1.2.4.4: simplified OoxContextHelper interface 2008/01/24 16:22:35 dr 1.2.4.3: preparations for DrawingML import 2008/01/24 15:49:41 dr 1.2.4.2: minor changes 2008/01/24 14:58:36 dr 1.2.4.1: OOBIN additions, BIFF string handling
Diffstat (limited to 'oox/source/xls/worksheetfragment.cxx')
-rw-r--r--oox/source/xls/worksheetfragment.cxx505
1 files changed, 293 insertions, 212 deletions
diff --git a/oox/source/xls/worksheetfragment.cxx b/oox/source/xls/worksheetfragment.cxx
index 0fce487bb5c7..278169ef615c 100644
--- a/oox/source/xls/worksheetfragment.cxx
+++ b/oox/source/xls/worksheetfragment.cxx
@@ -4,9 +4,9 @@
*
* $RCSfile: worksheetfragment.cxx,v $
*
- * $Revision: 1.2 $
+ * $Revision: 1.3 $
*
- * last change: $Author: rt $ $Date: 2008-01-17 08:06:09 $
+ * last change: $Author: kz $ $Date: 2008-03-05 19:09:27 $
*
* The Contents of this file are made available subject to
* the terms of GNU Lesser General Public License Version 2.1.
@@ -58,10 +58,9 @@ using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Exception;
using ::com::sun::star::table::CellAddress;
using ::com::sun::star::table::CellRangeAddress;
-using ::com::sun::star::xml::sax::XFastContextHandler;
+using ::oox::core::RecordInfo;
using ::oox::core::Relations;
using ::oox::core::RelationsRef;
-using ::oox::core::RecordContextRef;
namespace oox {
namespace xls {
@@ -70,9 +69,8 @@ namespace xls {
namespace {
-const sal_uInt32 OOBIN_BRK_MANUAL = 0x00000001;
-
const sal_uInt16 BIFF_COLINFO_HIDDEN = 0x0001;
+const sal_uInt16 BIFF_COLINFO_SHOWPHONETIC = 0x0008;
const sal_uInt16 BIFF_COLINFO_COLLAPSED = 0x1000;
const sal_uInt16 BIFF_DEFROW_CUSTOMHEIGHT = 0x0001;
@@ -104,58 +102,83 @@ OoxWorksheetFragment::OoxWorksheetFragment( const WorkbookHelper& rHelper,
OoxWorksheetFragmentBase( rHelper, rFragmentPath, xProgressBar, eSheetType, nSheet )
{
// import data tables related to this worksheet
- RelationsRef xTableRels = getRelations().getRelationsFromType( CREATE_RELATIONS_TYPE( "table" ) );
+ RelationsRef xTableRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATIONSTYPE( "table" ) );
for( Relations::const_iterator aIt = xTableRels->begin(), aEnd = xTableRels->end(); aIt != aEnd; ++aIt )
importOoxFragment( new OoxTableFragment( *this, getFragmentPathFromTarget( aIt->second.maTarget ) ) );
}
-// oox.xls.OoxContextHelper interface -----------------------------------------
+// oox.core.ContextHandler2Helper interface -----------------------------------
-bool OoxWorksheetFragment::onCanCreateContext( sal_Int32 nElement ) const
+ContextWrapper OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& )
{
- switch( getCurrentContext() )
+ switch( getCurrentElement() )
{
- case XML_ROOT_CONTEXT:
- return (nElement == XLS_TOKEN( worksheet ));
+ case XML_ROOT_CONTEXT: switch( getSheetType() )
+ {
+ case SHEETTYPE_WORKSHEET: return (nElement == XLS_TOKEN( worksheet ));
+ case SHEETTYPE_CHARTSHEET: return false;
+ case SHEETTYPE_MACROSHEET: return (nElement == XM_TOKEN( macrosheet ));
+ case SHEETTYPE_DIALOGSHEET: return false;
+ case SHEETTYPE_MODULESHEET: return false;
+ }
+ break;
+
case XLS_TOKEN( worksheet ):
+ case XM_TOKEN( macrosheet ):
+ switch( nElement )
+ {
+ case XLS_TOKEN( sheetData ):
+ return new OoxSheetDataContext( *this );
+ case XLS_TOKEN( autoFilter ):
+ return new OoxAutoFilterContext( *this );
+ case XLS_TOKEN( conditionalFormatting ):
+ return new OoxCondFormatContext( *this );
+ }
return (nElement == XLS_TOKEN( sheetPr )) ||
(nElement == XLS_TOKEN( dimension )) ||
- (nElement == XLS_TOKEN( sheetFormatPr )) ||
(nElement == XLS_TOKEN( sheetViews )) ||
+ (nElement == XLS_TOKEN( sheetFormatPr )) ||
(nElement == XLS_TOKEN( cols )) ||
- (nElement == XLS_TOKEN( sheetData )) ||
+ (nElement == XLS_TOKEN( sheetProtection )) ||
(nElement == XLS_TOKEN( mergeCells )) ||
- (nElement == XLS_TOKEN( hyperlinks )) ||
- (nElement == XLS_TOKEN( autoFilter )) ||
+ (nElement == XLS_TOKEN( phoneticPr )) ||
(nElement == XLS_TOKEN( dataValidations )) ||
- (nElement == XLS_TOKEN( conditionalFormatting )) ||
+ (nElement == XLS_TOKEN( hyperlinks )) ||
+ (nElement == XLS_TOKEN( printOptions )) ||
(nElement == XLS_TOKEN( pageMargins )) ||
(nElement == XLS_TOKEN( pageSetup )) ||
(nElement == XLS_TOKEN( headerFooter )) ||
- (nElement == XLS_TOKEN( printOptions )) ||
+ (nElement == XLS_TOKEN( picture )) ||
(nElement == XLS_TOKEN( rowBreaks )) ||
(nElement == XLS_TOKEN( colBreaks )) ||
- (nElement == XLS_TOKEN( sheetProtection )) ||
- (nElement == XLS_TOKEN( phoneticPr ));
+ (nElement == XLS_TOKEN( drawing ));
+
case XLS_TOKEN( sheetPr ):
- return (nElement == XLS_TOKEN( outlinePr )) ||
+ return (nElement == XLS_TOKEN( tabColor )) ||
+ (nElement == XLS_TOKEN( outlinePr )) ||
(nElement == XLS_TOKEN( pageSetUpPr ));
+
case XLS_TOKEN( sheetViews ):
return (nElement == XLS_TOKEN( sheetView ));
case XLS_TOKEN( sheetView ):
return (nElement == XLS_TOKEN( pane )) ||
(nElement == XLS_TOKEN( selection ));
+
case XLS_TOKEN( cols ):
return (nElement == XLS_TOKEN( col ));
+
case XLS_TOKEN( mergeCells ):
return (nElement == XLS_TOKEN( mergeCell ));
- case XLS_TOKEN( hyperlinks ):
- return (nElement == XLS_TOKEN( hyperlink ));
+
case XLS_TOKEN( dataValidations ):
return (nElement == XLS_TOKEN( dataValidation ));
case XLS_TOKEN( dataValidation ):
return (nElement == XLS_TOKEN( formula1 )) ||
(nElement == XLS_TOKEN( formula2 ));
+
+ case XLS_TOKEN( hyperlinks ):
+ return (nElement == XLS_TOKEN( hyperlink ));
+
case XLS_TOKEN( headerFooter ):
return (nElement == XLS_TOKEN( firstHeader )) ||
(nElement == XLS_TOKEN( firstFooter )) ||
@@ -170,49 +193,50 @@ bool OoxWorksheetFragment::onCanCreateContext( sal_Int32 nElement ) const
return false;
}
-Reference< XFastContextHandler > OoxWorksheetFragment::onCreateContext( sal_Int32 nElement, const AttributeList& /*rAttribs*/ )
+void OoxWorksheetFragment::onStartElement( const AttributeList& rAttribs )
{
- switch( nElement )
+ switch( getCurrentElement() )
{
- case XLS_TOKEN( sheetData ):
- return new OoxSheetDataContext( *this );
- case XLS_TOKEN( autoFilter ):
- return new OoxAutoFilterContext( *this );
- case XLS_TOKEN( conditionalFormatting ):
- return new OoxCondFormatContext( *this );
+ case XLS_TOKEN( sheetPr ): getWorksheetSettings().importSheetPr( rAttribs ); break;
+ case XLS_TOKEN( tabColor ): getWorksheetSettings().importTabColor( rAttribs ); break;
+ case XLS_TOKEN( outlinePr ): getWorksheetSettings().importOutlinePr( rAttribs ); break;
+ case XLS_TOKEN( pageSetUpPr ): importPageSetUpPr( rAttribs ); break;
+ case XLS_TOKEN( dimension ): importDimension( rAttribs ); break;
+ case XLS_TOKEN( sheetView ): getSheetViewSettings().importSheetView( rAttribs ); break;
+ case XLS_TOKEN( pane ): getSheetViewSettings().importPane( rAttribs ); break;
+ case XLS_TOKEN( selection ): getSheetViewSettings().importSelection( rAttribs ); break;
+ case XLS_TOKEN( sheetFormatPr ): importSheetFormatPr( rAttribs ); break;
+ case XLS_TOKEN( col ): importCol( rAttribs ); break;
+ case XLS_TOKEN( sheetProtection ): getWorksheetSettings().importSheetProtection( rAttribs ); break;
+ case XLS_TOKEN( mergeCell ): importMergeCell( rAttribs ); break;
+ case XLS_TOKEN( phoneticPr ): getWorksheetSettings().importPhoneticPr( rAttribs ); break;
+ case XLS_TOKEN( dataValidation ): importDataValidation( rAttribs ); break;
+ case XLS_TOKEN( hyperlink ): importHyperlink( rAttribs ); break;
+ case XLS_TOKEN( printOptions ): getPageSettings().importPrintOptions( rAttribs ); break;
+ case XLS_TOKEN( pageMargins ): getPageSettings().importPageMargins( rAttribs ); break;
+ case XLS_TOKEN( pageSetup ): getPageSettings().importPageSetup( getRelations(), rAttribs ); break;
+ case XLS_TOKEN( headerFooter ): getPageSettings().importHeaderFooter( rAttribs ); break;
+ case XLS_TOKEN( picture ): getPageSettings().importPicture( getRelations(), rAttribs ); break;
+ case XLS_TOKEN( brk ): importBrk( rAttribs ); break;
+ case XLS_TOKEN( drawing ): importDrawing( rAttribs ); break;
}
- return this;
}
-void OoxWorksheetFragment::onStartElement( const AttributeList& rAttribs )
+namespace {
+
+ApiTokenSequence lclImportDataValFormula( FormulaParser& rParser, const OUString& rFormula, const CellAddress& rBaseAddress )
{
- switch( getCurrentContext() )
- {
- case XLS_TOKEN( dimension ): importDimension( rAttribs ); break;
- case XLS_TOKEN( sheetFormatPr ): importSheetFormatPr( rAttribs ); break;
- case XLS_TOKEN( sheetView ): getSheetViewSettings().importSheetView( rAttribs ); break;
- case XLS_TOKEN( pane ): getSheetViewSettings().importPane( rAttribs ); break;
- case XLS_TOKEN( selection ): getSheetViewSettings().importSelection( rAttribs ); break;
- case XLS_TOKEN( outlinePr ): getWorksheetSettings().importOutlinePr( rAttribs ); break;
- case XLS_TOKEN( sheetProtection ): getWorksheetSettings().importSheetProtection( rAttribs ); break;
- case XLS_TOKEN( phoneticPr ): getWorksheetSettings().importPhoneticPr( rAttribs ); break;
- case XLS_TOKEN( col ): importCol( rAttribs ); break;
- case XLS_TOKEN( mergeCell ): importMergeCell( rAttribs ); break;
- case XLS_TOKEN( hyperlink ): importHyperlink( rAttribs ); break;
- case XLS_TOKEN( dataValidation ): importDataValidation( rAttribs ); break;
- case XLS_TOKEN( pageMargins ): getPageSettings().importPageMargins( rAttribs ); break;
- case XLS_TOKEN( pageSetup ): getPageSettings().importPageSetup( rAttribs ); break;
- case XLS_TOKEN( printOptions ): getPageSettings().importPrintOptions( rAttribs ); break;
- case XLS_TOKEN( headerFooter ): getPageSettings().importHeaderFooter( rAttribs ); break;
- case XLS_TOKEN( pageSetUpPr ): importPageSetUpPr( rAttribs ); break;
- case XLS_TOKEN( brk ): importBrk( rAttribs ); break;
- }
+ TokensFormulaContext aContext( true, false );
+ aContext.setBaseAddress( rBaseAddress );
+ rParser.importFormula( aContext, rFormula );
+ return aContext.getTokens();
}
+} // namespace
+
void OoxWorksheetFragment::onEndElement( const OUString& rChars )
{
- sal_Int32 nCurrentContext = getCurrentContext();
- switch( nCurrentContext )
+ switch( getCurrentElement() )
{
case XLS_TOKEN( firstHeader ):
case XLS_TOKEN( firstFooter ):
@@ -220,12 +244,13 @@ void OoxWorksheetFragment::onEndElement( const OUString& rChars )
case XLS_TOKEN( oddFooter ):
case XLS_TOKEN( evenHeader ):
case XLS_TOKEN( evenFooter ):
- getPageSettings().importHeaderFooterCharacters( rChars, nCurrentContext );
+ getPageSettings().importHeaderFooterCharacters( rChars, getCurrentElement() );
break;
case XLS_TOKEN( formula1 ):
if( mxValData.get() )
{
- importDataValFormula( mxValData->maTokens1, rChars, mxValData->maRanges.getBaseAddress() );
+ mxValData->maTokens1 = lclImportDataValFormula(
+ getFormulaParser(), rChars, mxValData->maRanges.getBaseAddress() );
// process string list of a list validation (convert to list of string tokens)
if( mxValData->mnType == XML_list )
getFormulaParser().convertStringToStringList( mxValData->maTokens1, ',', true );
@@ -233,7 +258,8 @@ void OoxWorksheetFragment::onEndElement( const OUString& rChars )
break;
case XLS_TOKEN( formula2 ):
if( mxValData.get() )
- importDataValFormula( mxValData->maTokens2, rChars, mxValData->maRanges.getBaseAddress() );
+ mxValData->maTokens2 = lclImportDataValFormula(
+ getFormulaParser(), rChars, mxValData->maRanges.getBaseAddress() );
break;
case XLS_TOKEN( dataValidation ):
if( mxValData.get() )
@@ -243,31 +269,38 @@ void OoxWorksheetFragment::onEndElement( const OUString& rChars )
}
}
-bool OoxWorksheetFragment::onCanCreateRecordContext( sal_Int32 nRecId )
+ContextWrapper OoxWorksheetFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& )
{
- switch( getCurrentContext() )
+ switch( getCurrentElement() )
{
case XML_ROOT_CONTEXT:
return (nRecId == OOBIN_ID_WORKSHEET);
case OOBIN_ID_WORKSHEET:
+ switch( nRecId )
+ {
+ case OOBIN_ID_SHEETDATA:
+ return new OoxSheetDataContext( *this );
+ case OOBIN_ID_CONDFORMATTING:
+ return new OoxCondFormatContext( *this );
+ }
return (nRecId == OOBIN_ID_SHEETPR) ||
(nRecId == OOBIN_ID_DIMENSION) ||
(nRecId == OOBIN_ID_SHEETFORMATPR) ||
(nRecId == OOBIN_ID_SHEETVIEWS) ||
(nRecId == OOBIN_ID_COLS) ||
- (nRecId == OOBIN_ID_SHEETDATA) ||
(nRecId == OOBIN_ID_MERGECELLS) ||
(nRecId == OOBIN_ID_HYPERLINK) ||
(nRecId == OOBIN_ID_DATAVALIDATIONS) ||
- (nRecId == OOBIN_ID_CONDFORMATTING) ||
(nRecId == OOBIN_ID_PAGEMARGINS) ||
(nRecId == OOBIN_ID_PAGESETUP) ||
(nRecId == OOBIN_ID_PRINTOPTIONS) ||
(nRecId == OOBIN_ID_HEADERFOOTER) ||
+ (nRecId == OOBIN_ID_PICTURE) ||
(nRecId == OOBIN_ID_ROWBREAKS) ||
(nRecId == OOBIN_ID_COLBREAKS) ||
(nRecId == OOBIN_ID_SHEETPROTECTION) ||
- (nRecId == OOBIN_ID_PHONETICPR);
+ (nRecId == OOBIN_ID_PHONETICPR) ||
+ (nRecId == OOBIN_ID_DRAWING);
case OOBIN_ID_SHEETVIEWS:
return (nRecId == OOBIN_ID_SHEETVIEW);
case OOBIN_ID_SHEETVIEW:
@@ -286,56 +319,74 @@ bool OoxWorksheetFragment::onCanCreateRecordContext( sal_Int32 nRecId )
return false;
}
-RecordContextRef OoxWorksheetFragment::onCreateRecordContext( sal_Int32 nRecId, RecordInputStream& )
+void OoxWorksheetFragment::onStartRecord( RecordInputStream& rStrm )
{
- switch( nRecId )
+ switch( getCurrentElement() )
{
- case OOBIN_ID_SHEETDATA:
- return new OoxSheetDataContext( *this );
- case OOBIN_ID_CONDFORMATTING:
- return new OoxCondFormatContext( *this );
+ case OOBIN_ID_SHEETPR: getWorksheetSettings().importSheetPr( rStrm ); break;
+ case OOBIN_ID_DIMENSION: importDimension( rStrm ); break;
+ case OOBIN_ID_SHEETPROTECTION: getWorksheetSettings().importSheetProtection( rStrm ); break;
+ case OOBIN_ID_PHONETICPR: getWorksheetSettings().importPhoneticPr( rStrm ); break;
+ case OOBIN_ID_SHEETFORMATPR: importSheetFormatPr( rStrm ); break;
+ case OOBIN_ID_SHEETVIEW: getSheetViewSettings().importSheetView( rStrm ); break;
+ case OOBIN_ID_PANE: getSheetViewSettings().importPane( rStrm ); break;
+ case OOBIN_ID_SELECTION: getSheetViewSettings().importSelection( rStrm ); break;
+ case OOBIN_ID_COL: importCol( rStrm ); break;
+ case OOBIN_ID_MERGECELL: importMergeCell( rStrm ); break;
+ case OOBIN_ID_HYPERLINK: importHyperlink( rStrm ); break;
+ case OOBIN_ID_DATAVALIDATION: importDataValidation( rStrm ); break;
+ case OOBIN_ID_PAGEMARGINS: getPageSettings().importPageMargins( rStrm ); break;
+ case OOBIN_ID_PAGESETUP: getPageSettings().importPageSetup( getRelations(), rStrm ); break;
+ case OOBIN_ID_PRINTOPTIONS: getPageSettings().importPrintOptions( rStrm ); break;
+ case OOBIN_ID_HEADERFOOTER: getPageSettings().importHeaderFooter( rStrm ); break;
+ case OOBIN_ID_PICTURE: getPageSettings().importPicture( getRelations(), rStrm ); break;
+ case OOBIN_ID_BRK: importBrk( rStrm ); break;
+ case OOBIN_ID_DRAWING: importDrawing( rStrm ); break;
}
- return this;
}
-void OoxWorksheetFragment::onStartRecord( RecordInputStream& rStrm )
+// oox.core.FragmentHandler2 interface ----------------------------------------
+
+const RecordInfo* OoxWorksheetFragment::getRecordInfos() const
{
- switch( getCurrentContext() )
+ static const RecordInfo spRecInfos[] =
{
- case OOBIN_ID_SHEETPR: getWorksheetSettings().importSheetPr( rStrm ); break;
- case OOBIN_ID_DIMENSION: importDimension( rStrm ); break;
- case OOBIN_ID_SHEETPROTECTION: getWorksheetSettings().importSheetProtection( rStrm ); break;
- case OOBIN_ID_PHONETICPR: getWorksheetSettings().importPhoneticPr( rStrm ); break;
- case OOBIN_ID_SHEETFORMATPR: importSheetFormatPr( rStrm ); break;
- case OOBIN_ID_SHEETVIEW: getSheetViewSettings().importSheetView( rStrm ); break;
- case OOBIN_ID_PANE: getSheetViewSettings().importPane( rStrm ); break;
- case OOBIN_ID_SELECTION: getSheetViewSettings().importSelection( rStrm ); break;
- case OOBIN_ID_COL: importCol( rStrm ); break;
- case OOBIN_ID_MERGECELL: importMergeCell( rStrm ); break;
- case OOBIN_ID_HYPERLINK: importHyperlink( rStrm ); break;
- case OOBIN_ID_DATAVALIDATION: importDataValidation( rStrm ); break;
- case OOBIN_ID_PAGEMARGINS: getPageSettings().importPageMargins( rStrm ); break;
- case OOBIN_ID_PAGESETUP: getPageSettings().importPageSetup( rStrm ); break;
- case OOBIN_ID_PRINTOPTIONS: getPageSettings().importPrintOptions( rStrm ); break;
- case OOBIN_ID_HEADERFOOTER: getPageSettings().importHeaderFooter( rStrm ); break;
- case OOBIN_ID_BRK: importBrk( rStrm ); break;
- }
+ { OOBIN_ID_CFRULE, OOBIN_ID_CFRULE + 1 },
+ { OOBIN_ID_COLBREAKS, OOBIN_ID_COLBREAKS + 1 },
+ { OOBIN_ID_COLORSCALE, OOBIN_ID_COLORSCALE + 1 },
+ { OOBIN_ID_COLS, OOBIN_ID_COLS + 1 },
+ { OOBIN_ID_CONDFORMATTING, OOBIN_ID_CONDFORMATTING + 1 },
+ { OOBIN_ID_CUSTOMSHEETVIEW, OOBIN_ID_CUSTOMSHEETVIEW + 1 },
+ { OOBIN_ID_CUSTOMSHEETVIEWS, OOBIN_ID_CUSTOMSHEETVIEWS + 3 },
+ { OOBIN_ID_DATABAR, OOBIN_ID_DATABAR + 1 },
+ { OOBIN_ID_DATAVALIDATIONS, OOBIN_ID_DATAVALIDATIONS + 1 },
+ { OOBIN_ID_HEADERFOOTER, OOBIN_ID_HEADERFOOTER + 1 },
+ { OOBIN_ID_ICONSET, OOBIN_ID_ICONSET + 1 },
+ { OOBIN_ID_MERGECELLS, OOBIN_ID_MERGECELLS + 1 },
+ { OOBIN_ID_ROW, -1 },
+ { OOBIN_ID_ROWBREAKS, OOBIN_ID_ROWBREAKS + 1 },
+ { OOBIN_ID_SHEETDATA, OOBIN_ID_SHEETDATA + 1 },
+ { OOBIN_ID_SHEETVIEW, OOBIN_ID_SHEETVIEW + 1 },
+ { OOBIN_ID_SHEETVIEWS, OOBIN_ID_SHEETVIEWS + 1 },
+ { OOBIN_ID_TABLEPARTS, OOBIN_ID_TABLEPARTS + 2 },
+ { OOBIN_ID_WORKSHEET, OOBIN_ID_WORKSHEET + 1 },
+ { -1, -1 }
+ };
+ return spRecInfos;
}
-// oox.xls.OoxFragmentHandler interface ---------------------------------------
-
void OoxWorksheetFragment::initializeImport()
{
// initial processing in base class WorksheetHelper
initializeWorksheetImport();
// import query table fragments related to this worksheet
- RelationsRef xQueryRels = getRelations().getRelationsFromType( CREATE_RELATIONS_TYPE( "queryTable" ) );
+ RelationsRef xQueryRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATIONSTYPE( "queryTable" ) );
for( Relations::const_iterator aIt = xQueryRels->begin(), aEnd = xQueryRels->end(); aIt != aEnd; ++aIt )
importOoxFragment( new OoxQueryTableFragment( *this, getFragmentPathFromTarget( aIt->second.maTarget ) ) );
// import pivot table fragments related to this worksheet
- RelationsRef xPivotRels = getRelations().getRelationsFromType( CREATE_RELATIONS_TYPE( "pivotTable" ) );
+ RelationsRef xPivotRels = getRelations().getRelationsFromType( CREATE_OFFICEDOC_RELATIONSTYPE( "pivotTable" ) );
for( Relations::const_iterator aIt = xPivotRels->begin(), aEnd = xPivotRels->end(); aIt != aEnd; ++aIt )
importOoxFragment( new OoxPivotTableFragment( *this, getFragmentPathFromTarget( aIt->second.maTarget ) ) );
}
@@ -348,6 +399,12 @@ void OoxWorksheetFragment::finalizeImport()
// private --------------------------------------------------------------------
+void OoxWorksheetFragment::importPageSetUpPr( const AttributeList& rAttribs )
+{
+ // for whatever reason, this flag is still stored separated from the page settings
+ getPageSettings().setFitToPagesMode( rAttribs.getBool( XML_fitToPage, false ) );
+}
+
void OoxWorksheetFragment::importDimension( const AttributeList& rAttribs )
{
CellRangeAddress aRange;
@@ -372,13 +429,14 @@ void OoxWorksheetFragment::importSheetFormatPr( const AttributeList& rAttribs )
void OoxWorksheetFragment::importCol( const AttributeList& rAttribs )
{
OoxColumnData aData;
- aData.mnFirstCol = rAttribs.getInteger( XML_min, -1 );
- aData.mnLastCol = rAttribs.getInteger( XML_max, -1 );
- aData.mfWidth = rAttribs.getDouble( XML_width, 0.0 );
- aData.mnXfId = rAttribs.getInteger( XML_style, -1 );
- aData.mnLevel = rAttribs.getInteger( XML_outlineLevel, 0 );
- aData.mbHidden = rAttribs.getBool( XML_hidden, false );
- aData.mbCollapsed = rAttribs.getBool( XML_collapsed, false );
+ aData.mnFirstCol = rAttribs.getInteger( XML_min, -1 );
+ aData.mnLastCol = rAttribs.getInteger( XML_max, -1 );
+ aData.mfWidth = rAttribs.getDouble( XML_width, 0.0 );
+ aData.mnXfId = rAttribs.getInteger( XML_style, -1 );
+ aData.mnLevel = rAttribs.getInteger( XML_outlineLevel, 0 );
+ aData.mbShowPhonetic = rAttribs.getBool( XML_phonetic, false );
+ aData.mbHidden = rAttribs.getBool( XML_hidden, false );
+ aData.mbCollapsed = rAttribs.getBool( XML_collapsed, false );
// set column properties in the current sheet
setColumnData( aData );
}
@@ -390,19 +448,6 @@ void OoxWorksheetFragment::importMergeCell( const AttributeList& rAttribs )
setMergedRange( aRange );
}
-void OoxWorksheetFragment::importHyperlink( const AttributeList& rAttribs )
-{
- OoxHyperlinkData aData;
- if( getAddressConverter().convertToCellRange( aData.maRange, rAttribs.getString( XML_ref ), getSheetIndex(), true ) )
- {
- aData.maTarget = getRelations().getTargetFromRelId( rAttribs.getString( R_TOKEN( id ) ) );
- aData.maLocation = rAttribs.getString( XML_location );
- aData.maDisplay = rAttribs.getString( XML_display );
- aData.maTooltip = rAttribs.getString( XML_tooltip );
- setHyperlink( aData );
- }
-}
-
void OoxWorksheetFragment::importDataValidation( const AttributeList& rAttribs )
{
mxValData.reset( new OoxValidationData );
@@ -423,10 +468,17 @@ void OoxWorksheetFragment::importDataValidation( const AttributeList& rAttribs )
mxValData->mbAllowBlank = rAttribs.getBool( XML_allowBlank, false );
}
-void OoxWorksheetFragment::importPageSetUpPr( const AttributeList& rAttribs )
+void OoxWorksheetFragment::importHyperlink( const AttributeList& rAttribs )
{
- // for whatever reason, this flag is still stored separated from the page settings
- getPageSettings().setFitToPagesMode( rAttribs.getBool( XML_fitToPage, false ) );
+ OoxHyperlinkData aData;
+ if( getAddressConverter().convertToCellRange( aData.maRange, rAttribs.getString( XML_ref ), getSheetIndex(), true ) )
+ {
+ aData.maTarget = getRelations().getTargetFromRelId( rAttribs.getString( R_TOKEN( id ) ) );
+ aData.maLocation = rAttribs.getString( XML_location );
+ aData.maDisplay = rAttribs.getString( XML_display );
+ aData.maTooltip = rAttribs.getString( XML_tooltip );
+ setHyperlink( aData );
+ }
}
void OoxWorksheetFragment::importBrk( const AttributeList& rAttribs )
@@ -436,20 +488,16 @@ void OoxWorksheetFragment::importBrk( const AttributeList& rAttribs )
aData.mnMin = rAttribs.getInteger( XML_id, 0 );
aData.mnMax = rAttribs.getInteger( XML_id, 0 );
aData.mbManual = rAttribs.getBool( XML_man, false );
- switch( getPreviousContext() )
+ switch( getPreviousElement() )
{
case XLS_TOKEN( rowBreaks ): setPageBreak( aData, true ); break;
case XLS_TOKEN( colBreaks ): setPageBreak( aData, false ); break;
}
}
-void OoxWorksheetFragment::importDataValFormula( ApiTokenSequence& orTokens,
- const OUString& rFormula, const CellAddress& rBaseAddress )
+void OoxWorksheetFragment::importDrawing( const AttributeList& rAttribs )
{
- TokensFormulaContext aContext( true, false );
- aContext.setBaseAddress( rBaseAddress );
- getFormulaParser().importFormula( aContext, rFormula );
- orTokens = aContext.getTokens();
+ setDrawingPath( getFragmentPathFromRelId( rAttribs.getString( R_TOKEN( id ) ) ) );
}
void OoxWorksheetFragment::importDimension( RecordInputStream& rStrm )
@@ -484,20 +532,20 @@ void OoxWorksheetFragment::importCol( RecordInputStream& rStrm )
{
OoxColumnData aData;
- sal_uInt16 nWidth, nFlags;
- rStrm >> aData.mnFirstCol >> aData.mnLastCol >> nWidth;
- rStrm.skip( 2 );
- rStrm >> aData.mnXfId >> nFlags;
+ sal_Int32 nWidth;
+ sal_uInt16 nFlags;
+ rStrm >> aData.mnFirstCol >> aData.mnLastCol >> nWidth >> aData.mnXfId >> nFlags;
// column indexes are 0-based in OOBIN, but OoxColumnData expects 1-based
++aData.mnFirstCol;
++aData.mnLastCol;
// width is stored as 1/256th of a character in OOBIN, convert to entire character
- aData.mfWidth = static_cast< double >( nWidth ) / 256.0;
+ aData.mfWidth = static_cast< double >( nWidth ) / 256.0;
// equal flags in BIFF and OOBIN
- aData.mnLevel = extractValue< sal_Int32 >( nFlags, 8, 3 );
- aData.mbHidden = getFlag( nFlags, BIFF_COLINFO_HIDDEN );
- aData.mbCollapsed = getFlag( nFlags, BIFF_COLINFO_COLLAPSED );
+ aData.mnLevel = extractValue< sal_Int32 >( nFlags, 8, 3 );
+ aData.mbShowPhonetic = getFlag( nFlags, BIFF_COLINFO_SHOWPHONETIC );
+ aData.mbHidden = getFlag( nFlags, BIFF_COLINFO_HIDDEN );
+ aData.mbCollapsed = getFlag( nFlags, BIFF_COLINFO_COLLAPSED );
// set column properties in the current sheet
setColumnData( aData );
}
@@ -545,15 +593,16 @@ void OoxWorksheetFragment::importDataValidation( RecordInputStream& rStrm )
getAddressConverter().convertToCellRangeList( aData.maRanges, aRanges, getSheetIndex(), true );
// condition formula(s)
+ FormulaParser& rParser = getFormulaParser();
TokensFormulaContext aContext( true, false );
aContext.setBaseAddress( aData.maRanges.getBaseAddress() );
- getFormulaParser().importFormula( aContext, rStrm );
+ rParser.importFormula( aContext, rStrm );
aData.maTokens1 = aContext.getTokens();
- getFormulaParser().importFormula( aContext, rStrm );
+ rParser.importFormula( aContext, rStrm );
aData.maTokens2 = aContext.getTokens();
// process string list of a list validation (convert to list of string tokens)
if( (aData.mnType == XML_list) && getFlag( nFlags, BIFF_DATAVAL_STRINGLIST ) )
- getFormulaParser().convertStringToStringList( aData.maTokens1, ',', true );
+ rParser.convertStringToStringList( aData.maTokens1, ',', true );
// set validation data
setValidation( aData );
@@ -562,16 +611,21 @@ void OoxWorksheetFragment::importDataValidation( RecordInputStream& rStrm )
void OoxWorksheetFragment::importBrk( RecordInputStream& rStrm )
{
OoxPageBreakData aData;
- sal_uInt32 nFlags;
- rStrm >> aData.mnColRow >> aData.mnMin >> aData.mnMax >> nFlags;
- aData.mbManual = getFlag( nFlags, OOBIN_BRK_MANUAL );
- switch( getPreviousContext() )
+ sal_Int32 nManual;
+ rStrm >> aData.mnColRow >> aData.mnMin >> aData.mnMax >> nManual;
+ aData.mbManual = nManual != 0;
+ switch( getPreviousElement() )
{
case OOBIN_ID_ROWBREAKS: setPageBreak( aData, true ); break;
case OOBIN_ID_COLBREAKS: setPageBreak( aData, false ); break;
}
}
+void OoxWorksheetFragment::importDrawing( RecordInputStream& rStrm )
+{
+ setDrawingPath( getFragmentPathFromRelId( rStrm.readString() ) );
+}
+
// ============================================================================
BiffWorksheetFragment::BiffWorksheetFragment( const WorkbookHelper& rHelper, ISegmentProgressBarRef xProgressBar, WorksheetType eSheetType, sal_Int32 nSheet ) :
@@ -709,6 +763,7 @@ bool BiffWorksheetFragment::importFragment( BiffInputStream& rStrm )
case BIFF_ID_LABELRANGES: importLabelRanges( rStrm ); break;
case BIFF_ID_MERGEDCELLS: importMergedCells( rStrm ); break;
case BIFF_ID_OBJECTPROTECT: rWorksheetSett.importObjectProtect( rStrm ); break;
+ case BIFF_ID_PICTURE: rPageSett.importPicture( rStrm ); break;
case BIFF_ID_SAVERECALC: rWorkbookSett.importSaveRecalc( rStrm ); break;
case BIFF_ID_SCENPROTECT: rWorksheetSett.importScenProtect( rStrm ); break;
case BIFF_ID_SCL: rSheetViewSett.importScl( rStrm ); break;
@@ -747,14 +802,15 @@ void BiffWorksheetFragment::importColInfo( BiffInputStream& rStrm )
OoxColumnData aData;
// column indexes are 0-based in BIFF, but OoxColumnData expects 1-based
- aData.mnFirstCol = static_cast< sal_Int32 >( nFirstCol ) + 1;
- aData.mnLastCol = static_cast< sal_Int32 >( nLastCol ) + 1;
+ aData.mnFirstCol = static_cast< sal_Int32 >( nFirstCol ) + 1;
+ aData.mnLastCol = static_cast< sal_Int32 >( nLastCol ) + 1;
// width is stored as 1/256th of a character in BIFF, convert to entire character
- aData.mfWidth = static_cast< double >( nWidth ) / 256.0;
- aData.mnXfId = nXfId;
- aData.mnLevel = extractValue< sal_Int32 >( nFlags, 8, 3 );
- aData.mbHidden = getFlag( nFlags, BIFF_COLINFO_HIDDEN );
- aData.mbCollapsed = getFlag( nFlags, BIFF_COLINFO_COLLAPSED );
+ aData.mfWidth = static_cast< double >( nWidth ) / 256.0;
+ aData.mnXfId = nXfId;
+ aData.mnLevel = extractValue< sal_Int32 >( nFlags, 8, 3 );
+ aData.mbShowPhonetic = getFlag( nFlags, BIFF_COLINFO_SHOWPHONETIC );
+ aData.mbHidden = getFlag( nFlags, BIFF_COLINFO_HIDDEN );
+ aData.mbCollapsed = getFlag( nFlags, BIFF_COLINFO_COLLAPSED );
// set column properties in the current sheet
setColumnData( aData );
}
@@ -815,6 +871,33 @@ void BiffWorksheetFragment::importDataValidations( BiffInputStream& rStrm )
//! TODO: invalidate object id in drawing object manager
}
+namespace {
+
+OUString lclReadDataValMessage( BiffInputStream& rStrm )
+{
+ // empty strings are single NUL characters (string length is 1)
+ rStrm.enableNulChars( true );
+ OUString aMessage = rStrm.readUniString();
+ rStrm.enableNulChars( false );
+ if( (aMessage.getLength() == 1) && (aMessage[ 0 ] == 0) )
+ aMessage = OUString();
+ return aMessage;
+}
+
+ApiTokenSequence lclReadDataValFormula( BiffInputStream& rStrm, FormulaParser& rParser )
+{
+ sal_uInt16 nFmlaSize = rStrm.readuInt16();
+ rStrm.skip( 2 );
+ TokensFormulaContext aContext( true, false );
+ // enable NUL characters, string list is single tStr token with NUL separators
+ rStrm.enableNulChars( true );
+ rParser.importFormula( aContext, rStrm, &nFmlaSize );
+ rStrm.enableNulChars( false );
+ return aContext.getTokens();
+}
+
+} // namespace
+
void BiffWorksheetFragment::importDataValidation( BiffInputStream& rStrm )
{
OoxValidationData aData;
@@ -830,23 +913,19 @@ void BiffWorksheetFragment::importDataValidation( BiffInputStream& rStrm )
aData.mbShowInputMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWINPUT );
aData.mbShowErrorMsg = getFlag( nFlags, BIFF_DATAVAL_SHOWERROR );
- /* Message strings. Empty strings are single NUL characters (string length
- is 1). Do not let the stream replace them with '?' characters. */
- rStrm.setNulSubstChar( '\0' );
- aData.maInputTitle = rStrm.readUniString();
- aData.maErrorTitle = rStrm.readUniString();
- aData.maInputMessage = rStrm.readUniString();
- aData.maErrorMessage = rStrm.readUniString();
-
- /* Condition formula(s). String list is single tStr token with NUL
- separators, replace them with LF characters. */
- rStrm.setNulSubstChar( '\n' );
- readDataValFormula( aData.maTokens1, rStrm );
- readDataValFormula( aData.maTokens2, rStrm );
- rStrm.setNulSubstChar(); // back to default
+ // message strings
+ aData.maInputTitle = lclReadDataValMessage( rStrm );
+ aData.maErrorTitle = lclReadDataValMessage( rStrm );
+ aData.maInputMessage = lclReadDataValMessage( rStrm );
+ aData.maErrorMessage = lclReadDataValMessage( rStrm );
+
+ // condition formula(s)
+ FormulaParser& rParser = getFormulaParser();
+ aData.maTokens1 = lclReadDataValFormula( rStrm, rParser );
+ aData.maTokens2 = lclReadDataValFormula( rStrm, rParser );
// process string list of a list validation (convert to list of string tokens)
if( (aData.mnType == XML_list) && getFlag( nFlags, BIFF_DATAVAL_STRINGLIST ) )
- getFormulaParser().convertStringToStringList( aData.maTokens1, '\n', true );
+ rParser.convertStringToStringList( aData.maTokens1, '\0', true );
// cell range list
BinRangeList aRanges;
@@ -870,6 +949,49 @@ void BiffWorksheetFragment::importDimension( BiffInputStream& rStrm )
setDimension( aRange );
}
+namespace {
+
+OUString lclReadHyperlinkString( BiffInputStream& rStrm, sal_Int32 nChars, rtl_TextEncoding eTextEnc, bool bUnicode )
+{
+ OUString aRet;
+ if( nChars > 0 )
+ {
+ sal_uInt16 nReadChars = getLimitedValue< sal_uInt16, sal_Int32 >( nChars, 0, SAL_MAX_UINT16 );
+ // strings are NUL terminated with trailing garbage
+ rStrm.enableNulChars( true );
+ aRet = bUnicode ?
+ rStrm.readUnicodeArray( nReadChars ) :
+ rStrm.readCharArray( nReadChars, eTextEnc );
+ rStrm.enableNulChars( false );
+ // remove trailing garbage
+ sal_Int32 nNulPos = aRet.indexOf( '\0' );
+ if( nNulPos >= 0 )
+ aRet = aRet.copy( 0, nNulPos );
+ // skip remaining chars
+ sal_uInt32 nSkip = static_cast< sal_uInt32 >( nChars - nReadChars );
+ rStrm.skip( bUnicode ? (nSkip * 2) : nSkip );
+ }
+ return aRet;
+}
+
+OUString lclReadHyperlinkString( BiffInputStream& rStrm, rtl_TextEncoding eTextEnc, bool bUnicode )
+{
+ return lclReadHyperlinkString( rStrm, rStrm.readInt32(), eTextEnc, bUnicode );
+}
+
+void lclSkipHyperlinkString( BiffInputStream& rStrm, sal_Int32 nChars, bool bUnicode )
+{
+ if( nChars > 0 )
+ rStrm.skip( static_cast< sal_uInt32 >( bUnicode ? (nChars * 2) : nChars ) );
+}
+
+void lclSkipHyperlinkString( BiffInputStream& rStrm, bool bUnicode )
+{
+ lclSkipHyperlinkString( rStrm, rStrm.readInt32(), bUnicode );
+}
+
+} // namespace
+
void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm )
{
OoxHyperlinkData aData;
@@ -894,10 +1016,10 @@ void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm )
// display string
if( getFlag( nFlags, BIFF_HYPERLINK_DISPLAY ) )
- aData.maDisplay = readHyperlinkString( rStrm, true );
+ aData.maDisplay = lclReadHyperlinkString( rStrm, getTextEncoding(), true );
// target frame (ignore) !TODO: DISPLAY/FRAME - right order? (never seen them together)
if( getFlag( nFlags, BIFF_HYPERLINK_FRAME ) )
- skipHyperlinkString( rStrm, true );
+ lclSkipHyperlinkString( rStrm, true );
// target
if( getFlag( nFlags, BIFF_HYPERLINK_TARGET ) )
@@ -906,7 +1028,7 @@ void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm )
{
// UNC path
OSL_ENSURE( getFlag( nFlags, BIFF_HYPERLINK_ABS ), "BiffWorksheetFragment::importHyperlink - UNC link not absolute" );
- aData.maTarget = readHyperlinkString( rStrm, true );
+ aData.maTarget = lclReadHyperlinkString( rStrm, getTextEncoding(), true );
}
else
{
@@ -917,24 +1039,24 @@ void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm )
sal_Int16 nUpLevels;
rStrm >> nUpLevels;
OSL_ENSURE( (nUpLevels == 0) || !getFlag( nFlags, BIFF_HYPERLINK_ABS ), "BiffWorksheetFragment::importHyperlink - absolute filename with upcount" );
- OUString aShortName = readHyperlinkString( rStrm, false );
+ OUString aShortName = lclReadHyperlinkString( rStrm, getTextEncoding(), false );
if( rStrm.skip( 24 ).readInt32() > 0 )
{
sal_Int32 nStrLen = rStrm.readInt32() / 2; // byte count to char count
rStrm.skip( 2 );
- aData.maTarget = readHyperlinkString( rStrm, nStrLen, true );
+ aData.maTarget = lclReadHyperlinkString( rStrm, nStrLen, getTextEncoding(), true );
}
if( aData.maTarget.getLength() == 0 )
aData.maTarget = aShortName;
if( !getFlag( nFlags, BIFF_HYPERLINK_ABS ) )
- for( sal_uInt16 nLevel = 0; nLevel < nUpLevels; ++nLevel )
- aData.maTarget = CREATE_OUSTRING( "..\\" ) + aData.maTarget;
+ for( sal_Int16 nLevel = 0; nLevel < nUpLevels; ++nLevel )
+ aData.maTarget = CREATE_OUSTRING( "../" ) + aData.maTarget;
}
else if( aGuid == BiffHelper::maGuidUrlMoniker )
{
// URL, maybe relative and with leading '../'
sal_Int32 nStrLen = rStrm.readInt32() / 2; // byte count to char count
- aData.maTarget = readHyperlinkString( rStrm, nStrLen, true );
+ aData.maTarget = lclReadHyperlinkString( rStrm, nStrLen, getTextEncoding(), true );
}
else
{
@@ -946,7 +1068,7 @@ void BiffWorksheetFragment::importHyperlink( BiffInputStream& rStrm )
// target location
if( getFlag( nFlags, BIFF_HYPERLINK_LOC ) )
- aData.maLocation = readHyperlinkString( rStrm, true );
+ aData.maLocation = lclReadHyperlinkString( rStrm, getTextEncoding(), true );
OSL_ENSURE( rStrm.getRecLeft() == 0, "BiffWorksheetFragment::importHyperlink - unknown record data" );
@@ -1020,47 +1142,6 @@ void BiffWorksheetFragment::importStandardWidth( BiffInputStream& rStrm )
setDefaultColumnWidth( fWidth );
}
-void BiffWorksheetFragment::readDataValFormula( ApiTokenSequence& orTokens, BiffInputStream& rStrm )
-{
- sal_uInt16 nFmlaSize = rStrm.readuInt16();
- rStrm.skip( 2 );
- TokensFormulaContext aContext( true, false );
- getFormulaParser().importFormula( aContext, rStrm, &nFmlaSize );
- orTokens = aContext.getTokens();
-}
-
-OUString BiffWorksheetFragment::readHyperlinkString( BiffInputStream& rStrm, sal_Int32 nChars, bool bUnicode )
-{
- OUString aRet;
- if( nChars > 0 )
- {
- sal_uInt16 nReadChars = getLimitedValue< sal_uInt16, sal_Int32 >( nChars, 0, SAL_MAX_UINT16 );
- aRet = bUnicode ?
- rStrm.readUnicodeArray( nReadChars ) :
- rStrm.readCharArray( nReadChars, getTextEncoding() );
- // skip remaining chars
- sal_uInt32 nSkip = static_cast< sal_uInt32 >( nChars - nReadChars );
- rStrm.skip( bUnicode ? (nSkip * 2) : nSkip );
- }
- return aRet;
-}
-
-OUString BiffWorksheetFragment::readHyperlinkString( BiffInputStream& rStrm, bool bUnicode )
-{
- return readHyperlinkString( rStrm, rStrm.readInt32(), bUnicode );
-}
-
-void BiffWorksheetFragment::skipHyperlinkString( BiffInputStream& rStrm, sal_Int32 nChars, bool bUnicode )
-{
- if( nChars > 0 )
- rStrm.skip( static_cast< sal_uInt32 >( bUnicode ? (nChars * 2) : nChars ) );
-}
-
-void BiffWorksheetFragment::skipHyperlinkString( BiffInputStream& rStrm, bool bUnicode )
-{
- skipHyperlinkString( rStrm, rStrm.readInt32(), bUnicode );
-}
-
// ============================================================================
} // namespace xls