LibreOffice Module sc (master)  1
xecontent.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 <memory>
21 #include <xecontent.hxx>
22 
23 #include <vector>
24 #include <algorithm>
25 #include <string_view>
26 
27 #include <com/sun/star/frame/XModel.hpp>
28 #include <com/sun/star/sheet/XAreaLinks.hpp>
29 #include <com/sun/star/sheet/XAreaLink.hpp>
30 #include <com/sun/star/sheet/TableValidationVisibility.hpp>
31 #include <com/sun/star/beans/XPropertySet.hpp>
32 #include <sfx2/objsh.hxx>
33 #include <tools/urlobj.hxx>
34 #include <formula/grammar.hxx>
35 #include <scitems.hxx>
36 #include <editeng/flditem.hxx>
37 #include <document.hxx>
38 #include <validat.hxx>
39 #include <unonames.hxx>
40 #include <convuno.hxx>
41 #include <rangenam.hxx>
42 #include <tokenarray.hxx>
43 #include <stlpool.hxx>
44 #include <patattr.hxx>
45 #include <fapihelper.hxx>
46 #include <xehelper.hxx>
47 #include <xestyle.hxx>
48 #include <xename.hxx>
49 #include <xlcontent.hxx>
50 #include <xltools.hxx>
51 #include <xeformula.hxx>
52 #include <rtl/uuid.h>
53 #include <sal/log.hxx>
54 #include <oox/export/utils.hxx>
55 #include <oox/token/namespaces.hxx>
57 #include <comphelper/string.hxx>
58 
59 using namespace ::oox;
60 
61 using ::com::sun::star::uno::Reference;
62 using ::com::sun::star::uno::UNO_QUERY;
63 using ::com::sun::star::table::CellRangeAddress;
64 using ::com::sun::star::sheet::XAreaLinks;
65 using ::com::sun::star::sheet::XAreaLink;
66 
67 // Shared string table ========================================================
68 
69 namespace {
70 
72 struct XclExpHashEntry
73 {
74  const XclExpString* mpString;
75  sal_uInt32 mnSstIndex;
76  explicit XclExpHashEntry( const XclExpString* pString, sal_uInt32 nSstIndex ) :
77  mpString( pString ), mnSstIndex( nSstIndex ) {}
78 };
79 
81 struct XclExpHashEntrySWO
82 {
83  bool operator()( const XclExpHashEntry& rLeft, const XclExpHashEntry& rRight ) const
84  { return *rLeft.mpString < *rRight.mpString; }
85 };
86 
87 }
88 
93 {
94 public:
95  explicit XclExpSstImpl();
96 
98  sal_uInt32 Insert( XclExpStringRef xString );
99 
101  void Save( XclExpStream& rStrm );
102  void SaveXml( XclExpXmlStream& rStrm );
103 
104 private:
105  typedef ::std::vector< XclExpHashEntry > XclExpHashVec;
106 
107  std::vector< XclExpStringRef > maStringVector;
108  std::vector< XclExpHashVec >
110  sal_uInt32 mnTotal;
111  sal_uInt32 mnSize;
112 };
113 
114 const sal_uInt32 EXC_SST_HASHTABLE_SIZE = 2048;
115 
117  maHashTab( EXC_SST_HASHTABLE_SIZE ),
118  mnTotal( 0 ),
119  mnSize( 0 )
120 {
121 }
122 
124 {
125  OSL_ENSURE( xString, "XclExpSstImpl::Insert - empty pointer not allowed" );
126  if( !xString )
127  xString.reset( new XclExpString );
128 
129  ++mnTotal;
130  sal_uInt32 nSstIndex = 0;
131 
132  // calculate hash value in range [0,EXC_SST_HASHTABLE_SIZE)
133  sal_uInt16 nHash = xString->GetHash();
134  nHash = (nHash ^ (nHash / EXC_SST_HASHTABLE_SIZE)) % EXC_SST_HASHTABLE_SIZE;
135 
136  XclExpHashVec& rVec = maHashTab[ nHash ];
137  XclExpHashEntry aEntry( xString.get(), mnSize );
138  XclExpHashVec::iterator aIt = ::std::lower_bound( rVec.begin(), rVec.end(), aEntry, XclExpHashEntrySWO() );
139  if( (aIt == rVec.end()) || (*aIt->mpString != *xString) )
140  {
141  nSstIndex = mnSize;
142  maStringVector.push_back( xString );
143  rVec.insert( aIt, aEntry );
144  ++mnSize;
145  }
146  else
147  {
148  nSstIndex = aIt->mnSstIndex;
149  }
150 
151  return nSstIndex;
152 }
153 
155 {
156  if( maStringVector.empty() )
157  return;
158 
159  SvMemoryStream aExtSst( 8192 );
160 
161  sal_uInt32 nBucket = mnSize;
162  while( nBucket > 0x0100 )
163  nBucket /= 2;
164 
165  sal_uInt16 nPerBucket = llimit_cast< sal_uInt16 >( nBucket, 8 );
166  sal_uInt16 nBucketIndex = 0;
167 
168  // *** write the SST record ***
169 
170  rStrm.StartRecord( EXC_ID_SST, 8 );
171 
172  rStrm << mnTotal << mnSize;
173  for (auto const& elem : maStringVector)
174  {
175  if( !nBucketIndex )
176  {
177  // write bucket info before string to get correct record position
178  sal_uInt32 nStrmPos = static_cast< sal_uInt32 >( rStrm.GetSvStreamPos() );
179  sal_uInt16 nRecPos = rStrm.GetRawRecPos() + 4;
180  aExtSst.WriteUInt32( nStrmPos ) // stream position
181  .WriteUInt16( nRecPos ) // position from start of SST or CONTINUE
182  .WriteUInt16( 0 ); // reserved
183  }
184 
185  rStrm << *elem;
186 
187  if( ++nBucketIndex == nPerBucket )
188  nBucketIndex = 0;
189  }
190 
191  rStrm.EndRecord();
192 
193  // *** write the EXTSST record ***
194 
195  rStrm.StartRecord( EXC_ID_EXTSST, 0 );
196 
197  rStrm << nPerBucket;
198  rStrm.SetSliceSize( 8 ); // size of one bucket info
199  aExtSst.Seek( STREAM_SEEK_TO_BEGIN );
200  rStrm.CopyFromStream( aExtSst );
201 
202  rStrm.EndRecord();
203 }
204 
206 {
207  if( maStringVector.empty() )
208  return;
209 
211  "xl/sharedStrings.xml",
212  "sharedStrings.xml",
213  rStrm.GetCurrentStream()->getOutputStream(),
214  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
215  oox::getRelationship(Relationship::SHAREDSTRINGS));
216  rStrm.PushStream( pSst );
217 
218  pSst->startElement( XML_sst,
219  XML_xmlns, rStrm.getNamespaceURL(OOX_NS(xls)),
220  XML_count, OString::number(mnTotal),
221  XML_uniqueCount, OString::number(mnSize) );
222 
223  for (auto const& elem : maStringVector)
224  {
225  pSst->startElement(XML_si);
226  elem->WriteXml( rStrm );
227  pSst->endElement( XML_si );
228  }
229 
230  pSst->endElement( XML_sst );
231 
232  rStrm.PopStream();
233 }
234 
236  mxImpl( new XclExpSstImpl )
237 {
238 }
239 
241 {
242 }
243 
244 sal_uInt32 XclExpSst::Insert( const XclExpStringRef& xString )
245 {
246  return mxImpl->Insert( xString );
247 }
248 
250 {
251  mxImpl->Save( rStrm );
252 }
253 
255 {
256  mxImpl->SaveXml( rStrm );
257 }
258 
259 // Merged cells ===============================================================
260 
262  XclExpRoot( rRoot )
263 {
264 }
265 
266 void XclExpMergedcells::AppendRange( const ScRange& rRange, sal_uInt32 nBaseXFId )
267 {
268  if( GetBiff() == EXC_BIFF8 )
269  {
270  maMergedRanges.push_back( rRange );
271  maBaseXFIds.push_back( nBaseXFId );
272  }
273 }
274 
275 sal_uInt32 XclExpMergedcells::GetBaseXFId( const ScAddress& rPos ) const
276 {
277  OSL_ENSURE( maBaseXFIds.size() == maMergedRanges.size(), "XclExpMergedcells::GetBaseXFId - invalid lists" );
278  ScfUInt32Vec::const_iterator aIt = maBaseXFIds.begin();
279  ScRangeList& rNCRanges = const_cast< ScRangeList& >( maMergedRanges );
280  for ( size_t i = 0, nRanges = rNCRanges.size(); i < nRanges; ++i, ++aIt )
281  {
282  const ScRange & rScRange = rNCRanges[ i ];
283  if( rScRange.In( rPos ) )
284  return *aIt;
285  }
286  return EXC_XFID_NOTFOUND;
287 }
288 
290 {
291  if( GetBiff() != EXC_BIFF8 )
292  return;
293 
294  XclRangeList aXclRanges;
295  GetAddressConverter().ConvertRangeList( aXclRanges, maMergedRanges, true );
296  size_t nFirstRange = 0;
297  size_t nRemainingRanges = aXclRanges.size();
298  while( nRemainingRanges > 0 )
299  {
300  size_t nRangeCount = ::std::min< size_t >( nRemainingRanges, EXC_MERGEDCELLS_MAXCOUNT );
301  rStrm.StartRecord( EXC_ID_MERGEDCELLS, 2 + 8 * nRangeCount );
302  aXclRanges.WriteSubList( rStrm, nFirstRange, nRangeCount );
303  rStrm.EndRecord();
304  nFirstRange += nRangeCount;
305  nRemainingRanges -= nRangeCount;
306  }
307 }
308 
310 {
311  size_t nCount = maMergedRanges.size();
312  if( !nCount )
313  return;
314  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
315  rWorksheet->startElement(XML_mergeCells, XML_count, OString::number(nCount));
316  for( size_t i = 0; i < nCount; ++i )
317  {
318  const ScRange & rRange = maMergedRanges[ i ];
319  rWorksheet->singleElement(XML_mergeCell, XML_ref,
320  XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), rRange));
321  }
322  rWorksheet->endElement( XML_mergeCells );
323 }
324 
325 // Hyperlinks =================================================================
326 
327 XclExpHyperlink::XclExpHyperlink( const XclExpRoot& rRoot, const SvxURLField& rUrlField, const ScAddress& rScPos ) :
329  maScPos( rScPos ),
330  mxVarData( new SvMemoryStream ),
331  mnFlags( 0 )
332 {
333  const OUString& rUrl = rUrlField.GetURL();
334  const OUString& rRepr = rUrlField.GetRepresentation();
335  INetURLObject aUrlObj( rUrl );
336  const INetProtocol eProtocol = aUrlObj.GetProtocol();
337  bool bWithRepr = !rRepr.isEmpty();
338  XclExpStream aXclStrm( *mxVarData, rRoot ); // using in raw write mode.
339 
340  // description
341  if( bWithRepr )
342  {
343  XclExpString aDescr( rRepr, XclStrFlags::ForceUnicode, 255 );
344  aXclStrm << sal_uInt32( aDescr.Len() + 1 ); // string length + 1 trailing zero word
345  aDescr.WriteBuffer( aXclStrm ); // NO flags
346  aXclStrm << sal_uInt16( 0 );
347 
349  m_Repr = rRepr;
350  }
351 
352  // file link or URL
353  if( eProtocol == INetProtocol::File || eProtocol == INetProtocol::Smb )
354  {
355  sal_uInt16 nLevel;
356  bool bRel;
357  OUString aFileName(
358  BuildFileName(nLevel, bRel, rUrl, rRoot, rRoot.GetOutput() == EXC_OUTPUT_XML_2007));
359 
360  if( eProtocol == INetProtocol::Smb )
361  {
362  // #n382718# (and #n261623#) Convert smb notation to '\\'
363  aFileName = aUrlObj.GetMainURL( INetURLObject::DecodeMechanism::NONE );
364  aFileName = aFileName.copy(4); // skip the 'smb:' part
365  aFileName = aFileName.replace('/', '\\');
366  }
367 
368  if( !bRel )
371 
372  OString aAsciiLink(OUStringToOString(aFileName,
373  rRoot.GetTextEncoding()));
374  XclExpString aLink( aFileName, XclStrFlags::ForceUnicode, 255 );
375  aXclStrm << XclTools::maGuidFileMoniker
376  << nLevel
377  << sal_uInt32( aAsciiLink.getLength() + 1 ); // string length + 1 trailing zero byte
378  aXclStrm.Write( aAsciiLink.getStr(), aAsciiLink.getLength() );
379  aXclStrm << sal_uInt8( 0 )
380  << sal_uInt32( 0xDEADFFFF );
381  aXclStrm.WriteZeroBytes( 20 );
382  aXclStrm << sal_uInt32( aLink.GetBufferSize() + 6 )
383  << sal_uInt32( aLink.GetBufferSize() ) // byte count, not string length
384  << sal_uInt16( 0x0003 );
385  aLink.WriteBuffer( aXclStrm ); // NO flags
386 
387  if (m_Repr.isEmpty())
388  m_Repr = aFileName;
389 
391 
392  if( bRel )
393  {
394  for( int i = 0; i < nLevel; ++i )
395  msTarget = "../" + msTarget;
396  }
397  else
398  {
399  // ooxml expects the file:/// part appended ( or at least
400  // ms2007 does, ms2010 is more tolerant )
401  msTarget = "file:///" + msTarget;
402  }
403  }
404  else if( eProtocol != INetProtocol::NotValid )
405  {
406  XclExpString aUrl( aUrlObj.GetURLNoMark(), XclStrFlags::ForceUnicode, 255 );
407  aXclStrm << XclTools::maGuidUrlMoniker
408  << sal_uInt32( aUrl.GetBufferSize() + 2 ); // byte count + 1 trailing zero word
409  aUrl.WriteBuffer( aXclStrm ); // NO flags
410  aXclStrm << sal_uInt16( 0 );
411 
413  if (m_Repr.isEmpty())
414  m_Repr = rUrl;
415 
417  }
418  else if( !rUrl.isEmpty() && rUrl[0] == '#' ) // hack for #89066#
419  {
420  OUString aTextMark( rUrl.copy( 1 ) );
421 
422  sal_Int32 nSepPos = aTextMark.lastIndexOf( '!' );
423  sal_Int32 nPointPos = aTextMark.lastIndexOf( '.' );
424  // last dot is the separator, if there is no ! after it
425  if(nSepPos < nPointPos)
426  {
427  nSepPos = nPointPos;
428  aTextMark = aTextMark.replaceAt( nSepPos, 1, "!" );
429  }
430 
431  if(nSepPos != -1)
432  {
433  OUString aSheetName( aTextMark.copy(0, nSepPos));
434 
435  if ( aSheetName.indexOf(' ') != -1 && aSheetName[0] != '\'')
436  {
437  aTextMark = "'" + aTextMark.replaceAt(nSepPos, 0, "'");
438  }
439  }
440 
441  mxTextMark.reset( new XclExpString( aTextMark, XclStrFlags::ForceUnicode, 255 ) );
442  }
443 
444  // text mark
445  if( !mxTextMark && aUrlObj.HasMark() )
446  mxTextMark.reset( new XclExpString( aUrlObj.GetMark(), XclStrFlags::ForceUnicode, 255 ) );
447 
448  if( mxTextMark )
449  {
450  aXclStrm << sal_uInt32( mxTextMark->Len() + 1 ); // string length + 1 trailing zero word
451  mxTextMark->WriteBuffer( aXclStrm ); // NO flags
452  aXclStrm << sal_uInt16( 0 );
453 
455 
456  OUString location = XclXmlUtils::ToOUString(*mxTextMark);
457  if (!location.isEmpty() && msTarget.endsWith(OUString("#" + location)))
458  msTarget = msTarget.copy(0, msTarget.getLength() - location.getLength() - 1);
459  }
460 
461  SetRecSize( 32 + mxVarData->Tell() );
462 }
463 
465 {
466 }
467 
469  sal_uInt16& rnLevel, bool& rbRel, const OUString& rUrl, const XclExpRoot& rRoot, bool bEncoded )
470 {
471  INetURLObject aURLObject( rUrl );
472  OUString aDosName(bEncoded ? aURLObject.GetMainURL(INetURLObject::DecodeMechanism::ToIUri)
473  : aURLObject.getFSysPath(FSysStyle::Dos));
474  rnLevel = 0;
475  rbRel = rRoot.IsRelUrl();
476 
477  if( rbRel )
478  {
479  // try to convert to relative file name
480  OUString aTmpName( aDosName );
481  aDosName = INetURLObject::GetRelURL( rRoot.GetBasePath(), rUrl,
484 
485  if (aDosName.startsWith(INET_FILE_SCHEME))
486  {
487  // not converted to rel -> back to old, return absolute flag
488  aDosName = aTmpName;
489  rbRel = false;
490  }
491  else if (aDosName.startsWith("./"))
492  {
493  aDosName = aDosName.copy(2);
494  }
495  else
496  {
497  while (aDosName.startsWith("../"))
498  {
499  aDosName = aDosName.copy(3);
500  ++rnLevel;
501  }
502  }
503  }
504  return aDosName;
505 }
506 
508 {
509  sal_uInt16 nXclCol = static_cast< sal_uInt16 >( maScPos.Col() );
510  sal_uInt16 nXclRow = static_cast< sal_uInt16 >( maScPos.Row() );
511  rStrm << nXclRow << nXclRow << nXclCol << nXclCol;
512  WriteEmbeddedData( rStrm );
513 }
514 
516 {
517  rStrm << XclTools::maGuidStdLink
518  << sal_uInt32( 2 )
519  << mnFlags;
520 
522  rStrm.CopyFromStream( *mxVarData );
523 }
524 
526 {
527  OUString sId = !msTarget.isEmpty() ? rStrm.addRelation( rStrm.GetCurrentStream()->getOutputStream(),
528  oox::getRelationship(Relationship::HYPERLINK),
529  msTarget, true ) : OUString();
530  std::optional<OString> sTextMark;
531  if (mxTextMark)
532  sTextMark = XclXmlUtils::ToOString(*mxTextMark);
533  rStrm.GetCurrentStream()->singleElement( XML_hyperlink,
534  XML_ref, XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), maScPos),
535  FSNS( XML_r, XML_id ), sax_fastparser::UseIf(sId, !sId.isEmpty()),
536  XML_location, sTextMark,
537  // OOXTODO: XML_tooltip, from record HLinkTooltip 800h wzTooltip
538  XML_display, m_Repr );
539 }
540 
541 // Label ranges ===============================================================
542 
544  XclExpRoot( rRoot )
545 {
546  SCTAB nScTab = GetCurrScTab();
547  // row label ranges
548  FillRangeList( maRowRanges, rRoot.GetDoc().GetRowNameRangesRef(), nScTab );
549  // row labels only over 1 column (restriction of Excel97/2000/XP)
550  for ( size_t i = 0, nRanges = maRowRanges.size(); i < nRanges; ++i )
551  {
552  ScRange & rScRange = maRowRanges[ i ];
553  if( rScRange.aStart.Col() != rScRange.aEnd.Col() )
554  rScRange.aEnd.SetCol( rScRange.aStart.Col() );
555  }
556  // col label ranges
557  FillRangeList( maColRanges, rRoot.GetDoc().GetColNameRangesRef(), nScTab );
558 }
559 
561  const ScRangePairListRef& xLabelRangesRef, SCTAB nScTab )
562 {
563  for ( size_t i = 0, nPairs = xLabelRangesRef->size(); i < nPairs; ++i )
564  {
565  const ScRangePair & rRangePair = (*xLabelRangesRef)[i];
566  const ScRange& rScRange = rRangePair.GetRange( 0 );
567  if( rScRange.aStart.Tab() == nScTab )
568  rScRanges.push_back( rScRange );
569  }
570 }
571 
573 {
575  XclRangeList aRowXclRanges, aColXclRanges;
576  rAddrConv.ConvertRangeList( aRowXclRanges, maRowRanges, false );
577  rAddrConv.ConvertRangeList( aColXclRanges, maColRanges, false );
578  if( !aRowXclRanges.empty() || !aColXclRanges.empty() )
579  {
580  rStrm.StartRecord( EXC_ID_LABELRANGES, 4 + 8 * (aRowXclRanges.size() + aColXclRanges.size()) );
581  rStrm << aRowXclRanges << aColXclRanges;
582  rStrm.EndRecord();
583  }
584 }
585 
586 // Conditional formatting ====================================================
587 
589 class XclExpCFImpl : protected XclExpRoot
590 {
591 public:
592  explicit XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin );
593 
595  void WriteBody( XclExpStream& rStrm );
596  void SaveXml( XclExpXmlStream& rStrm );
597 
598 private:
606  sal_uInt32 mnFontColorId;
609  sal_Int32 mnPriority;
610  bool mbFontUsed;
613  bool mbColorUsed;
618  bool mbPattUsed;
620 };
621 
622 XclExpCFImpl::XclExpCFImpl( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin ) :
623  XclExpRoot( rRoot ),
624  mrFormatEntry( rFormatEntry ),
625  maOrigin( aOrigin ),
626  mnFontColorId( 0 ),
628  mnOperator( EXC_CF_CMP_NONE ),
629  mnPriority( nPriority ),
630  mbFontUsed( false ),
631  mbHeightUsed( false ),
632  mbWeightUsed( false ),
633  mbColorUsed( false ),
634  mbUnderlUsed( false ),
635  mbItalicUsed( false ),
636  mbStrikeUsed( false ),
637  mbBorderUsed( false ),
638  mbPattUsed( false ),
639  mbFormula2(false)
640 {
641  // Set correct tab for maOrigin from GetValidSrcPos() of the format-entry.
642  ScAddress aValidSrcPos = mrFormatEntry.GetValidSrcPos();
643  maOrigin.SetTab(aValidSrcPos.Tab());
644 
645  /* Get formatting attributes here, and not in WriteBody(). This is needed to
646  correctly insert all colors into the palette. */
647 
648  if( SfxStyleSheetBase* pStyleSheet = GetDoc().GetStyleSheetPool()->Find( mrFormatEntry.GetStyle(), SfxStyleFamily::Para ) )
649  {
650  const SfxItemSet& rItemSet = pStyleSheet->GetItemSet();
651 
652  // font
655  mbColorUsed = ScfTools::CheckItem( rItemSet, ATTR_FONT_COLOR, true );
660  if( mbFontUsed )
661  {
662  vcl::Font aFont;
663  ScPatternAttr::GetFont( aFont, rItemSet, SC_AUTOCOL_RAW );
664  maFontData.FillFromVclFont( aFont );
666  }
667 
668  // border
669  mbBorderUsed = ScfTools::CheckItem( rItemSet, ATTR_BORDER, true );
670  if( mbBorderUsed )
671  maBorder.FillFromItemSet( rItemSet, GetPalette(), GetBiff() );
672 
673  // pattern
674  mbPattUsed = ScfTools::CheckItem( rItemSet, ATTR_BACKGROUND, true );
675  if( mbPattUsed )
676  maArea.FillFromItemSet( rItemSet, GetPalette(), true );
677  }
678 
679  // *** mode and comparison operator ***
680 
681  switch( rFormatEntry.GetOperation() )
682  {
685  break;
688  mbFormula2 = true;
689  break;
692  mbFormula2 = true;
693  break;
696  break;
699  break;
702  break;
705  break;
708  break;
711  break;
714  break;
715  default:
717  OSL_FAIL( "XclExpCF::WriteBody - unknown condition type" );
718  }
719 }
720 
722 {
723 
724  // *** formulas ***
725 
727 
728  std::unique_ptr< ScTokenArray > xScTokArr( mrFormatEntry.CreateFlatCopiedTokenArray( 0 ) );
729  mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_CONDFMT, *xScTokArr );
730 
731  if (mbFormula2)
732  {
733  xScTokArr = mrFormatEntry.CreateFlatCopiedTokenArray( 1 );
734  mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_CONDFMT, *xScTokArr );
735  }
736 
737  // *** mode and comparison operator ***
738 
739  rStrm << mnType << mnOperator;
740 
741  // *** formula sizes ***
742 
743  sal_uInt16 nFmlaSize1 = mxTokArr1 ? mxTokArr1->GetSize() : 0;
744  sal_uInt16 nFmlaSize2 = mxTokArr2 ? mxTokArr2->GetSize() : 0;
745  rStrm << nFmlaSize1 << nFmlaSize2;
746 
747  // *** formatting blocks ***
748 
750  {
751  sal_uInt32 nFlags = EXC_CF_ALLDEFAULT;
752 
756 
757  // attributes used -> set flags to 0.
760 
761  rStrm << nFlags << sal_uInt16( 0 );
762 
763  if( mbFontUsed )
764  {
765  // font height, 0xFFFFFFFF indicates unused
766  sal_uInt32 nHeight = mbHeightUsed ? maFontData.mnHeight : 0xFFFFFFFF;
767  // font style: italic and strikeout
768  sal_uInt32 nStyle = 0;
771  // font color, 0xFFFFFFFF indicates unused
772  sal_uInt32 nColor = mbColorUsed ? GetPalette().GetColorIndex( mnFontColorId ) : 0xFFFFFFFF;
773  // font used flags for italic, weight, and strikeout -> 0 = used, 1 = default
774  sal_uInt32 nFontFlags1 = EXC_CF_FONT_ALLDEFAULT;
775  ::set_flag( nFontFlags1, EXC_CF_FONT_STYLE, !(mbItalicUsed || mbWeightUsed) );
777  // font used flag for underline -> 0 = used, 1 = default
778  sal_uInt32 nFontFlags3 = mbUnderlUsed ? 0 : EXC_CF_FONT_UNDERL;
779 
780  rStrm.WriteZeroBytesToRecord( 64 );
781  rStrm << nHeight
782  << nStyle
786  rStrm.WriteZeroBytesToRecord( 3 );
787  rStrm << nColor
788  << sal_uInt32( 0 )
789  << nFontFlags1
790  << EXC_CF_FONT_ESCAPEM // escapement never used -> set the flag
791  << nFontFlags3;
792  rStrm.WriteZeroBytesToRecord( 16 );
793  rStrm << sal_uInt16( 1 ); // must be 1
794  }
795 
796  if( mbBorderUsed )
797  {
798  sal_uInt16 nLineStyle = 0;
799  sal_uInt32 nLineColor = 0;
801  maBorder.FillToCF8( nLineStyle, nLineColor );
802  rStrm << nLineStyle << nLineColor << sal_uInt16( 0 );
803  }
804 
805  if( mbPattUsed )
806  {
807  sal_uInt16 nPattern = 0, nColor = 0;
809  maArea.FillToCF8( nPattern, nColor );
810  rStrm << nPattern << nColor;
811  }
812  }
813  else
814  {
815  // no data blocks at all
816  rStrm << sal_uInt32( 0 ) << sal_uInt16( 0 );
817  }
818 
819  // *** formulas ***
820 
821  if( mxTokArr1 )
822  mxTokArr1->WriteArray( rStrm );
823  if( mxTokArr2 )
824  mxTokArr2->WriteArray( rStrm );
825 }
826 
827 namespace {
828 
829 const char* GetOperatorString(ScConditionMode eMode, bool& bFrmla2)
830 {
831  const char *pRet = nullptr;
832  switch(eMode)
833  {
835  pRet = "equal";
836  break;
838  pRet = "lessThan";
839  break;
841  pRet = "greaterThan";
842  break;
844  pRet = "lessThanOrEqual";
845  break;
847  pRet = "greaterThanOrEqual";
848  break;
850  pRet = "notEqual";
851  break;
853  bFrmla2 = true;
854  pRet = "between";
855  break;
857  bFrmla2 = true;
858  pRet = "notBetween";
859  break;
861  pRet = nullptr;
862  break;
864  pRet = nullptr;
865  break;
867  pRet = "beginsWith";
868  break;
870  pRet = "endsWith";
871  break;
873  pRet = "containsText";
874  break;
876  pRet = "notContains";
877  break;
879  break;
881  default:
882  break;
883  }
884  return pRet;
885 }
886 
887 const char* GetTypeString(ScConditionMode eMode)
888 {
889  switch(eMode)
890  {
892  return "expression";
897  return "top10";
902  return "aboveAverage";
904  return "uniqueValues";
906  return "duplicateValues";
908  return "containsErrors";
910  return "notContainsErrors";
912  return "beginsWith";
914  return "endsWith";
916  return "containsText";
918  return "notContainsText";
919  default:
920  return "cellIs";
921  }
922 }
923 
924 bool IsTopBottomRule(ScConditionMode eMode)
925 {
926  switch(eMode)
927  {
932  return true;
933  default:
934  break;
935  }
936 
937  return false;
938 }
939 
940 bool IsTextRule(ScConditionMode eMode)
941 {
942  switch(eMode)
943  {
948  return true;
949  default:
950  break;
951  }
952 
953  return false;
954 }
955 
956 bool RequiresFormula(ScConditionMode eMode)
957 {
958  if (IsTopBottomRule(eMode))
959  return false;
960  else if (IsTextRule(eMode))
961  return false;
962 
963  switch (eMode)
964  {
969  return false;
970  default:
971  break;
972  }
973 
974  return true;
975 }
976 
977 bool RequiresFixedFormula(ScConditionMode eMode)
978 {
979  switch(eMode)
980  {
987  return true;
988  default:
989  break;
990  }
991 
992  return false;
993 }
994 
995 OString GetFixedFormula(ScConditionMode eMode, const ScAddress& rAddress, std::string_view rText)
996 {
997  OStringBuffer aBuffer;
998  XclXmlUtils::ToOString(aBuffer, rAddress);
999  OString aPos = aBuffer.makeStringAndClear();
1000  switch (eMode)
1001  {
1003  return OString("ISERROR(" + aPos + ")") ;
1005  return OString("NOT(ISERROR(" + aPos + "))") ;
1007  return OString("LEFT(" + aPos + ",LEN(\"" + rText + "\"))=\"" + rText + "\"");
1009  return OString("RIGHT(" + aPos +",LEN(\"" + rText + "\"))=\"" + rText + "\"");
1011  return OString(OString::Concat("NOT(ISERROR(SEARCH(\"") + rText + "\"," + aPos + ")))");
1013  return OString(OString::Concat("ISERROR(SEARCH(\"") + rText + "\"," + aPos + "))");
1014  default:
1015  break;
1016  }
1017 
1018  return "";
1019 }
1020 
1021 }
1022 
1024 {
1025  bool bFmla2 = false;
1027  bool bAboveAverage = eOperation == ScConditionMode::AboveAverage ||
1028  eOperation == ScConditionMode::AboveEqualAverage;
1029  bool bEqualAverage = eOperation == ScConditionMode::AboveEqualAverage ||
1030  eOperation == ScConditionMode::BelowEqualAverage;
1031  bool bBottom = eOperation == ScConditionMode::Bottom10
1032  || eOperation == ScConditionMode::BottomPercent;
1033  bool bPercent = eOperation == ScConditionMode::TopPercent ||
1034  eOperation == ScConditionMode::BottomPercent;
1035  OUString aRank("0");
1036  if(IsTopBottomRule(eOperation))
1037  {
1038  // position and formula grammar are not important
1039  // we only store a number there
1040  aRank = mrFormatEntry.GetExpression(ScAddress(0,0,0), 0);
1041  }
1042  OString aText;
1043  if(IsTextRule(eOperation))
1044  {
1045  // we need to write the text without quotes
1046  // we have to actually get the string from
1047  // the token array for that
1048  std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0));
1049  if(pTokenArray->GetLen())
1050  aText = pTokenArray->FirstToken()->GetString().getString().toUtf8();
1051  }
1052 
1053  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1054  rWorksheet->startElement( XML_cfRule,
1055  XML_type, GetTypeString( mrFormatEntry.GetOperation() ),
1056  XML_priority, OString::number(mnPriority + 1),
1057  XML_operator, GetOperatorString( mrFormatEntry.GetOperation(), bFmla2 ),
1058  XML_aboveAverage, ToPsz10(bAboveAverage),
1059  XML_equalAverage, ToPsz10(bEqualAverage),
1060  XML_bottom, ToPsz10(bBottom),
1061  XML_percent, ToPsz10(bPercent),
1062  XML_rank, aRank,
1063  XML_text, aText,
1064  XML_dxfId, OString::number(GetDxfs().GetDxfId(mrFormatEntry.GetStyle())) );
1065 
1066  if (RequiresFixedFormula(eOperation))
1067  {
1068  rWorksheet->startElement(XML_formula);
1069  OString aFormula = GetFixedFormula(eOperation, maOrigin, aText);
1070  rWorksheet->writeEscaped(aFormula.getStr());
1071  rWorksheet->endElement( XML_formula );
1072  }
1073  else if(RequiresFormula(eOperation))
1074  {
1075  rWorksheet->startElement(XML_formula);
1076  std::unique_ptr<ScTokenArray> pTokenArray(mrFormatEntry.CreateFlatCopiedTokenArray(0));
1078  pTokenArray.get()));
1079  rWorksheet->endElement( XML_formula );
1080  if (bFmla2)
1081  {
1082  rWorksheet->startElement(XML_formula);
1083  std::unique_ptr<ScTokenArray> pTokenArray2(mrFormatEntry.CreateFlatCopiedTokenArray(1));
1085  pTokenArray2.get()));
1086  rWorksheet->endElement( XML_formula );
1087  }
1088  }
1089  // OOXTODO: XML_extLst
1090  rWorksheet->endElement( XML_cfRule );
1091 }
1092 
1093 XclExpCF::XclExpCF( const XclExpRoot& rRoot, const ScCondFormatEntry& rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin ) :
1095  XclExpRoot( rRoot ),
1096  mxImpl( new XclExpCFImpl( rRoot, rFormatEntry, nPriority, aOrigin ) )
1097 {
1098 }
1099 
1101 {
1102 }
1103 
1105 {
1106  mxImpl->WriteBody( rStrm );
1107 }
1108 
1110 {
1111  mxImpl->SaveXml( rStrm );
1112 }
1113 
1114 XclExpDateFormat::XclExpDateFormat( const XclExpRoot& rRoot, const ScCondDateFormatEntry& rFormatEntry, sal_Int32 nPriority ):
1116  XclExpRoot( rRoot ),
1117  mrFormatEntry(rFormatEntry),
1118  mnPriority(nPriority)
1119 {
1120 }
1121 
1123 {
1124 }
1125 
1126 namespace {
1127 
1128 const char* getTimePeriodString( condformat::ScCondFormatDateType eType )
1129 {
1130  switch(eType)
1131  {
1132  case condformat::TODAY:
1133  return "today";
1134  case condformat::YESTERDAY:
1135  return "yesterday";
1136  case condformat::TOMORROW:
1137  return "yesterday";
1138  case condformat::THISWEEK:
1139  return "thisWeek";
1140  case condformat::LASTWEEK:
1141  return "lastWeek";
1142  case condformat::NEXTWEEK:
1143  return "nextWeek";
1144  case condformat::THISMONTH:
1145  return "thisMonth";
1146  case condformat::LASTMONTH:
1147  return "lastMonth";
1148  case condformat::NEXTMONTH:
1149  return "nextMonth";
1150  case condformat::LAST7DAYS:
1151  return "last7Days";
1152  default:
1153  break;
1154  }
1155  return nullptr;
1156 }
1157 
1158 }
1159 
1161 {
1162  // only write the supported entries into OOXML
1163  const char* sTimePeriod = getTimePeriodString(mrFormatEntry.GetDateType());
1164  if(!sTimePeriod)
1165  return;
1166 
1167  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1168  rWorksheet->startElement( XML_cfRule,
1169  XML_type, "timePeriod",
1170  XML_priority, OString::number(mnPriority + 1),
1171  XML_timePeriod, sTimePeriod,
1172  XML_dxfId, OString::number(GetDxfs().GetDxfId(mrFormatEntry.GetStyleName())) );
1173  rWorksheet->endElement( XML_cfRule);
1174 }
1175 
1176 XclExpCfvo::XclExpCfvo(const XclExpRoot& rRoot, const ScColorScaleEntry& rEntry, const ScAddress& rAddr, bool bFirst):
1177  XclExpRecord(),
1178  XclExpRoot( rRoot ),
1179  mrEntry(rEntry),
1180  maSrcPos(rAddr),
1181  mbFirst(bFirst)
1182 {
1183 }
1184 
1185 namespace {
1186 
1187 OString getColorScaleType( const ScColorScaleEntry& rEntry, bool bFirst )
1188 {
1189  switch(rEntry.GetType())
1190  {
1191  case COLORSCALE_MIN:
1192  return "min";
1193  case COLORSCALE_MAX:
1194  return "max";
1195  case COLORSCALE_PERCENT:
1196  return "percent";
1197  case COLORSCALE_FORMULA:
1198  return "formula";
1199  case COLORSCALE_AUTO:
1200  if(bFirst)
1201  return "min";
1202  else
1203  return "max";
1204  case COLORSCALE_PERCENTILE:
1205  return "percentile";
1206  default:
1207  break;
1208  }
1209 
1210  return "num";
1211 }
1212 
1213 }
1214 
1216 {
1217  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1218 
1219  OString aValue;
1221  {
1223  mrEntry.GetFormula());
1224  aValue = OUStringToOString(aFormula, RTL_TEXTENCODING_UTF8 );
1225  }
1226  else
1227  {
1228  aValue = OString::number( mrEntry.GetValue() );
1229  }
1230 
1231  rWorksheet->startElement( XML_cfvo,
1232  XML_type, getColorScaleType(mrEntry, mbFirst),
1233  XML_val, aValue );
1234 
1235  rWorksheet->endElement( XML_cfvo );
1236 }
1237 
1239  XclExpRecord(),
1240  XclExpRoot( rRoot ),
1241  mrColor( rColor )
1242 {
1243 }
1244 
1246 {
1247 }
1248 
1250 {
1251  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1252 
1253  rWorksheet->startElement(XML_color, XML_rgb, XclXmlUtils::ToOString(mrColor));
1254 
1255  rWorksheet->endElement( XML_color );
1256 }
1257 
1258 namespace {
1259 
1260 OString createHexStringFromDigit(sal_uInt8 nDigit)
1261 {
1262  OString aString = OString::number( nDigit, 16 );
1263  if(aString.getLength() == 1)
1264  aString += OString::number(0);
1265  return aString;
1266 }
1267 
1268 OString createGuidStringFromInt(sal_uInt8 nGuid[16])
1269 {
1270  OStringBuffer aBuffer;
1271  aBuffer.append('{');
1272  for(size_t i = 0; i < 16; ++i)
1273  {
1274  aBuffer.append(createHexStringFromDigit(nGuid[i]));
1275  if(i == 3|| i == 5 || i == 7 || i == 9 )
1276  aBuffer.append('-');
1277  }
1278  aBuffer.append('}');
1279  OString aString = aBuffer.makeStringAndClear();
1280  return aString.toAsciiUpperCase();
1281 }
1282 
1283 OString generateGUIDString()
1284 {
1285  sal_uInt8 nGuid[16];
1286  rtl_createUuid(nGuid, nullptr, true);
1287  return createGuidStringFromInt(nGuid);
1288 }
1289 
1290 }
1291 
1292 XclExpCondfmt::XclExpCondfmt( const XclExpRoot& rRoot, const ScConditionalFormat& rCondFormat, const XclExtLstRef& xExtLst, sal_Int32& rIndex ) :
1294  XclExpRoot( rRoot )
1295 {
1296  const ScRangeList& aScRanges = rCondFormat.GetRange();
1297  GetAddressConverter().ConvertRangeList( maXclRanges, aScRanges, true );
1298  if( maXclRanges.empty() )
1299  return;
1300 
1301  std::vector<XclExpExtCondFormatData> aExtEntries;
1302  ScAddress aOrigin = aScRanges.Combine().aStart;
1303  for( size_t nIndex = 0, nCount = rCondFormat.size(); nIndex < nCount; ++nIndex )
1304  if( const ScFormatEntry* pFormatEntry = rCondFormat.GetEntry( nIndex ) )
1305  {
1306  if(pFormatEntry->GetType() == ScFormatEntry::Type::Condition)
1307  maCFList.AppendNewRecord( new XclExpCF( GetRoot(), static_cast<const ScCondFormatEntry&>(*pFormatEntry), ++rIndex, aOrigin ) );
1308  else if(pFormatEntry->GetType() == ScFormatEntry::Type::ExtCondition)
1309  {
1310  const ScCondFormatEntry& rFormat = static_cast<const ScCondFormatEntry&>(*pFormatEntry);
1311  XclExpExtCondFormatData aExtEntry;
1312  aExtEntry.nPriority = ++rIndex;
1313  aExtEntry.aGUID = generateGUIDString();
1314  aExtEntry.pEntry = &rFormat;
1315  aExtEntries.push_back(aExtEntry);
1316  }
1317  else if(pFormatEntry->GetType() == ScFormatEntry::Type::Colorscale)
1318  maCFList.AppendNewRecord( new XclExpColorScale( GetRoot(), static_cast<const ScColorScaleFormat&>(*pFormatEntry), ++rIndex ) );
1319  else if(pFormatEntry->GetType() == ScFormatEntry::Type::Databar)
1320  {
1321  const ScDataBarFormat& rFormat = static_cast<const ScDataBarFormat&>(*pFormatEntry);
1322  XclExpExtCondFormatData aExtEntry;
1323  aExtEntry.nPriority = -1;
1324  aExtEntry.aGUID = generateGUIDString();
1325  aExtEntry.pEntry = &rFormat;
1326  aExtEntries.push_back(aExtEntry);
1327 
1328  maCFList.AppendNewRecord( new XclExpDataBar( GetRoot(), rFormat, ++rIndex, aExtEntry.aGUID));
1329  }
1330  else if(pFormatEntry->GetType() == ScFormatEntry::Type::Iconset)
1331  {
1332  // don't export iconSet entries that are not in OOXML
1333  const ScIconSetFormat& rIconSet = static_cast<const ScIconSetFormat&>(*pFormatEntry);
1334  bool bNeedsExt = false;
1335  switch (rIconSet.GetIconSetData()->eIconSetType)
1336  {
1337  case IconSet_3Smilies:
1338  case IconSet_3ColorSmilies:
1339  case IconSet_3Stars:
1340  case IconSet_3Triangles:
1341  case IconSet_5Boxes:
1342  {
1343  bNeedsExt = true;
1344  }
1345  break;
1346  default:
1347  break;
1348  }
1349 
1350  bNeedsExt |= rIconSet.GetIconSetData()->mbCustom;
1351 
1352  if (bNeedsExt)
1353  {
1354  XclExpExtCondFormatData aExtEntry;
1355  aExtEntry.nPriority = ++rIndex;
1356  aExtEntry.aGUID = generateGUIDString();
1357  aExtEntry.pEntry = &rIconSet;
1358  aExtEntries.push_back(aExtEntry);
1359  }
1360  else
1361  maCFList.AppendNewRecord( new XclExpIconSet( GetRoot(), rIconSet, ++rIndex ) );
1362  }
1363  else if(pFormatEntry->GetType() == ScFormatEntry::Type::Date)
1364  maCFList.AppendNewRecord( new XclExpDateFormat( GetRoot(), static_cast<const ScCondDateFormatEntry&>(*pFormatEntry), ++rIndex ) );
1365  }
1367 
1368  if(!aExtEntries.empty() && xExtLst)
1369  {
1370  XclExpExt* pParent = xExtLst->GetItem( XclExpExtDataBarType );
1371  if( !pParent )
1372  {
1373  xExtLst->AddRecord( new XclExpExtCondFormat( *xExtLst ) );
1374  pParent = xExtLst->GetItem( XclExpExtDataBarType );
1375  }
1376  static_cast<XclExpExtCondFormat*>(xExtLst->GetItem( XclExpExtDataBarType ))->AddRecord(
1377  new XclExpExtConditionalFormatting( *pParent, aExtEntries, aScRanges));
1378  }
1379 }
1380 
1382 {
1383 }
1384 
1386 {
1387  // ccf (2 bytes): An unsigned integer that specifies the count of CF records that follow this
1388  // record. MUST be greater than or equal to 0x0001, and less than or equal to 0x0003.
1389 
1390  SAL_WARN_IF( maCFList.GetSize() > 3, "sc.filter", "More than 3 conditional filters for cell(s), won't export");
1391 
1392  return !maCFList.IsEmpty() && maCFList.GetSize() <= 3 && !maXclRanges.empty();
1393 }
1394 
1396 {
1397  return !maCFList.IsEmpty() && !maXclRanges.empty();
1398 }
1399 
1401 {
1402  if( IsValidForBinary() )
1403  {
1404  XclExpRecord::Save( rStrm );
1405  maCFList.Save( rStrm );
1406  }
1407 }
1408 
1410 {
1411  OSL_ENSURE( !maCFList.IsEmpty(), "XclExpCondfmt::WriteBody - no CF records to write" );
1412  OSL_ENSURE( !maXclRanges.empty(), "XclExpCondfmt::WriteBody - no cell ranges found" );
1413 
1414  rStrm << static_cast< sal_uInt16 >( maCFList.GetSize() )
1415  << sal_uInt16( 1 )
1417  << maXclRanges;
1418 }
1419 
1421 {
1422  if( !IsValidForXml() )
1423  return;
1424 
1425  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1426  rWorksheet->startElement( XML_conditionalFormatting,
1427  XML_sqref, msSeqRef
1428  // OOXTODO: XML_pivot
1429  );
1430 
1431  maCFList.SaveXml( rStrm );
1432 
1433  rWorksheet->endElement( XML_conditionalFormatting );
1434 }
1435 
1436 XclExpColorScale::XclExpColorScale( const XclExpRoot& rRoot, const ScColorScaleFormat& rFormat, sal_Int32 nPriority ):
1437  XclExpRecord(),
1438  XclExpRoot( rRoot ),
1439  mnPriority( nPriority )
1440 {
1441  const ScRange & rRange = rFormat.GetRange().front();
1442  ScAddress aAddr = rRange.aStart;
1443  for(const auto& rxColorScaleEntry : rFormat)
1444  {
1445  // exact position is not important, we allow only absolute refs
1446 
1447  XclExpCfvoList::RecordRefType xCfvo( new XclExpCfvo( GetRoot(), *rxColorScaleEntry, aAddr ) );
1448  maCfvoList.AppendRecord( xCfvo );
1449  XclExpColScaleColList::RecordRefType xClo( new XclExpColScaleCol( GetRoot(), rxColorScaleEntry->GetColor() ) );
1450  maColList.AppendRecord( xClo );
1451  }
1452 }
1453 
1455 {
1456  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1457 
1458  rWorksheet->startElement( XML_cfRule,
1459  XML_type, "colorScale",
1460  XML_priority, OString::number(mnPriority + 1) );
1461 
1462  rWorksheet->startElement(XML_colorScale);
1463 
1464  maCfvoList.SaveXml(rStrm);
1465  maColList.SaveXml(rStrm);
1466 
1467  rWorksheet->endElement( XML_colorScale );
1468 
1469  rWorksheet->endElement( XML_cfRule );
1470 }
1471 
1472 XclExpDataBar::XclExpDataBar( const XclExpRoot& rRoot, const ScDataBarFormat& rFormat, sal_Int32 nPriority, const OString& rGUID):
1473  XclExpRecord(),
1474  XclExpRoot( rRoot ),
1475  mrFormat( rFormat ),
1476  mnPriority( nPriority ),
1477  maGUID(rGUID)
1478 {
1479  const ScRange & rRange = rFormat.GetRange().front();
1480  ScAddress aAddr = rRange.aStart;
1481  // exact position is not important, we allow only absolute refs
1482  mpCfvoLowerLimit.reset(
1483  new XclExpCfvo(GetRoot(), *mrFormat.GetDataBarData()->mpLowerLimit, aAddr, true));
1484  mpCfvoUpperLimit.reset(
1485  new XclExpCfvo(GetRoot(), *mrFormat.GetDataBarData()->mpUpperLimit, aAddr, false));
1486 
1488 }
1489 
1491 {
1492  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1493 
1494  rWorksheet->startElement( XML_cfRule,
1495  XML_type, "dataBar",
1496  XML_priority, OString::number(mnPriority + 1) );
1497 
1498  rWorksheet->startElement( XML_dataBar,
1499  XML_showValue, ToPsz10(!mrFormat.GetDataBarData()->mbOnlyBar),
1500  XML_minLength, OString::number(sal_uInt32(mrFormat.GetDataBarData()->mnMinLength)),
1501  XML_maxLength, OString::number(sal_uInt32(mrFormat.GetDataBarData()->mnMaxLength)) );
1502 
1503  mpCfvoLowerLimit->SaveXml(rStrm);
1504  mpCfvoUpperLimit->SaveXml(rStrm);
1505  mpCol->SaveXml(rStrm);
1506 
1507  rWorksheet->endElement( XML_dataBar );
1508 
1509  // extLst entries for Excel 2010 and 2013
1510  rWorksheet->startElement(XML_extLst);
1511  rWorksheet->startElement(XML_ext,
1512  FSNS(XML_xmlns, XML_x14), rStrm.getNamespaceURL(OOX_NS(xls14Lst)),
1513  XML_uri, "{B025F937-C7B1-47D3-B67F-A62EFF666E3E}");
1514 
1515  rWorksheet->startElementNS( XML_x14, XML_id );
1516  rWorksheet->write(maGUID);
1517  rWorksheet->endElementNS( XML_x14, XML_id );
1518 
1519  rWorksheet->endElement( XML_ext );
1520  rWorksheet->endElement( XML_extLst );
1521 
1522  rWorksheet->endElement( XML_cfRule );
1523 }
1524 
1525 XclExpIconSet::XclExpIconSet( const XclExpRoot& rRoot, const ScIconSetFormat& rFormat, sal_Int32 nPriority ):
1526  XclExpRecord(),
1527  XclExpRoot( rRoot ),
1528  mrFormat( rFormat ),
1529  mnPriority( nPriority )
1530 {
1531  const ScRange & rRange = rFormat.GetRange().front();
1532  ScAddress aAddr = rRange.aStart;
1533  for (auto const& itr : rFormat)
1534  {
1535  // exact position is not important, we allow only absolute refs
1536 
1537  XclExpCfvoList::RecordRefType xCfvo( new XclExpCfvo( GetRoot(), *itr, aAddr ) );
1538  maCfvoList.AppendRecord( xCfvo );
1539  }
1540 }
1541 
1543 {
1544  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1545 
1546  rWorksheet->startElement( XML_cfRule,
1547  XML_type, "iconSet",
1548  XML_priority, OString::number(mnPriority + 1) );
1549 
1551  rWorksheet->startElement( XML_iconSet,
1552  XML_iconSet, pIconSetName,
1553  XML_showValue, sax_fastparser::UseIf("0", !mrFormat.GetIconSetData()->mbShowValue),
1554  XML_reverse, sax_fastparser::UseIf("1", mrFormat.GetIconSetData()->mbReverse));
1555 
1556  maCfvoList.SaveXml( rStrm );
1557 
1558  rWorksheet->endElement( XML_iconSet );
1559  rWorksheet->endElement( XML_cfRule );
1560 }
1561 
1563  XclExpRoot( rRoot )
1564 {
1565  if( const ScConditionalFormatList* pCondFmtList = GetDoc().GetCondFormList(GetCurrScTab()) )
1566  {
1567  sal_Int32 nIndex = 0;
1568  for( const auto& rxCondFmt : *pCondFmtList)
1569  {
1570  XclExpCondfmtList::RecordRefType xCondfmtRec( new XclExpCondfmt( GetRoot(), *rxCondFmt, xExtLst, nIndex ));
1571  if( xCondfmtRec->IsValidForXml() )
1572  maCondfmtList.AppendRecord( xCondfmtRec );
1573  }
1574  }
1575 }
1576 
1578 {
1579  maCondfmtList.Save( rStrm );
1580 }
1581 
1583 {
1584  maCondfmtList.SaveXml( rStrm );
1585 }
1586 
1587 // Validation =================================================================
1588 
1589 namespace {
1590 
1592 void lclWriteDvFormula( XclExpStream& rStrm, const XclTokenArray* pXclTokArr )
1593 {
1594  sal_uInt16 nFmlaSize = pXclTokArr ? pXclTokArr->GetSize() : 0;
1595  rStrm << nFmlaSize << sal_uInt16( 0 );
1596  if( pXclTokArr )
1597  pXclTokArr->WriteArray( rStrm );
1598 }
1599 
1601 void lclWriteDvFormula( XclExpStream& rStrm, const XclExpString& rString )
1602 {
1603  // fake a formula with a single tStr token
1604  rStrm << static_cast< sal_uInt16 >( rString.GetSize() + 1 )
1605  << sal_uInt16( 0 )
1606  << EXC_TOKID_STR
1607  << rString;
1608 }
1609 
1610 const char* lcl_GetValidationType( sal_uInt32 nFlags )
1611 {
1612  switch( nFlags & EXC_DV_MODE_MASK )
1613  {
1614  case EXC_DV_MODE_ANY: return "none";
1615  case EXC_DV_MODE_WHOLE: return "whole";
1616  case EXC_DV_MODE_DECIMAL: return "decimal";
1617  case EXC_DV_MODE_LIST: return "list";
1618  case EXC_DV_MODE_DATE: return "date";
1619  case EXC_DV_MODE_TIME: return "time";
1620  case EXC_DV_MODE_TEXTLEN: return "textLength";
1621  case EXC_DV_MODE_CUSTOM: return "custom";
1622  }
1623  return nullptr;
1624 }
1625 
1626 const char* lcl_GetOperatorType( sal_uInt32 nFlags )
1627 {
1628  switch( nFlags & EXC_DV_COND_MASK )
1629  {
1630  case EXC_DV_COND_BETWEEN: return "between";
1631  case EXC_DV_COND_NOTBETWEEN: return "notBetween";
1632  case EXC_DV_COND_EQUAL: return "equal";
1633  case EXC_DV_COND_NOTEQUAL: return "notEqual";
1634  case EXC_DV_COND_GREATER: return "greaterThan";
1635  case EXC_DV_COND_LESS: return "lessThan";
1636  case EXC_DV_COND_EQGREATER: return "greaterThanOrEqual";
1637  case EXC_DV_COND_EQLESS: return "lessThanOrEqual";
1638  }
1639  return nullptr;
1640 }
1641 
1642 const char* lcl_GetErrorType( sal_uInt32 nFlags )
1643 {
1644  switch (nFlags & EXC_DV_ERROR_MASK)
1645  {
1646  case EXC_DV_ERROR_STOP: return "stop";
1647  case EXC_DV_ERROR_WARNING: return "warning";
1648  case EXC_DV_ERROR_INFO: return "information";
1649  }
1650  return nullptr;
1651 }
1652 
1653 void lcl_SetValidationText(const OUString& rText, XclExpString& rValidationText)
1654 {
1655  if ( !rText.isEmpty() )
1656  {
1657  // maximum length allowed in Excel is 255 characters
1658  if ( rText.getLength() > 255 )
1659  {
1660  OUStringBuffer aBuf( rText );
1661  rValidationText.Assign(
1662  comphelper::string::truncateToLength(aBuf, 255).makeStringAndClear() );
1663  }
1664  else
1665  rValidationText.Assign( rText );
1666  }
1667  else
1668  rValidationText.Assign( '\0' );
1669 }
1670 
1671 } // namespace
1672 
1673 XclExpDV::XclExpDV( const XclExpRoot& rRoot, sal_uLong nScHandle ) :
1675  XclExpRoot( rRoot ),
1676  mnFlags( 0 ),
1677  mnScHandle( nScHandle )
1678 {
1679  if( const ScValidationData* pValData = GetDoc().GetValidationEntry( mnScHandle ) )
1680  {
1681  // prompt box - empty string represented by single NUL character
1682  OUString aTitle, aText;
1683  bool bShowPrompt = pValData->GetInput( aTitle, aText );
1684  lcl_SetValidationText(aTitle, maPromptTitle);
1685  lcl_SetValidationText(aText, maPromptText);
1686 
1687  // error box - empty string represented by single NUL character
1688  ScValidErrorStyle eScErrorStyle;
1689  bool bShowError = pValData->GetErrMsg( aTitle, aText, eScErrorStyle );
1690  lcl_SetValidationText(aTitle, maErrorTitle);
1691  lcl_SetValidationText(aText, maErrorText);
1692 
1693  // flags
1694  switch( pValData->GetDataMode() )
1695  {
1696  case SC_VALID_ANY: mnFlags |= EXC_DV_MODE_ANY; break;
1697  case SC_VALID_WHOLE: mnFlags |= EXC_DV_MODE_WHOLE; break;
1699  case SC_VALID_LIST: mnFlags |= EXC_DV_MODE_LIST; break;
1700  case SC_VALID_DATE: mnFlags |= EXC_DV_MODE_DATE; break;
1701  case SC_VALID_TIME: mnFlags |= EXC_DV_MODE_TIME; break;
1703  case SC_VALID_CUSTOM: mnFlags |= EXC_DV_MODE_CUSTOM; break;
1704  default: OSL_FAIL( "XclExpDV::XclExpDV - unknown mode" );
1705  }
1706 
1707  switch( pValData->GetOperation() )
1708  {
1709  case ScConditionMode::NONE:
1718  default: OSL_FAIL( "XclExpDV::XclExpDV - unknown condition" );
1719  }
1720  switch( eScErrorStyle )
1721  {
1722  case SC_VALERR_STOP: mnFlags |= EXC_DV_ERROR_STOP; break;
1724  case SC_VALERR_INFO: mnFlags |= EXC_DV_ERROR_INFO; break;
1725  case SC_VALERR_MACRO:
1726  // set INFO for validity with macro call, delete title
1728  maErrorTitle.Assign( '\0' ); // contains macro name
1729  break;
1730  default: OSL_FAIL( "XclExpDV::XclExpDV - unknown error style" );
1731  }
1732  ::set_flag( mnFlags, EXC_DV_IGNOREBLANK, pValData->IsIgnoreBlank() );
1733  ::set_flag( mnFlags, EXC_DV_SUPPRESSDROPDOWN, pValData->GetListType() == css::sheet::TableValidationVisibility::INVISIBLE );
1734  ::set_flag( mnFlags, EXC_DV_SHOWPROMPT, bShowPrompt );
1735  ::set_flag( mnFlags, EXC_DV_SHOWERROR, bShowError );
1736 
1737  // formulas
1739 
1740  // first formula
1741  std::unique_ptr< ScTokenArray > xScTokArr = pValData->CreateFlatCopiedTokenArray( 0 );
1742  if (xScTokArr)
1743  {
1744  if( pValData->GetDataMode() == SC_VALID_LIST )
1745  {
1746  OUString aString;
1747  if( XclTokenArrayHelper::GetStringList( aString, *xScTokArr, '\n' ) )
1748  {
1749  bool bList = false;
1750  OUStringBuffer sListBuf;
1751  OUStringBuffer sFormulaBuf;
1752  sFormulaBuf.append( '"' );
1753  /* Formula is a list of string tokens -> build the Excel string.
1754  Data validity is BIFF8 only (important for the XclExpString object).
1755  Excel uses the NUL character as string list separator. */
1757  if (!aString.isEmpty())
1758  {
1759  sal_Int32 nStringIx = 0;
1760  for(;;)
1761  {
1762  const OUString aToken( aString.getToken( 0, '\n', nStringIx ) );
1763  if (aToken.indexOf(",") != -1)
1764  {
1765  sListBuf.append('"');
1766  sListBuf.append(aToken);
1767  sListBuf.append('"');
1768  bList = true;
1769  }
1770  else
1771  sListBuf.append(aToken);
1772  mxString1->Append( aToken );
1773  sFormulaBuf.append( aToken );
1774  if (nStringIx<0)
1775  break;
1776  mxString1->Append(OUString(u'\0'));
1777  sFormulaBuf.append( ',' );
1778  sListBuf.append( ',' );
1779  }
1780  }
1782 
1783  // maximum length allowed in Excel is 255 characters, and don't end with an empty token
1784  // It should be 8192 but Excel doesn't accept it for unknown reason
1785  // See also https://bugs.documentfoundation.org/show_bug.cgi?id=137167#c2 for more details
1786  sal_uInt32 nLen = sFormulaBuf.getLength();
1787  if( nLen > 256 ) // 255 + beginning quote mark
1788  {
1789  nLen = 256;
1790  if( sFormulaBuf[nLen - 1] == ',' )
1791  --nLen;
1792  sFormulaBuf.truncate(nLen);
1793  }
1794 
1795  sFormulaBuf.append( '"' );
1796  msFormula1 = sFormulaBuf.makeStringAndClear();
1797  if (bList)
1798  msList = sListBuf.makeStringAndClear();
1799  else
1800  sListBuf.remove(0, sListBuf.getLength());
1801  }
1802  else
1803  {
1804  /* All other formulas in validation are stored like conditional
1805  formatting formulas (with tRefN/tAreaN tokens as value or
1806  array class). But NOT the cell references and defined names
1807  in list validation - they are stored as reference class
1808  tokens... Example:
1809  1) Cell must be equal to A1 -> formula is =A1 -> writes tRefNV token
1810  2) List is taken from A1 -> formula is =A1 -> writes tRefNR token
1811  Formula compiler supports this by offering two different functions
1812  CreateDataValFormula() and CreateListValFormula(). */
1813  if(GetOutput() == EXC_OUTPUT_BINARY)
1814  mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_LISTVAL, *xScTokArr );
1815  else
1816  msFormula1 = XclXmlUtils::ToOUString( GetCompileFormulaContext(), pValData->GetSrcPos(),
1817  xScTokArr.get());
1818  }
1819  }
1820  else
1821  {
1822  // no list validation -> convert the formula
1823  if(GetOutput() == EXC_OUTPUT_BINARY)
1824  mxTokArr1 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, *xScTokArr );
1825  else
1826  msFormula1 = XclXmlUtils::ToOUString( GetCompileFormulaContext(), pValData->GetSrcPos(),
1827  xScTokArr.get());
1828  }
1829  }
1830 
1831  // second formula
1832  xScTokArr = pValData->CreateFlatCopiedTokenArray( 1 );
1833  if (xScTokArr)
1834  {
1835  if(GetOutput() == EXC_OUTPUT_BINARY)
1836  mxTokArr2 = rFmlaComp.CreateFormula( EXC_FMLATYPE_DATAVAL, *xScTokArr );
1837  else
1838  msFormula2 = XclXmlUtils::ToOUString( GetCompileFormulaContext(), pValData->GetSrcPos(),
1839  xScTokArr.get());
1840  }
1841  }
1842  else
1843  {
1844  OSL_FAIL( "XclExpDV::XclExpDV - missing core data" );
1845  mnScHandle = ULONG_MAX;
1846  }
1847 }
1848 
1850 {
1851 }
1852 
1853 void XclExpDV::InsertCellRange( const ScRange& rRange )
1854 {
1855  maScRanges.Join( rRange );
1856 }
1857 
1859 {
1861  return (mnScHandle != ULONG_MAX) && !maXclRanges.empty();
1862 }
1863 
1865 {
1866  // flags and strings
1868  // condition formulas
1869  if( mxString1 )
1870  lclWriteDvFormula( rStrm, *mxString1 );
1871  else
1872  lclWriteDvFormula( rStrm, mxTokArr1.get() );
1873  lclWriteDvFormula( rStrm, mxTokArr2.get() );
1874  // cell ranges
1875  rStrm << maXclRanges;
1876 }
1877 
1879 {
1880  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1881  rWorksheet->startElement( XML_dataValidation,
1882  XML_allowBlank, ToPsz( ::get_flag( mnFlags, EXC_DV_IGNOREBLANK ) ),
1883  XML_error, XESTRING_TO_PSZ( maErrorText ),
1884  XML_errorStyle, lcl_GetErrorType(mnFlags),
1885  XML_errorTitle, XESTRING_TO_PSZ( maErrorTitle ),
1886  // OOXTODO: XML_imeMode,
1887  XML_operator, lcl_GetOperatorType( mnFlags ),
1888  XML_prompt, XESTRING_TO_PSZ( maPromptText ),
1889  XML_promptTitle, XESTRING_TO_PSZ( maPromptTitle ),
1890  // showDropDown should have been showNoDropDown - check oox/xlsx import for details
1891  XML_showDropDown, ToPsz( ::get_flag( mnFlags, EXC_DV_SUPPRESSDROPDOWN ) ),
1892  XML_showErrorMessage, ToPsz( ::get_flag( mnFlags, EXC_DV_SHOWERROR ) ),
1893  XML_showInputMessage, ToPsz( ::get_flag( mnFlags, EXC_DV_SHOWPROMPT ) ),
1894  XML_sqref, XclXmlUtils::ToOString(rStrm.GetRoot().GetDoc(), maScRanges),
1895  XML_type, lcl_GetValidationType(mnFlags) );
1896  if (!msList.isEmpty())
1897  {
1898  rWorksheet->startElement(FSNS(XML_mc, XML_AlternateContent),
1899  FSNS(XML_xmlns, XML_x12ac),rStrm.getNamespaceURL(OOX_NS(x12ac)),
1900  FSNS(XML_xmlns, XML_mc),rStrm.getNamespaceURL(OOX_NS(mce)));
1901  rWorksheet->startElement(FSNS(XML_mc, XML_Choice), XML_Requires, "x12ac");
1902  rWorksheet->startElement(FSNS(XML_x12ac, XML_list));
1903  rWorksheet->writeEscaped(msList);
1904  rWorksheet->endElement(FSNS(XML_x12ac, XML_list));
1905  rWorksheet->endElement(FSNS(XML_mc, XML_Choice));
1906  rWorksheet->startElement(FSNS(XML_mc, XML_Fallback));
1907  rWorksheet->startElement(XML_formula1);
1908  rWorksheet->writeEscaped(msFormula1);
1909  rWorksheet->endElement(XML_formula1);
1910  rWorksheet->endElement(FSNS(XML_mc, XML_Fallback));
1911  rWorksheet->endElement(FSNS(XML_mc, XML_AlternateContent));
1912  }
1913  if (msList.isEmpty() && !msFormula1.isEmpty())
1914  {
1915  rWorksheet->startElement(XML_formula1);
1916  rWorksheet->writeEscaped( msFormula1 );
1917  rWorksheet->endElement( XML_formula1 );
1918  }
1919  if( !msFormula2.isEmpty() )
1920  {
1921  rWorksheet->startElement(XML_formula2);
1922  rWorksheet->writeEscaped( msFormula2 );
1923  rWorksheet->endElement( XML_formula2 );
1924  }
1925  rWorksheet->endElement( XML_dataValidation );
1926 }
1927 
1929  XclExpRecord( EXC_ID_DVAL, 18 ),
1930  XclExpRoot( rRoot )
1931 {
1932 }
1933 
1935 {
1936 }
1937 
1938 void XclExpDval::InsertCellRange( const ScRange& rRange, sal_uLong nScHandle )
1939 {
1940  if( GetBiff() == EXC_BIFF8 )
1941  {
1942  XclExpDV& rDVRec = SearchOrCreateDv( nScHandle );
1943  rDVRec.InsertCellRange( rRange );
1944  }
1945 }
1946 
1948 {
1949  // check all records
1950  size_t nPos = maDVList.GetSize();
1951  while( nPos )
1952  {
1953  --nPos; // backwards to keep nPos valid
1954  XclExpDVRef xDVRec = maDVList.GetRecord( nPos );
1955  if( !xDVRec->Finalize() )
1956  maDVList.RemoveRecord( nPos );
1957  }
1958 
1959  // write the DVAL and the DV's
1960  if( !maDVList.IsEmpty() )
1961  {
1962  XclExpRecord::Save( rStrm );
1963  maDVList.Save( rStrm );
1964  }
1965 }
1966 
1968 {
1969  if( maDVList.IsEmpty() )
1970  return;
1971 
1972  sax_fastparser::FSHelperPtr& rWorksheet = rStrm.GetCurrentStream();
1973  rWorksheet->startElement( XML_dataValidations,
1974  XML_count, OString::number(maDVList.GetSize())
1975  // OOXTODO: XML_disablePrompts,
1976  // OOXTODO: XML_xWindow,
1977  // OOXTODO: XML_yWindow
1978  );
1979  maDVList.SaveXml( rStrm );
1980  rWorksheet->endElement( XML_dataValidations );
1981 }
1982 
1984 {
1985  // test last found record
1986  if( mxLastFoundDV && (mxLastFoundDV->GetScHandle() == nScHandle) )
1987  return *mxLastFoundDV;
1988 
1989  // binary search
1990  size_t nCurrPos = 0;
1991  if( !maDVList.IsEmpty() )
1992  {
1993  size_t nFirstPos = 0;
1994  size_t nLastPos = maDVList.GetSize() - 1;
1995  bool bLoop = true;
1996  sal_uLong nCurrScHandle = ::std::numeric_limits< sal_uLong >::max();
1997  while( (nFirstPos <= nLastPos) && bLoop )
1998  {
1999  nCurrPos = (nFirstPos + nLastPos) / 2;
2000  mxLastFoundDV = maDVList.GetRecord( nCurrPos );
2001  nCurrScHandle = mxLastFoundDV->GetScHandle();
2002  if( nCurrScHandle == nScHandle )
2003  bLoop = false;
2004  else if( nCurrScHandle < nScHandle )
2005  nFirstPos = nCurrPos + 1;
2006  else if( nCurrPos )
2007  nLastPos = nCurrPos - 1;
2008  else // special case for nLastPos = -1
2009  bLoop = false;
2010  }
2011  if( nCurrScHandle == nScHandle )
2012  return *mxLastFoundDV;
2013  else if( nCurrScHandle < nScHandle )
2014  ++nCurrPos;
2015  }
2016 
2017  // create new DV record
2018  mxLastFoundDV = new XclExpDV( *this, nScHandle );
2019  maDVList.InsertRecord( mxLastFoundDV, nCurrPos );
2020  return *mxLastFoundDV;
2021 }
2022 
2024 {
2025  rStrm.WriteZeroBytes( 10 );
2026  rStrm << EXC_DVAL_NOOBJ << static_cast< sal_uInt32 >( maDVList.GetSize() );
2027 }
2028 
2029 // Web Queries ================================================================
2030 
2032  const OUString& rRangeName,
2033  const OUString& rUrl,
2034  const OUString& rSource,
2035  sal_Int32 nRefrSecs ) :
2036  maDestRange( rRangeName ),
2037  maUrl( rUrl ),
2038  // refresh delay time: seconds -> minutes
2039  mnRefresh( ulimit_cast< sal_Int16 >( (nRefrSecs + 59) / 60 ) ),
2040  mbEntireDoc( false )
2041 {
2042  // comma separated list of HTML table names or indexes
2043  OUString aNewTables;
2044  OUString aAppendTable;
2045  bool bExitLoop = false;
2046  if (!rSource.isEmpty())
2047  {
2048  sal_Int32 nStringIx = 0;
2049  do
2050  {
2051  OUString aToken( rSource.getToken( 0, ';', nStringIx ) );
2053  bExitLoop = mbEntireDoc || ScfTools::IsHTMLTablesName( aToken );
2054  if( !bExitLoop && ScfTools::GetHTMLNameFromName( aToken, aAppendTable ) )
2055  aNewTables = ScGlobal::addToken( aNewTables, aAppendTable, ',' );
2056  }
2057  while (nStringIx>0 && !bExitLoop);
2058  }
2059 
2060  if( !bExitLoop ) // neither HTML_all nor HTML_tables found
2061  {
2062  if( !aNewTables.isEmpty() )
2063  mxQryTables.reset( new XclExpString( aNewTables ) );
2064  else
2065  mbEntireDoc = true;
2066  }
2067 }
2068 
2070 {
2071 }
2072 
2074 {
2075  OSL_ENSURE( !mbEntireDoc || !mxQryTables, "XclExpWebQuery::Save - illegal mode" );
2076  sal_uInt16 nFlags;
2077 
2078  // QSI record
2079  rStrm.StartRecord( EXC_ID_QSI, 10 + maDestRange.GetSize() );
2080  rStrm << EXC_QSI_DEFAULTFLAGS
2081  << sal_uInt16( 0x0010 )
2082  << sal_uInt16( 0x0012 )
2083  << sal_uInt32( 0x00000000 )
2084  << maDestRange;
2085  rStrm.EndRecord();
2086 
2087  // PARAMQRY record
2088  nFlags = 0;
2089  ::insert_value( nFlags, EXC_PQRYTYPE_WEBQUERY, 0, 3 );
2090  ::set_flag( nFlags, EXC_PQRY_WEBQUERY );
2091  ::set_flag( nFlags, EXC_PQRY_TABLES, !mbEntireDoc );
2092  rStrm.StartRecord( EXC_ID_PQRY, 12 );
2093  rStrm << nFlags
2094  << sal_uInt16( 0x0000 )
2095  << sal_uInt16( 0x0001 );
2096  rStrm.WriteZeroBytes( 6 );
2097  rStrm.EndRecord();
2098 
2099  // WQSTRING record
2101  rStrm << maUrl;
2102  rStrm.EndRecord();
2103 
2104  // unknown record 0x0802
2105  rStrm.StartRecord( EXC_ID_0802, 16 + maDestRange.GetSize() );
2106  rStrm << EXC_ID_0802; // repeated record id ?!?
2107  rStrm.WriteZeroBytes( 6 );
2108  rStrm << sal_uInt16( 0x0003 )
2109  << sal_uInt32( 0x00000000 )
2110  << sal_uInt16( 0x0010 )
2111  << maDestRange;
2112  rStrm.EndRecord();
2113 
2114  // WEBQRYSETTINGS record
2116  rStrm.StartRecord( EXC_ID_WQSETT, 28 );
2117  rStrm << EXC_ID_WQSETT // repeated record id ?!?
2118  << sal_uInt16( 0x0000 )
2119  << sal_uInt16( 0x0004 )
2120  << sal_uInt16( 0x0000 )
2122  << nFlags;
2123  rStrm.WriteZeroBytes( 10 );
2124  rStrm << mnRefresh // refresh delay in minutes
2126  << sal_uInt16( 0x0000 );
2127  rStrm.EndRecord();
2128 
2129  // WEBQRYTABLES record
2130  if( mxQryTables )
2131  {
2132  rStrm.StartRecord( EXC_ID_WQTABLES, 4 + mxQryTables->GetSize() );
2133  rStrm << EXC_ID_WQTABLES // repeated record id ?!?
2134  << sal_uInt16( 0x0000 )
2135  << *mxQryTables; // comma separated list of source tables
2136  rStrm.EndRecord();
2137  }
2138 }
2139 
2141 {
2142  SCTAB nScTab = rRoot.GetCurrScTab();
2143  SfxObjectShell* pShell = rRoot.GetDocShell();
2144  if( !pShell ) return;
2145  ScfPropertySet aModelProp( pShell->GetModel() );
2146  if( !aModelProp.Is() ) return;
2147 
2148  Reference< XAreaLinks > xAreaLinks;
2149  aModelProp.GetProperty( xAreaLinks, SC_UNO_AREALINKS );
2150  if( !xAreaLinks.is() ) return;
2151 
2152  for( sal_Int32 nIndex = 0, nCount = xAreaLinks->getCount(); nIndex < nCount; ++nIndex )
2153  {
2154  Reference< XAreaLink > xAreaLink( xAreaLinks->getByIndex( nIndex ), UNO_QUERY );
2155  if( xAreaLink.is() )
2156  {
2157  CellRangeAddress aDestRange( xAreaLink->getDestArea() );
2158  if( static_cast< SCTAB >( aDestRange.Sheet ) == nScTab )
2159  {
2160  ScfPropertySet aLinkProp( xAreaLink );
2161  OUString aFilter;
2162  if( aLinkProp.GetProperty( aFilter, SC_UNONAME_FILTER ) &&
2163  (aFilter == EXC_WEBQRY_FILTER) )
2164  {
2165  // get properties
2166  OUString /*aFilterOpt,*/ aUrl;
2167  sal_Int32 nRefresh = 0;
2168 
2169 // aLinkProp.GetProperty( aFilterOpt, SC_UNONAME_FILTOPT );
2170  aLinkProp.GetProperty( aUrl, SC_UNONAME_LINKURL );
2171  aLinkProp.GetProperty( nRefresh, SC_UNONAME_REFDELAY );
2172 
2173  OUString aAbsDoc( ScGlobal::GetAbsDocName( aUrl, pShell ) );
2174  INetURLObject aUrlObj( aAbsDoc );
2175  OUString aWebQueryUrl( aUrlObj.getFSysPath( FSysStyle::Dos ) );
2176  if( aWebQueryUrl.isEmpty() )
2177  aWebQueryUrl = aAbsDoc;
2178 
2179  // find range or create a new range
2180  OUString aRangeName;
2181  ScRange aScDestRange;
2182  ScUnoConversion::FillScRange( aScDestRange, aDestRange );
2183  if( const ScRangeData* pRangeData = rRoot.GetNamedRanges().findByRange( aScDestRange ) )
2184  {
2185  aRangeName = pRangeData->GetName();
2186  }
2187  else
2188  {
2189  XclExpFormulaCompiler& rFmlaComp = rRoot.GetFormulaCompiler();
2190  XclExpNameManager& rNameMgr = rRoot.GetNameManager();
2191 
2192  // create a new unique defined name containing the range
2193  XclTokenArrayRef xTokArr = rFmlaComp.CreateFormula( EXC_FMLATYPE_WQUERY, aScDestRange );
2194  sal_uInt16 nNameIdx = rNameMgr.InsertUniqueName( aUrlObj.getBase(), xTokArr, nScTab );
2195  aRangeName = rNameMgr.GetOrigName( nNameIdx );
2196  }
2197 
2198  // create and store the web query record
2199  if( !aRangeName.isEmpty() )
2201  aRangeName, aWebQueryUrl, xAreaLink->getSourceArea(), nRefresh ) );
2202  }
2203  }
2204  }
2205  }
2206 }
2207 
2208 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const sal_uInt16 EXC_ID_WQSETT
Definition: xlcontent.hxx:174
const sal_uInt32 EXC_DV_COND_NOTBETWEEN
Definition: xlcontent.hxx:126
void ConvertRangeList(XclRangeList &rXclRanges, const ScRangeList &rScRanges, bool bWarn)
Converts the passed Calc cell range list to an Excel cell range list.
Definition: xehelper.cxx:265
void FillFromVclFont(const vcl::Font &rFont)
Fills all members (except color and escapement) from the passed font.
Definition: xlstyle.cxx:202
double mnMaxLength
Maximal length of a databar in percent of cell length Value has to be in the range (0...
Definition: colorscale.hxx:178
XclTokenArrayRef mxTokArr2
Formula for first condition.
Definition: xecontent.cxx:605
static const XclGuid maGuidUrlMoniker
GUID of StdLink (HLINK record).
Definition: xltools.hxx:97
XclExpCfvoList maCfvoList
Definition: xecontent.hxx:288
This class stores an unformatted or formatted string for Excel export.
Definition: xestring.hxx:48
bool mbFirst
Definition: xecontent.hxx:207
const sal_uInt16 EXC_WQSETT_SPECTABLES
All tables or entire document.
Definition: xlcontent.hxx:176
const sal_uInt32 EXC_DV_MODE_DECIMAL
Definition: xlcontent.hxx:116
bool mbHeightUsed
true = Any font attribute used.
Definition: xecontent.cxx:611
virtual void Save(XclExpStream &rStrm) override
Writes the complete record list.
Definition: xerecord.hxx:375
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1878
XclExpWebQuery(const OUString &rRangeName, const OUString &rUrl, const OUString &rSource, sal_Int32 nRefrSecs)
Constructs a web query record container with settings from Calc.
Definition: xecontent.cxx:2031
std::size_t Write(const void *pData, std::size_t nBytes)
Writes nBytes bytes from memory.
Definition: xestream.cxx:216
static OString ToOString(const Color &rColor)
Definition: xestream.cxx:699
const sal_uInt16 EXC_ID_CONDFMT
Definition: xlcontent.hxx:54
const sal_uInt16 EXC_ID_LABELRANGES
Definition: xlcontent.hxx:50
sal_Int16 mnRefresh
List of source range names.
Definition: xecontent.hxx:406
XclExpRecordList< XclExpRecord > maCFList
Definition: xecontent.hxx:243
XclExpCFImplPtr mxImpl
Definition: xecontent.hxx:182
rtl_TextEncoding GetTextEncoding() const
Returns the text encoding to import/export byte strings.
Definition: xlroot.hxx:147
sal_Int32 nIndex
const sal_uInt8 EXC_CF_CMP_LESS
Definition: xlcontent.hxx:67
const sal_uInt32 EXC_DV_ERROR_STOP
Definition: xlcontent.hxx:136
bool mbBorderUsed
true = Font strikeout used.
Definition: xecontent.cxx:617
ScAddress aStart
Definition: address.hxx:500
const sal_uInt32 EXC_DV_COND_EQGREATER
Definition: xlcontent.hxx:131
const sal_uInt32 EXC_DV_COND_GREATER
Definition: xlcontent.hxx:129
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the DV record.
Definition: xecontent.cxx:1864
static bool GetHTMLNameFromName(const OUString &rSource, OUString &rName)
Converts a built-in range name to an HTML table name.
Definition: ftools.cxx:327
const sal_uInt8 EXC_TOKID_STR
Missing argument.
Definition: xlformula.hxx:75
static bool CheckItem(const SfxItemSet &rItemSet, sal_uInt16 nWhichId, bool bDeep)
Returns true, if the passed item set contains the item.
Definition: ftools.cxx:195
XclExpDV(const XclExpRoot &rRoot, sal_uLong nScHandle)
Definition: xecontent.cxx:1673
bool mbFontUsed
Priority of this entry; needed for oox export.
Definition: xecontent.cxx:610
ScRangeName & GetNamedRanges() const
Returns the defined names container of the Calc document.
Definition: xlroot.cxx:302
sal_uInt8 mnOperator
Type of the condition (cell/formula).
Definition: xecontent.cxx:608
MS Excel binary .xls.
Definition: xlconst.hxx:44
const XclExpRoot & GetRoot() const
Returns the filter root data.
Definition: xestream.hxx:292
XclExpStringRef mxQryTables
Source document URL.
Definition: xecontent.hxx:405
constexpr TypedWhichId< SvxBoxItem > ATTR_BORDER(150)
SvStream & WriteUInt16(sal_uInt16 nUInt16)
This class is used to export Excel record streams.
Definition: xestream.hxx:73
SCROW Row() const
Definition: address.hxx:262
static const XclGuid maGuidFileMoniker
GUID of URL moniker (HLINK record).
Definition: xltools.hxx:98
static bool IsHTMLTablesName(const OUString &rSource)
Returns true, if rSource is the built-in range name for all HTML tables.
Definition: ftools.cxx:322
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xerecord.hxx:382
const ScCondDateFormatEntry & mrFormatEntry
Definition: xecontent.hxx:194
void WriteBuffer(XclExpStream &rStrm) const
Writes the raw character buffer.
Definition: xestring.cxx:305
const sal_uInt16 EXC_ID_PQRY
Definition: xlcontent.hxx:159
const sal_uInt32 EXC_HLINK_BODY
Definition: xlcontent.hxx:144
sal_uInt16 GetRawRecPos() const
Returns the position inside of current record (starts by 0 in every CONTINUE).
Definition: xestream.hxx:96
virtual ~XclExpColScaleCol() override
Definition: xecontent.cxx:1245
const sal_uInt16 EXC_ID_EXTSST
Definition: xlcontent.hxx:46
void AppendRecord(RecType *pRec)
Appends a record to the list.
Definition: xerecord.hxx:348
const sal_uInt8 EXC_CF_TYPE_NONE
Definition: xlcontent.hxx:57
static OUString ToOUString(const char *s)
Definition: xestream.cxx:784
void Format(OUString &, ScRefFlags nFlags, const ScDocument &, formula::FormulaGrammar::AddressConvention eConv=formula::FormulaGrammar::CONV_OOO, sal_Unicode cDelimiter=0, bool bFullAddressNotation=false) const
Definition: rangelst.cxx:144
OUString getBase(sal_Int32 nIndex=LAST_SEGMENT, bool bIgnoreFinalSlash=true, DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
bool mbReverse
Specifies whether the icons should be shown in reverse order.
Definition: colorscale.hxx:339
XclExpDVRef mxLastFoundDV
List of DV records.
Definition: xecontent.hxx:379
ScValidErrorStyle
Definition: validat.hxx:51
constexpr TypedWhichId< SvxCrossedOutItem > ATTR_FONT_CROSSEDOUT(106)
const sal_uInt32 EXC_HLINK_ABS
Contains file link or URL.
Definition: xlcontent.hxx:145
sal_uIntPtr sal_uLong
XclExpCondFormatBuffer(const XclExpRoot &rRoot, const XclExtLstRef &xExtLst)
Constructs CONDFMT and CF records containing the conditional formats of the current sheet...
Definition: xecontent.cxx:1562
const Color & mrColor
Definition: xecontent.hxx:218
double mnMinLength
Minimal length of a databar in percent of cell length Value has to be in the range [0...
Definition: colorscale.hxx:173
XclExpString maUrl
Destination range.
Definition: xecontent.hxx:404
const sal_uInt8 EXC_CF_CMP_EQUAL
Definition: xlcontent.hxx:64
Conditional format.
Definition: xlformula.hxx:166
This struct helps reading and writing Excel fonts.
Definition: xlstyle.hxx:286
bool FillFromItemSet(const SfxItemSet &rItemSet, XclExpPalette &rPalette, bool bStyle)
Fills the area attributes from the passed item set.
Definition: xestyle.cxx:1873
static bool IsHTMLDocName(const OUString &rSource)
Returns true, if rSource is the built-in range name for an HTML document.
Definition: ftools.cxx:317
const sal_uInt32 EXC_DV_MODE_TIME
Definition: xlcontent.hxx:119
bool mbStrikeUsed
true = Font posture used.
Definition: xecontent.cxx:616
const ObjectTypeFormatEntry & mrEntry
const OUString & GetStyle() const
Definition: conditio.hxx:474
XclExpFormulaCompiler & GetFormulaCompiler() const
Returns the formula compiler to produce formula token arrays.
Definition: xeroot.cxx:87
void SetRecSize(std::size_t nRecSize)
Sets a new record size prediction.
Definition: xerecord.hxx:163
static bool GetStringList(OUString &rStringList, const ScTokenArray &rScTokArr, sal_Unicode cSep)
Parses the passed formula and tries to find a string token list, i.e.
Definition: xlformula.cxx:874
aBuf
sal_uInt32 Insert(XclExpStringRef xString)
Inserts the passed string, if not already inserted, and returns the unique SST index.
Definition: xecontent.cxx:123
sal_uInt16 mnHeight
Font color.
Definition: xlstyle.hxx:291
const sal_uInt8 EXC_CF_CMP_BETWEEN
Definition: xlcontent.hxx:62
sal_uInt64 Seek(sal_uInt64 nPos)
condformat::ScCondFormatDateType GetDateType() const
Definition: conditio.hxx:513
const sal_uInt32 EXC_DV_SHOWERROR
Definition: xlcontent.hxx:110
bool mbEntireDoc
Refresh time in minutes.
Definition: xecontent.hxx:407
XclExpString maDestRange
Definition: xecontent.hxx:403
ScRange Combine() const
Definition: rangelst.cxx:1112
bool mbOnlyBar
If TRUE we only show the bar and not the value.
Definition: colorscale.hxx:183
ScAddress aEnd
Definition: address.hxx:501
bool IsValidForBinary() const
Returns true, if this conditional format contains at least one cell range and CF record.
Definition: xecontent.cxx:1385
void set_flag(Type &rnBitField, Type nMask, bool bSet=true)
Sets or clears (according to bSet) all set bits of nMask in rnBitField.
Definition: ftools.hxx:96
XclFontData maFontData
Top left cell of the combined range.
Definition: xecontent.cxx:601
bool mbColorUsed
true = Font weight used.
Definition: xecontent.cxx:613
Represents a CF record that contains one condition of a conditional format.
Definition: xecontent.cxx:589
const sal_uInt32 EXC_DV_STRINGLIST
Definition: xlcontent.hxx:106
static OUString GetRelURL(OUString const &rTheBaseURIRef, OUString const &rTheAbsURIRef, EncodeMechanism eEncodeMechanism=EncodeMechanism::WasEncoded, DecodeMechanism eDecodeMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8, FSysStyle eStyle=FSysStyle::Detect)
sal_uInt16 GetSize() const
Returns the size of the token array in bytes.
Definition: xlformula.cxx:735
const sal_uInt32 EXC_DV_COND_NOTEQUAL
Definition: xlcontent.hxx:128
const ScColorScaleEntry & mrEntry
Definition: xecontent.hxx:205
css::uno::Reference< css::frame::XModel > GetModel() const
ScCondFormatDateType
Definition: conditio.hxx:485
const sal_uInt8 EXC_CF_CMP_LESS_EQUAL
Definition: xlcontent.hxx:69
ScRangeList maScRanges
Definition: xecontent.hxx:337
sal_uLong mnScHandle
Miscellaneous flags.
Definition: xecontent.hxx:350
ScDocument & GetDoc() const
Returns reference to the destination document (import) or source document (export).
Definition: xlroot.cxx:276
XclExpCondfmtList maCondfmtList
Definition: xecontent.hxx:306
const sal_uInt32 EXC_DV_COND_LESS
Definition: xlcontent.hxx:130
const sal_uInt32 EXC_DV_COND_EQLESS
Definition: xlcontent.hxx:132
virtual ~XclExpDval() override
Definition: xecontent.cxx:1934
Shared formula.
Definition: xlformula.hxx:165
sal_Int32 mnPriority
Definition: xecontent.hxx:260
const sal_uInt32 EXC_CF_ALLDEFAULT
Any area attribute modified?
Definition: xlcontent.hxx:80
XclExpStringRef mxString1
The error text.
Definition: xecontent.hxx:343
ScConditionMode GetOperation() const
Definition: conditio.hxx:370
const sal_uInt8 EXC_CF_CMP_NONE
Definition: xlcontent.hxx:61
Web query source range.
Definition: xlformula.hxx:171
Extends the XclCellArea struct for export.
Definition: xestyle.hxx:373
size_t size() const
Definition: xladdress.hxx:109
const sal_uInt32 EXC_DV_COND_BETWEEN
Definition: xlcontent.hxx:125
const sal_uInt16 EXC_PQRYTYPE_WEBQUERY
Source type: ODBC.
Definition: xlcontent.hxx:161
const sal_uInt16 EXC_ID_DV
Definition: xlcontent.hxx:103
Base class for ext entries.
Definition: xeextlst.hxx:37
bool mbItalicUsed
true = Font underline type used.
Definition: xecontent.cxx:615
FuncFlags mnFlags
Information about all parameters.
XclExpString maErrorTitle
The prompt text.
Definition: xecontent.hxx:341
const ScTokenArray * GetFormula() const
Definition: colorscale.cxx:216
static const char * getIconSetName(ScIconSetType eType)
const ScRangeList & GetRange() const
Definition: conditio.hxx:560
The formula compiler to create Excel token arrays from Calc token arrays.
Definition: xeformula.hxx:52
const sal_uInt32 EXC_DV_MODE_DATE
Definition: xlcontent.hxx:118
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:254
void InsertCellRange(const ScRange &rRange, sal_uLong nScHandle)
Inserts the cell range into the range list of the DV record with the specified handle.
Definition: xecontent.cxx:1938
Access to global data from other classes.
Definition: xeroot.hxx:113
const sal_uInt32 EXC_DV_MODE_CUSTOM
Definition: xlcontent.hxx:121
OUString getNamespaceURL(sal_Int32 nNSID) const
void SaveXml(XclExpXmlStream &rStrm)
Definition: xecontent.cxx:205
#define INET_FILE_SCHEME
XclExpColScaleCol(const XclExpRoot &rRoot, const Color &rColor)
Definition: xecontent.cxx:1238
static const XclGuid maGuidStdLink
Definition: xltools.hxx:96
void SaveXml(XclExpXmlStream &rStrm)
Definition: xecontent.cxx:1023
ReturnType ulimit_cast(Type nValue, ReturnType nMax)
Returns the value, if it is not greater than nMax, otherwise nMax.
Definition: ftools.hxx:54
sal_uInt16 InsertUniqueName(const OUString &rName, const XclTokenArrayRef &xTokArr, SCTAB nScTab)
Inserts a new defined name.
Definition: xename.cxx:824
OUString maUrl
const sal_uInt16 EXC_ID_MERGEDCELLS
Definition: xlcontent.hxx:33
const sal_uInt8 EXC_CF_TYPE_CELL
Definition: xlcontent.hxx:58
ScIconSetType eIconSetType
Definition: colorscale.hxx:334
int nCount
void WriteArray(XclExpStream &rStrm) const
Writes the tokens of the token array (without size field).
Definition: xlformula.cxx:765
OUString msFormula2
Formula for second condition.
Definition: xecontent.hxx:348
ScColorScaleEntryType GetType() const
Definition: colorscale.hxx:77
const sal_uInt16 EXC_ID_WQTABLES
Definition: xlcontent.hxx:183
void PushStream(sax_fastparser::FSHelperPtr const &aStream)
Definition: xestream.cxx:917
void push_back(const ScRange &rRange)
Definition: rangelst.cxx:1142
const sal_uInt16 EXC_FONTESC_NONE
Definition: xlstyle.hxx:126
SvStream & WriteUInt32(sal_uInt32 nUInt32)
ScConditionMode
Definition: conditio.hxx:61
SCTAB Tab() const
Definition: address.hxx:271
const ScCondFormatEntry & mrFormatEntry
Definition: xecontent.cxx:599
const sal_uInt32 EXC_CF_BLOCK_AREA
Border block present?
Definition: xlcontent.hxx:85
sal_uInt32 InsertColor(const Color &rColor, XclExpColorType eType, sal_uInt16 nAutoDefault=0)
Inserts the color into the list and updates weighting.
Definition: xestyle.cxx:763
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1215
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
INetProtocol
ScRangeList maRowRanges
Definition: xecontent.hxx:159
XclExpDataBar(const XclExpRoot &rRoot, const ScDataBarFormat &rFormat, sal_Int32 nPriority, const OString &rGUID)
Definition: xecontent.cxx:1472
bool mbItalic
Underline style.
Definition: xlstyle.hxx:297
sax_fastparser::FSHelperPtr & GetCurrentStream()
Definition: xestream.cxx:911
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1109
XclExpCfvo(const XclExpRoot &rRoot, const ScColorScaleEntry &rFormatEntry, const ScAddress &rPos, bool bFirst=true)
Definition: xecontent.cxx:1176
OUString getRelationship(Relationship eRelationship)
void SetCol(SCCOL nColP)
Definition: address.hxx:279
XclExpIconSet(const XclExpRoot &rRoot, const ScIconSetFormat &rFormat, sal_Int32 nPriority)
Definition: xecontent.cxx:1525
XclExpDxfs & GetDxfs() const
Returns the differential formatting list.
Definition: xeroot.cxx:159
size_t size() const
Definition: conditio.cxx:1767
void PopStream()
Definition: xestream.cxx:922
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1249
#define SC_UNONAME_FILTER
Definition: unonames.hxx:366
void SetSliceSize(sal_uInt16 nSize)
Sets data slice length.
Definition: xestream.cxx:130
constexpr TypedWhichId< SvxUnderlineItem > ATTR_FONT_UNDERLINE(104)
Color maPositiveColor
Color for all Positive Values and if mbNeg == false also for negative ones.
Definition: colorscale.hxx:135
const sal_uInt16 EXC_PQRY_WEBQUERY
ODBC connection.
Definition: xlcontent.hxx:163
sal_uInt32 mnFlags
OOXML Formula for second condition.
Definition: xecontent.hxx:349
virtual ~XclExpSst() override
Definition: xecontent.cxx:240
void SetFinalColors(const XclExpPalette &rPalette)
Fills the mn***Color base members from the mn***ColorId members.
Definition: xestyle.cxx:1891
bool empty() const
Definition: xladdress.hxx:110
ScAddress maOrigin
Calc conditional format entry.
Definition: xecontent.cxx:600
void Save(XclExpStream &rStrm)
Writes the complete SST and EXTSST records.
Definition: xecontent.cxx:154
const sal_uInt32 EXC_CF_AREA_ALL
Background color modified?
Definition: xlcontent.hxx:79
bool mbWeightUsed
true = Font height used.
Definition: xecontent.cxx:612
ScAddress GetValidSrcPos() const
Return a position that's adjusted to allow textual representation of expressions if possible...
Definition: conditio.cxx:1326
std::vector< XclExpStringRef > maStringVector
Definition: xecontent.cxx:107
const sal_uInt32 EXC_CF_FONT_STRIKEOUT
Font posture or weight modified?
Definition: xlcontent.hxx:90
sal_uInt32 mnFontColorId
Formula for second condition.
Definition: xecontent.cxx:606
const sal_uInt16 EXC_ID_DVAL
Font escapement type modified?
Definition: xlcontent.hxx:98
const sal_uInt32 EXC_DV_MODE_LIST
Definition: xlcontent.hxx:117
const sal_uInt32 EXC_CF_BLOCK_BORDER
Alignment block present?
Definition: xlcontent.hxx:84
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the DVAL record.
Definition: xecontent.cxx:2023
sal_Int32 mnPriority
Definition: xecontent.hxx:275
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1582
const ScRangeList & GetRange() const
Definition: colorscale.cxx:438
double mnPriority
const ScFormatEntry * GetEntry(sal_uInt16 nPos) const
Definition: conditio.cxx:1781
::std::vector< XclExpHashEntry > XclExpHashVec
Definition: xecontent.cxx:105
static SC_DLLPUBLIC OUString GetAbsDocName(const OUString &rFileName, const SfxObjectShell *pShell)
Definition: global2.cxx:284
void SetTab(SCTAB nTabP)
Definition: address.hxx:283
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1420
constexpr TypedWhichId< SvxPostureItem > ATTR_FONT_POSTURE(103)
const sal_uInt32 EXC_CF_FONT_STYLE
NumberFormat String or Id?
Definition: xlcontent.hxx:89
XclExpCfvoList maCfvoList
Definition: xecontent.hxx:258
bool IsValidForXml() const
Definition: xecontent.cxx:1395
SC_DLLPUBLIC const ScRangeData * findByRange(const ScRange &rRange) const
Definition: rangenam.cxx:672
MS Excel 5.0, MS Excel 7.0 (95)
Definition: xlconst.hxx:36
OUString getFSysPath(FSysStyle eStyle, sal_Unicode *pDelimiter=nullptr) const
bool mbUnderlUsed
true = Font color used.
Definition: xecontent.cxx:614
Extends the XclCellBorder struct for export.
Definition: xestyle.hxx:342
static void GetFont(vcl::Font &rFont, const SfxItemSet &rItemSet, ScAutoFontColorMode eAutoMode, const OutputDevice *pOutDev=nullptr, const Fraction *pScale=nullptr, const SfxItemSet *pCondSet=nullptr, SvtScriptType nScript=SvtScriptType::NONE, const Color *pBackConfigColor=nullptr, const Color *pTextConfigColor=nullptr)
Static helper function to fill a font object from the passed item set.
Definition: patattr.cxx:216
const sal_uInt8 EXC_CF_CMP_GREATER_EQUAL
Definition: xlcontent.hxx:68
void Assign(const OUString &rString, XclStrFlags nFlags=XclStrFlags::NONE, sal_uInt16 nMaxLen=EXC_STR_MAXLEN)
Assigns an unformatted string, converts this object to a BIFF8 Unicode string.
Definition: xestring.cxx:111
Represents a CONDFMT record that contains all conditions of a conditional format. ...
Definition: xecontent.hxx:223
XclOutput GetOutput() const
Returns the current output format of the importer/exporter.
Definition: xlroot.hxx:143
#define SC_UNO_AREALINKS
Definition: unonames.hxx:38
sal_uInt8 mnUnderline
Windows character set.
Definition: xlstyle.hxx:296
XclExpAddressConverter & GetAddressConverter() const
Returns the address converter.
Definition: xeroot.cxx:81
OUString msFormula1
Formula for first condition.
Definition: xecontent.hxx:345
sal_uInt64 GetSvStreamPos() const
Returns the absolute position of the system stream.
Definition: xestream.hxx:141
sal_uInt16 GetColorIndex(sal_uInt32 nColorId) const
Returns the Excel palette index of the color with passed color ID.
Definition: xestyle.cxx:778
const sal_uInt16 EXC_PQRY_TABLES
Web query.
Definition: xlcontent.hxx:164
int i
virtual void Save(XclExpStream &rStrm) override
Writes the CONDFMT record with following CF records, if there is valid data.
Definition: xecontent.cxx:1400
OUStringBuffer & truncateToLength(OUStringBuffer &rBuffer, sal_Int32 nLength)
OUString GetURLNoMark(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
XclExpDV & SearchOrCreateDv(sal_uLong nScHandle)
Searches for or creates a XclExpDV record object with the specified handle.
Definition: xecontent.cxx:1983
Manager that stores all internal defined names (NAME records) of the document.
Definition: xename.hxx:32
OString maGUID
Definition: xecontent.hxx:276
sal_Int32 mnType
#define STREAM_SEEK_TO_BEGIN
Contains all records for a web query (linked tables in an HTML document).
Definition: xecontent.hxx:388
OUString GetExpression(const ScAddress &rCursor, sal_uInt16 nPos, sal_uInt32 nNumFmt=0, const formula::FormulaGrammar::Grammar eGrammar=formula::FormulaGrammar::GRAM_DEFAULT) const
Definition: conditio.cxx:1235
std::unique_ptr< XclExpColScaleCol > mpCol
Definition: xecontent.hxx:272
const sal_uInt32 EXC_DV_ERROR_WARNING
Definition: xlcontent.hxx:137
XclExpPalette & GetPalette() const
Returns the color buffer.
Definition: xeroot.cxx:105
void RemoveRecord(size_t nPos)
Removes the record at the specified position from the list.
Definition: xerecord.hxx:369
const OUString & GetOrigName(sal_uInt16 nNameIdx) const
Returns the Calc sheet of a local defined name, or SCTAB_GLOBAL for global defined names...
Definition: xename.cxx:840
const sal_uInt32 EXC_DV_MODE_TEXTLEN
Definition: xlcontent.hxx:120
const sal_uInt32 EXC_CF_BLOCK_FONT
Font block present?
Definition: xlcontent.hxx:82
ScRangeList maColRanges
Cell range list for row labels.
Definition: xecontent.hxx:160
A 2D cell range address list with Excel column and row indexes.
Definition: xladdress.hxx:101
size_t size() const
Definition: rangelst.hxx:90
void InsertRecord(RecType *pRec, size_t nPos)
Inserts a record at the specified position into the list.
Definition: xerecord.hxx:343
const ScRange & GetRange(sal_uInt16 n) const
Definition: address.hxx:817
float u
const sal_uInt32 EXC_HLINK_MARK
Description.
Definition: xlcontent.hxx:147
const sal_uInt32 EXC_DV_IGNOREBLANK
Definition: xlcontent.hxx:107
void EndRecord()
Checks and corrects real record length.
Definition: xestream.cxx:121
virtual ~XclExpDateFormat() override
Definition: xecontent.cxx:1122
bool get_flag(Type nBitField, Type nMask)
Returns true, if at least one of the bits set in nMask is set in nBitField.
Definition: ftools.hxx:76
const ScIconSetFormatData * GetIconSetData() const
virtual ~XclExpCF() override
Definition: xecontent.cxx:1100
const OUString & GetRepresentation() const
XclExpNameManager & GetNameManager() const
Returns the buffer that contains internal defined names.
Definition: xeroot.cxx:141
XclExpWebQueryBuffer(const XclExpRoot &rRoot)
Definition: xecontent.cxx:2140
virtual void Save(XclExpStream &rStrm) override
Writes all needed records for this web query.
Definition: xecontent.cxx:2073
const sal_uInt8 EXC_CF_TYPE_FMLA
Definition: xlcontent.hxx:59
const sal_uInt32 EXC_DV_COND_MASK
Definition: xlcontent.hxx:124
const sal_uInt8 EXC_CF_CMP_GREATER
Definition: xlcontent.hxx:66
bool In(const ScAddress &) const
is Address& in Range?
Definition: address.hxx:733
void FillToCF8(sal_uInt16 &rnPattern, sal_uInt16 &rnColor) const
Fills the data to the passed fields of a BIFF8 CF (conditional format) record.
Definition: xestyle.cxx:1910
OString generateGUIDString()
#define XESTRING_TO_PSZ(s)
Definition: xestream.hxx:233
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1542
void CopyFromStream(SvStream &rInStrm, sal_uInt64 nBytes=STREAM_SEEK_TO_END)
Copies nBytes bytes from current position of the stream rInStrm.
Definition: xestream.cxx:284
std::shared_ptr< FastSerializerHelper > FSHelperPtr
virtual ~XclExpDV() override
Definition: xecontent.cxx:1849
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1160
void AppendNewRecord(RecType *pRec)
Appends a newly created record to the list.
Definition: xerecord.hxx:361
std::shared_ptr< XclTokenArray > XclTokenArrayRef
Definition: xlformula.hxx:417
const sal_uInt32 EXC_CF_FONT_UNDERL
Default flags.
Definition: xlcontent.hxx:93
static void FillRangeList(ScRangeList &rScRanges, const ScRangePairListRef &xLabelRangesRef, SCTAB nScTab)
Fills the specified range list with all label headers of the current sheet.
Definition: xecontent.cxx:560
const sal_uInt32 EXC_CF_BORDER_ALL
Bottom border line modified?
Definition: xlcontent.hxx:75
SCCOL Col() const
Definition: address.hxx:267
void FillToCF8(sal_uInt16 &rnLine, sal_uInt32 &rnColor) const
Fills the data to the passed fields of a BIFF8 CF (conditional format) record.
Definition: xestyle.cxx:1798
XclExpColScaleColList maColList
Definition: xecontent.hxx:259
const XclExpRoot & GetRoot() const
Returns this root instance - for code readability in derived classes.
Definition: xeroot.hxx:119
SCTAB GetCurrScTab() const
Returns the current Calc sheet index.
Definition: xlroot.hxx:161
bool FillFromItemSet(const SfxItemSet &rItemSet, XclExpPalette &rPalette, XclBiff eBiff, bool bStyle=false)
Fills the border attributes from the passed item set.
Definition: xestyle.cxx:1703
const sal_uInt32 EXC_DV_SUPPRESSDROPDOWN
Definition: xlcontent.hxx:108
ReturnType llimit_cast(Type nValue, ReturnType nMin)
Returns the value, if it is not less than nMin, otherwise nMin.
Definition: ftools.hxx:49
const ScIconSetFormat & mrFormat
Definition: xecontent.hxx:289
const sal_uInt16 EXC_QSI_DEFAULTFLAGS
Definition: xlcontent.hxx:168
const OUString & GetURL() const
XclExpString maErrorText
The error title.
Definition: xecontent.hxx:342
virtual void Save(XclExpStream &rStrm) override
Writes all contained CONDFMT records with their CF records.
Definition: xecontent.cxx:1577
const sal_uInt32 EXC_XFID_NOTFOUND
Special index for "not found" state.
Definition: xlstyle.hxx:143
const sal_uInt16 EXC_ID_SST
Definition: xlcontent.hxx:45
Default string settings.
Provides functions to convert Calc cell addresses to Excel cell addresses.
Definition: xehelper.hxx:82
constexpr TypedWhichId< SvxBrushItem > ATTR_BACKGROUND(148)
OUString GetMainURL(DecodeMechanism eMechanism, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
const sal_uInt32 EXC_DV_COND_EQUAL
Definition: xlcontent.hxx:127
virtual void Save(XclExpStream &rStrm) override
Writes the record, if it contains at least one merged cell range.
Definition: xecontent.cxx:289
RecType * GetRecord(size_t nPos) const
Returns reference to an existing record or empty reference on error.
Definition: xerecord.hxx:333
Binary representation of an Excel token array.
Definition: xlformula.hxx:377
A wrapper for a UNO property set.
Definition: fapihelper.hxx:104
OUString addRelation(const OUString &rType, const OUString &rTarget)
XclExpDateFormat(const XclExpRoot &rRoot, const ScCondDateFormatEntry &rFormatEntry, sal_Int32 nPriority)
Definition: xecontent.cxx:1114
void InsertCellRange(const ScRange &rPos)
Inserts a new cell range into the cell range list.
Definition: xecontent.cxx:1853
std::unique_ptr< char[]> aBuffer
const sal_uInt32 EXC_DV_ERROR_MASK
Definition: xlcontent.hxx:135
void WriteZeroBytesToRecord(std::size_t nBytes)
Definition: xestream.cxx:274
sal_Int32 mnPriority
Definition: xecontent.hxx:290
sal_uInt16 Len() const
Returns the character count of the string.
Definition: xestring.hxx:119
const ScFormatEntry * pEntry
Definition: xeextlst.hxx:31
bool mbPattUsed
true = Border attribute used.
Definition: xecontent.cxx:618
XclExpCellBorder maBorder
Font formatting attributes.
Definition: xecontent.cxx:602
OUString msSeqRef
Cell ranges for this conditional format.
Definition: xecontent.hxx:245
void SetFinalColors(const XclExpPalette &rPalette)
Fills the mn***Color base members from the mn***ColorId members.
Definition: xestyle.cxx:1761
#define SC_UNONAME_LINKURL
Definition: unonames.hxx:368
#define SAL_WARN_IF(condition, area, stream)
XclRangeList maXclRanges
Calc range list with all affected cells.
Definition: xecontent.hxx:338
void Join(const ScRange &, bool bIsInList=false)
Definition: rangelst.cxx:164
static SC_DLLPUBLIC OUString addToken(const OUString &rTokenList, const OUString &rToken, sal_Unicode cSep, sal_Int32 nSepCount=1, bool bForceSep=false)
Adds the string rToken to rTokenList, using a list separator character.
Definition: global.cxx:654
virtual ~XclExpCondfmt() override
Definition: xecontent.cxx:1381
unsigned char sal_uInt8
std::unique_ptr< ScColorScaleEntry, o3tl::default_delete< ScColorScaleEntry > > mpUpperLimit
Definition: colorscale.hxx:185
const sal_uInt16 EXC_WQSETT_FORMATFULL
Definition: xlcontent.hxx:180
const OUString & GetStyleName() const
Definition: conditio.hxx:515
void AppendRange(const ScRange &rRange, sal_uInt32 nBaseXFId)
Appends a new range to the list of merged cell ranges.
Definition: xecontent.cxx:266
XclExpColorScale(const XclExpRoot &rRoot, const ScColorScaleFormat &rFormat, sal_Int32 nPriority)
Definition: xecontent.cxx:1436
std::size_t GetSize() const
Returns the byte count the whole string will take on export.
Definition: xestring.cxx:249
virtual ~XclExpWebQuery() override
Definition: xecontent.cxx:2069
sal_Int32 mnPriority
Comparison operator for cell type.
Definition: xecontent.cxx:609
size_t size() const
Definition: rangelst.cxx:1229
Any maOrigin
const sal_uInt16 EXC_ID_QSI
All tables.
Definition: xlcontent.hxx:167
XclRangeList maXclRanges
List of CF records.
Definition: xecontent.hxx:244
bool HasMark() const
INetProtocol GetProtocol() const
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1490
Always use UCS-2 characters (default: try to compress). BIFF8 only.
sax_fastparser::FSHelperPtr CreateOutputStream(const OUString &sFullStream, const OUString &sRelativeStream, const css::uno::Reference< css::io::XOutputStream > &xParentRelation, const char *sContentType, std::u16string_view sRelationshipType, OUString *pRelationshipId=nullptr)
Definition: xestream.cxx:940
ScRangeList maMergedRanges
Definition: xecontent.hxx:89
Represents a CF record that contains one condition of a conditional format.
Definition: xecontent.hxx:168
sal_uInt16 mnWeight
Font height in twips (1/20 of a point).
Definition: xlstyle.hxx:292
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1454
constexpr TypedWhichId< SvxWeightItem > ATTR_FONT_WEIGHT(102)
XclExpCellArea maArea
Border formatting attributes.
Definition: xecontent.cxx:603
XclTokenArrayRef CreateFormula(XclFormulaType eType, const ScTokenArray &rScTokArr, const ScAddress *pScBasePos=nullptr, XclExpRefLog *pRefLog=nullptr)
Creates and returns the token array of a formula.
Definition: xeformula.cxx:2637
void insert_value(Type &rnBitField, InsertType nValue, sal_uInt8 nStartBit, sal_uInt8 nBitCount)
Inserts a value into a bitfield.
Definition: ftools.hxx:103
virtual void Save(XclExpStream &rStrm) override
Writes the LABELRANGES record if it contains at least one range.
Definition: xecontent.cxx:572
XclExpCondfmt(const XclExpRoot &rRoot, const ScConditionalFormat &rCondFormat, const XclExtLstRef &xExtLst, sal_Int32 &rIndex)
Definition: xecontent.cxx:1292
XclRange GetEnclosingRange() const
Definition: xladdress.cxx:72
const sal_uInt16 EXC_MERGEDCELLS_MAXCOUNT
Definition: xlcontent.hxx:34
XclBiff GetBiff() const
Returns the current BIFF version of the importer/exporter.
Definition: xlroot.hxx:141
const sal_uInt8 EXC_CF_CMP_NOT_BETWEEN
Definition: xlcontent.hxx:63
const sal_uInt16 EXC_ID_HLINK
Definition: xlcontent.hxx:142
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the CF record.
Definition: xecontent.cxx:1104
bool mbFormula2
true = Pattern attribute used.
Definition: xecontent.cxx:619
XclTokenArrayRef mxTokArr1
String for first condition formula.
Definition: xecontent.hxx:344
const sal_uInt16 EXC_WQSETT_ALL
Definition: xlcontent.hxx:175
SC_DLLPUBLIC ScStyleSheetPool * GetStyleSheetPool() const
Definition: document.cxx:6059
const sal_uInt8 EXC_CF_CMP_NOT_EQUAL
Definition: xlcontent.hxx:65
ScfUInt32Vec maBaseXFIds
All merged cell ranges of the sheet.
Definition: xecontent.hxx:90
constexpr sal_Int32 FSNS(sal_Int32 namespc, sal_Int32 element)
sal_uInt32 Insert(const XclExpStringRef &xString)
Inserts a new string into the table.
Definition: xecontent.cxx:244
XclExpLabelranges(const XclExpRoot &rRoot)
Fills the cell range lists with all ranges of the current sheet.
Definition: xecontent.cxx:543
size_t GetSize() const
Definition: xerecord.hxx:327
std::vector< XclExpHashVec > maHashTab
List of unique strings (in SST ID order).
Definition: xecontent.cxx:109
const ScDataBarFormatData * GetDataBarData() const
Definition: colorscale.cxx:736
XclTokenArrayRef mxTokArr1
Pattern formatting attributes.
Definition: xecontent.cxx:604
void StartRecord(sal_uInt16 nRecId, std::size_t nRecSize)
Starts a new record: writes header data, stores calculated record size.
Definition: xestream.cxx:109
const sal_uInt32 EXC_CF_FONT_ALLDEFAULT
Font cancellation modified?
Definition: xlcontent.hxx:91
sal_uInt32 mnTotal
Hashed table that manages string pointers.
Definition: xecontent.cxx:110
OUString sId
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the CONDFMT record.
Definition: xecontent.cxx:1409
void WriteBody(XclExpStream &rStrm)
Writes the body of the CF record.
Definition: xecontent.cxx:721
ScRange & front()
Definition: rangelst.hxx:93
const sal_uInt16 EXC_ID_WQSTRING
Definition: xlcontent.hxx:156
const sal_uInt32 EXC_DV_MODE_MASK
Definition: xlcontent.hxx:113
XclExpCF(const XclExpRoot &rRoot, const ScCondFormatEntry &rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin)
Definition: xecontent.cxx:1093
XclExpMergedcells(const XclExpRoot &rRoot)
Definition: xecontent.cxx:261
OUString GetMark(DecodeMechanism eMechanism=DecodeMechanism::ToIUri, rtl_TextEncoding eCharset=RTL_TEXTENCODING_UTF8) const
const OUString & GetBasePath() const
Returns the base path of the imported/exported file.
Definition: xlroot.hxx:173
Provides export of the data of a DV record.
Definition: xecontent.hxx:315
Color maColor
String with styles (bold, italic).
Definition: xlstyle.hxx:290
#define EXC_WEBQRY_FILTER
UNC path.
Definition: xlcontent.hxx:153
#define SC_UNONAME_REFDELAY
Definition: unonames.hxx:370
std::unique_ptr< ScTokenArray > CreateFlatCopiedTokenArray(sal_uInt16 nPos) const
Create a flat copy using ScTokenArray copy-ctor with shared tokens.
Definition: conditio.cxx:1281
XclExpString maPromptTitle
Excel range list with all affected cells.
Definition: xecontent.hxx:339
XclExpCFImpl(const XclExpRoot &rRoot, const ScCondFormatEntry &rFormatEntry, sal_Int32 nPriority, ScAddress aOrigin)
Definition: xecontent.cxx:622
SfxObjectShell * GetDocShell() const
Returns the object shell of the Calc document.
Definition: xlroot.cxx:281
XclTokenArrayRef mxTokArr2
x12ac:list for first condition.
Definition: xecontent.hxx:347
std::unique_ptr< ScColorScaleEntry, o3tl::default_delete< ScColorScaleEntry > > mpLowerLimit
Definition: colorscale.hxx:186
const sal_uInt16 EXC_ID_CF
Definition: xlcontent.hxx:55
std::shared_ptr< XclExpString > XclExpStringRef
Definition: xeroot.hxx:36
virtual void Save(XclExpStream &rStrm) override
Writes the DVAL record and the DV record list.
Definition: xecontent.cxx:1947
const sal_uInt32 EXC_DV_MODE_ANY
Definition: xlcontent.hxx:114
const sal_uInt32 EXC_HLINK_DESCR
Absolute path.
Definition: xlcontent.hxx:146
virtual void Save(XclExpStream &rStrm) override
Writes the complete SST and EXTSST records.
Definition: xecontent.cxx:249
XclExpDVList maDVList
Definition: xecontent.hxx:378
sal_uInt8 mnType
Font color ID.
Definition: xecontent.cxx:607
static void FillScRange(ScRange &rScRange, const css::table::CellRangeAddress &rApiRange)
Definition: convuno.hxx:80
bool IsEmpty() const
Definition: xerecord.hxx:326
virtual void Save(XclExpStream &rStrm) override
Writes the record header and calls WriteBody().
Definition: xerecord.cxx:150
const sal_uInt32 EXC_SST_HASHTABLE_SIZE
Definition: xecontent.cxx:114
void SvStream & rStrm
bool mbStrikeout
true = Italic.
Definition: xlstyle.hxx:298
XclExpString maPromptText
The prompt title.
Definition: xecontent.hxx:340
virtual SfxStyleSheetBase * Find(const OUString &, SfxStyleFamily eFam, SfxStyleSearchBits n=SfxStyleSearchBits::All)
const sal_uInt32 EXC_DV_ERROR_INFO
Definition: xlcontent.hxx:138
const char * UseIf(const char *s, bool bUse)
const sal_uInt16 EXC_ID_0802
Flags for export.
Definition: xlcontent.hxx:171
constexpr TypedWhichId< SvxColorItem > ATTR_FONT_COLOR(109)
XclExpDval(const XclExpRoot &rRoot)
Definition: xecontent.cxx:1928
void WriteSubList(XclExpStream &rStrm, size_t nBegin, size_t nCount, bool bCol16Bit=true, sal_uInt16 nCountInStream=0) const
Definition: xladdress.cxx:108
constexpr TypedWhichId< SvxFontHeightItem > ATTR_FONT_HEIGHT(101)
bool IsRelUrl() const
Returns true, if URLs should be stored relative to the document location.
Definition: xeroot.hxx:121
bool GetProperty(Type &rValue, const OUString &rPropName) const
Gets the specified property from the property set.
Definition: fapihelper.hxx:149
sc::CompileFormulaContext & GetCompileFormulaContext() const
Definition: xeroot.hxx:122
OUString msList
OOXML Formula for first condition.
Definition: xecontent.hxx:346
bool Finalize()
Converts the Calc range list to the Excel range list.
Definition: xecontent.cxx:1858
sal_Int32 mnPriority
Definition: xecontent.hxx:195
std::size_t GetBufferSize() const
Returns the byte count the character buffer will take on export.
Definition: xestring.cxx:244
ScRangePairListRef & GetRowNameRangesRef()
Definition: document.hxx:808
ScAddress maSrcPos
Definition: xecontent.hxx:206
Spreadsheet links in form controls.
Definition: xlformula.hxx:170
sal_uInt32 GetBaseXFId(const ScAddress &rPos) const
Returns the XF identifier of the top-left cell in a merged range.
Definition: xecontent.cxx:275
const sal_uInt32 EXC_DV_MODE_WHOLE
Definition: xlcontent.hxx:115
double GetValue() const
Definition: colorscale.cxx:237
XclExpSstImplPtr mxImpl
Definition: xecontent.hxx:68
const ScDataBarFormat & mrFormat
Definition: xecontent.hxx:274
Base class for single records with any content.
Definition: xerecord.hxx:142
sal_uInt16 nPos
sal_Int16 SCTAB
Definition: types.hxx:23
const sal_uInt32 EXC_DV_SHOWPROMPT
Definition: xlcontent.hxx:109
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:309
Implementation of the SST export.
Definition: xecontent.cxx:92
const sal_uInt16 EXC_WQSETT_DEFAULTFLAGS
Specific tables.
Definition: xlcontent.hxx:177
void WriteZeroBytes(std::size_t nBytes)
Writes a sequence of nBytes zero bytes (respects slice setting).
Definition: xestream.cxx:257
std::unique_ptr< XclExpCfvo > mpCfvoUpperLimit
Definition: xecontent.hxx:271
ScRangePairListRef & GetColNameRangesRef()
Definition: document.hxx:807
virtual void SaveXml(XclExpXmlStream &rStrm) override
Definition: xecontent.cxx:1967
sal_uInt32 mnSize
sal_uInt32 mnSize
Total count of strings (including doubles).
Definition: xecontent.cxx:111
const sal_uInt32 EXC_CF_FONT_ESCAPEM
Font underline type modified?
Definition: xlcontent.hxx:94
std::unique_ptr< XclExpCfvo > mpCfvoLowerLimit
Definition: xecontent.hxx:270