31 #include <document.hxx>
34 #include <oox/token/tokens.hxx>
49 using namespace ::
oox;
51 using ::com::sun::star::uno::Sequence;
55 0x5c, 0x00, 0x20, 0x00, 0x04,
'C',
'a',
'l',
'c',
56 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
57 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
58 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
64 0x40, 0x00, 0x02, 0x00, 0x00, 0x00,
65 0x8d, 0x00, 0x02, 0x00, 0x00, 0x00,
70 0x0e, 0x00, 0x02, 0x00, 0x01, 0x00,
71 0xda, 0x00, 0x02, 0x00, 0x00, 0x00
77 0x0d, 0x00, 0x02, 0x00, 0x01, 0x00,
78 0x0c, 0x00, 0x02, 0x00, 0x64, 0x00,
79 0x0f, 0x00, 0x02, 0x00, 0x01, 0x00,
80 0x11, 0x00, 0x02, 0x00, 0x00, 0x00,
81 0x10, 0x00, 0x08, 0x00, 0xfc, 0xa9, 0xf1, 0xd2, 0x4d,
83 0x5f, 0x00, 0x02, 0x00, 0x01, 0x00
140 rStrm << static_cast<sal_uInt16>(
bVal ? 0x0001 : 0x0000);
255 bVal = (rDate ==
Date( 1, 1, 1904 ));
284 nGrbit( rRootData.pER->GetTabInfo().IsVisibleTab( nTabNum ) ? 0x0000 : 0x0001 ),
301 rStrm << static_cast<sal_uInt32>(
m_nStrPos);
314 OSL_ENSURE( sTabName.getLength() < 256,
"ExcBundlesheet::ExcBundlesheet - table name too long" );
321 rStrm << sal_uInt32(0x00000000)
328 return 7 + std::min(
aName.getLength(), sal_Int32(255) );
368 mnScTab(nScTab), mpManager(pManager), mbFitToPage(bFitToPages), maTabColor(rTabColor) {}
373 rWorksheet->startElement( XML_sheetPr,
392 rWorksheet->singleElement(XML_pageSetUpPr,
396 rWorksheet->endElement( XML_sheetPr );
439 if (aHash.getLength() >= 2)
441 sHash = OString::number(
442 ( static_cast<sal_uInt8>(aHash[0]) << 8
443 | static_cast<sal_uInt8>(aHash[1]) ),
447 rWorksheet->singleElement( XML_sheetProtection,
452 XML_sheet, ToPsz(
true ),
453 XML_password, sHash.isEmpty()?
nullptr : sHash.getStr(),
474 rWorksheet->startElement(XML_protectedRanges);
475 for (
const auto& rProt : rProts)
477 SAL_WARN_IF( rProt.maSecurityDescriptorXML.isEmpty() && !rProt.maSecurityDescriptor.empty(),
478 "sc.filter",
"XclExpSheetProtection::SaveXml: losing BIFF security descriptor");
479 rWorksheet->singleElement( XML_protectedRange,
480 XML_name, rProt.maTitle.isEmpty() ?
nullptr : rProt.maTitle.toUtf8().getStr(),
481 XML_securityDescriptor, rProt.maSecurityDescriptorXML.isEmpty() ?
nullptr : rProt.maSecurityDescriptorXML.toUtf8().getStr(),
486 XML_password, rProt.mnPasswordVerifier ? OString::number( rProt.mnPasswordVerifier, 16).getStr() :
nullptr,
487 XML_algorithmName, rProt.maPasswordHash.maAlgorithmName.isEmpty() ?
nullptr : rProt.maPasswordHash.maAlgorithmName.toUtf8().getStr(),
488 XML_hashValue, rProt.maPasswordHash.maHashValue.isEmpty() ?
nullptr : rProt.maPasswordHash.maHashValue.toUtf8().getStr(),
489 XML_saltValue, rProt.maPasswordHash.maSaltValue.isEmpty() ?
nullptr : rProt.maPasswordHash.maSaltValue.toUtf8().getStr(),
490 XML_spinCount, rProt.maPasswordHash.mnSpinCount ? OString::number( rProt.maPasswordHash.mnSpinCount).getStr() :
nullptr,
493 rWorksheet->endElement( XML_protectedRanges);
500 if (aHash.getLength() >= 2)
502 mnHash = ((aHash[0] << 8) & 0xFFFF);
503 mnHash |= (aHash[1] & 0xFF);
523 maStartPos( rStartPos )
540 return pText ? (1 +
pText->GetBufferSize()) : 0;
560 OSL_ENSURE(
pText,
"ExcFilterCondition::Save() -- pText is NULL!" );
561 rStrm << sal_uInt32(0) << static_cast<sal_uInt8>(
pText->Len()) << sal_uInt16(0) <<
sal_uInt8(0);
564 rStrm << sal_uInt8(0) << static_cast<sal_uInt8>((fVal != 0) ? 1 : 0) << sal_uInt32(0) << sal_uInt16(0);
567 rStrm << sal_uInt32(0) << sal_uInt32(0);
582 default:
return "**none**";
593 default:
return OString();
611 OSL_ENSURE(
pText,
"ExcFilterCondition::SaveText() -- pText is NULL!" );
612 pText->WriteFlagField( rStrm );
613 pText->WriteBuffer( rStrm );
627 double fVal,
const OUString* pText,
bool bSimple )
629 if( !
aCond[ 1 ].IsEmpty() )
673 bool bConflict =
false;
684 sText =
"*" + sText +
"*";
702 bool bLen = sText.getLength() > 0;
715 OUString* pText =
nullptr;
720 sal_uInt16 nNewFlags = 0x0000;
739 bConflict =
HasTop10() && bNewTop10;
744 if( fVal < 0 ) fVal = 0;
745 if( fVal >= 501 ) fVal = 500;
746 nFlags |= (nNewFlags |
static_cast<sal_uInt16
>(fVal) << 7);
783 for (
const auto& rItem : rItems)
803 rWorksheet->startElement( XML_filterColumn,
804 XML_colId, OString::number(
nCol)
815 rWorksheet->singleElement( XML_top10,
818 XML_val, OString::number((
nFlags >> 7))
823 rWorksheet->startElement( XML_customFilters,
827 rWorksheet->endElement( XML_customFilters );
834 rWorksheet->singleElement(XML_filters, XML_blank,
"1");
839 rWorksheet->startElement(XML_filters);
843 const char* pz = aStr.getStr();
844 rWorksheet->singleElement(XML_filter, XML_val, pz);
846 rWorksheet->endElement(XML_filters);
850 rWorksheet->endElement( XML_filterColumn );
860 bool bAdvanced =
false;
888 if( !pDefinedData && aAdvRange.
aStart.
Tab() == nTab )
896 if( !pDefinedData && aDestRange.
aStart.
Tab() == nTab )
905 bool bConflict =
false;
906 bool bContLoop =
true;
911 for(
SCSIZE nEntry = 0; !bConflict && bContLoop && (nEntry < aParam.
GetEntryCount()); nEntry++ )
923 bConflict = (nEntry > 1) && bHasOr;
926 (nFirstField != rEntry.
nField);
928 bConflict = pFilter->
AddEntry( rEntry );
936 bConflict = xFilter->HasCondition() && xFilter->HasTop10();
967 bool bSortAscending=
true;
968 for (
const auto & rKey : aSortParam.
maKeyState)
972 nField = rKey.nField;
973 bSortAscending = rKey.bAscending;
982 const OUString aItemList = rData.
GetString();
1000 if( xFilter->GetCol() ==
static_cast<sal_uInt16
>(nCol) )
1001 return xFilter.get();
1005 return xFilter.get();
1056 if (std::get<2>(rSortCriteria))
1057 rWorksheet->singleElement(XML_sortCondition,
1059 std::get<0>(rSortCriteria)),
1060 XML_descending,
"1",
1061 XML_customList, std::get<1>(rSortCriteria).toUtf8().getStr());
1063 rWorksheet->singleElement(XML_sortCondition,
1065 std::get<0>(rSortCriteria)),
1066 XML_customList, std::get<1>(rSortCriteria).toUtf8().getStr());
1069 rWorksheet->endElement(XML_sortState);
1072 rWorksheet->endElement( XML_autoFilter );
1093 XclExpTabFilterMap::iterator aIt =
maFilterMap.find( nScTab );
1104 XclExpTabFilterMap::iterator aIt =
maFilterMap.find( nScTab );
1107 return aIt->second->HasFilterMode();
void SetValue(const Type &rValue)
Sets a new record value.
::std::vector< ScSortKeyState > maKeyState
void WriteAttributes(sal_Int32 nAttribute, Str &&value, Args &&...rest)
XclExpWindowProtection(bool bValue)
This class stores an unformatted or formatted string for Excel export.
virtual void Save(XclExpStream &rStrm) override
Writes the complete record list.
virtual void SaveCont(XclExpStream &rStrm)
Collection of user-defined sort lists.
std::size_t Write(const void *pData, std::size_t nBytes)
Writes nBytes bytes from memory.
bool HasAutoFilter() const
static OString ToOString(const Color &rColor)
const sal_Unicode EXC_BUILTIN_CRITERIA
rtl_TextEncoding GetTextEncoding() const
Returns the text encoding to import/export byte strings.
SC_DLLPUBLIC bool HasQueryParam() const
bool AddEntry(const ScQueryEntry &rEntry)
OUString getString() const
const sal_uInt8 EXC_AFOPER_GREATER
bool IsFiltered(SCCOL nCol)
LanguageType GetDocLanguage() const
Returns the document language.
XclExpXmlSheetPr(bool bFitToPages, SCTAB nScTab, const Color &rTabColor, XclExpFilterManager *pManager)
virtual const sal_uInt8 * GetData() const override
virtual const sal_uInt8 * GetData() const =0
static const sal_uInt8 pMyData[]
const sal_Unicode EXC_BUILTIN_EXTRACT
const XclExpRoot & GetRoot() const
Returns the filter root data.
const sal_uInt8 EXC_AFOPER_LESSEQUAL
const sal_uInt16 EXC_ID_COUNTRY
SC_DLLPUBLIC ScDBData * GetAnonymousDBData(SCTAB nTab)
void InitTabFilter(SCTAB nScTab)
Creates the filter records for the specified sheet.
const sal_uInt8 EXC_AFTYPE_NOTEMPTY
This class is used to export Excel record streams.
const ::std::vector< ScEnhancedProtection > & getEnhancedProtection() const
virtual void SaveXml(XclExpXmlStream &rStrm) override
std::unique_ptr< XclExpString > pText
static const sal_uInt8 pMyData[]
virtual void SaveXml(XclExpXmlStream &rStrm) override
std::unique_ptr< ContentProperties > pData
virtual void SaveXml(XclExpXmlStream &rStrm) override
virtual sal_uInt16 GetNum() const override
SC_DLLPUBLIC void GetSortParam(ScSortParam &rSortParam) const
void AppendRecord(RecType *pRec)
Appends a record to the list.
sheet protection state container
XclExpWsbool(bool bFitToPages)
const Type & GetValue() const
Returns the value of the record.
bool AddCondition(ScQueryConnect eConn, sal_uInt8 nType, sal_uInt8 nOp, double fVal, const OUString *pText, bool bSimple=false)
OUString maSaltValue
base64 encoded hash value
static const std::size_t nMyLen
OoxmlVersion getVersion() const
virtual void SaveXml(XclExpXmlStream &rStrm) override
QueryItemsType & GetQueryItems()
OUString GetScTabName(SCTAB nScTab) const
Returns the Calc name of the specified sheet.
XclExpPassHash(const css::uno::Sequence< sal_Int8 > &aHash)
#define STREAM_SEEK_TO_END
ExcFilterCondition aCond[2]
const ContentProperties & rData
const sal_uInt16 EXC_ID_FILTERMODE
sal_uInt16 GetCol() const
const sal_uInt8 EXC_AFOPER_NOTEQUAL
static const std::size_t nMyLen
void SetCondition(sal_uInt8 nTp, sal_uInt8 nOp, double fV, const OUString *pT)
static const sal_uInt8 pMyData[]
virtual const sal_uInt8 * GetData() const override
const sal_uInt16 EXC_AFFLAG_TOP10TOP
bool IsQueryByEmpty() const
rtl::Reference< XclExpFiltermode > m_pFilterMode
const sal_uInt16 EXC_AFFLAG_SIMPLE2
virtual void SaveCont(XclExpStream &rStrm) override
const sal_uInt8 EXC_AFTYPE_DOUBLE
ScDocument & GetDoc() const
Returns reference to the destination document (import) or source document (export).
SvNumberFormatter & GetFormatter() const
Returns the number formatter of the Calc document.
std::vector< OUString > maMultiValues
const sal_uInt8 EXC_AFTYPE_STRING
void AddMultiValueEntry(const ScQueryEntry &rEntry)
void SaveXml(XclExpXmlStream &rStrm)
OUString maHashValue
"SHA-512", ...
virtual ~ExcAutoFilterRecs() override
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the record (without record header).
static const sal_uInt8 pMyData[]
static const std::size_t nMyLen
constexpr::Color COL_AUTO(0xFF, 0xFF, 0xFF, 0xFF)
Access to global data from other classes.
Stores individual user-defined sort list.
virtual void Save(XclExpStream &rStrm) override
Overwrite this method to do any operation while saving the record.
bool isOptionEnabled(Option eOption) const
static const char * lcl_GetOperator(sal_uInt8 nOper)
void Save(XclExpStream &rStrm)
size_t SCSIZE
size_t typedef to be able to find places where code was changed from USHORT to size_t and is used to ...
sal_Int32 SCCOLROW
a type capable of holding either SCCOL or SCROW
virtual void SaveXml(XclExpXmlStream &rStrm) override
XclExpAutofilter(const XclExpRoot &rRoot, sal_uInt16 nC)
SC_DLLPUBLIC SCSIZE GetEntryCount() const
SC_DLLPUBLIC const ScQueryEntry & GetEntry(SCSIZE n) const
const sal_uInt8 EXC_AFOPER_EQUAL
OOXML password definitions: algorithmName, hashValue, saltValue, spinCount.
XclExpAutofilterinfo(const ScAddress &rStartPos, SCCOL nScCol)
virtual std::size_t GetLen() const override
const sal_uInt16 EXC_AFFLAG_AND
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
const sal_uInt16 EXC_AFFLAG_TOP10
sax_fastparser::FSHelperPtr & GetCurrentStream()
const SCTAB SCTAB_GLOBAL
An invalid Calc sheet index, for common use.
XclExpTabFilterMap maFilterMap
virtual std::size_t GetLen() const =0
bool HasFilterMode(SCTAB nScTab)
Returns whether or not FilterMode is present.
virtual ~XclExpPassHash() override
virtual std::size_t GetLen() const override
virtual sal_uInt16 GetNum() const override
virtual const sal_uInt8 * GetData() const override
const sal_uInt8 EXC_AFOPER_NONE
const sal_uInt16 EXC_ID_AUTOFILTERINFO
virtual std::size_t GetLen() const override
virtual void SaveXml(XclExpXmlStream &rStrm) override
std::vector< std::tuple< ScRange, OUString, bool > > maSortCustomList
SC_DLLPUBLIC SvNumberFormatter * GetFormatTable() const
virtual void Save(XclExpStream &rStrm) override
Writes the record header and calls WriteBody().
A record with a single value of type Type.
XclOutput GetOutput() const
Returns the current output format of the importer/exporter.
XclExpProtection(bool bValue)
virtual void SaveCont(XclExpStream &rStrm) override
sal_uInt64 GetSvStreamPos() const
Returns the absolute position of the system stream.
Exc1904(const ScDocument &rDoc)
const sal_uInt16 EXC_ID_PROTECT
virtual void SaveCont(XclExpStream &rStrm) override
virtual void WriteBody(XclExpStream &rStrm) override
The document country ID.
bool IsQueryByNonEmpty() const
Manager that stores all internal defined names (NAME records) of the document.
void IncCol(SCCOL nDelta=1)
bool HasCondition() const
virtual std::size_t GetLen() const override
const OUString & GetString() const
static SC_DLLPUBLIC ScUserList * GetUserList()
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the record.
XclExpNameManager & GetNameManager() const
Returns the buffer that contains internal defined names.
XclExpTabInfo & GetTabInfo() const
Returns the buffer for Calc->Excel sheet index conversion.
std::shared_ptr< FastSerializerHelper > FSHelperPtr
void SaveText(XclExpStream &rStrm)
const sal_uInt16 EXC_AFFLAG_ANDORMASK
void WriteByteString(const OString &rString)
Writes string length field and OString buffer.
const sal_uInt16 EXC_ID_WINDOWPROTECT
svl::SharedString maString
bool HasFilterMode() const
bool GetBool() const
Returns the Boolean value of the record.
const sal_uInt8 EXC_AFOPER_LESS
virtual void SaveXml(XclExpXmlStream &rStrm) override
const XclExpRoot & GetRoot() const
Returns this root instance - for code readability in derived classes.
sal_uInt16 InsertBuiltInName(sal_Unicode cBuiltIn, const ScRange &rRange)
Inserts a new built-in defined name, referring to the passed sheet range.
void SetSvStreamPos(sal_uInt64 nPos)
Sets position of system stream (only allowed outside of records).
virtual sal_uInt16 GetNum() const override
XclExpCountry(const XclExpRoot &rRoot)
virtual std::size_t GetLen() const override
virtual std::size_t GetLen() const override
virtual std::size_t GetLen() const override
virtual void Save(XclExpStream &rStrm) override
Writes the record header and calls WriteBody().
RecType * GetRecord(size_t nPos) const
Returns reference to an existing record or empty reference on error.
const sal_uInt16 EXC_ID_WSBOOL
virtual void SaveCont(XclExpStream &rStrm) override
const sal_uInt16 EXC_AFFLAG_SIMPLE1
void SetRecHeader(sal_uInt16 nRecId, std::size_t nRecSize)
Sets record ID and size with one call.
static OString lcl_GetValue(sal_uInt8 nType, double fVal, const XclExpString *pStr)
const sal_uInt16 EXC_AFFLAG_OR
static const std::size_t nMyLen
const sal_uInt16 EXC_WSBOOL_DEFAULTFLAGS
void UpdateStreamPos(XclExpStream &rStrm)
virtual std::size_t GetLen() const override
virtual sal_uInt16 GetNum() const override
#define SAL_WARN_IF(condition, area, stream)
const sal_uInt8 EXC_AFTYPE_EMPTY
virtual void Save(XclExpStream &rStrm) override
Writes the record header and calls WriteBody().
void RemoveAllRecords()
Removes all records from the list.
virtual std::size_t GetLen() const override
Always use UCS-2 characters (default: try to compress). BIFF8 only.
virtual std::size_t GetLen() const override
XclExpAutofilterList maFilterList
std::size_t GetTextBytes() const
const sal_uInt8 EXC_AFTYPE_BOOLERR
XclExpObjectManager & GetObjectManager() const
Returns the drawing object manager.
virtual void WriteBody(XclExpStream &rStrm) override
Writes the body of the record (without record header).
SC_DLLPUBLIC void GetQueryParam(ScQueryParam &rQueryParam) const
XclExpFilterManager(const XclExpRoot &rRoot)
virtual sal_uInt16 GetNum() const override
const sal_uInt16 EXC_ID_AUTOFILTER
ExcBundlesheet(const RootData &rRootData, SCTAB nTab)
const sal_uInt8 EXC_AFOPER_GREATEREQUAL
virtual void SaveXml(XclExpXmlStream &rStrm) override
std::vector< Item > QueryItemsType
virtual const sal_uInt8 * GetData() const override
XclExpRecordRef CreateRecord(SCTAB nScTab)
Returns a record object containing all filter records for the specified sheet.
SC_DLLPUBLIC bool GetAdvancedQuerySource(ScRange &rSource) const
void EnableEncryption(bool bEnable=true)
XclExpAutofilter * GetByCol(SCCOL nCol)
virtual sal_uInt16 GetNum() const override
virtual sal_uInt16 GetNum() const override
XclExpSheetProtection(bool bValue, SCTAB nTab)
sal_uInt32 mnSpinCount
base64 encoded salt value
sal_uInt16 mnDocCountry
The UI country ID.
virtual void Save(XclExpStream &rStrm) override
Writes the record header and calls WriteBody().
const sal_uInt16 EXC_WSBOOL_FITTOPAGE
const sal_uInt16 EXC_ID_PASSWORD
ExcAutoFilterRecs(const XclExpRoot &rRoot, SCTAB nTab, const ScDBData *pDefinedData)
Each instance of this struct represents a single filtering criteria.
virtual sal_uInt16 GetNum() const =0
sal_uInt16 AddObj(std::unique_ptr< XclObj > pObjRec)
const sal_Unicode EXC_BUILTIN_FILTERDATABASE
Base class for single records with any content.
Record which contains a Boolean value.
rtl::Reference< XclExpAutofilterinfo > m_pFilterInfo
virtual css::uno::Sequence< sal_Int8 > getPasswordHash(ScPasswordHash eHash, ScPasswordHash eHash2=PASSHASH_UNSPECIFIED) const override
void AddRecSize(std::size_t nRecSize)
Adds a size value to the record size prediction.
const sal_uInt8 EXC_AFTYPE_NOTUSED
SC_DLLPUBLIC const ScTableProtection * GetTabProtection(SCTAB nTab) const
XclExpFilterManager * mpManager
const sal_uInt16 EXC_AFFLAG_TOP10PERC