diff options
author | Noel Power <noel.power@novell.com> | 2010-10-13 09:48:44 +0100 |
---|---|---|
committer | Noel Power <noel.power@novell.com> | 2010-10-13 10:01:42 +0100 |
commit | be3ca836cb9a7f189759571d15ec8762cfb130fd (patch) | |
tree | edd9751cdedea19453796cba3e5fbe38bc82b6ea /sc/source/filter/excel/read.cxx | |
parent | 4b33c0d44fe85064d73ebe39eba4ea2d8ed018b9 (diff) | |
parent | 6196c60c78c0a66e79d283450830e3df92f10bde (diff) |
Merge branch 'vba' fix conflics, trailing ws & tab issues
additionally the following iz patches are rolled up with this commit i#113356, i#112998 i#113955 i#113358 i#113515 i#112531 i#112596 i#112530
Diffstat (limited to 'sc/source/filter/excel/read.cxx')
-rw-r--r-- | sc/source/filter/excel/read.cxx | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/sc/source/filter/excel/read.cxx b/sc/source/filter/excel/read.cxx index e3e46add1c73..1e30cbb1e7de 100644 --- a/sc/source/filter/excel/read.cxx +++ b/sc/source/filter/excel/read.cxx @@ -832,6 +832,12 @@ FltError ImportExcel8::Read( void ) sal_Size nProgressBasePos = 0; sal_Size nProgressBaseSize = 0; + bool bSheetHasCodeName = false; + + std::vector< String > CodeNames; + + std::vector < SCTAB > nTabsWithNoCodeName; + while( eAkt != EXC_STATE_END ) { if( eAkt == EXC_STATE_BEFORE_SHEET ) @@ -913,6 +919,7 @@ FltError ImportExcel8::Read( void ) // #i62752# possible to have BIFF8 sheet without globals NeueTabelle(); eAkt = EXC_STATE_SHEET_PRE; // Shrfmla Prefetch, Row-Prefetch + bSheetHasCodeName = false; // reset aIn.StoreGlobalPosition(); } } @@ -1083,12 +1090,32 @@ FltError ImportExcel8::Read( void ) case EXC_ID2_DIMENSIONS: case EXC_ID3_DIMENSIONS: ReadDimensions(); break; - case EXC_ID_CODENAME: ReadCodeName( aIn, false ); break; + case EXC_ID_CODENAME: ReadCodeName( aIn, false ); bSheetHasCodeName = true; break; case 0x0A: // EOF [ 2345 ] + { eAkt = EXC_STATE_SHEET; + String sName; + GetDoc().GetName( GetCurrScTab(), sName ); + if ( !bSheetHasCodeName ) + { + nTabsWithNoCodeName.push_back( GetCurrScTab() ); + OSL_TRACE("No Codename for %d", GetCurrScTab() ); + } + else + { + String sCodeName; + GetDoc().GetCodeName( GetCurrScTab(), sCodeName ); + OSL_TRACE("Have CodeName %s for SheetName %s", + rtl::OUStringToOString( sCodeName, RTL_TEXTENCODING_UTF8 ).getStr(), rtl::OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr() ); + CodeNames.push_back( sCodeName ); + } + + bSheetHasCodeName = false; // reset + aIn.SeekGlobalPosition(); // und zurueck an alte Position break; + } case 0x12: SheetProtect(); break; case 0x13: SheetPassword(); break; case 0x42: Codepage(); break; // CODEPAGE [ 2345 ] @@ -1207,6 +1234,42 @@ FltError ImportExcel8::Read( void ) if( eLastErr == eERR_OK ) { + // In some strange circumstances a the codename might be missing + // # Create any missing Sheet CodeNames + std::vector < SCTAB >::iterator it_end = nTabsWithNoCodeName.end(); + for ( std::vector < SCTAB >::iterator it = nTabsWithNoCodeName.begin(); it != it_end; ++it ) + { + bool bGotCodeName = false; + SCTAB nTab = 1; + OSL_TRACE("Trying to find suitable codename for %d", *it ); + while ( true ) + { + String sTmpName( RTL_CONSTASCII_USTRINGPARAM("Sheet" ) ); + sTmpName += String::CreateFromInt32( sal_Int32(nTab++) ); + std::vector< String >::iterator codeName_It = CodeNames.begin(); + std::vector< String >::iterator codeName_It_end = CodeNames.end(); + // search for codename + for ( ; codeName_It != codeName_It_end; ++codeName_It ) + { + if ( *codeName_It == sTmpName ) + break; + } + + if ( codeName_It == codeName_It_end ) // generated codename not found + { + OSL_TRACE("Using generated codename %s", rtl::OUStringToOString( sTmpName, RTL_TEXTENCODING_UTF8 ).getStr() ); + // Set new codename + GetDoc().SetCodeName( *it, sTmpName ); + // Record newly used codename + CodeNames.push_back( sTmpName ); + // Record those we have created so they can be created in + // basic + AutoGeneratedCodeNames.push_back( sTmpName ); + break; + } + } + + } // #i45843# Convert pivot tables before calculation, so they are available // for the GETPIVOTDATA function. if( GetBiff() == EXC_BIFF8 ) |