LibreOffice Module sc (master)  1
excdoc.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <sfx2/objsh.hxx>
21 #include <rtl/ustring.hxx>
22 
23 #include <document.hxx>
24 #include <scextopt.hxx>
25 #include <docoptio.hxx>
26 #include <tabprotection.hxx>
27 #include <postit.hxx>
28 #include <root.hxx>
29 
30 #include <excdoc.hxx>
31 #include <xeextlst.hxx>
32 #include <biffhelper.hxx>
33 
34 #include <xcl97rec.hxx>
35 #include <xetable.hxx>
36 #include <xelink.hxx>
37 #include <xepage.hxx>
38 #include <xeview.hxx>
39 #include <xecontent.hxx>
40 #include <xeescher.hxx>
41 #include <xepivot.hxx>
42 #include <export/SparklineExt.hxx>
43 #include <XclExpChangeTrack.hxx>
44 #include <xepivotxml.hxx>
45 #include <xedbdata.hxx>
46 #include <xlcontent.hxx>
47 #include <xlname.hxx>
48 #include <xllink.hxx>
49 #include <xltools.hxx>
50 
51 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
52 #include <com/sun/star/frame/XModel.hpp>
53 #include <o3tl/safeint.hxx>
54 #include <oox/token/tokens.hxx>
55 #include <oox/token/namespaces.hxx>
56 #include <memory>
57 
58 using namespace oox;
59 
60 static OUString lcl_GetVbaTabName( SCTAB n )
61 {
62  OUString aRet = "__VBA__" + OUString::number( static_cast<sal_uInt16>(n) );
63  return aRet;
64 }
65 
66 static void lcl_AddBookviews( XclExpRecordList<>& aRecList, const ExcTable& self )
67 {
68  aRecList.AppendNewRecord( new XclExpXmlStartElementRecord( XML_bookViews ) );
69  aRecList.AppendNewRecord( new XclExpWindow1( self.GetRoot() ) );
70  aRecList.AppendNewRecord( new XclExpXmlEndElementRecord( XML_bookViews ) );
71 }
72 
73 static void lcl_AddCalcPr( XclExpRecordList<>& aRecList, const ExcTable& self )
74 {
75  ScDocument& rDoc = self.GetDoc();
76 
77  aRecList.AppendNewRecord( new XclExpXmlStartSingleElementRecord( XML_calcPr ) );
78  // OOXTODO: calcCompleted, calcId, calcMode, calcOnSave,
79  // concurrentCalc, concurrentManualCount,
80  // forceFullCalc, fullCalcOnLoad, fullPrecision
81  aRecList.AppendNewRecord( new XclCalccount( rDoc ) );
82  aRecList.AppendNewRecord( new XclRefmode( rDoc ) );
83  aRecList.AppendNewRecord( new XclIteration( rDoc ) );
84  aRecList.AppendNewRecord( new XclDelta( rDoc ) );
86  aRecList.AppendNewRecord( new XclExpXmlEndSingleElementRecord() ); // XML_calcPr
87 }
88 
89 static void lcl_AddWorkbookProtection( XclExpRecordList<>& aRecList, const ExcTable& self )
90 {
91  aRecList.AppendNewRecord( new XclExpXmlStartSingleElementRecord( XML_workbookProtection ) );
92 
93  const ScDocProtection* pProtect = self.GetDoc().GetDocProtection();
94  if (pProtect && pProtect->isProtected())
95  {
98  aRecList.AppendNewRecord( new XclExpPassHash(pProtect->getPasswordHash(PASSHASH_XL)) );
99  }
100 
101  aRecList.AppendNewRecord( new XclExpXmlEndSingleElementRecord() ); // XML_workbookProtection
102 }
103 
104 static void lcl_AddScenariosAndFilters( XclExpRecordList<>& aRecList, const XclExpRoot& rRoot, SCTAB nScTab )
105 {
106  // Scenarios
107  aRecList.AppendNewRecord( new ExcEScenarioManager( rRoot, nScTab ) );
108  // filter
109  aRecList.AppendRecord( rRoot.GetFilterManager().CreateRecord( nScTab ) );
110 }
111 
113  XclExpRoot( rRoot ),
114  mnScTab( SCTAB_GLOBAL ),
115  nExcTab( EXC_NOTAB ),
116  mxNoteList( new XclExpNoteList )
117 {
118 }
119 
120 ExcTable::ExcTable( const XclExpRoot& rRoot, SCTAB nScTab ) :
121  XclExpRoot( rRoot ),
122  mnScTab( nScTab ),
123  nExcTab( rRoot.GetTabInfo().GetXclTab( nScTab ) ),
124  mxNoteList( new XclExpNoteList )
125 {
126 }
127 
129 {
130 }
131 
133 {
134  OSL_ENSURE( pRec, "-ExcTable::Add(): pRec is NULL!" );
135  aRecList.AppendNewRecord( pRec );
136 }
137 
139 {
141 
142  RootData& rR = GetOldRoot();
143  ScDocument& rDoc = GetDoc();
144  XclExpTabInfo& rTabInfo = GetTabInfo();
145 
146  if ( GetBiff() <= EXC_BIFF5 )
147  Add( new ExcBofW );
148  else
149  Add( new ExcBofW8 );
150 
151  sal_uInt16 nExcTabCount = rTabInfo.GetXclTabCount();
152  sal_uInt16 nCodenames = static_cast< sal_uInt16 >( GetExtDocOptions().GetCodeNameCount() );
153 
154  SfxObjectShell* pShell = GetDocShell();
155  sal_uInt16 nWriteProtHash = pShell ? pShell->GetModifyPasswordHash() : 0;
156  bool bRecommendReadOnly = pShell && pShell->IsLoadReadonly();
157 
158  if( (nWriteProtHash > 0) || bRecommendReadOnly )
160 
161  // TODO: correct codepage for BIFF5?
162  sal_uInt16 nCodePage = XclTools::GetXclCodePage( (GetBiff() <= EXC_BIFF5) ? RTL_TEXTENCODING_MS_1252 : RTL_TEXTENCODING_UNICODE );
163 
164  if( GetBiff() <= EXC_BIFF5 )
165  {
167  Add( new XclExpUInt16Record( EXC_ID_MMS, 0 ) );
171  Add( new ExcDummy_00 );
172  }
173  else
174  {
175  if( IsDocumentEncrypted() )
176  Add( new XclExpFileEncryption( GetRoot() ) );
177  Add( new XclExpInterfaceHdr( nCodePage ) );
178  Add( new XclExpUInt16Record( EXC_ID_MMS, 0 ) );
179  Add( new XclExpInterfaceEnd );
180  Add( new XclExpWriteAccess );
181  }
182 
183  Add( new XclExpFileSharing( GetRoot(), nWriteProtHash, bRecommendReadOnly ) );
184  Add( new XclExpUInt16Record( EXC_ID_CODEPAGE, nCodePage ) );
185 
186  if( GetBiff() == EXC_BIFF8 )
187  {
188  Add( new XclExpBoolRecord( EXC_ID_DSF, false ) );
190  rR.pTabId = new XclExpChTrTabId( std::max( nExcTabCount, nCodenames ) );
191  Add( rR.pTabId );
192  if( HasVbaStorage() )
193  {
194  Add( new XclObproj );
195  const OUString& rCodeName = GetExtDocOptions().GetDocSettings().maGlobCodeName;
196  if( !rCodeName.isEmpty() )
197  Add( new XclCodename( rCodeName ) );
198  }
199  }
200 
202 
203  if ( GetBiff() <= EXC_BIFF5 )
204  {
205  // global link table: EXTERNCOUNT, EXTERNSHEET, NAME
208  }
209 
210  // document protection options
212 
213  if( GetBiff() == EXC_BIFF8 )
214  {
215  Add( new XclExpProt4Rev );
216  Add( new XclExpProt4RevPass );
217  }
218 
219  lcl_AddBookviews( aRecList, *this );
220 
221  Add( new XclExpXmlStartSingleElementRecord( XML_workbookPr ) );
222  if ( GetBiff() == EXC_BIFF8 && GetOutput() != EXC_OUTPUT_BINARY )
223  {
224  Add( new XclExpBoolRecord(0x0040, false, XML_backupFile ) ); // BACKUP
225  Add( new XclExpBoolRecord(0x008D, false, XML_showObjects ) ); // HIDEOBJ
226  }
227 
228  if ( GetBiff() == EXC_BIFF8 )
229  {
230  Add( new XclExpBoolRecord(0x0040, false) ); // BACKUP
231  Add( new XclExpBoolRecord(0x008D, false) ); // HIDEOBJ
232  }
233 
234  if( GetBiff() <= EXC_BIFF5 )
235  {
236  Add( new ExcDummy_040 );
237  Add( new Exc1904( rDoc ) );
238  Add( new ExcDummy_041 );
239  }
240  else
241  {
242  // BIFF8
243  Add( new Exc1904( rDoc ) );
244  Add( new XclExpBoolRecord( 0x000E, !rDoc.GetDocOptions().IsCalcAsShown() ) );
245  Add( new XclExpBoolRecord(0x01B7, false) ); // REFRESHALL
246  Add( new XclExpBoolRecord(0x00DA, false) ); // BOOKBOOL
247  }
248 
249  // Formatting: FONT, FORMAT, XF, STYLE, PALETTE
254 
255  SCTAB nC;
256  SCTAB nScTabCount = rTabInfo.GetScTabCount();
257  if( GetBiff() <= EXC_BIFF5 )
258  {
259  // Bundlesheet
260  for( nC = 0 ; nC < nScTabCount ; nC++ )
261  if( rTabInfo.IsExportTab( nC ) )
262  {
263  ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet( rR, nC );
264  aRecList.AppendRecord( xBoundsheet );
265  rBoundsheetList.AppendRecord( xBoundsheet );
266  }
267  }
268  else
269  {
270  // Pivot Cache
272  aRecList.AppendRecord( GetPivotTableManager().CreatePivotCachesRecord() );
273 
274  // Change tracking
275  if( rDoc.GetChangeTrack() )
276  {
278  Add( rR.pUserBViewList );
279  }
280 
281  // Natural Language Formulas Flag
282  aRecList.AppendNewRecord( new XclExpBoolRecord( EXC_ID_USESELFS, GetDoc().GetDocOptions().IsLookUpColRowNames() ) );
283 
284  // Bundlesheet
285  for( nC = 0 ; nC < nScTabCount ; nC++ )
286  if( rTabInfo.IsExportTab( nC ) )
287  {
288  ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( rR, nC );
289  aRecList.AppendRecord( xBoundsheet );
290  rBoundsheetList.AppendRecord( xBoundsheet );
291  }
292 
293  OUString aTmpString;
294  for( SCTAB nAdd = 0; nC < static_cast<SCTAB>(nCodenames) ; nC++, nAdd++ )
295  {
296  aTmpString = lcl_GetVbaTabName( nAdd );
297  ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( aTmpString );
298  aRecList.AppendRecord( xBoundsheet );
299  rBoundsheetList.AppendRecord( xBoundsheet );
300  }
301 
302  // COUNTRY - in BIFF8 in workbook globals
303  Add( new XclExpCountry( GetRoot() ) );
304 
305  // link table: SUPBOOK, XCT, CRN, EXTERNNAME, EXTERNSHEET, NAME
308 
309  Add( new XclExpRecalcId );
310 
311  // MSODRAWINGGROUP per-document data
312  aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
313  // Shared string table: SST, EXTSST
315 
316  Add( new XclExpBookExt );
317  }
318 
319  Add( new ExcEof );
320 }
321 
323 {
325 
326  RootData& rR = GetOldRoot();
327  ScDocument& rDoc = GetDoc();
328  XclExpTabInfo& rTabInfo = GetTabInfo();
329 
330  sal_uInt16 nExcTabCount = rTabInfo.GetXclTabCount();
331  sal_uInt16 nCodenames = static_cast< sal_uInt16 >( GetExtDocOptions().GetCodeNameCount() );
332 
333  rR.pTabId = new XclExpChTrTabId( std::max( nExcTabCount, nCodenames ) );
334  Add( rR.pTabId );
335 
336  Add( new XclExpXmlStartSingleElementRecord( XML_workbookPr ) );
337  Add( new XclExpBoolRecord(0x0040, false, XML_backupFile ) ); // BACKUP
338  Add( new XclExpBoolRecord(0x008D, false, XML_showObjects ) ); // HIDEOBJ
339 
340  Add( new Exc1904( rDoc ) );
341  // OOXTODO: The following /workbook/workbookPr attributes are mapped
342  // to various BIFF records that are not currently supported:
343  //
344  // XML_allowRefreshQuery: QSISTAG 802h: fEnableRefresh
345  // XML_autoCompressPictures: COMPRESSPICTURES 89Bh: fAutoCompressPictures
346  // XML_checkCompatibility: COMPAT12 88Ch: fNoCompatChk
347  // XML_codeName: "Calc"
348  // XML_defaultThemeVersion: ???
349  // XML_filterPrivacy: BOOKEXT 863h: fFilterPrivacy
350  // XML_hidePivotFieldList: BOOKBOOL DAh: fHidePivotTableFList
351  // XML_promptedSolutions: BOOKEXT 863h: fBuggedUserAboutSolution
352  // XML_publishItems: NAMEPUBLISH 893h: fPublished
353  // XML_saveExternalLinkValues: BOOKBOOL DAh: fNoSavSupp
354  // XML_showBorderUnselectedTables: BOOKBOOL DAh: fHideBorderUnsels
355  // XML_showInkAnnotation: BOOKEXT 863h: fShowInkAnnotation
356  // XML_showPivotChart: PIVOTCHARTBITS 859h: fGXHide??
357  // XML_updateLinks: BOOKBOOL DAh: grbitUpdateLinks
358  Add( new XclExpXmlEndSingleElementRecord() ); // XML_workbookPr
359 
360  // Formatting: FONT, FORMAT, XF, STYLE, PALETTE
362 
363  // Change tracking
364  if( rDoc.GetChangeTrack() )
365  {
367  Add( rR.pUserBViewList );
368  }
369 
371  lcl_AddBookviews( aRecList, *this );
372 
373  // Bundlesheet
374  SCTAB nC;
375  SCTAB nScTabCount = rTabInfo.GetScTabCount();
377  for( nC = 0 ; nC < nScTabCount ; nC++ )
378  if( rTabInfo.IsExportTab( nC ) )
379  {
380  ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( rR, nC );
381  aRecList.AppendRecord( xBoundsheet );
382  rBoundsheetList.AppendRecord( xBoundsheet );
383  }
385 
386  OUString aTmpString;
387  for( SCTAB nAdd = 0; nC < static_cast<SCTAB>(nCodenames) ; nC++, nAdd++ )
388  {
389  aTmpString = lcl_GetVbaTabName( nAdd );
390  ExcBoundsheetList::RecordRefType xBoundsheet = new ExcBundlesheet8( aTmpString );
391  aRecList.AppendRecord( xBoundsheet );
392  rBoundsheetList.AppendRecord( xBoundsheet );
393  }
394 
395  // link table: SUPBOOK, XCT, CRN, EXTERNNAME, EXTERNSHEET, NAME
398 
399  lcl_AddCalcPr( aRecList, *this );
400 
401  // MSODRAWINGGROUP per-document data
402  aRecList.AppendRecord( GetObjectManager().CreateDrawingGroup() );
403  // Shared string table: SST, EXTSST
405 }
406 
407 void ExcTable::FillAsTableBinary( SCTAB nCodeNameIdx )
408 {
410 
411  RootData& rR = GetOldRoot();
412  XclBiff eBiff = GetBiff();
413  ScDocument& rDoc = GetDoc();
414 
415  OSL_ENSURE( (mnScTab >= 0) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" );
416  OSL_ENSURE( nExcTab <= o3tl::make_unsigned(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" );
417 
418  // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation)
419  if( eBiff == EXC_BIFF8 )
421 
422  // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
424 
425  //export cell notes
426  std::vector<sc::NoteEntry> aNotes;
427  rDoc.GetAllNoteEntries(aNotes);
428  for (const auto& rNote : aNotes)
429  {
430  if (rNote.maPos.Tab() != mnScTab)
431  continue;
432 
433  mxNoteList->AppendNewRecord(new XclExpNote(GetRoot(), rNote.maPos, rNote.mpNote, u""));
434  }
435 
436  // WSBOOL needs data from page settings, create it here, add it later
438  bool bFitToPages = xPageSett->GetPageData().mbFitToPages;
439 
440  if( eBiff <= EXC_BIFF5 )
441  {
442  Add( new ExcBof );
443  Add( new ExcDummy_02a );
444  }
445  else
446  {
447  Add( new ExcBof8 );
448  lcl_AddCalcPr( aRecList, *this );
449  }
450 
451  // GUTS (count & size of outline icons)
452  aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_GUTS ) );
453  // DEFROWHEIGHT, created by the cell table
455 
456  // COUNTRY - in BIFF5/7 in every worksheet
457  if( eBiff <= EXC_BIFF5 )
458  Add( new XclExpCountry( GetRoot() ) );
459 
460  Add( new XclExpWsbool( bFitToPages ) );
461 
462  // page settings (SETUP and various other records)
463  aRecList.AppendRecord( xPageSett );
464 
465  const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
466  if (pTabProtect && pTabProtect->isProtected())
467  {
468  Add( new XclExpProtection(true) );
472  Add( new XclExpPassHash(pTabProtect->getPasswordHash(PASSHASH_XL)) );
473  }
474 
475  // local link table: EXTERNCOUNT, EXTERNSHEET
476  if( eBiff <= EXC_BIFF5 )
478 
479  if ( eBiff == EXC_BIFF8 )
481 
482  // cell table: DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
484 
485  // MERGEDCELLS record, generated by the cell table
487  // label ranges
488  if( eBiff == EXC_BIFF8 )
489  Add( new XclExpLabelranges( GetRoot() ) );
490  // data validation (DVAL and list of DV records), generated by the cell table
491  aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_DVAL ) );
492 
493  if( eBiff == EXC_BIFF8 )
494  {
495  // all MSODRAWING and OBJ stuff of this sheet goes here
496  aRecList.AppendRecord( GetObjectManager().ProcessDrawing( GetSdrPage( mnScTab ) ) );
497  // pivot tables
498  aRecList.AppendRecord( GetPivotTableManager().CreatePivotTablesRecord( mnScTab ) );
499  }
500 
501  // list of NOTE records, generated by the cell table
503 
504  // sheet view settings: WINDOW2, SCL, PANE, SELECTION
506 
507  if( eBiff == EXC_BIFF8 )
508  {
509  // sheet protection options
511 
512  // enhanced protections if there are
513  if (pTabProtect)
514  {
515  const ::std::vector<ScEnhancedProtection>& rProts( pTabProtect->getEnhancedProtection());
516  for (const auto& rProt : rProts)
517  {
518  Add( new XclExpSheetEnhancedProtection( GetRoot(), rProt));
519  }
520  }
521 
522  // web queries
523  Add( new XclExpWebQueryBuffer( GetRoot() ) );
524 
525  // conditional formats
527 
528  if( HasVbaStorage() )
529  if( nCodeNameIdx < GetExtDocOptions().GetCodeNameCount() )
530  Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
531  }
532 
533  // list of HLINK records, generated by the cell table
534  aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_HLINK ) );
535 
536  // change tracking
537  if( rR.pUserBViewList )
538  {
540  for ( iter = rR.pUserBViewList->cbegin(); iter != rR.pUserBViewList->cend(); ++iter)
541  {
542  Add( new XclExpUsersViewBegin( (*iter).GetGUID(), nExcTab ) );
543  Add( new XclExpUsersViewEnd );
544  }
545  }
546 
547  // EOF
548  Add( new ExcEof );
549 }
550 
552 {
554 
555  ScDocument& rDoc = GetDoc();
556 
557  OSL_ENSURE( (mnScTab >= 0) && (mnScTab <= MAXTAB), "-ExcTable::Table(): mnScTab - no ordinary table!" );
558  OSL_ENSURE( nExcTab <= o3tl::make_unsigned(MAXTAB), "-ExcTable::Table(): nExcTab - no ordinary table!" );
559 
560  // create a new OBJ list for this sheet (may be used by notes, autofilter, data validation)
562 
563  // cell table: DEFROWHEIGHT, DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
565 
566  //export cell notes
567  std::vector<sc::NoteEntry> aNotes;
568  rDoc.GetAllNoteEntries(aNotes);
569  for (const auto& rNote : aNotes)
570  {
571  if (rNote.maPos.Tab() != mnScTab)
572  continue;
573 
574  mxNoteList->AppendNewRecord(new XclExpNote(GetRoot(), rNote.maPos, rNote.mpNote, u""));
575  }
576 
577  // WSBOOL needs data from page settings, create it here, add it later
579  XclExtLstRef xExtLst = new XclExtLst( GetRoot() );
580  bool bFitToPages = xPageSett->GetPageData().mbFitToPages;
581 
582  Color aTabColor = GetRoot().GetDoc().GetTabBgColor(mnScTab);
583  Add(new XclExpXmlSheetPr(bFitToPages, mnScTab, aTabColor, &GetFilterManager()));
584 
585  // GUTS (count & size of outline icons)
586  aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_GUTS ) );
587  // DEFROWHEIGHT, created by the cell table
589 
591 
592  // sheet view settings: WINDOW2, SCL, PANE, SELECTION
594 
595  // cell table: DEFCOLWIDTH, COLINFO, DIMENSIONS, ROW, cell records
597 
598  // list of NOTE records, generated by the cell table
599  // not in the worksheet file
600  if( mxNoteList != nullptr && !mxNoteList->IsEmpty() )
602 
603  const ScTableProtection* pTabProtect = rDoc.GetTabProtection(mnScTab);
604  if (pTabProtect && pTabProtect->isProtected())
605  Add( new XclExpSheetProtection(true, mnScTab) );
606 
608 
609  // MERGEDCELLS record, generated by the cell table
611 
612  // conditional formats
613  Add( new XclExpCondFormatBuffer( GetRoot(), xExtLst ) );
614 
615  Add(new xcl::exp::SparklineBuffer(GetRoot(), xExtLst));
616 
617  // data validation (DVAL and list of DV records), generated by the cell table
618  aRecList.AppendRecord( mxCellTable->CreateRecord( EXC_ID_DVAL ) );
619 
620  // list of HLINK records, generated by the cell table
621  XclExpRecordRef xHyperlinks = mxCellTable->CreateRecord( EXC_ID_HLINK );
622  XclExpHyperlinkList* pHyperlinkList = dynamic_cast<XclExpHyperlinkList*>(xHyperlinks.get());
623  if( pHyperlinkList != nullptr && !pHyperlinkList->IsEmpty() )
624  {
625  aRecList.AppendNewRecord( new XclExpXmlStartElementRecord( XML_hyperlinks ) );
626  aRecList.AppendRecord( xHyperlinks );
627  aRecList.AppendNewRecord( new XclExpXmlEndElementRecord( XML_hyperlinks ) );
628  }
629 
630  aRecList.AppendRecord( xPageSett );
631 
632  // all MSODRAWING and OBJ stuff of this sheet goes here
633  aRecList.AppendRecord( GetObjectManager().ProcessDrawing( GetSdrPage( mnScTab ) ) );
634 
635  XclExpImgData* pImgData = xPageSett->getGraphicExport();
636  if (pImgData)
637  aRecList.AppendRecord(pImgData);
638 
639  // <tableParts> after <drawing> and before <extLst>
640  aRecList.AppendRecord( GetTablesManager().GetTablesBySheet( mnScTab));
641 
642  aRecList.AppendRecord( xExtLst );
643 }
644 
645 void ExcTable::FillAsEmptyTable( SCTAB nCodeNameIdx )
646 {
648 
649  if( !(HasVbaStorage() && (nCodeNameIdx < GetExtDocOptions().GetCodeNameCount())) )
650  return;
651 
652  if( GetBiff() <= EXC_BIFF5 )
653  {
654  Add( new ExcBof );
655  }
656  else
657  {
658  Add( new ExcBof8 );
659  Add( new XclCodename( GetExtDocOptions().GetCodeName( nCodeNameIdx ) ) );
660  }
661  // sheet view settings: WINDOW2, SCL, PANE, SELECTION
663  Add( new ExcEof );
664 }
665 
667 {
669  if( mxCellTable )
670  mxCellTable->Finalize(true);
671  aRecList.Save( rStrm );
672 }
673 
675 {
676  if (!GetTabInfo().IsExportTab(mnScTab))
677  {
678  // header export.
680  if (mxCellTable)
681  mxCellTable->Finalize(false);
682  aRecList.SaveXml(rStrm);
683 
684  return;
685  }
686 
687  // worksheet export
688  OUString sSheetName = XclXmlUtils::GetStreamName( "xl/", "worksheets/sheet", mnScTab+1 );
689 
690  sax_fastparser::FSHelperPtr pWorksheet = rStrm.GetStreamForPath( sSheetName );
691 
692  rStrm.PushStream( pWorksheet );
693 
694  pWorksheet->startElement( XML_worksheet,
695  XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)).toUtf8(),
696  FSNS(XML_xmlns, XML_r), rStrm.getNamespaceURL(OOX_NS(officeRel)).toUtf8(),
697  FSNS(XML_xmlns, XML_xdr), "http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing", // rStrm.getNamespaceURL(OOX_NS(xm)).toUtf8() -> "http://schemas.microsoft.com/office/excel/2006/main",
698  FSNS(XML_xmlns, XML_x14), rStrm.getNamespaceURL(OOX_NS(xls14Lst)).toUtf8(),
699  FSNS(XML_xmlns, XML_xr2), rStrm.getNamespaceURL(OOX_NS(xr2)).toUtf8(),
700  FSNS(XML_xmlns, XML_mc), rStrm.getNamespaceURL(OOX_NS(mce)).toUtf8());
701 
703  if (mxCellTable)
704  mxCellTable->Finalize(false);
705  aRecList.SaveXml( rStrm );
706 
708  if (pPT)
709  pPT->SaveXml(rStrm);
710 
711  rStrm.GetCurrentStream()->endElement( XML_worksheet );
712  rStrm.PopStream();
713 }
714 
716  XclExpRoot( rRoot ),
717  aHeader( rRoot )
718 {
719 }
720 
722 {
723  maTableList.RemoveAllRecords(); // for the following assertion!
724 }
725 
727 {
729 
730  if (GetOutput() == EXC_OUTPUT_BINARY)
732  else
733  {
736  GetTablesManager().Initialize(); // Move outside conditions if we wanted to support BIFF.
737  }
738 
739  SCTAB nScTab = 0, nScTabCount = GetTabInfo().GetScTabCount();
740  SCTAB nCodeNameIdx = 0, nCodeNameCount = GetExtDocOptions().GetCodeNameCount();
741 
742  for( ; nScTab < nScTabCount; ++nScTab )
743  {
744  if( GetTabInfo().IsExportTab( nScTab ) )
745  {
746  ExcTableList::RecordRefType xTab = new ExcTable( GetRoot(), nScTab );
747  maTableList.AppendRecord( xTab );
748  if (GetOutput() == EXC_OUTPUT_BINARY)
749  xTab->FillAsTableBinary(nCodeNameIdx);
750  else
751  xTab->FillAsTableXml();
752 
753  ++nCodeNameIdx;
754  }
755  }
756  for( ; nCodeNameIdx < nCodeNameCount; ++nScTab, ++nCodeNameIdx )
757  {
758  ExcTableList::RecordRefType xTab = new ExcTable( GetRoot(), nScTab );
759  maTableList.AppendRecord( xTab );
760  xTab->FillAsEmptyTable( nCodeNameIdx );
761  }
762 
763  if ( GetBiff() == EXC_BIFF8 )
764  {
765  // complete temporary Escher stream
767 
768  // change tracking
769  if ( GetDoc().GetChangeTrack() )
771  }
772 }
773 
774 void ExcDocument::Write( SvStream& rSvStrm )
775 {
776  if( !maTableList.IsEmpty() )
777  {
778  InitializeSave();
779 
780  XclExpStream aXclStrm( rSvStrm, GetRoot() );
781 
782  aHeader.Write( aXclStrm );
783 
784  OSL_ENSURE( maTableList.GetSize() == maBoundsheetList.GetSize(),
785  "ExcDocument::Write - different number of sheets and BOUNDSHEET records" );
786 
787  for( size_t nTab = 0, nTabCount = maTableList.GetSize(); nTab < nTabCount; ++nTab )
788  {
789  // set current stream position in BOUNDSHEET record
790  ExcBoundsheetRef xBoundsheet = maBoundsheetList.GetRecord( nTab );
791  if( xBoundsheet )
792  xBoundsheet->SetStreamPos( aXclStrm.GetSvStreamPos() );
793  // write the table
794  maTableList.GetRecord( nTab )->Write( aXclStrm );
795  }
796 
797  // write the table stream positions into the BOUNDSHEET records
798  for( size_t nBSheet = 0, nBSheetCount = maBoundsheetList.GetSize(); nBSheet < nBSheetCount; ++nBSheet )
799  maBoundsheetList.GetRecord( nBSheet )->UpdateStreamPos( aXclStrm );
800  }
801  if( m_xExpChangeTrack )
802  m_xExpChangeTrack->Write();
803 }
804 
806 {
807  SfxObjectShell* pDocShell = GetDocShell();
808 
809  using namespace ::com::sun::star;
810  uno::Reference<document::XDocumentPropertiesSupplier> xDPS( pDocShell->GetModel(), uno::UNO_QUERY_THROW );
811  uno::Reference<document::XDocumentProperties> xDocProps = xDPS->getDocumentProperties();
812 
813  OUString sUserName = GetUserName();
814  sal_uInt32 nWriteProtHash = pDocShell->GetModifyPasswordHash();
815  bool bHasPasswordHash = nWriteProtHash && !sUserName.isEmpty();
816  const uno::Sequence<beans::PropertyValue> aInfo = pDocShell->GetModifyPasswordInfo();
817  OUString sAlgorithm, sSalt, sHash;
818  sal_Int32 nCount = 0;
819  for (const auto& prop : aInfo)
820  {
821  if (prop.Name == "algorithm-name")
822  prop.Value >>= sAlgorithm;
823  else if (prop.Name == "salt")
824  prop.Value >>= sSalt;
825  else if (prop.Name == "iteration-count")
826  prop.Value >>= nCount;
827  else if (prop.Name == "hash")
828  prop.Value >>= sHash;
829  }
830  bool bHasPasswordInfo
831  = sAlgorithm != "PBKDF2" && !sSalt.isEmpty() && !sHash.isEmpty() && !sUserName.isEmpty();
832  rStrm.exportDocumentProperties(xDocProps, pDocShell->IsSecurityOptOpenReadOnly()
833  && !bHasPasswordHash && !bHasPasswordInfo);
834  rStrm.exportCustomFragments();
835 
836  sax_fastparser::FSHelperPtr& rWorkbook = rStrm.GetCurrentStream();
837  rWorkbook->startElement( XML_workbook,
838  XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)).toUtf8(),
839  FSNS(XML_xmlns, XML_r), rStrm.getNamespaceURL(OOX_NS(officeRel)).toUtf8() );
840  rWorkbook->singleElement( XML_fileVersion,
841  XML_appName, "Calc"
842  // OOXTODO: XML_codeName
843  // OOXTODO: XML_lastEdited
844  // OOXTODO: XML_lowestEdited
845  // OOXTODO: XML_rupBuild
846  );
847 
848  if (bHasPasswordHash)
849  rWorkbook->singleElement(XML_fileSharing,
850  XML_userName, sUserName,
851  XML_reservationPassword, OString::number(nWriteProtHash, 16).getStr());
852  else if (bHasPasswordInfo)
853  rWorkbook->singleElement(XML_fileSharing,
854  XML_userName, sUserName,
855  XML_algorithmName, sAlgorithm.toUtf8().getStr(),
856  XML_hashValue, sHash.toUtf8().getStr(),
857  XML_saltValue, sSalt.toUtf8().getStr(),
858  XML_spinCount, OString::number(nCount).getStr());
859 
860  if( !maTableList.IsEmpty() )
861  {
862  InitializeSave();
863 
864  aHeader.WriteXml( rStrm );
865 
866  for( size_t nTab = 0, nTabCount = maTableList.GetSize(); nTab < nTabCount; ++nTab )
867  {
868  // write the table
869  maTableList.GetRecord( nTab )->WriteXml( rStrm );
870  }
871  }
872 
873  if( m_xExpChangeTrack )
874  m_xExpChangeTrack->WriteXml( rStrm );
875 
877  if (rCaches.HasCaches())
878  rCaches.SaveXml(rStrm);
879 
880  const ScCalcConfig& rCalcConfig = GetDoc().GetCalcConfig();
882 
883  // don't save "unspecified" string ref syntax ... query formula grammar
884  // and save that instead
886  {
887  eConv = GetDoc().GetAddressConvention();
888  }
889 
890  // write if it has been read|imported or explicitly changed
891  // or if ref syntax isn't what would be native for our file format
892  // i.e. ExcelA1 in this case
893  if ( rCalcConfig.mbHasStringRefSyntax ||
895  {
896  XclExtLstRef xExtLst = new XclExtLst( GetRoot() );
897  xExtLst->AddRecord( new XclExpExtCalcPr( GetRoot(), eConv ) );
898  xExtLst->SaveXml(rStrm);
899  }
900 
901  rWorkbook->endElement( XML_workbook );
902  rWorkbook.reset();
903 }
904 
905 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const sal_uInt16 EXC_ID_FNGROUPCOUNT
Definition: xlconst.hxx:200
XclExpFilterManager & GetFilterManager() const
Returns the filter manager.
Definition: xeroot.cxx:153
virtual void Save(XclExpStream &rStrm) override
Writes the complete record list.
Definition: xerecord.hxx:375
ExcTableList maTableList
Definition: excdoc.hxx:85
XclBiff
An enumeration for all Excel file format types (BIFF types).
Definition: xlconst.hxx:29
const sal_uInt16 EXC_ID_INTERFACEHDR
Definition: xlconst.hxx:214
void InitializeGlobals()
Is called when export filter starts to create the workbook global data (>=BIFF5). ...
Definition: xeroot.cxx:193
bool IsExportTab(SCTAB nScTab) const
Returns true, if the specified Calc sheet will be exported.
Definition: xelink.cxx:773
const sal_uInt16 EXC_ID_DSF
Definition: xlconst.hxx:221
This class is used to export Excel record streams.
Definition: xestream.hxx:72
const ::std::vector< ScEnhancedProtection > & getEnhancedProtection() const
SCTAB GetCodeNameCount() const
Definition: scextopt.cxx:195
static void lcl_AddWorkbookProtection(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:89
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xerecord.hxx:382
friend class ExcTable
Definition: excdoc.hxx:76
bool HasCaches() const
Definition: xepivotxml.cxx:169
void InitializeConvert()
Is called when export filter starts to create the Excel document (all BIFF versions).
Definition: xeroot.cxx:183
Provides export of the row/column label range list of a sheet.
Definition: xecontent.hxx:140
void AppendRecord(RecType *pRec)
Appends a record to the list.
Definition: xerecord.hxx:348
sheet protection state container
const_iterator cbegin()
const sal_uInt16 EXC_ID_NAME
Definition: xlname.hxx:28
XclExpPivotTableManager & GetPivotTableManager() const
Returns the pivot table manager.
Definition: xeroot.cxx:165
std::unique_ptr< XclExpChangeTrack > m_xExpChangeTrack
Definition: excdoc.hxx:88
void CreatePivotTables()
Creates all pivot tables and caches from the Calc DataPilot objects.
Definition: xepivot.cxx:1630
bool IsSecurityOptOpenReadOnly() const
This record contains the Windows country IDs for the UI and document language.
Definition: excrecds.hxx:279
css::uno::Reference< css::frame::XModel3 > GetModel() const
virtual bool isProtected() const override
void EndDocument()
Finalizes the object manager after conversion of all sheets.
Definition: xeescher.cxx:1989
Represents a NOTE record containing the relevant data of a cell note.
Definition: xeescher.hxx:342
Contains all web query records for this document.
Definition: xecontent.hxx:410
XclExpNoteListRef mxNoteList
Definition: excdoc.hxx:52
const ScExtDocSettings & GetDocSettings() const
Definition: scextopt.cxx:170
const sal_uInt16 EXC_ID2_DEFROWHEIGHT
Definition: xltable.hxx:111
XclExpRecordList aRecList
Definition: excdoc.hxx:46
ScDocument & GetDoc() const
Returns reference to the destination document (import) or source document (export).
Definition: xlroot.cxx:285
SCTAB mnScTab
Definition: excdoc.hxx:49
RootData & GetOldRoot() const
Returns old RootData struct.
Definition: xlroot.hxx:138
const sal_uInt16 BIFF_ID_OBJECTPROTECT
Definition: biffhelper.hxx:457
Beginning of User Interface Records.
Definition: xcl97rec.hxx:520
SC_DLLPUBLIC formula::FormulaGrammar::AddressConvention GetAddressConvention() const
Definition: documen3.cxx:494
Save sheetPr element and its children for xlsx export.
Definition: excrecds.hxx:303
char const sHash[]
void StartSheet()
Initializes the object manager for a new sheet.
Definition: xeescher.cxx:1960
const sal_uInt16 EXC_ID3_DIMENSIONS
Definition: xltable.hxx:33
const sal_uInt16 EXC_ID_TOOLBAREND
Definition: xlconst.hxx:210
sax_fastparser::FSHelperPtr GetStreamForPath(const OUString &rPath)
Definition: xestream.cxx:929
Access to global data from other classes.
Definition: xeroot.hxx:112
bool isOptionEnabled(Option eOption) const
XclExpChTrTabId * pTabId
Definition: root.hxx:56
OUString getNamespaceURL(sal_Int32 nNSID) const
MS Excel 4.0.
Definition: xlconst.hxx:34
const sal_uInt16 EXC_ID_MERGEDCELLS
Definition: xlcontent.hxx:33
int nCount
void PushStream(sax_fastparser::FSHelperPtr const &aStream)
Definition: xestream.cxx:918
const OUString & GetUserName() const
Returns the current user name.
Definition: xlroot.hxx:176
Contains all view settings records for a single sheet.
Definition: xeview.hxx:137
const sal_uInt16 EXC_ID_WRITEPROT
Definition: xlconst.hxx:191
Base class for all Excel records.
Definition: xerecord.hxx:38
XclExpUserBViewList * pUserBViewList
Definition: root.hxx:57
OUString maGlobCodeName
Global codename (VBA module name).
Definition: scextopt.hxx:29
sax_fastparser::FSHelperPtr & GetCurrentStream()
Definition: xestream.cxx:912
const SCTAB SCTAB_GLOBAL
An invalid Calc sheet index, for common use.
Definition: xlconst.hxx:74
static void lcl_AddScenariosAndFilters(XclExpRecordList<> &aRecList, const XclExpRoot &rRoot, SCTAB nScTab)
Definition: excdoc.cxx:104
static void lcl_AddCalcPr(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:73
void PopStream()
Definition: xestream.cxx:923
ScChangeTrack * GetChangeTrack() const
Definition: document.hxx:2485
sal_uInt16 nExcTab
Definition: excdoc.hxx:50
const sal_uInt16 EXC_ID_DVAL
Font escapement type modified?
Definition: xlcontent.hxx:98
SC_DLLPUBLIC const ScDocOptions & GetDocOptions() const
Definition: documen3.cxx:1946
End of User Interface Records.
Definition: xcl97rec.hxx:530
MS Excel 5.0, MS Excel 7.0 (95)
Definition: xlconst.hxx:35
XclOutput GetOutput() const
Returns the current output format of the importer/exporter.
Definition: xlroot.hxx:143
sal_uInt64 GetSvStreamPos() const
Returns the absolute position of the system stream.
Definition: xestream.hxx:140
const sal_uInt16 EXC_ID_FONTLIST
Definition: xestyle.hxx:37
ScExtDocOptions & GetExtDocOptions() const
Returns the extended document options.
Definition: xlroot.cxx:428
XclExpXmlPivotTableManager & GetXmlPivotTableManager()
Definition: xeroot.cxx:171
void WriteXml(XclExpXmlStream &)
Definition: excdoc.cxx:674
rtl::Reference< XclExtLst > XclExtLstRef
Definition: xeextlst.hxx:206
bool HasVbaStorage() const
Returns true, if the document contains a VBA storage.
Definition: xlroot.cxx:255
const sal_uInt16 BIFF_ID_SAVERECALC
Definition: biffhelper.hxx:496
const css::uno::Sequence< css::beans::PropertyValue > & GetModifyPasswordInfo() const
static void lcl_AddBookviews(XclExpRecordList<> &aRecList, const ExcTable &self)
Definition: excdoc.cxx:66
constexpr std::enable_if_t< std::is_signed_v< T >, std::make_unsigned_t< T > > make_unsigned(T value)
void FillAsHeaderXml(ExcBoundsheetList &rBoundsheetList)
Definition: excdoc.cxx:322
const sal_uInt16 EXC_ID_USESELFS
Definition: xlconst.hxx:218
float u
void Write(SvStream &rSvStrm)
Definition: excdoc.cxx:774
Stores the correct Excel sheet index for each Calc sheet.
Definition: xelink.hxx:61
Represents a FEATHDR (SHEETPROTECTION) record that stores sheet protection options.
Definition: xcl97rec.hxx:426
ExcDocument(const XclExpRoot &rRoot)
Definition: excdoc.cxx:715
This class contains the cell contents and more of an entire sheet.
Definition: xetable.hxx:986
sal_uInt32 GetModifyPasswordHash() const
XclExpTablesManager & GetTablesManager()
Definition: xeroot.cxx:177
XclExpTabInfo & GetTabInfo() const
Returns the buffer for Calc->Excel sheet index conversion.
Definition: xeroot.cxx:75
const SCTAB MAXTAB
Definition: address.hxx:70
static sal_uInt16 GetXclCodePage(rtl_TextEncoding eTextEnc)
Returns an Excel code page from a text encoding.
Definition: xltools.cxx:441
std::shared_ptr< FastSerializerHelper > FSHelperPtr
XclExpXmlPivotCaches & GetCaches()
Definition: xepivotxml.cxx:621
const sal_uInt16 BIFF_ID_SCENPROTECT
Definition: biffhelper.hxx:500
formula::FormulaGrammar::AddressConvention meStringRefAddressSyntax
Definition: calcconfig.hxx:53
void AppendNewRecord(RecType *pRec)
Appends a newly created record to the list.
Definition: xerecord.hxx:361
XclExpRecordRef CreateRecord(sal_uInt16 nRecId) const
Returns the reference to a record (or record list) representing a root object.
Definition: xeroot.cxx:280
void InitializeSave()
Is called before export filter starts to write the records to the stream.
Definition: xeroot.cxx:274
void ReadDoc()
Definition: excdoc.cxx:726
virtual bool isProtected() const override
ExcTable aHeader
Definition: excdoc.hxx:83
Contains all conditional formats of a specific sheet.
Definition: xecontent.hxx:293
const XclExpRoot & GetRoot() const
Returns this root instance - for code readability in derived classes.
Definition: xeroot.hxx:118
const sal_uInt16 EXC_ID_XFLIST
For internal use only.
Definition: xestyle.hxx:39
XclExpValueRecord< sal_uInt16 > XclExpUInt16Record
A record containing an unsigned 16-bit value.
Definition: xerecord.hxx:247
virtual css::uno::Sequence< sal_Int8 > getPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2=PASSHASH_UNSPECIFIED) const override
const sal_uInt16 EXC_ID_SST
Definition: xlcontent.hxx:45
Configuration options for formula interpreter.
Definition: calcconfig.hxx:43
const sal_uInt16 EXC_ID_MMS
Definition: xlconst.hxx:211
void SetCurrScTab(SCTAB nScTab)
Sets the current Calc sheet index.
Definition: xlroot.hxx:261
static OUString GetStreamName(const char *sStreamDir, const char *sStream, sal_Int32 nId)
Definition: xestream.cxx:694
SCTAB GetScTabCount() const
Returns the number of Calc sheets.
Definition: xelink.hxx:89
const sal_uInt16 EXC_ID_GUTS
Definition: xltable.hxx:147
RecType * GetRecord(size_t nPos) const
Returns reference to an existing record or empty reference on error.
Definition: xerecord.hxx:333
SC_DLLPUBLIC Color GetTabBgColor(SCTAB nTab) const
Definition: documen3.cxx:448
void FillAsHeaderBinary(ExcBoundsheetList &rBoundsheetList)
Definition: excdoc.cxx:138
const sal_uInt16 EXC_ID_PALETTE
Definition: xlstyle.hxx:199
Contains all page (print) settings records for a single sheet.
Definition: xepage.hxx:91
void UpdateStreamPos(XclExpStream &rStrm)
Definition: excrecds.cxx:299
bool mbHasStringRefSyntax
Definition: calcconfig.hxx:56
const_iterator cend()
sal_uInt16 GetXclTabCount() const
Returns the number of Excel sheets to be exported.
Definition: xelink.hxx:92
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xepivotxml.cxx:638
Represents the WINDOW1 record containing global workbook view settings.
Definition: xeview.hxx:29
Write Access User Name - This record contains the user name, which is the name you type when you inst...
Definition: xcl97rec.hxx:542
const ScCalcConfig & GetCalcConfig() const
Definition: document.hxx:2612
Provides export of bitmap data to an IMGDATA record.
Definition: xeescher.hxx:148
bool IsCalcAsShown() const
Definition: docoptio.hxx:81
A record without body.
Definition: xerecord.hxx:183
void RemoveAllRecords()
Removes all records from the list.
Definition: xerecord.hxx:372
void Add(XclExpRecordBase *pRec)
Definition: excdoc.cxx:132
void FillAsTableXml()
Definition: excdoc.cxx:551
const sal_uInt16 EXC_ID_TOOLBARHDR
Definition: xlconst.hxx:209
void InitializeTable(SCTAB nScTab)
Is called when export filter starts to create data for a single sheet (all BIFF versions).
Definition: xeroot.cxx:264
const sal_uInt16 EXC_ID_INTERFACEEND
Definition: xlconst.hxx:215
XclExpObjectManager & GetObjectManager() const
Returns the drawing object manager.
Definition: xeroot.cxx:147
const sal_uInt16 EXC_NOTAB
Definition: xlconst.hxx:72
XclBiff GetBiff() const
Returns the current BIFF version of the importer/exporter.
Definition: xlroot.hxx:141
const sal_uInt16 EXC_ID_HLINK
Definition: xlcontent.hxx:142
void Write(XclExpStream &)
Definition: excdoc.cxx:666
void FillAsTableBinary(SCTAB nCodeNameIdx)
Definition: excdoc.cxx:407
constexpr sal_Int32 FSNS(sal_Int32 namespc, sal_Int32 element)
size_t GetSize() const
Definition: xerecord.hxx:327
ExcBoundsheetList maBoundsheetList
Definition: excdoc.hxx:86
virtual ~ExcTable() override
Definition: excdoc.cxx:128
const sal_uInt16 EXC_ID_FORMATLIST
For internal use only.
Definition: xestyle.hxx:38
bool IsDocumentEncrypted() const
Definition: xeroot.cxx:298
void WriteXml(XclExpXmlStream &)
Definition: excdoc.cxx:805
XclExpRecordRef CreateRecord(SCTAB nScTab)
Returns a record object containing all filter records for the specified sheet.
Definition: excrecds.cxx:1155
void exportDocumentProperties(const css::uno::Reference< css::document::XDocumentProperties > &xProperties, bool bSecurityOptOpenReadOnly)
std::vector< XclExpUserBView >::const_iterator const_iterator
static OUString lcl_GetVbaTabName(SCTAB n)
Definition: excdoc.cxx:60
void FillAsEmptyTable(SCTAB nCodeNameIdx)
Definition: excdoc.cxx:645
Represents one EnhancedProtection feature in a FEAT record.
Definition: xcl97rec.hxx:440
const sal_uInt16 EXC_ID_CODEPAGE
Definition: xlconst.hxx:179
SfxObjectShell * GetDocShell() const
Returns the object shell of the Calc document.
Definition: xlroot.cxx:290
bool IsLoadReadonly() const
bool isOptionEnabled(Option eOption) const
XclExpCellTableRef mxCellTable
Definition: excdoc.hxx:47
XclExpXmlPivotTables * GetTablesBySheet(SCTAB nTab)
Definition: xepivotxml.cxx:626
bool IsEmpty() const
Definition: xerecord.hxx:326
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xepivotxml.cxx:133
const sal_uInt16 EXC_ID_XL9FILE
Definition: xlconst.hxx:231
ExcTable(const XclExpRoot &rRoot)
Definition: excdoc.cxx:112
SdrPage * GetSdrPage(SCTAB nScTab) const
Returns the drawing layer page of the passed sheet, if present.
Definition: xlroot.cxx:316
sal_Int16 SCTAB
Definition: types.hxx:22
Record which contains a Boolean value.
Definition: xerecord.hxx:254
virtual css::uno::Sequence< sal_Int8 > getPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2=PASSHASH_UNSPECIFIED) const override
virtual ~ExcDocument() override
Definition: excdoc.cxx:721
SC_DLLPUBLIC void GetAllNoteEntries(std::vector< sc::NoteEntry > &rNotes) const
Definition: document.cxx:6972
SC_DLLPUBLIC const ScTableProtection * GetTabProtection(SCTAB nTab) const
Definition: documen3.cxx:1922