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