From 01b114770a02d7ee7d2d57c6168efaac9e78f407 Mon Sep 17 00:00:00 2001 From: Elena Subbotina Date: Mon, 19 Jun 2023 12:11:36 +0300 Subject: [PATCH 001/221] . --- OOXML/XlsbFormat/Biff12_records/SupTabs.h | 3 +- OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h | 1 + OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h | 2 +- OOXML/XlsbFormat/SlicerCachesStream.cpp | 2 +- .../ExternalLinks/ExternalLinks.cpp | 40 +++++++++++++++++++ .../XlsxFormat/ExternalLinks/ExternalLinks.h | 4 ++ X2tConverter/src/ASCConverters.cpp | 39 ++++++++++++++++++ 7 files changed, 87 insertions(+), 4 deletions(-) diff --git a/OOXML/XlsbFormat/Biff12_records/SupTabs.h b/OOXML/XlsbFormat/Biff12_records/SupTabs.h index 301176ce38..79a384f373 100644 --- a/OOXML/XlsbFormat/Biff12_records/SupTabs.h +++ b/OOXML/XlsbFormat/Biff12_records/SupTabs.h @@ -53,8 +53,7 @@ namespace XLSB _UINT32 cTab; std::vector sheetNames; - }; - + typedef boost::shared_ptr SupTabsPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h b/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h index 90c3546f02..a301bb27ae 100644 --- a/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h +++ b/OOXML/XlsbFormat/Biff12_unions/EXTERNALBOOK.h @@ -57,6 +57,7 @@ namespace XLSB ExternalReferenceType sbt; }; + typedef boost::shared_ptr EXTERNALBOOKPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h b/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h index d97dd76eea..0498a8ac6a 100644 --- a/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h +++ b/OOXML/XlsbFormat/Biff12_unions/EXTERNALLINK.h @@ -56,8 +56,8 @@ namespace XLSB XLS::BaseObjectPtr m_DDEOLELINK; std::vector m_arFRT; bool m_bBrtEndSupBook; - }; + typedef boost::shared_ptr EXTERNALLINKPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/SlicerCachesStream.cpp b/OOXML/XlsbFormat/SlicerCachesStream.cpp index 82415305ff..e2ae61c71c 100644 --- a/OOXML/XlsbFormat/SlicerCachesStream.cpp +++ b/OOXML/XlsbFormat/SlicerCachesStream.cpp @@ -76,7 +76,7 @@ const bool SlicerCachesStream::loadContent(BinProcessor& proc) proc.SkipRecord(); }break; } - } + } return true; } diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp index eb4433b397..09af649679 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -118,6 +118,16 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CExternalSheetNames::toBin() + { + XLSB::SupTabsPtr supTabs(new XLSB::SupTabs); + for (auto& item : m_arrItems) + { + XLSB::XLWideString str = *item->m_sVal; + supTabs->sheetNames.push_back(str); + } + return supTabs; + } void CExternalSheetNames::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -697,6 +707,21 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CExternalBook::toBin() + { + XLSB::EXTERNALLINKPtr externalLINK(new XLSB::EXTERNALLINK()); + + XLSB::ExternalReferenceType type; + XLSB::EXTERNALBOOKPtr externalBOOK(new XLSB::EXTERNALBOOK(type)); + + externalLINK->m_EXTERNALBOOK = externalBOOK; + if (externalBOOK != nullptr) + { + if (m_oSheetNames.IsInit()) + externalBOOK->m_BrtSupTabs = m_oSheetNames->toBin(); + } + return externalLINK; + } void CExternalBook::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1481,6 +1506,21 @@ namespace Spreadsheet CExternalLink::~CExternalLink() { } + XLS::BaseObjectPtr CExternalLink::writeBin() + { + XLSB::ExternalLinkStreamPtr externalLinkStreamStream(new XLSB::ExternalLinkStream); + + if (externalLinkStreamStream != nullptr) + { + if (m_oExternalBook.IsInit()) + externalLinkStreamStream->m_EXTERNALLINK = m_oExternalBook->toBin(); + //if (m_oDdeLink.IsInit()) + // externalLinkStreamStream->m_EXTERNALLINK = m_oDdeLink->toBin(); + //if (m_oOleLink.IsInit()) + // externalLinkStreamStream->m_EXTERNALLINK = m_oOleLink->toBin(); + } + return externalLinkStreamStream; + } void CExternalLink::readBin(const CPath& oPath) { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h index 358ee01686..b34f7da627 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h @@ -78,6 +78,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; class CAlternateUrls : public WritingElement @@ -251,6 +252,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -454,7 +456,9 @@ namespace OOX CExternalLink(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId); virtual ~CExternalLink(); + XLS::BaseObjectPtr writeBin(); void readBin(const CPath& oPath); + virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 24fafbfc1c..ccd852a232 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1131,6 +1131,41 @@ namespace NExtractTools } return nRes; } + _UINT32 xlsx2xlsb(const std::wstring& sFrom, const std::wstring& sTo, const std::wstring& sTemp, InputParams& params) + { + std::wstring sTempUnpackedXLSX = sTemp + FILE_SEPARATOR_STR + L"xlsx_unpacked"; + + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + + COfficeUtils oCOfficeUtils(NULL); + if (S_OK == oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0)) + { + return xlsx_dir2xlsb(sTempUnpackedXLSX, sTo, sTemp, params); + } + return AVS_FILEUTILS_ERROR_CONVERT; + } + _UINT32 xlsx_dir2xlsb(const std::wstring& sFrom, const std::wstring& sTo, const std::wstring& sTemp, InputParams& params) + { + std::wstring sTempUnpackedXLSB = sTemp + FILE_SEPARATOR_STR + L"xlsb_unpacked"; + NSDirectory::CreateDirectory(sTempUnpackedXLSB); + + _UINT32 nRes = 0; +//--------------------------------------------------------------------- + const OOX::CPath oox_path(sFrom); + + OOX::Spreadsheet::CXlsx xlsx(oox_path); + OOX::Spreadsheet::CXlsb xlsb; + + //XLS::BaseObjectPtr object = xlsx.toBin(); + //xlsb.WriteBin(sTempUnpackedXLSB, object.get()); +//--------------------------------------------------------------------- + if (SUCCEEDED_X2T(nRes)) + { + COfficeUtils oCOfficeUtils(NULL); + nRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sTempUnpackedXLSB, sTo, false, Z_DEFLATED)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + } + return nRes; + } _UINT32 xltm2xlsx_dir (const std::wstring &sFrom, const std::wstring &sTo, InputParams& params) { COfficeUtils oCOfficeUtils(NULL); @@ -5777,6 +5812,10 @@ namespace NExtractTools { result = msVbaProject2Xml(sFileFrom, sFileTo, sTempDir, oInputParams); }break; + case TCD_XLSX2XLSB: + { + result = xlsx2xlsb(sFileFrom, sFileTo, sTempDir, oInputParams); + }break; //TCD_FB22DOCT, //TCD_FB22DOCT_BIN, From ee3d0543738061f139667626ce1b2c7c3631c614 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 23 Jun 2023 21:00:47 +0600 Subject: [PATCH 002/221] completed external links converting --- OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h | 2 +- .../Biff12_unions/DDEOLEITEMVALUE.h | 2 +- .../Biff12_unions/DDEOLEITEMVALUES.h | 2 +- OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h | 1 + .../ExternalLinks/ExternalLinks.cpp | 189 +++++++++++++++++- .../XlsxFormat/ExternalLinks/ExternalLinks.h | 18 +- 6 files changed, 201 insertions(+), 13 deletions(-) diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h index a439c49784..2d6d18f3d0 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEM.h @@ -56,6 +56,6 @@ namespace XLSB ExternalReferenceType sbt; }; - + typedef boost::shared_ptr DDEOLEITEMPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h index 4e0dad286c..6e82c2e139 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUE.h @@ -51,6 +51,6 @@ namespace XLSB XLS::BaseObjectPtr m_source; }; - + typedef boost::shared_ptr DDEOLEITEMVALUEPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h index b470e5b9da..3a507facd3 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLEITEMVALUES.h @@ -55,6 +55,6 @@ namespace XLSB bool m_bBrtSupNameValueEnd; }; - + typedef boost::shared_ptr DDEOLEITEMVALUESPtr; } // namespace XLSB diff --git a/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h b/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h index d58ea61a01..1d21a1c8c4 100644 --- a/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h +++ b/OOXML/XlsbFormat/Biff12_unions/DDEOLELINK.h @@ -55,6 +55,7 @@ namespace XLSB ExternalReferenceType sbt; }; + typedef boost::shared_ptr DDEOLELINKPtr; } // namespace XLSB diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp index 09af649679..12dccca9c1 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -66,6 +66,8 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" +#include + namespace OOX { namespace Spreadsheet @@ -811,6 +813,77 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CDdeValue::toBin() + { + XLSB::DDEOLEITEMVALUEPtr ptr(new XLSB::DDEOLEITEMVALUE); + if(!m_oType.IsInit()) + return ptr; + auto type = m_oType->GetValue(); + switch(type) + { + case XLSB::rt_SupNameNum: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameNum}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + castedSource->value.data.value = std::stod(m_arrItems.back()->m_sText); + m_arrItems.pop_back(); + } + } + break; + case XLSB::rt_SupNameBool: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameBool}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + castedSource->value = std::stoi(m_arrItems.back()->m_sText); + m_arrItems.pop_back(); + } + + } + break; + case XLSB::rt_SupNameErr: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameErr}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + auto error = m_arrItems.back()->m_sText.c_str(); + + if(error == L"#NULL!"){ castedSource->value = 0x00;} + else if(error == L"#DIV/0!"){castedSource->value = 0x07;} + else if(error == L"#VALUE!"){ castedSource->value = 0x0F;} + else if(error == L"#REF!"){ castedSource->value = 0x17;} + else if(error == L"#NAME?"){ castedSource->value = 0x1D;} + else if(error == L"#NUM!"){castedSource->value = 0x24;} + else if(error == L"#N/A"){castedSource->value = 0x2A;} + else if(error == L"#GETTING_DATA"){castedSource->value = 0x2B;} + + m_arrItems.pop_back(); + } + } + break; + case XLSB::rt_SupNameSt: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameSt}; + if(!m_arrItems.empty()) + { + auto castedSource = reinterpret_cast(ptr->m_source.get()); + castedSource->value = m_arrItems.back()->m_sText; + m_arrItems.pop_back(); + } + } + break; + case XLSB::rt_SupNameNil: + { + ptr->m_source = XLS::BaseObjectPtr{new XLSB::SupNameNil}; + } + break; + } + return ptr; + } void CDdeValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -968,6 +1041,18 @@ namespace Spreadsheet m_arrItems.push_back(new CDdeValue(item)); } } + XLS::BaseObjectPtr CDdeValues::toBin() + { + XLSB::DDEOLEITEMVALUESPtr ptr(new XLSB::DDEOLEITEMVALUES); + auto castedPtr = static_cast(ptr->m_BrtSupNameValueStart.get()); + if(m_oRows.IsInit()) + castedPtr->cRw = m_oRows->GetValue(); + if(m_oCols.IsInit()) + castedPtr->cCol = m_oCols->GetValue(); + for (auto &item : m_arrItems) + ptr->m_arDDEOLEITEMVALUE.push_back(item->toBin()); + return ptr; + } void CDdeValues::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1036,6 +1121,31 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr CDdeItem::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLEITEMPtr ptr(new XLSB::DDEOLEITEM(type)); + if (m_oDdeValues.IsInit()) + ptr->m_DDEOLEITEMVALUES = m_oDdeValues->toBin(); + if(m_oName.IsInit()) + { + ptr->m_BrtSupNameStart = XLS::BaseObjectPtr{new XLSB::SupNameStart}; + auto ptrSupNameStart = static_cast(ptr->m_BrtSupNameStart.get()); + ptrSupNameStart->name = m_oName.get(); + } + if(m_oOle.IsInit() || m_oAdvise.IsInit() || m_oPreferPic.IsInit()) + { + ptr->m_BrtSupNameBits = XLS::BaseObjectPtr{new XLSB::SupNameBits(type)}; + auto ptrSupNameBits = static_cast(ptr->m_BrtSupNameBits.get()); + if(m_oOle.IsInit()) + ptrSupNameBits->contentsDDE.fOLE = m_oOle->ToBool(); + if(m_oAdvise.IsInit()) + ptrSupNameBits->contentsDDE.fWantAdvise = m_oAdvise->ToBool(); + if(m_oPreferPic.IsInit()) + ptrSupNameBits->contentsDDE.fWantPict = m_oPreferPic->ToBool(); + } + return ptr; + } void CDdeItem::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -1133,6 +1243,15 @@ namespace Spreadsheet } } + XLS::BaseObjectPtr CDdeItems::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLELINKPtr ptr(new XLSB::DDEOLELINK(type)); + for (auto item : m_arrItems) + ptr->m_arDDEOLEITEM.push_back(item->toBin()); + return ptr; + } + void CDdeLink::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); @@ -1180,6 +1299,18 @@ namespace Spreadsheet m_oDdeItems = ptr->m_DDEOLELINK; } } + XLS::BaseObjectPtr CDdeLink::toBin() + { + XLSB::EXTERNALLINKPtr ptr(new XLSB::EXTERNALLINK); + ptr->m_BrtBeginSupBook = XLS::BaseObjectPtr{new XLSB::BeginSupBook}; + auto castedBook = static_cast(ptr->m_BrtBeginSupBook.get()); + if (m_oDdeService.IsInit()) + castedBook->string1 = m_oDdeService.get(); + if (m_oDdeTopic.IsInit()) + castedBook->string2 = m_oDdeTopic.get(); + ptr->m_DDEOLELINK = m_oDdeItems->toBin(); + return ptr; + } CDdeLink::CDdeLink() { @@ -1248,6 +1379,29 @@ namespace Spreadsheet toXML(writer); return writer.GetData().c_str(); } + XLS::BaseObjectPtr COleItem::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLEITEMPtr coleItem(new XLSB::DDEOLEITEM(type)); + if(m_oName.IsInit()) + { + coleItem->m_BrtSupNameStart = XLS::BaseObjectPtr{new XLSB::SupNameStart}; + auto castedName = static_cast(coleItem->m_BrtSupNameStart.get()); + castedName->name = m_oName.get(); + } + if(m_oIcon.IsInit() || m_oAdvise.IsInit() || m_oPreferPic.IsInit()) + { + coleItem->m_BrtSupNameBits = XLS::BaseObjectPtr{new XLSB::SupNameBits(type)}; + auto ptrSupNameBits = static_cast(coleItem->m_BrtSupNameBits.get()); + if(m_oIcon.IsInit()) + ptrSupNameBits->contentsOLE.fIcon = m_oIcon->ToBool(); + if(m_oAdvise.IsInit()) + ptrSupNameBits->contentsOLE.fWantAdvise = m_oAdvise->ToBool(); + if(m_oPreferPic.IsInit()) + ptrSupNameBits->contentsOLE.fWantPict = m_oPreferPic->ToBool(); + } + return coleItem; + } void COleItem::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -1341,6 +1495,17 @@ namespace Spreadsheet m_arrItems.push_back(new COleItem(item)); } } + XLS::BaseObjectPtr COleItems::toBin() + { + XLSB::ExternalReferenceType type; + XLSB::DDEOLELINKPtr ptr(new XLSB::DDEOLELINK(type)); + + for(auto i: m_arrItems) + { + ptr->m_arDDEOLEITEM.push_back(i->toBin()); + } + return ptr; + } COleLink::COleLink() { @@ -1402,6 +1567,20 @@ namespace Spreadsheet m_oOleItems = ptr->m_DDEOLELINK; } } + XLS::BaseObjectPtr COleLink::toBin() + { + XLSB::EXTERNALLINKPtr COleLink(new XLSB::EXTERNALLINK); + COleLink->m_BrtBeginSupBook = XLS::BaseObjectPtr{new XLSB::BeginSupBook}; + auto castedBook = static_cast(COleLink->m_BrtBeginSupBook.get()); + + if(m_oRid.IsInit()) + castedBook->string1 = m_oRid->ToString(); + if(m_oProgId.IsInit()) + castedBook->string2 = m_oProgId.get(); + + COleLink->m_DDEOLELINK = m_oOleItems->toBin(); + return COleLink; + } void COleLink::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1440,7 +1619,7 @@ namespace Spreadsheet if (oReader.IsEmptyNode()) return; - + int nCurDepth = oReader.GetDepth(); while (oReader.ReadNextSiblingNode(nCurDepth)) { @@ -1514,10 +1693,10 @@ namespace Spreadsheet { if (m_oExternalBook.IsInit()) externalLinkStreamStream->m_EXTERNALLINK = m_oExternalBook->toBin(); - //if (m_oDdeLink.IsInit()) - // externalLinkStreamStream->m_EXTERNALLINK = m_oDdeLink->toBin(); - //if (m_oOleLink.IsInit()) - // externalLinkStreamStream->m_EXTERNALLINK = m_oOleLink->toBin(); + if (m_oDdeLink.IsInit()) + externalLinkStreamStream->m_EXTERNALLINK = m_oDdeLink->toBin(); + if (m_oOleLink.IsInit()) + externalLinkStreamStream->m_EXTERNALLINK = m_oOleLink->toBin(); } return externalLinkStreamStream; } diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h index b34f7da627..355359effe 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h @@ -67,17 +67,17 @@ namespace OOX public: WritingElement_AdditionMethods(CExternalSheetNames) WritingElement_XlsbConstructors(CExternalSheetNames) - + CExternalSheetNames(); virtual ~CExternalSheetNames(); virtual void fromXML(XmlUtils::CXmlNode& oNode); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; - void fromBin(XLS::BaseObjectPtr& obj); + void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; @@ -104,7 +104,7 @@ namespace OOX nullable m_oAbsoluteUrlRid; nullable m_oRelativeUrlRid; - + nullable_string m_oDriveId; nullable_string m_oItemId; }; @@ -167,7 +167,7 @@ namespace OOX virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oRef; nullable m_oType; nullable m_oValueMetadata; @@ -280,6 +280,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -303,6 +304,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -326,6 +328,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -355,6 +358,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; @@ -373,6 +377,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -398,6 +403,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -422,6 +428,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; }; @@ -439,6 +446,7 @@ namespace OOX virtual std::wstring toXML() const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From a74bb35ecd83b2237f96ec178181bd453910c743 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Tue, 27 Jun 2023 16:02:49 +0600 Subject: [PATCH 003/221] added cols convertation --- OOXML/XlsxFormat/Worksheets/Cols.cpp | 39 ++++++++++++++++++++++++++++ OOXML/XlsxFormat/Worksheets/Cols.h | 2 ++ 2 files changed, 41 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/Cols.cpp b/OOXML/XlsxFormat/Worksheets/Cols.cpp index df7739a53f..c10922071f 100644 --- a/OOXML/XlsxFormat/Worksheets/Cols.cpp +++ b/OOXML/XlsxFormat/Worksheets/Cols.cpp @@ -81,6 +81,36 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCol::toBin() + { + auto castedPtr = new XLSB::ColInfo; + XLS::BaseObjectPtr ptr(castedPtr); + if(m_oBestFit.IsInit()) + castedPtr->fBestFit = m_oBestFit->ToBool(); + if(m_oCollapsed.IsInit()) + castedPtr->fCollapsed = m_oCollapsed->ToBool(); + if(m_oCustomWidth.IsInit()) + castedPtr->fUserSet = m_oCustomWidth->ToBool(); + if(m_oHidden.IsInit()) + castedPtr->fHidden = m_oHidden->ToBool(); + if(m_oMax.IsInit()) + castedPtr->colLast = m_oMax->m_eValue - 1; + if(m_oMin.IsInit()) + castedPtr->colFirst = m_oMin->m_eValue - 1; + if(m_oOutlineLevel.IsInit()) + castedPtr->iOutLevel = m_oOutlineLevel->m_eValue; + if(m_oPhonetic.IsInit()) + castedPtr->fPhonetic = m_oPhonetic->ToBool(); + if(m_oStyle.IsInit()) + castedPtr->ixfeXLSB = m_oStyle->m_eValue; + + if (m_oWidth.IsInit()) + { + if(m_oWidth->GetValue() > 0) + castedPtr->coldx = m_oWidth->GetValue() * 256; + } + return ptr; + } EElementType CCol::getType() const { return et_x_Col; @@ -230,6 +260,15 @@ namespace OOX } } } + std::vector CCols::toBin() + { + std::vector ptrVector; + for(auto i:m_arrItems) + { + ptrVector.push_back(i->toBin()); + } + return ptrVector; + } EElementType CCols::getType () const { return et_x_Cols; diff --git a/OOXML/XlsxFormat/Worksheets/Cols.h b/OOXML/XlsxFormat/Worksheets/Cols.h index 7c000a45f9..5d2dbba615 100644 --- a/OOXML/XlsxFormat/Worksheets/Cols.h +++ b/OOXML/XlsxFormat/Worksheets/Cols.h @@ -61,6 +61,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; private: @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: From 98eb8566415247b61a0d2b067a22548a32344ad8 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Tue, 27 Jun 2023 16:20:26 +0600 Subject: [PATCH 004/221] add drawning conversion --- OOXML/XlsxFormat/Drawing/Drawing.h | 1 + OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/OOXML/XlsxFormat/Drawing/Drawing.h b/OOXML/XlsxFormat/Drawing/Drawing.h index 56f197f22c..c615372ba5 100644 --- a/OOXML/XlsxFormat/Drawing/Drawing.h +++ b/OOXML/XlsxFormat/Drawing/Drawing.h @@ -62,6 +62,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp b/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp index e52a6e2cff..22bcdbdceb 100644 --- a/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp +++ b/OOXML/XlsxFormat/Drawing/XlsxDrawing.cpp @@ -72,6 +72,17 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDrawingWorksheet::toBin() + { + auto castedPtr(new XLSB::Drawing); + XLS::BaseObjectPtr ptr(castedPtr); + if(m_oId.IsInit()) + { + if(!m_oId->GetValue().empty()) + castedPtr->stRelId.value = m_oId->GetValue(); + } + return ptr; + } EElementType CDrawingWorksheet::getType () const { return et_x_FromTo; From 75853c8cb3b0d197ebd9123fb584ac6e49e3e024 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Tue, 27 Jun 2023 16:24:22 +0600 Subject: [PATCH 005/221] added Cdimension conversion --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 10 +++++++++- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 5beec42fca..e358235103 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -675,6 +675,14 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDimension::toBin() + { + auto castedPtr(new XLSB::WsDim); + XLS::BaseObjectPtr ptr(castedPtr); + if (m_oRef.IsInit()) + castedPtr->rfx = m_oRef.get(); + return ptr; + } EElementType CDimension::getType() const { return et_x_Dimension; @@ -2298,7 +2306,7 @@ namespace OOX WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) WritingElement_ReadAttributes_Read_else_if(oReader, L"sqref", m_oSqref) WritingElement_ReadAttributes_End(oReader) - } + } void CUserProtectedRange::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 5ad4d9a39b..154c6fbe83 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -269,6 +269,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; From f56184505f91483f60851e5010ac03a130b8184b Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Tue, 27 Jun 2023 16:43:09 +0600 Subject: [PATCH 006/221] added BrtLegacyDrawing conversion --- OOXML/XlsxFormat/Comments/Comments.h | 1 + OOXML/XlsxFormat/Comments/XlsxComments.cpp | 8 ++++++++ OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 8 ++++++++ OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h | 1 + 4 files changed, 18 insertions(+) diff --git a/OOXML/XlsxFormat/Comments/Comments.h b/OOXML/XlsxFormat/Comments/Comments.h index 9ca4bf5ed1..4aa90a91a7 100644 --- a/OOXML/XlsxFormat/Comments/Comments.h +++ b/OOXML/XlsxFormat/Comments/Comments.h @@ -191,6 +191,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Comments/XlsxComments.cpp b/OOXML/XlsxFormat/Comments/XlsxComments.cpp index ff124aa762..babca8545e 100644 --- a/OOXML/XlsxFormat/Comments/XlsxComments.cpp +++ b/OOXML/XlsxFormat/Comments/XlsxComments.cpp @@ -451,6 +451,14 @@ mc:Ignorable=\"xr\">"); { ReadAttributes(obj); } + XLS::BaseObjectPtr CLegacyDrawingWorksheet::toBin() + { + auto castedPtr(new XLSB::LegacyDrawing); + XLS::BaseObjectPtr ptr(castedPtr); + if(m_oId.IsInit()) + castedPtr->stRelId.value = m_oId->GetValue(); + return ptr; + } EElementType CLegacyDrawingWorksheet::getType () const { return et_x_LegacyDrawingWorksheet; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index e358235103..9ec2c660ea 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1645,6 +1645,14 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CLegacyDrawingHFWorksheet::toBin() + { + auto castedPtr(new XLSB::LegacyDrawingHF); + XLS::BaseObjectPtr ptr(castedPtr); + if (m_oId.IsInit()) + castedPtr->stRelId.value = m_oId->GetValue(); + return ptr; + } EElementType CLegacyDrawingHFWorksheet::getType() const { return et_x_LegacyDrawingHFWorksheet; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 154c6fbe83..46cf02be76 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -602,6 +602,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 311c70816fd247622395083549352c28334eddbd Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Tue, 27 Jun 2023 21:22:23 +0600 Subject: [PATCH 007/221] added hyperlinks conversion --- OOXML/XlsxFormat/Worksheets/Hyperlinks.h | 3 ++ .../XlsxFormat/Worksheets/XlsxHyperlinks.cpp | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/Hyperlinks.h b/OOXML/XlsxFormat/Worksheets/Hyperlinks.h index a04c61a30b..1e548d960d 100644 --- a/OOXML/XlsxFormat/Worksheets/Hyperlinks.h +++ b/OOXML/XlsxFormat/Worksheets/Hyperlinks.h @@ -59,6 +59,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -90,6 +91,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); + virtual EElementType getType () const; }; diff --git a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp index 38782073a3..79292d3331 100644 --- a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp +++ b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp @@ -35,6 +35,8 @@ #include "../../Common/SimpleTypes_Shared.h" +#include "..\..\XlsbFormat\Biff12_unions\HLINKS.h" + namespace OOX { namespace Spreadsheet @@ -73,6 +75,24 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CHyperlink::toBin() + { + auto castedPtr(new XLSB::HLink); + XLS::BaseObjectPtr ptr(castedPtr); + + if(m_oDisplay.IsInit()) + castedPtr->display = m_oDisplay.get(); + if(m_oRid.IsInit()) + castedPtr->relId.value = m_oRid->GetValue(); + if(m_oLocation.IsInit()) + castedPtr->location = m_oLocation.get(); + if(m_oRef.IsInit()) + castedPtr->rfx = m_oRef.get(); + if(m_oTooltip.IsInit()) + castedPtr->tooltip = m_oTooltip.get(); + + return ptr; + } EElementType CHyperlink::getType () const { return et_x_Hyperlink; @@ -160,6 +180,19 @@ namespace OOX pHyperlink->fromBin(hyperlink); } } + XLS::BaseObjectPtr CHyperlinks::toBin() + { + + auto castedPtr(new XLSB::HLINKS); + XLS::BaseObjectPtr ptr(castedPtr); + + for(auto i:m_arrItems) + { + castedPtr->m_arHlinks.push_back(i->toBin()); + } + return ptr; + } + EElementType CHyperlinks::getType () const { return et_x_Hyperlinks; From 4f068159d7a056c2173988ab637f02e2a72a6cf9 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 28 Jun 2023 17:55:59 +0600 Subject: [PATCH 008/221] add merged cells conversion --- OOXML/XlsxFormat/Worksheets/MergeCells.cpp | 18 ++++++++++++++++++ OOXML/XlsxFormat/Worksheets/MergeCells.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp index 4d0cfd3446..ea9f80a7a5 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp @@ -34,6 +34,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/MergeCell.h" +#include "../../XlsbFormat\Biff12_unions\MERGECELLS.h" namespace OOX { @@ -69,6 +70,13 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CMergeCell::toBin() + { + auto castedPtr(new XLSB::MergeCell); + XLS::BaseObjectPtr ptr(castedPtr); + castedPtr->rfx = m_oRef.get(); + return ptr; + } EElementType CMergeCell::getType () const { return et_x_MergeCell; @@ -152,6 +160,16 @@ namespace OOX pMergeCell->fromBin(mergeCell); } } + XLS::BaseObjectPtr CMergeCells::toBin() + { + auto castedPtr(new XLSB::MERGECELLS); + XLS::BaseObjectPtr ptr(castedPtr); + for(auto i:m_arrItems) + { + castedPtr->m_arBrtMergeCell.push_back(i->toBin()); + } + return ptr; + } EElementType CMergeCells::getType () const { return et_x_MergeCells; diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.h b/OOXML/XlsxFormat/Worksheets/MergeCells.h index c761e0ea75..ce9064f602 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.h +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.h @@ -59,6 +59,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -83,6 +84,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(std::vector& obj); virtual EElementType getType () const; From 7bf8a55d258b92f83e34cd83534aae959fcee886 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 28 Jun 2023 17:56:42 +0600 Subject: [PATCH 009/221] added sheetformatpr conversion --- .../Worksheets/WorksheetChildOther.cpp | 22 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 1 + 2 files changed, 23 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 9ec2c660ea..c2d8694ecb 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -738,6 +738,28 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSheetFormatPr::toBin() + { + auto ptr(new XLSB::WsFmtInfo); + XLS::BaseObjectPtr Castedptr(ptr); + if(m_oBaseColWidth.IsInit()) + ptr->dxGCol = m_oBaseColWidth.get() * 256.; + if(m_oDefaultColWidth.IsInit()) + ptr->cchDefColWidth = m_oDefaultColWidth.get(); + + if (m_oDefaultRowHeight.IsInit()) + ptr->miyDefRwHeight = m_oDefaultRowHeight.get(); + else + ptr->miyDefRwHeight = 14.4; + + if (m_oOutlineLevelCol.IsInit()) ptr->iOutLevelCol = m_oOutlineLevelCol.get(); + if (m_oOutlineLevelRow.IsInit()) ptr->iOutLevelRw = m_oOutlineLevelRow.get(); + + if (m_oThickBottom.IsInit()) ptr->fExDesc = m_oThickBottom.get(); + if (m_oThickTop.IsInit()) ptr->fExAsc = m_oThickTop.get(); + if (m_oZeroHeight.IsInit()) ptr->fDyZero = m_oZeroHeight.get(); + return Castedptr; + } EElementType CSheetFormatPr::getType() const { return et_x_SheetFormatPr; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 46cf02be76..5c0b672f44 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -296,6 +296,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 264bec5feb412579779f71e7711f1d5789920af3 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 28 Jun 2023 22:50:08 +0600 Subject: [PATCH 010/221] added sheet view conversion --- .../Worksheets/WorksheetChildOther.cpp | 57 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 2 + 2 files changed, 59 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index c2d8694ecb..49495d84fc 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1041,6 +1041,43 @@ namespace OOX ReadAttributes(pCSVIEW->m_BrtBeginCsView); } } + XLS::BaseObjectPtr CSheetView::toBin() + { + if(m_oView.IsInit() || m_oTopLeftCell.IsInit() || m_oTopLeftCell.IsInit()) + { + auto pWsView(new XLSB::BeginWsView); + XLS::BaseObjectPtr castedPtr(pWsView); + pWsView->icvHdr = m_oColorId->m_eValue; + pWsView->fDefaultHdr = m_oDefaultGridColor->m_eValue; + pWsView->fRightToLeft = m_oRightToLeft->m_eValue; + pWsView->fDspFmlaRt = m_oShowFormulas->m_eValue; + pWsView->fDspGridRt = m_oShowGridLines->m_eValue; + pWsView->fDspGuts = m_oShowOutlineSymbols->m_eValue; + pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; + pWsView->fDspRuler = m_oShowRuler->m_eValue; + pWsView->fWhitespaceHidden = m_oShowWhiteSpace->m_eValue; + pWsView->fDspZerosRt = m_oShowZeros->m_eValue; + pWsView->fSelected = m_oTabSelected->m_eValue; + pWsView->topLeftCell = m_oTopLeftCell.get(); + pWsView->xlView = m_oView->m_eValue; + pWsView->fWnProt = m_oWindowProtection->m_eValue; + pWsView->iWbkView = m_oWorkbookViewId->m_eValue; + pWsView->wScale = m_oZoomScale->m_eValue; + pWsView->wScaleNormal = m_oZoomScaleNormal->m_eValue; + pWsView->wScalePLV = m_oZoomScalePageLayoutView->m_eValue; + pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; + return castedPtr; + } + else + { + auto pWsView(new XLSB::BeginCsView); + XLS::BaseObjectPtr castedPtr(pWsView); + pWsView->fSelected = m_oTabSelected->m_eValue; + pWsView->iWbkView = m_oWorkbookViewId->m_eValue; + pWsView->wScale = m_oZoomScale->m_eValue; + return castedPtr; + } + } EElementType CSheetView::getType() const { return et_x_SheetView; @@ -1180,6 +1217,26 @@ namespace OOX } } } + XLS::BaseObjectPtr CSheetViews::toBin() + { + auto view = m_arrItems.back(); + if(view->m_oView.IsInit() || view->m_oTopLeftCell.IsInit() || view->m_oTopLeftCell.IsInit()) + { + auto castedPtr(new XLSB::WSVIEWS2); + XLS::BaseObjectPtr ptr(castedPtr); + for(auto i:m_arrItems) + castedPtr->m_arWSVIEW2.push_back(i->toBin()); + return ptr; + } + else + { + auto castedPtr(new XLSB::CSVIEWS); + XLS::BaseObjectPtr ptr(castedPtr); + for(auto i:m_arrItems) + castedPtr->m_arCSVIEW.push_back(i->toBin()); + return ptr; + } + } EElementType CSheetViews::getType() const { return et_x_SheetViews; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 5c0b672f44..6bbd28d5d7 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -390,6 +390,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -435,6 +436,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; }; From 1e068075f4caa20a690059bee710a4b1ab0f3f7e Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 29 Jun 2023 14:12:54 +0600 Subject: [PATCH 011/221] added page margins conversion --- .../Worksheets/WorksheetChildOther.cpp | 25 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 1 + 2 files changed, 26 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 49495d84fc..9c57638ddc 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -386,6 +386,31 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPageMargins::toBin() + { + auto ptr(new XLSB::Margins); + XLS::BaseObjectPtr objPtr(ptr); + + if(m_oLeft.IsInit()) + ptr->xnumLeft.data.value = m_oLeft->GetValue(); + + if(m_oTop.IsInit()) + ptr->xnumTop.data.value = m_oTop->GetValue(); + + if(m_oRight.IsInit()) + ptr->xnumRight.data.value = m_oRight->GetValue(); + + if(m_oBottom.IsInit()) + ptr->xnumBottom.data.value = m_oBottom->GetValue(); + + if(m_oHeader.IsInit()) + ptr->xnumHeader.data.value = m_oHeader->GetValue(); + + if(m_oFooter.IsInit()) + ptr->xnumFooter.data.value = m_oFooter->GetValue(); + + return objPtr; + } EElementType CPageMargins::getType() const { return et_x_PageMargins; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 6bbd28d5d7..3cbc566457 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -169,6 +169,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 62b480b00c11ee9def5329696b3d323980e35555 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 29 Jun 2023 16:03:29 +0600 Subject: [PATCH 012/221] added page setup conversion --- .../Worksheets/WorksheetChildOther.cpp | 74 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 1 + 2 files changed, 75 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 9c57638ddc..4820ce4a37 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -503,6 +503,80 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPageSetup::toBin() + { + if(m_oErrors.IsInit() || m_oScale.IsInit()) + { + auto ptr(new XLSB::PageSetup); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBlackAndWhite.IsInit()) + ptr->fNoColor = m_oBlackAndWhite->m_eValue; + if (ptr->fNoColor) + { + if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) + ptr->fNotes = true; + else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) + ptr->fNotes = false; + } + + ptr->iCopies = m_oCopies->m_eValue; + ptr->fDraft = m_oDraft->m_eValue; + ptr->iErrors = m_oErrors->m_eValue; + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + ptr->iFitHeight = m_oFitToHeight->m_eValue; + ptr->iFitWidth = m_oFitToWidth->m_eValue; + ptr->iRes = m_oHorizontalDpi->m_eValue; + ptr->szRelID = m_oRId->GetValue(); + + if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) + ptr->fLandscape = true; + else + ptr->fLandscape = false; + + if ( m_oPageOrder == SimpleTypes::Spreadsheet::EPageOrder::pageorderOverThenDown) + ptr->fLeftToRight = true; + else + ptr->fLeftToRight = false; + + ptr->iPaperSize = m_oPaperSize->m_eValue; + ptr->iScale = m_oScale->m_eValue; + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + ptr->iVRes = m_oVerticalDpi->m_eValue; + + return objectPtr; + } + else + { + auto ptr(new XLSB::CsPageSetup); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oBlackAndWhite.IsInit()) + ptr->fNoColor = m_oBlackAndWhite->m_eValue; + if (ptr->fNoColor) + { + if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) + ptr->fNotes = true; + else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) + ptr->fNotes = false; + } + + ptr->iCopies = m_oCopies->m_eValue; + ptr->fDraft = m_oDraft->m_eValue; + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + ptr->iRes = m_oHorizontalDpi->m_eValue; + ptr->szRelID = m_oRId->GetValue(); + + if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) + ptr->fLandscape = true; + else + ptr->fLandscape = false; + + ptr->iPaperSize = m_oPaperSize->m_eValue; + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + ptr->iVRes = m_oVerticalDpi->m_eValue; + return objectPtr; + } + } EElementType CPageSetup::getType() const { return et_x_PageSetup; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 3cbc566457..ee352ac746 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -200,6 +200,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From 2d13189051eaaaf6ef63353e26e447996fe815e5 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 29 Jun 2023 16:12:31 +0600 Subject: [PATCH 013/221] added print options conversion --- .../Worksheets/WorksheetChildOther.cpp | 17 +++++++++++++++++ .../XlsxFormat/Worksheets/WorksheetChildOther.h | 1 + 2 files changed, 18 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 4820ce4a37..80a15b07a0 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -720,6 +720,23 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPrintOptions::toBin() + { + auto ptr(new XLSB::PrintOptions); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oGridLines.IsInit()) + ptr->fPrintGrid = m_oGridLines->m_eValue; + if(m_oGridLinesSet.IsInit()) + ptr->fPrintGrid = m_oGridLinesSet->m_eValue; + if(m_oHeadings.IsInit()) + ptr->fPrintHeaders = m_oHeadings->m_eValue; + if(m_oHorizontalCentered.IsInit()) + ptr->fHCenter = m_oHorizontalCentered->m_eValue; + if(m_oVerticalCentered.IsInit()) + ptr->fVCenter = m_oVerticalCentered->m_eValue; + + return objectPtr; + } EElementType CPrintOptions::getType() const { return et_x_PrintOptions; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index ee352ac746..898e0e7a0e 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -243,6 +243,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 8fe5139272e40723b1668d89434fdc61c3d2d82d Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 29 Jun 2023 17:35:19 +0600 Subject: [PATCH 014/221] added protection and headerfooter conversion --- .../Worksheets/WorksheetChildOther.cpp | 86 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 2 + 2 files changed, 88 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 80a15b07a0..c743492df0 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1764,6 +1764,34 @@ namespace OOX } } } + XLS::BaseObjectPtr CHeaderFooter::toBin() + { + auto ptr(new XLSB::HEADERFOOTER); + + XLS::BaseObjectPtr objectPtr(ptr); + + auto castedBegin(new XLSB::BeginHeaderFooter); + ptr->m_BrtBeginHeaderFooter = XLS::BaseObjectPtr{castedBegin}; + + castedBegin->fHFAlignMargins = m_oAlignWithMargins->m_eValue; + castedBegin->fHFDiffFirst = m_oDifferentFirst->m_eValue; + castedBegin->fHFDiffOddEven = m_oDifferentOddEven->m_eValue; + castedBegin->fHFScaleWithDoc = m_oScaleWithDoc->m_eValue; + + if(m_oOddHeader.IsInit()) + castedBegin->stHeader = m_oOddHeader->m_sText; + if(m_oOddFooter.IsInit()) + ptr->stFooter = m_oOddFooter->m_sText; + if(m_oEvenHeader.IsInit()) + ptr->stHeaderEven = m_oEvenHeader->m_sText; + if(m_oEvenFooter.IsInit()) + ptr->stFooterEven = m_oEvenFooter->m_sText; + if(m_oFirstHeader.IsInit()) + ptr->stHeaderFirst = m_oFirstHeader->m_sText; + if(m_oFirstFooter.IsInit()) + ptr->stFooterFirst = m_oFirstFooter->m_sText; + return objectPtr; + } EElementType CHeaderFooter::getType() const { return et_x_HeaderFooterWorksheet; @@ -2163,6 +2191,64 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSheetProtection::toBin() + { + if(m_oPassword.IsInit()) + { + auto ptr(new XLSB::SheetProtection); + XLS::BaseObjectPtr castedPtr(ptr); + + ptr->protpwd = m_oPassword.get(); + ptr->fAutoFilter = m_oAutoFilter->GetValue(); + + ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + ptr->fDeleteRows = m_oDeleteRows->GetValue(); + ptr->fFormatCells = m_oFormatCells->GetValue(); + ptr->fFormatColumns = m_oFormatColumns->GetValue(); + ptr->fFormatRows = m_oFormatRows->GetValue(); + ptr->fInsertColumns = m_oInsertColumns->GetValue(); + ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + ptr->fInsertRows = m_oInsertRows->GetValue(); + ptr->fObjects = m_oObjects->GetValue(); + ptr->fPivotTables = m_oPivotTables->GetValue(); + ptr->fScenarios = m_oScenarios->GetValue(); + ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + ptr->fLocked = m_oSheet->GetValue(); + ptr->fSort = m_oSort->GetValue(); + + return castedPtr; + } + else + { + auto ptr(new XLSB::SheetProtectionIso); + XLS::BaseObjectPtr castedPtr(ptr); + + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + ptr->dwSpinCount = m_oSpinCount->GetValue(); + ptr->ipdPasswordData.rgbHash = m_oHashValue->GetValue(); + ptr->ipdPasswordData.rgbSalt = m_oSaltValue->GetValue(); + + ptr->fAutoFilter = m_oAutoFilter->GetValue(); + + ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + ptr->fDeleteRows = m_oDeleteRows->GetValue(); + ptr->fFormatCells = m_oFormatCells->GetValue(); + ptr->fFormatColumns = m_oFormatColumns->GetValue(); + ptr->fFormatRows = m_oFormatRows->GetValue(); + ptr->fInsertColumns = m_oInsertColumns->GetValue(); + ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + ptr->fInsertRows = m_oInsertRows->GetValue(); + ptr->fObjects = m_oObjects->GetValue(); + ptr->fPivotTables = m_oPivotTables->GetValue(); + ptr->fScenarios = m_oScenarios->GetValue(); + ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + ptr->fLocked = m_oSheet->GetValue(); + ptr->fSort = m_oSort->GetValue(); + return castedPtr; + } + } EElementType CSheetProtection::getType() const { return et_x_SheetProtection; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 898e0e7a0e..370c1843c1 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -571,6 +571,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -734,6 +735,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From dee93bae01068d389b5eb381147a2db01793bd50 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 30 Jun 2023 15:14:57 +0600 Subject: [PATCH 015/221] added sortstate conversion --- OOXML/XlsxFormat/Table/Autofilter.cpp | 54 +++++++++++++++++++++++++++ OOXML/XlsxFormat/Table/Autofilter.h | 2 + 2 files changed, 56 insertions(+) diff --git a/OOXML/XlsxFormat/Table/Autofilter.cpp b/OOXML/XlsxFormat/Table/Autofilter.cpp index 908052d894..a541c87e1a 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.cpp +++ b/OOXML/XlsxFormat/Table/Autofilter.cpp @@ -104,6 +104,35 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSortCondition::toBin() + { + auto ptr(new XLSB::BeginSortCond); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->fSortDes = m_oDescending->GetValue(); + ptr->rfx = m_oRef->GetValue(); + + if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyValue) + { + ptr->sortOn = 0; + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyCellColor) + { + ptr->sortOn = 1; + ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyFontColor) + { + ptr->sortOn = 2; + ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyIcon) + { + ptr->sortOn = 3; + } + + return objectPtr; + } EElementType CSortCondition::getType () const { return et_x_SortCondition; @@ -254,8 +283,33 @@ namespace OOX for(auto &pSORTCOND14 : ptrACSORTCONDS->m_arSORTCOND14) m_arrItems.push_back(new CSortCondition(static_cast(pSORTCOND14.get())->m_BrtBeginSortCond14)); } + } + XLS::BaseObjectPtr CSortState::toBin() + { + auto ptr(new XLSB::SORTSTATE); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginSortState(new XLSB::BeginSortState); + ptr->m_BrtBeginSortState = XLS::BaseObjectPtr{beginSortState}; + if(m_oRef.IsInit()) + beginSortState->rfx = m_oRef->GetValue(); + if(m_oCaseSensitive.IsInit()) + beginSortState->fCaseSensitive = m_oCaseSensitive->GetValue(); + if(m_oColumnSort.IsInit()) + beginSortState->fCol = m_oColumnSort->GetValue(); + if(m_oSortMethod == SimpleTypes::Spreadsheet::ESortMethod::sortmethodStroke) + beginSortState->fAltMethod = true; + else + beginSortState->fAltMethod = false; + auto sortConds(new XLSB::SORTCONDS); + ptr->m_source = XLS::BaseObjectPtr{sortConds}; + for(auto i:m_arrItems) + { + sortConds->m_arSORTCOND.push_back(i->toBin()); + } + + return objectPtr; } EElementType CSortState::getType () const { diff --git a/OOXML/XlsxFormat/Table/Autofilter.h b/OOXML/XlsxFormat/Table/Autofilter.h index 4a4ab8d6ab..037f989bf6 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.h +++ b/OOXML/XlsxFormat/Table/Autofilter.h @@ -71,6 +71,7 @@ namespace OOX void toXMLWithNS(NSStringUtils::CStringBuilder& writer, const std::wstring &node_ns, const std::wstring &node_name, const std::wstring &child_ns) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -101,6 +102,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 950212b23b4cc0fca29c60a3b97059b3d44f57a4 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 30 Jun 2023 18:54:39 +0600 Subject: [PATCH 016/221] corrected conversion --- .../Worksheets/WorksheetChildOther.cpp | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index c743492df0..5f71aca8da 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1781,15 +1781,15 @@ namespace OOX if(m_oOddHeader.IsInit()) castedBegin->stHeader = m_oOddHeader->m_sText; if(m_oOddFooter.IsInit()) - ptr->stFooter = m_oOddFooter->m_sText; + castedBegin->stFooter = m_oOddFooter->m_sText; if(m_oEvenHeader.IsInit()) - ptr->stHeaderEven = m_oEvenHeader->m_sText; + castedBegin->stHeaderEven = m_oEvenHeader->m_sText; if(m_oEvenFooter.IsInit()) - ptr->stFooterEven = m_oEvenFooter->m_sText; + castedBegin->stFooterEven = m_oEvenFooter->m_sText; if(m_oFirstHeader.IsInit()) - ptr->stHeaderFirst = m_oFirstHeader->m_sText; + castedBegin->stHeaderFirst = m_oFirstHeader->m_sText; if(m_oFirstFooter.IsInit()) - ptr->stFooterFirst = m_oFirstFooter->m_sText; + castedBegin->stFooterFirst = m_oFirstFooter->m_sText; return objectPtr; } EElementType CHeaderFooter::getType() const @@ -2198,7 +2198,7 @@ namespace OOX auto ptr(new XLSB::SheetProtection); XLS::BaseObjectPtr castedPtr(ptr); - ptr->protpwd = m_oPassword.get(); + ptr->protpwd = std::stoul(m_oPassword.get()); ptr->fAutoFilter = m_oAutoFilter->GetValue(); ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); @@ -2226,8 +2226,17 @@ namespace OOX ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); ptr->dwSpinCount = m_oSpinCount->GetValue(); - ptr->ipdPasswordData.rgbHash = m_oHashValue->GetValue(); - ptr->ipdPasswordData.rgbSalt = m_oSaltValue->GetValue(); + byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + + byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; ptr->fAutoFilter = m_oAutoFilter->GetValue(); From b2b628b5b7819c065d786e0773fff1619f97fb51 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 30 Jun 2023 18:55:13 +0600 Subject: [PATCH 017/221] added autofilter conversion --- OOXML/XlsxFormat/Table/Autofilter.cpp | 273 ++++++++++++++++++++++++++ OOXML/XlsxFormat/Table/Autofilter.h | 12 +- 2 files changed, 284 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Table/Autofilter.cpp b/OOXML/XlsxFormat/Table/Autofilter.cpp index a541c87e1a..6c4733e315 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.cpp +++ b/OOXML/XlsxFormat/Table/Autofilter.cpp @@ -382,6 +382,15 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CColorFilter::toBin() + { + auto ptr(new XLSB::ColorFilter); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->fCellColor = m_oCellColor->GetValue(); + ptr->dxfid = m_oDxfId->GetValue(); + + return objectPtr; + } EElementType CColorFilter::getType () const { return et_x_ColorFilter; @@ -446,6 +455,94 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDynamicFilter::toBin() + { + auto ptr(new XLSB::DynamicFilter); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oType.IsInit()) + { + if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNull) + ptr->cft = 0x00000000; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeAboveAverage) + ptr->cft = 0x00000001; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeBelowAverage) + ptr->cft = 0x00000002; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeTomorrow) + ptr->cft = 0x00000008; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeToday) + ptr->cft = 0x00000009; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeYesterday) + ptr->cft = 0x0000000A; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextWeek) + ptr->cft = 0x0000000B; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisWeek) + ptr->cft = 0x0000000C; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastWeek) + ptr->cft = 0x0000000D; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextMonth) + ptr->cft = 0x0000000E; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisMonth) + ptr->cft = 0x0000000F; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastMonth) + ptr->cft = 0x00000010; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextQuarter) + ptr->cft = 0x00000011; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisQuarter) + ptr->cft = 0x00000012; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastQuarter) + ptr->cft = 0x00000013; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeNextYear) + ptr->cft = 0x00000014; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeThisYear) + ptr->cft = 0x00000015; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeLastYear) + ptr->cft = 0x00000016; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeYearToDate) + ptr->cft = 0x00000017; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ1) + ptr->cft = 0x00000018; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ2) + ptr->cft = 0x00000019; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ3) + ptr->cft = 0x0000001A; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeQ4) + ptr->cft = 0x0000001B; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM1) + ptr->cft = 0x0000001C; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM2) + ptr->cft = 0x0000001D; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM3) + ptr->cft = 0x0000001E; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM4) + ptr->cft = 0x0000001F; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM5) + ptr->cft = 0x00000020; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM6) + ptr->cft = 0x00000021; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM7) + ptr->cft = 0x00000022; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM8) + ptr->cft = 0x00000023; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM9) + ptr->cft = 0x00000024; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM10) + ptr->cft = 0x00000025; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM11) + ptr->cft = 0x00000026; + else if (m_oType == SimpleTypes::Spreadsheet::EDynamicFilterType::dynamicfiltertypeM12) + ptr->cft = 0x00000027; + } + if (m_oVal.IsInit()) + { + ptr->xNumValue.data.value = m_oVal->GetValue(); + } + + if (m_oMaxVal.IsInit()) + { + ptr->xNumValueMax.data.value = m_oMaxVal->GetValue(); + } + return objectPtr; + } EElementType CDynamicFilter::getType () const { return et_x_DynamicFilter; @@ -585,6 +682,40 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCustomFilter::toBin() + { + auto ptr(new XLSB::CustomFilter); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterLessThan) + { + ptr->grbitSgn = 0x01; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterEqual) + { + ptr->grbitSgn = 0x02; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterLessThanOrEqual) + { + ptr->grbitSgn = 0x03; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterGreaterThan) + { + ptr->grbitSgn = 0x04; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterNotEqual) + { + ptr->grbitSgn = 0x05; + } + else if (m_oOperator == SimpleTypes::Spreadsheet::ECustomFilter::customfilterGreaterThanOrEqual) + { + ptr->grbitSgn = 0x06; + } + ptr->vts = 0x00000006; + ptr->vtsStringXls = m_oVal.get(); + + return objectPtr; + } EElementType CCustomFilter::getType () const { return et_x_CustomFilters; @@ -701,6 +832,21 @@ namespace OOX } } } + XLS::BaseObjectPtr CCustomFilters::toBin() + { + auto ptr(new XLSB::CUSTOMFILTERS); + XLS::BaseObjectPtr objectPtr(ptr); + auto customFilters(new XLSB::BeginCustomFilters); + ptr->m_BrtBeginCustomFilters = XLS::BaseObjectPtr{customFilters}; + + customFilters->fAnd = m_oAnd->GetValue(); + + for(auto i:m_arrItems) + { + ptr->m_arBrtCustomFilter.push_back(i->toBin()); + } + return objectPtr; + } EElementType CCustomFilters::getType () const { return et_x_CustomFilters; @@ -761,6 +907,13 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CFilter::toBin() + { + auto ptr(new XLSB::Filter); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->rgch = m_oVal.get(); + return objectPtr; + } EElementType CFilter::getType () const { return et_x_Filter; @@ -827,6 +980,44 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDateGroupItem::toBin() + { + auto ptr(new XLSB::AFilterDateGroupItem); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupYear) + { + ptr->dntChecked = 0x00000000; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupMonth) + { + ptr->dntChecked = 0x00000001; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupDay) + { + ptr->dntChecked = 0x00000002; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupHour) + { + ptr->dntChecked = 0x00000003; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupMinute) + { + ptr->dntChecked = 0x00000004; + } + else if (m_oDateTimeGrouping == SimpleTypes::Spreadsheet::EDateTimeGroup::datetimegroupSecond) + { + ptr->dntChecked = 0x00000005; + } + + ptr->dom = m_oDay->GetValue(); + ptr->hour = m_oHour->GetValue(); + ptr->min = m_oMinute->GetValue(); + ptr->mon = m_oMonth->GetValue(); + ptr->sec = m_oSecond->GetValue(); + ptr->yr = m_oYear->GetValue(); + return objectPtr; + } EElementType CDateGroupItem::getType () const { return et_x_DateGroupItem; @@ -965,6 +1156,27 @@ namespace OOX } } } + XLS::BaseObjectPtr CFilters::toBin() + { + auto ptr(new XLSB::FILTERS); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBlank.IsInit()) + { + auto beginFilters(new XLSB::BeginFilters); + beginFilters->fBlank = m_oBlank->GetValue(); + } + for(auto i: m_arrItems) + { + if (CFilter* cfilter = dynamic_cast(i)) { + // Элемент является экземпляром класса CFilter + ptr->m_arBrtFilter.push_back(cfilter->toBin()); + } else if (CDateGroupItem* groupItem = dynamic_cast(i)) { + // Элемент является экземпляром класса CDateGroupItem + ptr->m_arBrtAFilterDateGroupItem.push_back(groupItem->toBin()); + } + } + return objectPtr; + } EElementType CFilters::getType () const { return et_x_Filters; @@ -1030,6 +1242,25 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CTop10::toBin() + { + auto ptr(new XLSB::Top10Filter); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oFilterVal.IsInit()) + ptr->xNumValue.data.value = m_oFilterVal->GetValue(); + + if (m_oPercent.IsInit()) + ptr->fPercent = m_oPercent->GetValue(); + + if (m_oTop.IsInit()) + ptr->fTop = m_oTop->GetValue(); + + if (m_oVal.IsInit()) + ptr->xNumFilter.data.value = m_oVal->GetValue(); + + return objectPtr; + } EElementType CTop10::getType () const { return et_x_ColorFilter; @@ -1146,6 +1377,33 @@ namespace OOX } } } + XLS::BaseObjectPtr CFilterColumn::toBin() + { + auto ptr(new XLSB::FILTERCOLUMN); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginfilter(new XLSB::BeginFilterColumn); + ptr->m_BrtBeginFilterColumn = XLS::BaseObjectPtr{beginfilter}; + + if(m_oColId.IsInit()) + beginfilter->dwCol = m_oColId->GetValue(); + if(m_oHiddenButton.IsInit()) + beginfilter->fHideArrow = m_oHiddenButton->GetValue(); + if(m_oShowButton.IsInit()) + beginfilter->fNoBtn = m_oShowButton->GetValue(); + + if(m_oColorFilter.IsInit()) + ptr->m_source = m_oColorFilter->toBin(); + else if(m_oDynamicFilter.IsInit()) + ptr->m_source = m_oDynamicFilter->toBin(); + else if(m_oCustomFilters.IsInit()) + ptr->m_source = m_oCustomFilters->toBin(); + else if(m_oFilters.IsInit()) + ptr->m_source = m_oFilters->toBin(); + else if(m_oTop10.IsInit()) + ptr->m_source = m_oTop10->toBin(); + + return objectPtr; + } EElementType CFilterColumn::getType () const { return et_x_FilterColumn; @@ -1244,6 +1502,21 @@ namespace OOX } } } + XLS::BaseObjectPtr CAutofilter::toBin() + { + auto ptr(new XLSB::AUTOFILTER); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRef.IsInit()) + { + auto beginFilter(new XLSB::BeginAFilter); + ptr->m_BrtBeginAFilter = XLS::BaseObjectPtr{beginFilter}; + beginFilter->rfx = m_oRef->GetValue(); + } + if(m_oSortState.IsInit()) + ptr->m_SORTSTATE = m_oSortState->toBin(); + + return objectPtr; + } EElementType CAutofilter::getType () const { return et_x_Autofilter; diff --git a/OOXML/XlsxFormat/Table/Autofilter.h b/OOXML/XlsxFormat/Table/Autofilter.h index 037f989bf6..ce6d0fd127 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.h +++ b/OOXML/XlsxFormat/Table/Autofilter.h @@ -133,6 +133,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -161,6 +162,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -190,6 +192,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -218,6 +221,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -244,7 +248,8 @@ namespace OOX void toXMLWithNS(NSStringUtils::CStringBuilder& writer, const std::wstring &node_ns, const std::wstring &node_name, const std::wstring &child_ns) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - void fromBin(XLS::BaseObjectPtr& obj);; + void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -272,6 +277,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -305,6 +311,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -332,6 +339,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -362,6 +370,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -395,6 +404,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; From 5e1c67b29ee95298b6aec7e1c24ce2bf2245ad5c Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 30 Jun 2023 19:31:57 +0600 Subject: [PATCH 018/221] added table parts conversion --- OOXML/XlsxFormat/Table/Table.h | 2 + OOXML/XlsxFormat/Table/Tables.cpp | 65 +++++++++++++++++++++---------- 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/OOXML/XlsxFormat/Table/Table.h b/OOXML/XlsxFormat/Table/Table.h index b5be81fa45..c8b9db642b 100644 --- a/OOXML/XlsxFormat/Table/Table.h +++ b/OOXML/XlsxFormat/Table/Table.h @@ -300,6 +300,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_TablePart; @@ -334,6 +335,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 79b4b0764f..1643f0d820 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -169,11 +169,11 @@ namespace Spreadsheet //есть такой баг: при сохранениии "sum" и названия таблицы "Table1" (русский excel), выдается ошибка в формулах WritingStringNullableAttrString(L"totalsRowFunction", m_oTotalsRowFunction, m_oTotalsRowFunction->ToString()); WritingStringNullableAttrInt(L"queryTableFieldId", m_oQueryTableFieldId, m_oQueryTableFieldId->GetValue()); - WritingStringNullableAttrString(L"dataCellStyle", m_oDataCellStyle, *m_oDataCellStyle); + WritingStringNullableAttrString(L"dataCellStyle", m_oDataCellStyle, *m_oDataCellStyle); WritingStringNullableAttrInt(L"dataDxfId", m_oDataDxfId, m_oDataDxfId->GetValue()); - WritingStringNullableAttrString(L"headerRowCellStyle", m_oHeaderRowCellStyle, *m_oHeaderRowCellStyle); + WritingStringNullableAttrString(L"headerRowCellStyle", m_oHeaderRowCellStyle, *m_oHeaderRowCellStyle); WritingStringNullableAttrInt(L"headerRowDxfId", m_oHeaderRowDxfId, m_oHeaderRowDxfId->GetValue()); - WritingStringNullableAttrString(L"totalsRowCellStyle", m_oTotalsRowCellStyle, *m_oTotalsRowCellStyle); + WritingStringNullableAttrString(L"totalsRowCellStyle", m_oTotalsRowCellStyle, *m_oTotalsRowCellStyle); WritingStringNullableAttrInt(L"totalsRowDxfId", m_oTotalsRowDxfId, m_oTotalsRowDxfId->GetValue()); if(m_oTotalsRowFormula.IsInit() || m_oCalculatedColumnFormula.IsInit()) { @@ -326,7 +326,7 @@ namespace Spreadsheet writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -334,7 +334,7 @@ namespace Spreadsheet m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CTableColumns::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -405,17 +405,17 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") WritingStringNullableAttrString(L"totalsRowCellStyle", m_oTotalsRowCellStyle, *m_oTotalsRowCellStyle); WritingStringNullableAttrInt(L"totalsRowDxfId", m_oTotalsRowDxfId, m_oTotalsRowDxfId->GetValue()); WritingStringNullableAttrInt(L"totalsRowBorderDxfId", m_oTotalsRowBorderDxfId, m_oTotalsRowBorderDxfId->GetValue()); - + //if (m_oHeaderRowCount.IsInit() && 0 == m_oHeaderRowCount->GetValue()) // WritingStringAttrString(L"headerRowCount", L"1"); //if (m_oTotalsRowCount.IsInit() && m_oTotalsRowCount->GetValue() > 0) // WritingStringAttrString(L"totalsRowCount", L"1"); // else - // WritingStringAttrString(L"totalsRowShown", L"0");//m_oTotalsRowShown + // WritingStringAttrString(L"totalsRowShown", L"0");//m_oTotalsRowShown WritingStringNullableAttrInt(L"headerRowCount", m_oHeaderRowCount, m_oHeaderRowCount->GetValue()); WritingStringNullableAttrInt(L"totalsRowCount", m_oTotalsRowCount, m_oTotalsRowCount->GetValue()); WritingStringNullableAttrBool2(L"totalsRowShown", m_oTotalsRowShown); - + WritingStringNullableAttrBool2(L"insertRow", m_oInsertRow); WritingStringNullableAttrBool2(L"insertRowShift", m_oInsertRowShift); WritingStringNullableAttrBool2(L"published", m_oPublished); @@ -439,7 +439,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") void CTable::toXML2(NSStringUtils::CStringBuilder& writer, int nIndex) { if(false == m_oRef.IsInit() || false == m_oDisplayName.IsInit()) return; - + if(!m_oId.IsInit()) { m_oId.Init(); @@ -508,7 +508,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") WritingElement_ReadAttributes_Read_else_if ( oReader, L"comment", m_oComment ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"connectionId", m_oConnectionId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"dataDxfId", m_oDataDxfId ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"dataCellStyle", m_oDataCellStyle ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"dataCellStyle", m_oDataCellStyle ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"headerRowBorderDxfId", m_oHeaderRowBorderDxfId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"headerRowCellStyle", m_oHeaderRowCellStyle ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"headerRowDxfId", m_oHeaderRowDxfId ) @@ -624,6 +624,14 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") { ReadAttributes(obj); } + XLS::BaseObjectPtr CTablePart::toBin() + { + auto ptr(new XLSB::ListPart); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRId.IsInit()) + ptr->stRelID.value = m_oRId->GetValue(); + return objectPtr; + } void CTablePart::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start_No_NS( oReader ) @@ -644,7 +652,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -652,8 +660,8 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_arrItems[i]->toXML(writer); } } - - writer.WriteString(L""); + + writer.WriteString(L""); } void CTableParts::fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -689,6 +697,23 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } } + XLS::BaseObjectPtr CTableParts::toBin() + { + auto ptr(new XLSB::LISTPARTS); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oCount.IsInit()) + { + auto beginlistParts(new XLSB::BeginListParts); + ptr->m_BrtBeginListParts = XLS::BaseObjectPtr{beginlistParts}; + beginlistParts->cParts = m_oCount->m_eValue; + } + for(auto i:m_arrItems) + { + ptr->m_arBrtListPart.push_back(i->toBin()); + } + return objectPtr; + } void CTableParts::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -837,7 +862,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -845,7 +870,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CQueryTableFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -931,7 +956,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -1071,7 +1096,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") WritingElement_ReadAttributes_Read_else_if ( oReader, (L"unboundColumnsRight"), m_UnboundColumnsRight ) WritingElement_ReadAttributes_End( oReader ) } - + void CQueryTable::toXML(NSStringUtils::CStringBuilder& writer) const { if(false == m_oName.IsInit()) return; @@ -1107,7 +1132,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrBool2(L"refreshOnLoad", m_oRefreshOnLoad); WritingStringNullableAttrBool2(L"removeDataOnSave", m_oRemoveDataOnSave); WritingStringNullableAttrBool2(L"rowNumbers", m_oRowNumbers); - + writer.WriteString(L">"); if(m_oQueryTableRefresh.IsInit()) @@ -1203,10 +1228,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyFontFormats", m_oApplyFontFormats ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyNumberFormats", m_oApplyNumberFormats ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyPatternFormats", m_oApplyPatternFormats ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyWidthHeightFormats", m_oApplyWidthHeightFormats ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"applyWidthHeightFormats", m_oApplyWidthHeightFormats ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"autoFormatId", m_oAutoFormatId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"backgroundRefresh", m_oBackgroundRefresh ) - WritingElement_ReadAttributes_Read_else_if ( oReader, L"connectionId", m_oConnectionId ) + WritingElement_ReadAttributes_Read_else_if ( oReader, L"connectionId", m_oConnectionId ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"disableEdit", m_oDisableEdit ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"disableRefresh", m_oDisableRefresh ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"fillFormulas", m_oFillFormulas ) From a1ac26ada9cec82aaf29e85f753053dd5abcfb40 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 5 Jul 2023 19:48:11 +0600 Subject: [PATCH 019/221] added ole objects convertation --- OOXML/XlsxFormat/Ole/OleObjects.cpp | 44 +++++++++++++++++++++++++++++ OOXML/XlsxFormat/Ole/OleObjects.h | 2 ++ 2 files changed, 46 insertions(+) diff --git a/OOXML/XlsxFormat/Ole/OleObjects.cpp b/OOXML/XlsxFormat/Ole/OleObjects.cpp index b6f273cb8a..0db040495e 100644 --- a/OOXML/XlsxFormat/Ole/OleObjects.cpp +++ b/OOXML/XlsxFormat/Ole/OleObjects.cpp @@ -293,6 +293,40 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr COleObject::toBin() + { + auto ptr(new XLSB::OleObject); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDvAspect.IsInit()) + { + if(m_oDvAspect == SimpleTypes::Spreadsheet::EDvAspect::Content) + ptr->dwAspect = 0x00000001; + else if(m_oDvAspect == SimpleTypes::Spreadsheet::EDvAspect::Icon) + ptr->dwAspect = 0x00000004; + } + if(m_oOleUpdate.IsInit()) + { + if(m_oOleUpdate == SimpleTypes::Spreadsheet::EOleUpdate::Always) + ptr->dwOleUpdate = 0x00000001; + else if(m_oOleUpdate == SimpleTypes::Spreadsheet::EOleUpdate::OnCall) + ptr->dwOleUpdate = 0x00000003; + } + + if(m_oShapeId.IsInit()) + ptr->shapeId = m_oShapeId->GetValue(); + + ptr->fAutoLoad = m_oAutoLoad->GetValue(); + + if(m_oProgId.IsInit()) + ptr->strProgID.value() = m_oProgId.get(); + + if(m_oLink.IsInit()) + ptr->link = m_oLink.get(); + if(m_oRid.IsInit()) + ptr->strRelID.value = m_oRid->GetValue(); + + return objectPtr; + } EElementType COleObject::getType () const { return et_x_OleObject; @@ -455,6 +489,16 @@ namespace OOX } } } + XLS::BaseObjectPtr COleObjects::toBin() + { + auto ptr(new XLSB::OLEOBJECTS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_mapOleObjects) + { + ptr->m_arBrtOleObject.push_back(i.second->toBin()); + } + return objectPtr; + } EElementType COleObjects::getType () const { return et_x_OleObjects; diff --git a/OOXML/XlsxFormat/Ole/OleObjects.h b/OOXML/XlsxFormat/Ole/OleObjects.h index 20c32d0df5..450f1997bc 100644 --- a/OOXML/XlsxFormat/Ole/OleObjects.h +++ b/OOXML/XlsxFormat/Ole/OleObjects.h @@ -136,6 +136,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -171,6 +172,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From c49508902222bb5f3102d7a59fe873f8b3e7ba8c Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 5 Jul 2023 21:31:25 +0600 Subject: [PATCH 020/221] added controls conversion --- OOXML/XlsxFormat/Controls/Controls.cpp | 26 ++++++++++++++++++++++++++ OOXML/XlsxFormat/Controls/Controls.h | 24 +++++++++++++----------- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Controls/Controls.cpp b/OOXML/XlsxFormat/Controls/Controls.cpp index c3ac52b8c8..9e48da5966 100644 --- a/OOXML/XlsxFormat/Controls/Controls.cpp +++ b/OOXML/XlsxFormat/Controls/Controls.cpp @@ -202,6 +202,20 @@ namespace OOX } } } + XLS::BaseObjectPtr CControl::toBin() + { + auto ptr(new XLSB::ActiveX); + XLS::BaseObjectPtr objectPtr(ptr); + if (m_oShapeId.IsInit()) + ptr->shapeId = m_oShapeId->GetValue(); + + if (!m_oName.IsInit()) + ptr->strName = m_oName.get(); + + if (!m_oRid.IsInit()) + ptr->strRelID.value = m_oRid->GetValue(); + return objectPtr; + } void CControl::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -335,6 +349,18 @@ namespace OOX } } + XLS::BaseObjectPtr CControls::toBin() + { + auto ptr(new XLSB::ACTIVEXCONTROLS); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_mapControls) + { + ptr->m_arBrtActiveX.push_back(i.second->toBin()); + } + + return objectPtr; + } CListItem::CListItem() {} CListItem::~CListItem() {} diff --git a/OOXML/XlsxFormat/Controls/Controls.h b/OOXML/XlsxFormat/Controls/Controls.h index cee8bba539..a721d54c38 100644 --- a/OOXML/XlsxFormat/Controls/Controls.h +++ b/OOXML/XlsxFormat/Controls/Controls.h @@ -67,10 +67,10 @@ namespace OOX { public: WritingElement_AdditionMethods(CListItem) - + CListItem(); virtual ~CListItem(); - + virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -80,7 +80,7 @@ namespace OOX virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_string m_oVal; }; //----------------------------------------------------------------------------------------------------------------------------- @@ -88,10 +88,10 @@ namespace OOX { public: WritingElement_AdditionMethods(CListItems) - + CListItems(); virtual ~CListItems(); - + virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; @@ -101,7 +101,7 @@ namespace OOX virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader){} - + std::vector> m_arrItems; nullable m_oExtLst; }; @@ -122,7 +122,7 @@ namespace OOX virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oDropLines; nullable m_oObjectType; nullable m_oChecked; @@ -142,7 +142,7 @@ namespace OOX nullable_string m_oFmlaGroup; nullable_string m_oFmlaLink; nullable_string m_oFmlaRange; - nullable_string m_oFmlaTxbx; + nullable_string m_oFmlaTxbx; nullable_bool m_oColored; nullable_bool m_oFirstButton; nullable_bool m_oHoriz; @@ -215,9 +215,10 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void toXML2(NSStringUtils::CStringBuilder& writer, bool bControlPr) const; - + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - void fromBin(XLS::BaseObjectPtr& obj); + void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -252,9 +253,10 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); - + void read(XmlUtils::CXmlLiteReader& oReader, bool bOldVersion = false); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; From 9c119635da0db3a7c75dc3855b96dc2cb4940f97 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 6 Jul 2023 15:15:00 +0600 Subject: [PATCH 021/221] added cheetpr conversion --- OOXML/XlsxFormat/Styles/rPr.cpp | 33 +++++++++++++++++++ OOXML/XlsxFormat/Styles/rPr.h | 8 +++-- .../Worksheets/WorksheetChildOther.cpp | 27 +++++++++++++++ .../Worksheets/WorksheetChildOther.h | 1 + 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index fb57085289..9499de767e 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -429,6 +429,39 @@ namespace OOX { ReadAttributes(obj); } + XLSB::Color CColor::toColor() + { + XLSB::Color ptr; + + if(m_oAuto.IsInit()) + { + if(m_oAuto->GetValue()) + ptr.xColorType = 0; + } + else if(m_oIndexed.IsInit()) + { + ptr.index = m_oIndexed->GetValue(); + ptr.xColorType = 1; + } + else if(m_oThemeColor.IsInit()) + { + ptr.index = m_oThemeColor->GetValue(); + ptr.xColorType = 3; + } + else + { + ptr.bAlpha = m_oRgb->Get_A(); + ptr.bBlue = m_oRgb->Get_B(); + ptr.bGreen = m_oRgb->Get_G(); + ptr.bRed = m_oRgb->Get_R(); + } + + if ( m_oTint.IsInit()) + { + ptr.nTintAndShade = m_oTint->GetValue() * 32767.0; + } + return ptr; + } EElementType CColor::getType () const { return et_x_Color; diff --git a/OOXML/XlsxFormat/Styles/rPr.h b/OOXML/XlsxFormat/Styles/rPr.h index f0ec51018a..a22e3b60c8 100644 --- a/OOXML/XlsxFormat/Styles/rPr.h +++ b/OOXML/XlsxFormat/Styles/rPr.h @@ -33,6 +33,7 @@ #include "../WritingElement.h" #include "../../Base/Nullable.h" +#include "../../XlsbFormat/Biff12_records/Color.h" namespace NSBinPptxRW { @@ -55,7 +56,7 @@ namespace SimpleTypes class CFontCharset; class CFontFamily; class CFontScheme; - class CUnderline; + class CUnderline; } } @@ -65,7 +66,7 @@ namespace ComplexTypes { class COnOff2; class String; - class CDouble; + class CDouble; } } @@ -98,7 +99,7 @@ namespace OOX public: nullable m_oRgb; }; - + class CIndexedColors : public WritingElementWithChilds { public: @@ -144,6 +145,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); void fromBin(XLS::BaseObject* obj); + XLSB::Color toColor(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 5f71aca8da..0fc89ece3f 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1530,6 +1530,33 @@ namespace OOX m_oOutlinePr = oReader; } } + XLS::BaseObjectPtr CSheetPr::toBin() + { + XLS::BaseObjectPtr objectPtr; + + if(m_oEnableFormatConditionsCalculation.IsInit() || m_oSyncHorizontal.IsInit() || m_oSyncHorizontal.IsInit() || m_oTransitionEvaluation.IsInit()) + { + auto ptr(new XLSB::WsProp); + objectPtr = XLS::BaseObjectPtr{ptr}; + + ptr->strName.value = m_oCodeName.get(); + + ptr->fCondFmtCalc = m_oEnableFormatConditionsCalculation->GetValue(); + ptr->fFilterMode = m_oFilterMode->GetValue(); + ptr->fPublish = m_oPublished->GetValue(); + ptr->fSyncHoriz = m_oSyncHorizontal->GetValue(); + ptr->fSyncVert = m_oSyncVertical->GetValue(); + ptr->fAltFormulaEntry = m_oTransitionEntry->GetValue(); + ptr->fAltExprEval = m_oTransitionEvaluation->GetValue(); + + if (m_oSyncRef.IsInit()) + ptr->syncRef = m_oSyncRef.get(); + + ptr->brtcolorTab = m_oTabColor->toColor(); + } + + return objectPtr; + } void CSheetPr::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeWsProp) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 370c1843c1..b5c7432ca2 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -512,6 +512,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From f70718822b653cc2fe0e7dd3cab001adb34bf950 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 6 Jul 2023 15:31:33 +0600 Subject: [PATCH 022/221] added picture worksheet conversion --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 10 ++++++++++ OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h | 1 + 2 files changed, 11 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 0fc89ece3f..78a2e931a0 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1969,6 +1969,16 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CPictureWorksheet::toBin() + { + auto ptr(new XLSB::BkHim); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oId.IsInit()) + ptr->rgb.value = m_oId->GetValue(); + + return objectPtr; + } void CPictureWorksheet::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index b5c7432ca2..5c5aaf34b9 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -654,6 +654,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From df147106b3cefb96848135329b3294b0c53f2579 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 6 Jul 2023 16:12:49 +0600 Subject: [PATCH 023/221] added breaks conversion --- .../Worksheets/WorksheetChildOther.cpp | 52 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 3 ++ 2 files changed, 55 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 78a2e931a0..7b9f3dac0e 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -2033,6 +2033,24 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CBreak::toBin() + { + auto ptr(new XLSB::Brk); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oId.IsInit()) + ptr->unRwCol = m_oId->GetValue(); + if(m_oMan.IsInit()) + ptr->fMan = m_oMan->GetValue(); + if(m_oMax.IsInit()) + ptr->unColRwStrt = m_oMax->GetValue(); + if(m_oMin.IsInit()) + ptr->unColRwEnd = m_oMin->GetValue(); + if(m_oPt.IsInit()) + ptr->fPivot = m_oPt->GetValue(); + + return objectPtr; + } void CBreak::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -2119,6 +2137,40 @@ namespace OOX } } } + XLS::BaseObjectPtr CRowColBreaks::toBinRow() + { + auto ptr(new XLSB::RWBRK); + XLS::BaseObjectPtr objectPtr(ptr); + auto rowPtr(new XLSB::BeginRwBrk); + ptr->m_BrtBeginRwBrk = XLS::BaseObjectPtr{rowPtr}; + if(m_oCount.IsInit()) + rowPtr->ibrkMac = m_oCount->GetValue(); + if(m_oManualBreakCount.IsInit()) + rowPtr->ibrkManMac = m_oManualBreakCount->GetValue(); + for(auto i:m_arrItems) + { + ptr->m_arBrtBrk.push_back(i->toBin()); + } + return objectPtr; + } + + XLS::BaseObjectPtr CRowColBreaks::toBinColumn() + { + auto ptr(new XLSB::COLBRK); + XLS::BaseObjectPtr objectPtr(ptr); + auto colPtr(new XLSB::BeginColBrk); + ptr->m_BrtBeginColBrk = XLS::BaseObjectPtr{colPtr}; + if(m_oCount.IsInit()) + colPtr->ibrkMac = m_oCount->GetValue(); + if(m_oManualBreakCount.IsInit()) + colPtr->ibrkManMac = m_oManualBreakCount->GetValue(); + for(auto i:m_arrItems) + { + ptr->m_arBrtBrk.push_back(i->toBin()); + } + return objectPtr; + } + void CRowColBreaks::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeRWBRK) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 5c5aaf34b9..8219c92da0 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -680,6 +680,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -710,6 +711,8 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinColumn(); + XLS::BaseObjectPtr toBinRow(); virtual EElementType getType () const; From ae185f6cd3b3da4e2c2cd619f87bb81bbf51a40c Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 6 Jul 2023 21:10:34 +0600 Subject: [PATCH 024/221] added data consolifate conversion --- .../Worksheets/WorksheetChildOther.cpp | 51 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 3 ++ 2 files changed, 54 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 7b9f3dac0e..9e89d260c6 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -2493,6 +2493,25 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CDataRef::toBin() + { + auto ptr(new XLSB::DRef); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oId.IsInit()) + ptr->relId.value = m_oId->GetValue(); + + if (m_oName.IsInit()) + ptr->xstrName = m_oName.get(); + + if (m_oRef.IsInit()) + ptr->rfx = m_oRef.get(); + + if (m_oSheet.IsInit()) + ptr->xstrSheet = m_oSheet.get(); + + return objectPtr; + } EElementType CDataRef::getType() const { return et_x_DataRef; @@ -2584,6 +2603,16 @@ namespace OOX m_arrItems.push_back(new CDataRef(dref)); } } + XLS::BaseObjectPtr CDataRefs::toBin() + { + auto ptr(new XLSB::DREFS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + { + ptr->m_arBrtDRef.push_back(i->toBin()); + } + return objectPtr; + } EElementType CDataRefs::getType() const { return et_x_DataRefs; @@ -2635,6 +2664,28 @@ namespace OOX m_oDataRefs = oReader; } } + XLS::BaseObjectPtr CDataConsolidate::toBin() + { + auto ptr(new XLSB::DCON); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginPtr(new XLSB::BeginDCon); + ptr->m_BrtBeginDCon = XLS::BaseObjectPtr{beginPtr}; + + if(m_oFunction.IsInit()) + beginPtr->iiftab = m_oFunction->GetValue(); + if(m_oFunction.IsInit()) + beginPtr->fLinkConsol = m_oLink->GetValue(); + if(m_oFunction.IsInit()) + beginPtr->fLeftCat = m_oStartLabels->GetValue(); + if(m_oFunction.IsInit()) + beginPtr->fTopCat = m_oTopLabels->GetValue(); + + if(m_oDataRefs.IsInit()) + { + ptr->m_DREFS = m_oDataRefs->toBin(); + } + return objectPtr; + } void CDataConsolidate::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 8219c92da0..8d7750a811 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -786,6 +786,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -812,6 +813,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -836,6 +838,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XLS::BaseObjectPtr& obj); From 69e5dd8cdf5db1e71e212d4a72073cb56efff36f Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 7 Jul 2023 19:54:52 +0600 Subject: [PATCH 025/221] added ProtectedRange conversion --- .../Worksheets/WorksheetChildOther.cpp | 52 +++++++++++++++++++ .../Worksheets/WorksheetChildOther.h | 2 + 2 files changed, 54 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 9e89d260c6..3fdf81143b 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -134,6 +134,49 @@ namespace OOX } } + XLS::BaseObjectPtr CProtectedRange::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oSpinCount.IsInit() || m_oSpinCount.IsInit() || m_oSpinCount.IsInit() || m_oSaltValue.IsInit()) + { + auto ptr(new XLSB::RangeProtectionIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oSpinCount.IsInit()) + ptr->dwSpinCount = m_oSpinCount->GetValue(); + if(m_oSqref.IsInit()) + ptr->sqRfX.strValue = m_oSqref.get(); + + if (m_oAlgorithmName.IsInit()) + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + + if (m_oName.IsInit()) + ptr->rangeProtectionTitleSDRel.rgchTitle = m_oName.get(); + + byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + + byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + } + else + { + auto ptr(new XLSB::RangeProtection); + objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oSqref.IsInit()) + ptr->sqRfX.strValue = m_oSqref.get(); + + if (m_oName.IsInit()) + ptr->rangeProtectionTitleSDRel.rgchTitle = m_oName.get(); + + } + return objectPtr; + } void CProtectedRange::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -239,6 +282,15 @@ namespace OOX } } } + std::vector CProtectedRanges::toBin() + { + std::vector result; + for(auto i:m_arrItems) + { + result.push_back(i->toBin()); + } + return result; + } void CProtectedRanges::fromBin(std::vector& obj) { for (auto &protRange : obj) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 8d7750a811..c744b9073a 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -79,6 +79,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -108,6 +109,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType() const; }; From 35cec4cbd833ef62ced1bcb97e0008ca2506a3e1 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 7 Jul 2023 21:01:31 +0600 Subject: [PATCH 026/221] added data validation conversion --- .../XlsxFormat/Worksheets/DataValidation.cpp | 98 +++++++++++++++++++ OOXML/XlsxFormat/Worksheets/DataValidation.h | 6 +- 2 files changed, 102 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp index 751fcd4ede..b152a62f0b 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp @@ -191,6 +191,84 @@ namespace OOX return result1 || result2; } + XLS::BaseObjectPtr CDataValidation::toBin() + { + auto ptr(new XLSB::DVal); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeNone) + ptr->valType = XLS::typeDvNone; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeWhole) + ptr->valType = XLS::typeDvWhole; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDecimal) + ptr->valType = XLS::typeDvDecimal; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeList) + ptr->valType = XLS::typeDvList; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDate) + ptr->valType = XLS::typeDvDate; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTime) + ptr->valType = XLS::typeDvTime; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTextLength) + ptr->valType = XLS::typeDvTextLength; + else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeCustom) + ptr->valType = XLS::typeDvCustom; + + ptr->fAllowBlank = m_oAllowBlank->GetValue(); + if(m_oError.IsInit()) + ptr->Error = m_oError.get(); + + if (m_oErrorTitle.IsInit()) + ptr->ErrorTitle = m_oErrorTitle.get(); + + if (m_oPrompt.IsInit()) + ptr->Prompt = m_oPrompt.get(); + + if (m_oPromptTitle.IsInit()) + ptr->PromptTitle = m_oPromptTitle.get(); + + ptr->errStyle = m_oErrorStyle->GetValue(); + + if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOn) + { + ptr->mdImeMode = 0x01; + } + else if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOff) + { + ptr->mdImeMode = 0x02; + } + else + { + ptr->mdImeMode = m_oImeMode->GetValue(); + } + + if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorBetween) + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotBetween) + ptr->typOperator = XLS::_typOperatorDv::operatorDvNotBetween; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvEquals; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvNotEquals; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThan) + ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThan; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThan) + ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThan; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThanOrEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThanOrEqual; + else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThanOrEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThanOrEqual; + + ptr->fSuppressCombo = m_oShowDropDown->GetValue(); + ptr->fShowErrorMsg = m_oShowErrorMessage->GetValue(); + ptr->fShowInputMsg = m_oShowInputMessage->GetValue(); + + ptr->sqrfx.strValue = m_oSqRef.get(); + + ptr->formula1 = m_oFormula1->m_sText; + ptr->formula2 = m_oFormula2->m_sText; + + return objectPtr; + } void CDataValidation::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -490,6 +568,26 @@ namespace OOX } } } + XLS::BaseObjectPtr CDataValidations::toBin() + { + XLS::BaseObjectPtr objectPtr; + auto ptr(new XLSB::DVALS); + objectPtr = XLS::BaseObjectPtr{ptr}; + + auto beginPtr(new XLSB::BeginDVals); + ptr->m_BrtBeginDVals = XLS::BaseObjectPtr{beginPtr}; + beginPtr->dVals.idvMac = m_oCount.get() ; + beginPtr->dVals.fWnClosed = m_oDisablePrompts->GetValue(); + beginPtr->dVals.xLeft = m_oXWindow->GetValue(); + beginPtr->dVals.yTop = m_oYWindow->GetValue(); + + for(auto i:m_arrItems) + { + ptr->m_arBrtDVal.push_back(i->toBin()); + } + + return objectPtr; + } void CDataValidations::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.h b/OOXML/XlsxFormat/Worksheets/DataValidation.h index bc46c90b06..fd37594042 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.h +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.h @@ -63,10 +63,10 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlNode& node); virtual std::wstring toXML() const; - void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const; + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const; virtual void toXML(NSStringUtils::CStringBuilder& writer) const; - virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType () const; std::wstring m_sNodeName; @@ -90,6 +90,7 @@ namespace OOX bool IsExtended(); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -133,6 +134,7 @@ namespace OOX void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From e2932091e8e9daaec2cc7d6e26538f305bda4215 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Mon, 10 Jul 2023 18:24:51 +0600 Subject: [PATCH 027/221] added conditional formatting conversion --- OOXML/XlsxFormat/Styles/rPr.cpp | 35 ++ OOXML/XlsxFormat/Styles/rPr.h | 1 + .../Worksheets/ConditionalFormatting.cpp | 392 +++++++++++++++++- .../Worksheets/ConditionalFormatting.h | 16 +- 4 files changed, 419 insertions(+), 25 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 9499de767e..568d7ec681 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -462,6 +462,41 @@ namespace OOX } return ptr; } + XLS::BaseObjectPtr CColor::toBin() + { + auto ptr(new XLSB::Color); + + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oAuto.IsInit()) + { + if(m_oAuto->GetValue()) + ptr->xColorType = 0; + } + else if(m_oIndexed.IsInit()) + { + ptr->index = m_oIndexed->GetValue(); + ptr->xColorType = 1; + } + else if(m_oThemeColor.IsInit()) + { + ptr->index = m_oThemeColor->GetValue(); + ptr->xColorType = 3; + } + else + { + ptr->bAlpha = m_oRgb->Get_A(); + ptr->bBlue = m_oRgb->Get_B(); + ptr->bGreen = m_oRgb->Get_G(); + ptr->bRed = m_oRgb->Get_R(); + } + + if ( m_oTint.IsInit()) + { + ptr->nTintAndShade = m_oTint->GetValue() * 32767.0; + } + return objectPtr; + } EElementType CColor::getType () const { return et_x_Color; diff --git a/OOXML/XlsxFormat/Styles/rPr.h b/OOXML/XlsxFormat/Styles/rPr.h index a22e3b60c8..3596e3de2a 100644 --- a/OOXML/XlsxFormat/Styles/rPr.h +++ b/OOXML/XlsxFormat/Styles/rPr.h @@ -145,6 +145,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); void fromBin(XLS::BaseObject* obj); + XLS::BaseObjectPtr toBin(); XLSB::Color toColor(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 30b5a0fc6a..5de0b0492e 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -108,7 +108,7 @@ EElementType CFormulaCF::getType () const void CFormulaCF::toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const { std::wstring node_name = bExtendedWrite ? L"xm:f" : L"formula"; - + writer.WriteString(L"<" + node_name + L">"); writer.WriteEncodeXmlString(m_sText); writer.WriteString(L""); @@ -125,7 +125,7 @@ void CFormulaCF::fromXML(XmlUtils::CXmlLiteReader& oReader) const CFormulaCF CFormulaCF::Merge(const CFormulaCF& oPrev, const CFormulaCF& oCurrent) { CFormulaCF oFormula; - + if (oCurrent.m_sText.empty() == false) { oFormula.m_sText = oCurrent.m_sText; @@ -180,11 +180,11 @@ void CConditionalFormatValueObject::ReadAttributes(XmlUtils::CXmlLiteReader& oRe void CConditionalFormatValueObject::toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const { if (false == m_oType.IsInit()) return; - + if (bExtendedWrite == false) { if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMin) m_oType->SetValue(SimpleTypes::Spreadsheet::Minimum); - if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMax) m_oType->SetValue(SimpleTypes::Spreadsheet::Maximum); + if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMax) m_oType->SetValue(SimpleTypes::Spreadsheet::Maximum); } std::wstring node_name = bExtendedWrite ? L"x14:cfvo" : L"cfvo"; @@ -220,7 +220,7 @@ void CConditionalFormatValueObject::toXML2(NSStringUtils::CStringBuilder& writer CFormulaCF formla; formla.m_sText = m_oVal.get(); formla.toXML2(writer, true); } - + } writer.WriteString(L""); @@ -228,7 +228,7 @@ void CConditionalFormatValueObject::toXML2(NSStringUtils::CStringBuilder& writer void CConditionalFormatValueObject::fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); - + if (oReader.IsEmptyNode()) return; @@ -240,6 +240,37 @@ void CConditionalFormatValueObject::fromXML(XmlUtils::CXmlLiteReader& oReader) m_oFormula = oReader; } } +XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() +{ + auto ptr(new XLSB::uCFVO); + XLS::BaseObjectPtr objectPtr(ptr); + + auto ptr1(new XLSB::CFVO); + ptr->m_BrtCFVO = XLS::BaseObjectPtr{ptr1}; + ptr1->fGTE = m_oGte->GetValue(); + + if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Number) + ptr1->iType = XLSB::CFVOtype::CFVONUM; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Minimum) + ptr1->iType = XLSB::CFVOtype::CFVOMIN; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Maximum) + ptr1->iType = XLSB::CFVOtype::CFVOMAX; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Percent) + ptr1->iType = XLSB::CFVOtype::CFVOPERCENT; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Percentile) + ptr1->iType = XLSB::CFVOtype::CFVOPERCENTILE; + else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Formula) + ptr1->iType = XLSB::CFVOtype::CFVOFMLA; + + ptr1->numParam.data.value = std::stod(m_oVal.get()); + + if(m_oFormula.IsInit()) + { + ptr1->formula = m_oFormula->m_sText; + } + + return objectPtr; +} void CConditionalFormatValueObject::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -617,6 +648,14 @@ void CColorScale::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr CColorScale::toBin() +{ + auto ptr(new XLSB::COLORSCALE); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrValues) + ptr->m_arCFVO.push_back(i->toBin()); + return objectPtr; +} EElementType CColorScale::getType () const { return et_x_ColorScale; @@ -635,7 +674,7 @@ nullable CColorScale::Merge(const nullable &oPrev, const nullablem_BrtBeginDatabar = XLS::BaseObjectPtr{ptr1}; + ptr1->bLenMax = m_oMaxLength->GetValue(); + ptr1->bLenMin = m_oMinLength->GetValue(); + ptr1->fShowValue = m_oShowValue->GetValue(); + + for(auto i:m_arrValues) + ptr->m_arCFVO.push_back(i->toBin()); + if(m_oColor.IsInit()) + + ptr->m_BrtColor = m_oColor->toBin(); + + return objectPtr; +} void CDataBar::ReadAttributes(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typeBeginDatabar) @@ -896,13 +954,13 @@ const CDataBar CDataBar::Merge(const CDataBar& oPrev, const CDataBar& oCurrent) oDataBar.m_oDirection = Merge( oPrev.m_oDirection, oCurrent.m_oDirection ); oDataBar.m_oNegativeBarColorSameAsPositive = Merge( oPrev.m_oNegativeBarColorSameAsPositive, oCurrent.m_oNegativeBarColorSameAsPositive ); oDataBar.m_oNegativeBarBorderColorSameAsPositive = Merge( oPrev.m_oNegativeBarBorderColorSameAsPositive, oCurrent.m_oNegativeBarBorderColorSameAsPositive ); - + oDataBar.m_oColor = Merge( oPrev.m_oColor, oCurrent.m_oColor ); oDataBar.m_oAxisColor = Merge( oPrev.m_oAxisColor, oCurrent.m_oAxisColor ); oDataBar.m_oBorderColor = Merge( oPrev.m_oBorderColor, oCurrent.m_oBorderColor ); oDataBar.m_oNegativeFillColor = Merge( oPrev.m_oNegativeFillColor, oCurrent.m_oNegativeFillColor ); oDataBar.m_oNegativeBorderColor = Merge( oPrev.m_oNegativeBorderColor, oCurrent.m_oNegativeBorderColor ); - + for (size_t i = 0; i < oPrev.m_arrValues.size(); i++) { if (i < oCurrent.m_arrValues.size()) @@ -1059,6 +1117,95 @@ void CIconSet::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr CIconSet::toBin() +{ + auto ptr(new XLSB::ICONSET); + XLS::BaseObjectPtr objectPtr(ptr); + + auto beginPtr(new XLSB::BeginIconSet); + ptr->m_BrtBeginIconSet = XLS::BaseObjectPtr{beginPtr}; + if(m_oShowValue.IsInit()) + beginPtr->fIcon = !m_oShowValue->GetValue(); + if(m_oReverse.IsInit()) + beginPtr->fReverse = m_oReverse->GetValue(); + + if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::NoIcons) + { + beginPtr->iSet.set = KPISets::KPINIL; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows3) + { + beginPtr->iSet.set = KPISets::KPI3ARROWS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows3Gray) + { + beginPtr->iSet.set = KPISets::KPI3ARROWSGRAY; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Flags3) + { + beginPtr->iSet.set = KPISets::KPI3FLAGS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights1) + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS1; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic3Lights2) + { + beginPtr->iSet.set = KPISets::KPI3TRAFFICLIGHTS2; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Signs3) + { + beginPtr->iSet.set = KPISets::KPI3SIGNS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Symbols3) + { + beginPtr->iSet.set = KPISets::KPI3SYMBOLS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Symbols3_2) + { + beginPtr->iSet.set = KPISets::KPI3SYMBOLS2; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows4) + { + beginPtr->iSet.set = KPISets::KPI4ARROWS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows4Gray) + { + beginPtr->iSet.set = KPISets::KPI4ARROWSGRAY; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::RedToBlack4) + { + beginPtr->iSet.set = KPISets::KPI4REDTOBLACK; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Rating4) + { + beginPtr->iSet.set = KPISets::KPI4RATING; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Traffic4Lights) + { + beginPtr->iSet.set = KPISets::KPI4TRAFFICLIGHTS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows5) + { + beginPtr->iSet.set = KPISets::KPI5ARROWS; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Arrows5Gray) + { + beginPtr->iSet.set = KPISets::KPI5ARROWSGRAY; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Rating5) + { + beginPtr->iSet.set = KPISets::KPI5RATING; + } + else if (m_oIconSet == SimpleTypes::Spreadsheet::EIconSetType::Quarters5) + { + beginPtr->iSet.set = KPISets::KPI5QUARTERS; + } + + for(auto i:m_arrValues) + ptr->m_arCFVO.push_back(i->toBin()); + return objectPtr; +} void CIconSet::ReadAttributes(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typeBeginIconSet) @@ -1307,7 +1454,7 @@ const CIconSet CIconSet::Merge(const CIconSet& oPrev, const CIconSet& oCurrent) oIconSet.m_oReverse = Merge( oPrev.m_oReverse, oCurrent.m_oReverse ); oIconSet.m_oShowValue = Merge( oPrev.m_oShowValue, oCurrent.m_oShowValue ); oIconSet.m_oCustom = Merge( oPrev.m_oCustom, oCurrent.m_oCustom ); - + for (size_t i = 0; i < oPrev.m_arrValues.size(); i++) { if (i < oCurrent.m_arrValues.size()) @@ -1381,7 +1528,7 @@ bool CConditionalFormattingRule::isExtended() if (m_oDataBar.IsInit()) return m_oDataBar->isExtended(); if (m_oIconSet.IsInit()) return m_oIconSet->isExtended(); if (m_oColorScale.IsInit()) return m_oColorScale->isExtended(); - + for (size_t i = 0; i < m_arrFormula.size(); i++) { if ((m_arrFormula[i].IsInit()) && m_arrFormula[i]->isExtended()) @@ -1394,7 +1541,7 @@ void CConditionalFormattingRule::toXML2(NSStringUtils::CStringBuilder& writer, b if (false == isValid()) return; std::wstring node_name = bExtendedWrite ? L"x14:cfRule" : L"cfRule"; - + writer.WriteString(L"<" + node_name); WritingStringNullableAttrString(L"type", m_oType, m_oType->ToString()); WritingStringNullableAttrInt(L"priority", m_oPriority, m_oPriority->GetValue()); @@ -1432,7 +1579,7 @@ void CConditionalFormattingRule::toXML2(NSStringUtils::CStringBuilder& writer, b m_oColorScale->toXML2(writer, bExtendedWrite); if (m_oDataBar.IsInit()) m_oDataBar->toXML2(writer, bExtendedWrite); - + for (size_t i = 0; i < m_arrFormula.size(); i++) { if (m_arrFormula[i].IsInit()) @@ -1458,7 +1605,7 @@ void CConditionalFormattingRule::fromXML(XmlUtils::CXmlLiteReader& oReader) while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - + if (L"colorScale" == sName ) m_oColorScale = oReader; else if ( L"dataBar" == sName) @@ -1557,6 +1704,182 @@ void CConditionalFormattingRule::fromBin(XLS::BaseObjectPtr& obj) } } } + +XLS::BaseObjectPtr CConditionalFormattingRule::toBin() +{ + XLS::CellRef cellRef; + auto ptr(new XLSB::CFRULE(cellRef)); + XLS::BaseObjectPtr objPtr(ptr); + + auto beginRule(new XLSB::BeginCFRule(cellRef)); + ptr->m_BrtBeginCFRule = WriteAttributes(); + + if(m_oColorScale.IsInit()) + { + ptr->m_source = m_oColorScale->toBin(); + } + else if(m_oDataBar.IsInit()) + { + ptr->m_source = m_oDataBar->toBin(); + } + else if(m_oIconSet.IsInit()) + { + ptr->m_source = m_oIconSet->toBin(); + } + return objPtr; +} + +XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() +{ + XLS::CellRef cellRef; + auto ptr(new XLSB::BeginCFRule(cellRef)); + BaseObjectPtr objectPtr(ptr); + + if(m_oDxfId.IsInit()) + { + ptr->dxfId = m_oDxfId->GetValue(); + } + ptr->iPri = m_oPriority->GetValue(); + ptr->fStopTrue = m_oStopIfTrue->GetValue(); + ptr->fAbove = m_oAboveAverage->GetValue(); + ptr->fBottom = m_oBottom->GetValue(); + ptr->fPercent = m_oPercent->GetValue(); + ptr->strParam = m_oText.get(); + + if(!m_arrFormula.empty()) + { + ptr->rgce1 = m_arrFormula.front()->m_sText; + m_arrFormula.erase(m_arrFormula.begin()); + } + if(!m_arrFormula.empty()) + { + ptr->rgce2 = m_arrFormula.front()->m_sText; + m_arrFormula.erase(m_arrFormula.begin()); + } + if(!m_arrFormula.empty()) + { + ptr->rgce3 = m_arrFormula.front()->m_sText; + m_arrFormula.erase(m_arrFormula.begin()); + } + + if (m_oType == SimpleTypes::Spreadsheet::ECfType::cellIs) +{ + if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_between) + ptr->iParam = XLSB::CFOper::CF_OPER_BN; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_notBetween) + ptr->iParam = XLSB::CFOper::CF_OPER_NB; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_equal) + ptr->iParam = XLSB::CFOper::CF_OPER_EQ; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_notEqual) + ptr->iParam = XLSB::CFOper::CF_OPER_NE; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_greaterThan) + ptr->iParam = XLSB::CFOper::CF_OPER_GT; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_lessThan) + ptr->iParam = XLSB::CFOper::CF_OPER_LT; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_greaterThanOrEqual) + ptr->iParam = XLSB::CFOper::CF_OPER_GE; + else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_lessThanOrEqual) + ptr->iParam = XLSB::CFOper::CF_OPER_LE; +} + +if (m_oType == SimpleTypes::Spreadsheet::ECfType::expression) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_FMLA; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::uniqueValues) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_UNIQUEVALUES; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::containsText) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_CONTAINS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsText) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_NOTCONTAINS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::beginsWith) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_BEGINSWITH; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::endsWith) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSTEXT; + ptr->iParam = XLSB::CFTextOper::CF_TEXTOPER_ENDSWITH; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::containsBlanks) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSBLANKS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsBlanks) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSNOBLANKS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::containsErrors) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSERRORS; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsErrors) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_CONTAINSNOERRORS; +} + +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::timePeriod) +{ + if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::today) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTODAY; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::tomorrow) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTOMORROW; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::yesterday) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODYESTERDAY; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::last7Days) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLAST7DAYS; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastMonth) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTMONTH; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextMonth) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTMONTH; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisWeek) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISWEEK; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextWeek) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTWEEK; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastWeek) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTWEEK; + else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisMonth) + ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISMONTH; +} + +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::aboveAverage) +{ + ptr->iTemplate= XLSB::CFTemp::CF_TEMPLATE_ABOVEAVERAGE; + ptr->iParam = m_oStdDev->GetValue(); +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::duplicateValues) +{ + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_DUPLICATEVALUES; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::colorScale) +{ + ptr->iType = XLSB::CFType::CF_TYPE_GRADIENT; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::dataBar) +{ + ptr->iType = XLSB::CFType::CF_TYPE_DATABAR; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::iconSet) +{ + ptr->iType = XLSB::CFType::CF_TYPE_MULTISTATE; +} +else if (m_oType == SimpleTypes::Spreadsheet::ECfType::top10) +{ + ptr->iType = XLSB::CFType::CF_TYPE_FILTER; + ptr->iParam = m_oRank->GetValue(); +} + + return objectPtr; +} template nullable CConditionalFormattingRule::Merge(const nullable &oPrev, const nullable &oCurrent) { @@ -1570,7 +1893,7 @@ nullable CConditionalFormattingRule::Merge(const nullable &oPrev, co const CConditionalFormattingRule CConditionalFormattingRule::Merge(const CConditionalFormattingRule& oPrev, const CConditionalFormattingRule& oCurrent) { CConditionalFormattingRule oRule; - + oRule.m_oAboveAverage = Merge( oPrev.m_oAboveAverage, oCurrent.m_oAboveAverage ); oRule.m_oBottom = Merge( oPrev.m_oBottom, oCurrent.m_oBottom ); oRule.m_oDxfId = Merge( oPrev.m_oDxfId, oCurrent.m_oDxfId ); @@ -1602,7 +1925,7 @@ const CConditionalFormattingRule CConditionalFormattingRule::Merge(const CCondit oRule.m_oColorScale = Merge( oPrev.m_oColorScale, oCurrent.m_oColorScale ); if (oPrev.m_oDataBar.IsInit() && oCurrent.m_oDataBar.IsInit()) - oRule.m_oDataBar = CDataBar::Merge ( oPrev.m_oDataBar.get(), oCurrent.m_oDataBar.get()); + oRule.m_oDataBar = CDataBar::Merge ( oPrev.m_oDataBar.get(), oCurrent.m_oDataBar.get()); else oRule.m_oDataBar = Merge( oPrev.m_oDataBar, oCurrent.m_oDataBar ); @@ -2127,7 +2450,7 @@ bool CConditionalFormatting::IsExtended() { m_bIsExtended = false; m_bIsValid = false; - + if (m_oSqRef.IsInit() == false) return m_bIsExtended; m_bIsValid = true; @@ -2135,7 +2458,7 @@ bool CConditionalFormatting::IsExtended() for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( !m_arrItems[i]) continue; - + if (m_arrItems[i]->isValid() == false) m_bIsValid = false; if (m_arrItems[i]->isExtended() == true) @@ -2144,7 +2467,7 @@ bool CConditionalFormatting::IsExtended() return m_bIsExtended; } void CConditionalFormatting::toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const -{ +{ std::wstring node_name = bExtendedWrite ? L"x14:conditionalFormatting" : L"conditionalFormatting"; writer.WriteString(L"<" + node_name); @@ -2161,7 +2484,7 @@ void CConditionalFormatting::toXML2(NSStringUtils::CStringBuilder& writer, bool writer.WriteString(L" pivot=\"1\""); } writer.WriteString(L">"); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -2224,6 +2547,33 @@ void CConditionalFormatting::fromBin(XLS::BaseObjectPtr& obj) m_arrItems.push_back(new CConditionalFormattingRule(pCFRULE14)); } } + +XLS::BaseObjectPtr CConditionalFormatting::toBin() +{ + XLS::BaseObjectPtr objectPtr; + if(m_arrItems.empty()) + { + return objectPtr; + } + if(m_arrItems.back()->m_oExtId.IsInit()) + { + auto ptr(new XLSB::CONDITIONALFORMATTING); + objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oSqRef.IsInit()) + { + auto conditionPtr(new XLSB::BeginConditionalFormatting); + ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; + + conditionPtr->sqrfx.strValue = m_oSqRef.get(); + conditionPtr->fPivot = m_oPivot->GetValue(); + } + for(auto i: m_arrItems) + { + ptr->m_arCFRULE.push_back(i->toBin()); + } + } + return objectPtr; +} bool CConditionalFormatting::IsUsage() { for ( size_t i = 0; i < m_arrItems.size(); ++i) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h index 14d011972b..acda290e53 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h @@ -106,6 +106,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; bool isExtended (); @@ -166,6 +167,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -199,6 +201,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -214,7 +217,7 @@ namespace OOX nullable m_oMaxLength; nullable m_oMinLength; nullable m_oShowValue; - + nullable m_oColor; std::vector> m_arrValues; @@ -229,7 +232,7 @@ namespace OOX nullable m_oAxisColor; nullable m_oBorderColor; - + nullable m_oNegativeFillColor; nullable m_oNegativeBorderColor; }; @@ -251,6 +254,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -295,6 +299,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; bool isValid () const; @@ -306,6 +311,8 @@ namespace OOX private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr WriteAttributes(); + public: nullable m_oDxf; @@ -323,7 +330,7 @@ namespace OOX nullable m_oText; nullable m_oTimePeriod; nullable m_oType; - + nullable m_oExtLst; nullable_string m_oExtId; @@ -353,10 +360,11 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; bool IsUsage(); - + private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); From bc7bbb94aaaef878799238509c91c51fb9d22e64 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 12 Jul 2023 18:08:02 +0600 Subject: [PATCH 028/221] added extension list conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 42 ++++++++++++-- OOXML/DocxFormat/Drawing/DrawingExt.h | 7 ++- OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 21 ++++++- OOXML/XlsxFormat/Slicer/SlicerCacheExt.h | 2 + OOXML/XlsxFormat/Worksheets/Sparkline.cpp | 67 ++++++++++++++++++++++ OOXML/XlsxFormat/Worksheets/Sparkline.h | 2 + 6 files changed, 132 insertions(+), 9 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 90aee2b188..163f8dc343 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -129,7 +129,7 @@ namespace OOX sResult += L" relId=\"" + m_oRelId->ToString() + L"\""; } sResult += L" minVer=\"http://schemas.openxmlformats.org/drawingml/2006/diagram\"/>"; - + return sResult; } EElementType CDataModelExt::getType() const @@ -214,9 +214,9 @@ namespace OOX *m_sUri == L"{46F421CA-312F-682f-3DD2-61675219B42D}" || *m_sUri == L"{DE250136-89BD-433C-8126-D09CA5730AF9}" || *m_sUri == L"{19B8F6BF-5375-455C-9EA6-DF929625EA0E}" || - *m_sUri == L"{725AE2AE-9491-48be-B2B4-4EB974FC3084}" || + *m_sUri == L"{725AE2AE-9491-48be-B2B4-4EB974FC3084}" || *m_sUri == L"{231B7EB2-2AFC-4442-B178-5FFDF5851E7C}" || - *m_sUri == L"http://schemas.microsoft.com/office/drawing/2008/diagram")) + *m_sUri == L"http://schemas.microsoft.com/office/drawing/2008/diagram")) { int nCurDepth = oReader.GetDepth(); while (oReader.ReadNextSiblingNode(nCurDepth)) @@ -491,7 +491,7 @@ namespace OOX NSStringUtils::CStringBuilder writer; writer.StartNode(L"externalReference"); writer.StartAttributes(); - + if (m_oFileKey.IsInit()) writer.WriteAttribute(L"fileKey", *m_oFileKey); if (m_oInstanceId.IsInit()) writer.WriteAttribute(L"instanceId", *m_oInstanceId); @@ -585,7 +585,7 @@ namespace OOX } pWriter->WriteNodeEnd(ns + L"extLst"); - } + } std::wstring COfficeArtExtensionList::toXML() const { return toXMLWithNS(L"a:"); @@ -606,6 +606,38 @@ namespace OOX return sResult; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorksheet() + { + auto ptr(new XLSB::FRTWORKSHEET); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_arrExt.empty()) + return objectPtr; + for(auto i:m_arrExt) + { + if(i->m_sUri == L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}") + { + auto formatPtr(new XLSB::CONDITIONALFORMATTINGS); + ptr->m_CONDITIONALFORMATTINGS = XLS::BaseObjectPtr{formatPtr}; + for(auto j:i->m_arrConditionalFormatting) + { + formatPtr->m_arCONDITIONALFORMATTING14.push_back(j->toBin()); + } + } + else if(i->m_sUri == L"{CCE6A557-97BC-4B89-ADB6-D9C93CAAB3DF}") + { + ptr->m_DVALS14 = i->m_oDataValidations->toBin(); + } + else if(i->m_sUri == L"{05C60535-1F16-4fd2-B633-F4F36F0B64E0}") + { + ptr->m_SPARKLINEGROUPS = i->m_oSparklineGroups->toBin(); + } + else if(i->m_sUri == L"{A8765BA9-456A-4dab-B4F3-ACF838C121DE}") + { + ptr->m_SLICERSEX = i->m_oSlicerList->toBin(); + } + } + return objectPtr; + } void COfficeArtExtensionList::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeFRTWORKBOOK) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index 4d43332336..93d1cd95e4 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -105,7 +105,7 @@ namespace OOX //-------------------------------------------------------------------------------- // COfficeArtExtension 20.1.2.2.14 (Part 1) - //-------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------- class COfficeArtExtension : public WritingElement { @@ -150,7 +150,7 @@ namespace OOX std::vector m_oSlicerCachePivotTables; nullable m_oTableSlicerCache; nullable m_oSlicerCacheHideItemsWithNoData; - + std::vector m_arrConditionalFormatting; nullable m_oPresenceInfo; @@ -167,7 +167,7 @@ namespace OOX //-------------------------------------------------------------------------------- // COfficeArtExtensionList 20.1.2.2.15 (Part 1) - //-------------------------------------------------------------------------------- + //-------------------------------------------------------------------------------- class COfficeArtExtensionList : public WritingElement { @@ -185,6 +185,7 @@ namespace OOX virtual std::wstring toXML() const; std::wstring toXMLWithNS(const std::wstring& sNamespace) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinWorksheet(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index fbb809808e..9655bfca25 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -540,6 +540,15 @@ void CSlicerCache::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) { pReader->SkipRecord(); } +XLS::BaseObjectPtr CSlicerRef::toBin() +{ + auto ptr(new XLSB::SLICEREX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerEx); + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + + return objectPtr; +} void CSlicerRef::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -557,7 +566,6 @@ void CSlicerRef::ReadAttributes(XLS::BaseObjectPtr &obj) if(!ptr1->FRTheader.relID.relId.value().empty()) m_oRId = ptr1->FRTheader.relID.relId.value(); } - } } else if(obj->get_type() == XLS::typeTABLESLICEREX) @@ -778,6 +786,17 @@ void CSlicerCaches::toXML(NSStringUtils::CStringBuilder& writer, const std::wstr } writer.EndNode(sPrefix + sName); } +XLS::BaseObjectPtr CSlicerRefs::toBin() +{ + auto ptr(new XLSB::SLICERSEX); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_oSlicer) + { + ptr->m_arSLICEREX.push_back(i.toBin()); + } + return objectPtr; +} void CSlicerRefs::fromBin(XLS::BaseObjectPtr &obj) { if(obj->get_type() == XLS::typeSLICERSEX) diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h index a94ddcd7a1..fa79a0c1c9 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h @@ -206,6 +206,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -280,6 +281,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType() const { diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp index 9263752056..64ec4da5b8 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp @@ -393,6 +393,65 @@ namespace OOX m_oSparklines = obj; } } + XLS::BaseObjectPtr CSparklineGroup::toBin() + { + auto ptr1(new XLSB::SPARKLINEGROUP); + XLS::BaseObjectPtr objectPtr(ptr1); + + auto ptr(new XLSB::BeginSparklineGroup); + ptr1->m_BrtBeginSparklineGroup = XLS::BaseObjectPtr{ptr}; + + ptr->dManualMax.data.value = m_oManualMax->GetValue(); + ptr->dManualMin.data.value = m_oManualMin->GetValue(); + ptr->dLineWeight.data.value = m_oLineWeight->GetValue(); + ptr->isltype = static_castisltype)>(m_oType->GetValue()); + ptr->fDateAxis = m_oDateAxis->GetValue(); + ptr->fShowEmptyCellAsZero = (m_oDisplayEmptyCellsAs == OOX::Spreadsheet::ST_DispBlanksAs::st_dispblanksasZERO) ? 0x01 : 0x00; + ptr->fMarkers = m_oMarkers->GetValue(); + ptr->fHigh = m_oHigh->GetValue(); + ptr->fLow = m_oLow->GetValue(); + ptr->fFirst = m_oFirst->GetValue(); + ptr->fLast = m_oLast->GetValue(); + ptr->fNegative = m_oNegative->GetValue(); + ptr->fAxis = m_oDisplayXAxis->GetValue(); + ptr->fDisplayHidden = m_oDisplayHidden->GetValue(); + ptr->fRTL = m_oRightToLeft->GetValue(); + + if(m_oMaxAxisType == SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Individual) + ptr->fIndividualAutoMax = true; + + + if(m_oColorSeries.IsInit()) + ptr->brtcolorSeries = m_oColorSeries->toColor(); + + if(m_oColorNegative.IsInit()) + ptr->brtcolorNegative = m_oColorNegative->toColor(); + + if(m_oColorAxis.IsInit()) + ptr->brtcolorAxis = m_oColorAxis->toColor(); + + if(m_oColorMarkers.IsInit()) + ptr->brtcolorMarkers = m_oColorMarkers->toColor(); + + if(m_oColorFirst.IsInit()) + ptr->brtcolorFirst = m_oColorFirst->toColor(); + + if(m_oColorLast.IsInit()) + ptr->brtcolorLast = m_oColorLast->toColor(); + + if(m_oColorHigh.IsInit()) + ptr->brtcolorHigh = m_oColorHigh->toColor(); + + if(m_oColorLow.IsInit()) + ptr->brtcolorLow = m_oColorLow->toColor(); + + if(ptr->FRTheader.rgFormulas.array.size() > 0) + { + ptr->FRTheader.rgFormulas.array[0].formula = m_oRef.get(); + } + + return objectPtr; + } EElementType CSparklineGroup::getType () const { return et_x_SparklineGroup; @@ -556,6 +615,14 @@ namespace OOX m_arrItems.push_back(new CSparklineGroup(sparklineGroup)); } } + XLS::BaseObjectPtr CSparklineGroups::toBin() + { + auto ptr(new XLSB::SPARKLINEGROUPS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSPARKLINEGROUP.push_back(i->toBin()); + return objectPtr; + } EElementType CSparklineGroups::getType () const { return et_x_SparklineGroups; diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.h b/OOXML/XlsxFormat/Worksheets/Sparkline.h index c2968e768d..938fc399d0 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.h +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.h @@ -109,6 +109,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -163,6 +164,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 1864a6d0c0243a6f1b69a8d8fc3d36a90a2a4672 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 12 Jul 2023 18:08:56 +0600 Subject: [PATCH 029/221] added worksheet conversion --- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 112 +++++++++++++++++++--- OOXML/XlsxFormat/Worksheets/Worksheet.h | 7 +- 2 files changed, 105 insertions(+), 14 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 4c62e56793..fd68ac3110 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -66,11 +66,11 @@ namespace OOX if (xlsx) { m_bPrepareForBinaryWriter = true; // подготовка для бинарника при чтении - + xlsx->m_arWorksheets.push_back( this ); //xlsx->m_mapWorksheets.insert( std::make_pair(rId, this) ); } - else + else m_bPrepareForBinaryWriter = false; } CWorksheet::CWorksheet(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId, bool isChartSheet) : OOX::File(pMain), OOX::IFileContainer(pMain), WritingElement(pMain) @@ -86,11 +86,11 @@ namespace OOX if (xlsx) { m_bPrepareForBinaryWriter = true; - + xlsx->m_arWorksheets.push_back( this ); xlsx->m_mapWorksheets.insert( std::make_pair(rId, this) ); } - else + else m_bPrepareForBinaryWriter = false; read( oRootPath, oPath ); @@ -229,6 +229,96 @@ namespace OOX } } + XLS::BaseObjectPtr CWorksheet::writeBin() + { + if(m_bIsChartSheet) + { + XLSB::ChartSheetStreamPtr chartSheetStream(new XLSB::ChartSheetStream); + return chartSheetStream; + } + else + { + XLSB::WorkSheetStreamPtr workSheetStream(new XLSB::WorkSheetStream); + + if (m_oCols.IsInit()) + workSheetStream->m_arCOLINFOS = m_oCols->toBin(); + if (m_oDimension.IsInit()) + workSheetStream->m_BrtWsDim = m_oDimension->toBin(); + if (m_oDrawing.IsInit()) + workSheetStream->m_BrtDrawing = m_oDrawing->toBin(); + if (m_oLegacyDrawing.IsInit()) + workSheetStream->m_BrtLegacyDrawing = m_oLegacyDrawing->toBin(); + if (m_oLegacyDrawingHF.IsInit()) + workSheetStream->m_BrtLegacyDrawingHF = m_oLegacyDrawingHF->toBin(); + if (m_oHyperlinks.IsInit()) + workSheetStream->m_HLINKS = m_oHyperlinks->toBin(); + if (m_oMergeCells.IsInit()) + workSheetStream->m_MERGECELLS = m_oMergeCells->toBin(); + + if (m_oSheetFormatPr.IsInit()) + workSheetStream->m_BrtWsFmtInfo = m_oSheetFormatPr->toBin(); + if (m_oSheetViews.IsInit()) + workSheetStream->m_WSVIEWS2 = m_oSheetViews->toBin(); + if (m_oPageMargins.IsInit()) + workSheetStream->m_BrtMargins = m_oPageMargins->toBin(); + if (m_oPageSetup.IsInit()) + workSheetStream->m_BrtPageSetup = m_oPageSetup->toBin(); + if (m_oPrintOptions.IsInit()) + workSheetStream->m_BrtPrintOptions = m_oPrintOptions->toBin(); + if (m_oHeaderFooter.IsInit()) + workSheetStream->m_HEADERFOOTER = m_oHeaderFooter->toBin(); + if(m_oSheetProtection.IsInit()) + { + if (m_oSheetProtection->m_oAlgorithmName.IsInit()) + workSheetStream->m_BrtSheetProtectionIso = m_oSheetProtection->toBin(); + else if(m_oSheetProtection->m_oPassword.IsInit()) + workSheetStream->m_BrtSheetProtection = m_oSheetProtection->toBin(); + } + if (m_oTableParts.IsInit()) + workSheetStream->m_LISTPARTS = m_oTableParts->toBin(); + if (m_oSortState.IsInit()) + workSheetStream->m_SORTSTATE = m_oSortState->toBin(); + if (!m_arrConditionalFormatting.empty()) + for(auto &item : m_arrConditionalFormatting) + workSheetStream->m_arCONDITIONALFORMATTING.push_back(item->toBin()); + + if (m_oAutofilter.IsInit()) + workSheetStream->m_AUTOFILTER = m_oAutofilter->toBin(); + if (m_oDataValidations.IsInit()) + workSheetStream->m_DVALS = m_oDataValidations->toBin(); + if (m_oOleObjects.IsInit()) + workSheetStream->m_OLEOBJECTS = m_oOleObjects->toBin(); + if (m_oControls.IsInit()) + workSheetStream->m_ACTIVEXCONTROLS = m_oControls->toBin(); + if (m_oSheetPr.IsInit()) + workSheetStream->m_BrtWsProp = m_oSheetPr->toBin(); + if (m_oPicture.IsInit()) + workSheetStream->m_BrtBkHim = m_oPicture->toBin(); + if (m_oRowBreaks.IsInit()) + workSheetStream->m_RWBRK = m_oRowBreaks->toBinRow(); + if (m_oColBreaks.IsInit()) + workSheetStream->m_COLBRK = m_oColBreaks->toBinColumn(); + if (m_oDataConsolidate.IsInit()) + workSheetStream->m_DCON = m_oDataConsolidate->toBin(); + + if (m_oProtectedRanges.IsInit()) + { + if(m_oProtectedRanges->m_arrItems.empty()) + { + auto arrayPtr = m_oProtectedRanges->m_arrItems.back(); + if(arrayPtr->m_oSpinCount.IsInit() || arrayPtr->m_oSpinCount.IsInit() || arrayPtr->m_oSpinCount.IsInit() || arrayPtr->m_oSaltValue.IsInit()) + workSheetStream->m_arBrtRangeProtectionIso = m_oProtectedRanges->toBin(); + else + workSheetStream->m_arBrtRangeProtection = m_oProtectedRanges->toBin(); + } + } + if (m_oExtLst.IsInit()) + workSheetStream->m_FRTWORKSHEET = m_oExtLst->toBinWorksheet(); + + return workSheetStream; + } + + } void CWorksheet::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -265,7 +355,7 @@ namespace OOX if ( oReader.IsEmptyNode() ) return; - + int nDocumentDepth = oReader.GetDepth(); std::wstring sName; @@ -417,7 +507,7 @@ namespace OOX void CWorksheet::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { nullable_string sName; - + WritingElement_ReadAttributes_Start( oReader ) WritingElement_ReadAttributes_Read_if ( oReader, L"ss:Name", sName ) WritingElement_ReadAttributes_End( oReader ) @@ -501,10 +591,10 @@ namespace OOX } if(false == m_oSheetViews.IsInit()) m_oSheetViews.Init(); - + if(m_oSheetViews->m_arrItems.empty()) m_oSheetViews->m_arrItems.push_back(new CSheetView()); - + CSheetView* pSheetView = m_oSheetViews->m_arrItems.front(); if(false == pSheetView->m_oWorkbookViewId.IsInit()) @@ -587,7 +677,7 @@ namespace OOX if (!m_bWriteDirectlyToFile) { NSStringUtils::CStringBuilder sXml; - + toXMLStart(sXml); toXML(sXml); toXMLEnd(sXml); @@ -695,14 +785,14 @@ mc:Ignorable=\"x14ac\">"); if (!m_oLegacyDrawing.IsInit()) return oElement; if (!m_oLegacyDrawing->m_oId.IsInit()) return oElement; - + smart_ptr oFile = this->Find(m_oLegacyDrawing->m_oId->GetValue()); smart_ptr oVmlDrawing = oFile.smart_dynamic_cast(); OOX::WritingElement* pShapeElem = NULL; if (oVmlDrawing.IsInit()) { - oElement = oVmlDrawing->FindVmlObject(spid); + oElement = oVmlDrawing->FindVmlObject(spid); } return oElement; } diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.h b/OOXML/XlsxFormat/Worksheets/Worksheet.h index 240696a9ab..e472137843 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.h +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.h @@ -76,6 +76,7 @@ namespace OOX virtual ~CWorksheet(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr writeBin(); virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); @@ -85,9 +86,9 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - + void toXMLStart(NSStringUtils::CStringBuilder& writer) const; void toXMLEnd(NSStringUtils::CStringBuilder& writer) const; virtual const OOX::FileType type() const; @@ -107,7 +108,7 @@ namespace OOX void ReadWorksheetOptions(XmlUtils::CXmlLiteReader& oReader); CPath m_oReadPath; - + bool m_bPrepareForBinaryWriter; bool m_bWriteDirectlyToFile; bool m_bIsChartSheet; From 21d883e083ffd3378713de9e635095f3f35b737c Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 12 Jul 2023 21:55:13 +0600 Subject: [PATCH 030/221] added book views conversion --- OOXML/XlsxFormat/Workbook/BookViews.cpp | 57 +++++++++++++++++++++++++ OOXML/XlsxFormat/Workbook/BookViews.h | 2 + 2 files changed, 59 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/BookViews.cpp b/OOXML/XlsxFormat/Workbook/BookViews.cpp index b960837f4d..86bcc02f7a 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.cpp +++ b/OOXML/XlsxFormat/Workbook/BookViews.cpp @@ -74,6 +74,55 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CWorkbookView::toBin() + { + auto ptr(new XLSB::BookView); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oActiveTab.IsInit()) + ptr->itabCur = m_oActiveTab->GetValue(); + + if (m_oAutoFilterDateGrouping.IsInit()) + ptr->fNoAFDateGroup = m_oAutoFilterDateGrouping->GetValue(); + if (m_oFirstSheet.IsInit()) + ptr->itabFirst = m_oFirstSheet->GetValue(); + if (m_oMinimized.IsInit()) + ptr->fIconic = m_oMinimized->GetValue(); + if (m_oShowHorizontalScroll.IsInit()) + ptr->fDspHScroll = m_oShowHorizontalScroll->GetValue(); + if (m_oShowSheetTabs.IsInit()) + ptr->fBotAdornment = m_oShowSheetTabs->GetValue(); + if (m_oShowVerticalScroll.IsInit()) + ptr->fDspVScroll = m_oShowVerticalScroll->GetValue(); + if (m_oTabRatio.IsInit()) + ptr->wTabRatio = m_oTabRatio->GetValue(); + if (m_oWindowHeight.IsInit()) + ptr->dyWn = m_oWindowHeight->GetValue(); + if (m_oWindowWidth.IsInit()) + ptr->dxWn = m_oWindowWidth->GetValue(); + if (m_oXWindow.IsInit()) + ptr->xWn = m_oXWindow->GetValue(); + if (m_oYWindow.IsInit()) + ptr->yWn = m_oYWindow->GetValue(); + + if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) + { + ptr->fHidden = true; + ptr->fVeryHidden = false; + } + else if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) + { + ptr->fHidden = false; + ptr->fVeryHidden = true; + } + else + { + ptr->fHidden = false; + ptr->fVeryHidden = false; + } + + return objectPtr; + } EElementType CWorkbookView::getType () const { return et_x_WorkbookView; @@ -183,6 +232,14 @@ namespace OOX m_arrItems.push_back(new CWorkbookView(workbookView)); } } + std::vector CBookViews::toBin() + { + std::vector ptrVector{}; + for(auto i:m_arrItems) + ptrVector.push_back(i->toBin()); + + return ptrVector; + } EElementType CBookViews::getType () const { return et_x_BookViews; diff --git a/OOXML/XlsxFormat/Workbook/BookViews.h b/OOXML/XlsxFormat/Workbook/BookViews.h index 5083d26c15..bd5c418df5 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.h +++ b/OOXML/XlsxFormat/Workbook/BookViews.h @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -104,6 +105,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: From 54a85f17fb75501bf5a19adbd477f2023af93156 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 13 Jul 2023 14:45:36 +0600 Subject: [PATCH 031/221] added calcPr conversion --- OOXML/XlsxFormat/Workbook/CalcPr.cpp | 21 +++++++++++++++++++++ OOXML/XlsxFormat/Workbook/CalcPr.h | 1 + 2 files changed, 22 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.cpp b/OOXML/XlsxFormat/Workbook/CalcPr.cpp index 1cfd708051..f63ac42d31 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.cpp +++ b/OOXML/XlsxFormat/Workbook/CalcPr.cpp @@ -82,6 +82,27 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCalcPr::toBin() + { + auto ptr(new XLSB::CalcProp); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->recalcID = m_oCalcId->GetValue(); + ptr->fAutoRecalc = m_oCalcMode->GetValue(); + ptr->fFullCalcOnLoad = m_oFullCalcOnLoad->GetValue(); + ptr->fRefA1 = !m_oRefMode->GetValue(); + ptr->fIter = m_oIterate->GetValue(); + ptr->cCalcCount = m_oIterateCount->GetValue(); + ptr->xnumDelta.data.value = m_oIterateDelta->GetValue(); + ptr->fFullPrec = m_oFullPrecision->GetValue(); + ptr->fSomeUncalced = m_oCalcCompleted->GetValue(); + ptr->fSaveRecalc = m_oCalcOnSave->GetValue(); + ptr->fMTREnabled = m_oConcurrentCalc->GetValue(); + ptr->cUserThreadCount = m_oConcurrentManualCount->GetValue(); + ptr->fNoDeps = m_oForceFullCalc->GetValue(); + + return objectPtr; + } EElementType CCalcPr::getType () const { return et_x_CalcPr; diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.h b/OOXML/XlsxFormat/Workbook/CalcPr.h index 821d0adb0b..2e193e766f 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.h +++ b/OOXML/XlsxFormat/Workbook/CalcPr.h @@ -66,6 +66,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From a0262cf5f91b0153125584107a36e60e4f234576 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 13 Jul 2023 15:34:44 +0600 Subject: [PATCH 032/221] added defined names conversion --- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 36 ++++++++++++++++++++++ OOXML/XlsxFormat/Workbook/DefinedNames.h | 2 ++ 2 files changed, 38 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index bfaaa6090d..549742369b 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -72,6 +72,33 @@ namespace OOX m_oRef = oReader.GetText3(); } + XLS::BaseObjectPtr CDefinedName::toBin() + { + auto ptr(new XLSB::Name); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->comment = m_oComment.get(); + + ptr->description = m_oDescription.get(); + ptr->fFunc = m_oFunction->GetValue(); + ptr->fGrp = m_oFunctionGroupId->GetValue(); + ptr->helpTopic = m_oHelp.get(); + ptr->fHidden = m_oHidden->GetValue(); + + if (m_oLocalSheetId.IsInit()) + ptr->itab = m_oLocalSheetId->GetValue(); + + ptr->name = m_oName.get(); + ptr->fPublished = m_oPublishToServer->GetValue(); + ptr->chKey = std::stoi(m_oShortcutKey.get()); + + ptr->fOB = m_oVbProcedure->GetValue(); + ptr->fWorkbookParam = m_oWorkbookParameter->GetValue(); + ptr->fFutureFunction = m_oXlm->GetValue(); + ptr->rgce = m_oRef.get(); + + return objectPtr; + } void CDefinedName::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -157,6 +184,15 @@ namespace OOX } } } + std::vector CDefinedNames::toBin() + { + std::vector objectVector; + + for(auto i:m_arrItems) + objectVector.push_back(i->toBin()); + + return objectVector; + } void CDefinedNames::fromBin(std::vector& obj) { //ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.h b/OOXML/XlsxFormat/Workbook/DefinedNames.h index 971c6ebc96..4e5c3edc4a 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.h +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.h @@ -60,6 +60,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -102,6 +103,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: From f6e6e2240175583f7b7ee61b09222e7a87594f99 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 13 Jul 2023 17:01:00 +0600 Subject: [PATCH 033/221] added sheets conversion --- OOXML/XlsxFormat/Workbook/Sheets.cpp | 25 +++++++++++++++++++++++++ OOXML/XlsxFormat/Workbook/Sheets.h | 2 ++ 2 files changed, 27 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/Sheets.cpp b/OOXML/XlsxFormat/Workbook/Sheets.cpp index bcb06ac25e..7b64bb9a31 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.cpp +++ b/OOXML/XlsxFormat/Workbook/Sheets.cpp @@ -69,6 +69,24 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CSheet::toBin() + { + auto ptr(new XLSB::BundleSh); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->strRelID.value = m_oRid->GetValue(); + ptr->strName = m_oName.get(); + ptr->iTabID = m_oSheetId->GetValue(); + + if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleVisible) + ptr->hsState = XLSB::BundleSh::ST_SheetState::VISIBLE; + else if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) + ptr->hsState = XLSB::BundleSh::ST_SheetState::HIDDEN; + else if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) + ptr->hsState = XLSB::BundleSh::ST_SheetState::VERYHIDDEN; + + return objectPtr; + } void CSheet::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -171,6 +189,13 @@ namespace OOX m_arrItems.push_back(new CSheet(sheet)); } } + std::vector CSheets::toBin() + { + std::vector objectVector; + for(auto i: m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CSheets::getType () const { return et_x_Sheets; diff --git a/OOXML/XlsxFormat/Workbook/Sheets.h b/OOXML/XlsxFormat/Workbook/Sheets.h index 7cee9f7af0..fc1956be6a 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.h +++ b/OOXML/XlsxFormat/Workbook/Sheets.h @@ -66,6 +66,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: From 368fdbec18e90fc4e382b2f079df6ba0043af5e3 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 13 Jul 2023 18:30:38 +0600 Subject: [PATCH 034/221] added workbookPr conversion --- OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 28 +++++++++++++++++++++++- OOXML/XlsxFormat/Workbook/WorkbookPr.h | 9 ++++---- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index 211dca4ff2..173df827db 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -89,6 +89,32 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CWorkbookPr::toBin() + { + auto ptr(new XLSB::WbProp); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->fNoSaveSup = m_oAllowRefreshQuery->GetValue(); + ptr->fAutoCompressPictures = m_oAutoCompressPictures->GetValue(); + ptr->fBackup = m_oBackupFile->GetValue(); + ptr->fCheckCompat = m_oCheckCompatibility->GetValue(); + ptr->strName.value= m_oCodeName->GetValue(); + ptr->f1904 = m_oDate1904->GetValue(); + ptr->fNoSaveSup = m_oDateCompatibility->GetValue(); + ptr->dwThemeVersion = m_oDefaultThemeVersion->GetValue(); + ptr->fFilterPrivacy = m_oFilterPrivacy->GetValue(); + ptr->fHidePivotTableFList = m_oHidePivotFieldList->GetValue(); + ptr->fBuggedUserAboutSolution = m_oPromptedSolutions->GetValue(); + ptr->fPublishedBookItems = m_oPublishItems->GetValue(); + ptr->fRefreshAll = m_oRefreshAllConnections->GetValue(); + ptr->fHideBorderUnselLists = m_oShowBorderUnselectedTables->GetValue(); + ptr->fShowInkAnnotation = m_oShowInkAnnotation->GetValue(); + ptr->mdDspObj = m_oShowObjects->GetValue() ? 1 : 2; + ptr->fShowPivotChartFilter = m_oShowPivotChartFilter->GetValue(); + ptr->grbitUpdateLinks = m_oUpdateLinks->GetValue(); + + return objectPtr; + } void CWorkbookPr::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -247,7 +273,7 @@ namespace OOX { writer.WriteString(L"ToString()); WritingStringNullableAttrString(L"hashValue", m_oHashValue, m_oHashValue.get()); WritingStringNullableAttrString(L"saltValue", m_oSaltValue, m_oSaltValue.get()); diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.h b/OOXML/XlsxFormat/Workbook/WorkbookPr.h index 86132084bd..1bdf9749b2 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.h +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.h @@ -56,7 +56,7 @@ namespace OOX public: WritingElement_AdditionMethods(CWorkbookPr) WritingElement_XlsbConstructors(CWorkbookPr) - + CWorkbookPr(); virtual ~CWorkbookPr(); @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -98,7 +99,7 @@ namespace OOX public: WritingElement_AdditionMethods(CWorkbookProtection) WritingElement_XlsbConstructors(CWorkbookProtection) - + CWorkbookProtection(); virtual ~CWorkbookProtection(); @@ -135,7 +136,7 @@ namespace OOX public: WritingElement_AdditionMethods(CFileSharing) WritingElement_XlsbConstructors(CFileSharing) - + CFileSharing(); virtual ~CFileSharing(); @@ -153,7 +154,7 @@ namespace OOX nullable_bool m_oReadOnlyRecommended; nullable_string m_oUserName; - + nullable m_oAlgorithmName; nullable m_oSpinCount; nullable_string m_oHashValue; From 23dee6d7eff9666e2613d8654c2d311b4e6d979f Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 13 Jul 2023 20:42:42 +0600 Subject: [PATCH 035/221] added workbook protection conversion --- OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 58 ++++++++++++++++++++++++ OOXML/XlsxFormat/Workbook/WorkbookPr.h | 1 + 2 files changed, 59 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index 173df827db..ab785456e6 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -202,6 +202,64 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CWorkbookProtection::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oWorkbookAlgorithmName.IsInit() || m_oWorkbookSpinCount.IsInit() || m_oRevisionsAlgorithmName.IsInit() || + m_oRevisionsSpinCount.IsInit()) + { + auto ptr(new XLSB::BookProtectionIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + + ptr->wFlags.fLockRevision = m_oLockRevision->GetValue(); + ptr->wFlags.fLockStructure = m_oLockStructure->GetValue(); + ptr->wFlags.fLockWindow = m_oLockWindows->GetValue(); + + ptr->ipdBookPasswordData.szAlgName = m_oWorkbookAlgorithmName->GetValue(); + ptr->dwBookSpinCount = m_oWorkbookSpinCount->GetValue(); + + auto len = 0; + auto bytes = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); + std::string strData = {m_oWorkbookHashValue.get().begin(), m_oWorkbookHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData.c_str(), strData.size(), + bytes, len); + ptr->ipdBookPasswordData.rgbHash.cbLength = len; + + + auto len1 = 0; + auto bytes1 = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); + std::string strData1 = {m_oWorkbookSaltValue.get().begin(), m_oWorkbookSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData1.c_str(), strData1.size(), + bytes1, len1); + ptr->ipdBookPasswordData.rgbSalt.cbLength = len1; + + ptr->ipdRevPasswordData.szAlgName = m_oRevisionsAlgorithmName->GetValue(); + ptr->dwRevSpinCount = m_oRevisionsSpinCount->GetValue(); + + auto len2 = 0; + auto bytes2 = ptr->ipdRevPasswordData.rgbHash.rgbData.data(); + std::string strData2 = {m_oRevisionsHashValue.get().begin(), m_oRevisionsHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData2.c_str(), strData2.size(), + bytes2, len2); + ptr->ipdRevPasswordData.rgbHash.cbLength = len2; + + auto len3 = 0; + auto bytes3 = ptr->ipdRevPasswordData.rgbSalt.rgbData.data(); + std::string strData3 = {m_oRevisionsSaltValue.get().begin(), m_oRevisionsSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData3.c_str(), strData3.size(), + bytes3, len3); + ptr->ipdRevPasswordData.rgbSalt.cbLength = len3; + } + else + { + auto ptr(new XLSB::BookProtection); + objectPtr = XLS::BaseObjectPtr{ptr}; + ptr->wFlags.fLockRevision = m_oLockRevision->GetValue(); + ptr->wFlags.fLockStructure = m_oLockStructure->GetValue(); + ptr->wFlags.fLockWindow = m_oLockWindows->GetValue(); + } + return objectPtr; + } void CWorkbookProtection::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.h b/OOXML/XlsxFormat/Workbook/WorkbookPr.h index 1bdf9749b2..0a2cd42fc8 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.h +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.h @@ -110,6 +110,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From 5398d4598bdfdebf4fd1c0c3cdbf0d7a1935a4a0 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 14 Jul 2023 18:05:55 +0600 Subject: [PATCH 036/221] added external references conversion --- .../Workbook/ExternalReferences.cpp | 23 ++++++++++++++++++- .../XlsxFormat/Workbook/ExternalReferences.h | 2 ++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp b/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp index 72452ca976..106178cfba 100644 --- a/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp +++ b/OOXML/XlsxFormat/Workbook/ExternalReferences.cpp @@ -39,7 +39,7 @@ namespace OOX { namespace Spreadsheet - { + { CExternalReference::CExternalReference() { } @@ -66,6 +66,20 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CExternalReference::toBin() + { + auto ptr(new XLSB::SUP); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRid.IsInit()) + { + auto ptr1(new XLSB::SupBookSrc); + ptr->m_source = XLS::BaseObjectPtr{ptr1}; + ptr1->strRelID.value = m_oRid->GetValue(); + } + + return objectPtr; + } + void CExternalReference::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -154,6 +168,13 @@ namespace OOX m_arrItems.push_back(new CExternalReference(externalReference)); } } + std::vector CExternalReferences::toBin() + { + std::vector objectVector; + for(auto i:m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CExternalReferences::getType () const { return et_x_ExternalReferences; diff --git a/OOXML/XlsxFormat/Workbook/ExternalReferences.h b/OOXML/XlsxFormat/Workbook/ExternalReferences.h index 557ef3a876..55a4813638 100644 --- a/OOXML/XlsxFormat/Workbook/ExternalReferences.h +++ b/OOXML/XlsxFormat/Workbook/ExternalReferences.h @@ -57,6 +57,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -83,6 +84,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; From 281d9abd8fc2049c2d4a0bf758f5d784ee761f2f Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 14 Jul 2023 18:49:04 +0600 Subject: [PATCH 037/221] added file sharing conversion --- OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 40 ++++++++++++++++++++++++ OOXML/XlsxFormat/Workbook/WorkbookPr.h | 1 + 2 files changed, 41 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index ab785456e6..c113a44e7e 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -346,6 +346,46 @@ namespace OOX if (!oReader.IsEmptyNode()) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CFileSharing::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oSpinCount.IsInit() || m_oAlgorithmName.IsInit() || m_oHashValue.IsInit()) + { + auto ptr(new XLSB::FileSharingIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + + if (m_oReadOnlyRecommended.IsInit()) + ptr->fReadOnlyRec = m_oReadOnlyRecommended.get(); + ptr->stUserName = m_oUserName.get(); + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + ptr->dwSpinCount = m_oSpinCount->GetValue(); + + auto len = 0; + auto bytes = ptr->ipdPasswordData.rgbHash.rgbData.data(); + std::string strData = {m_oHashValue.get().begin(), m_oHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData.c_str(), strData.size(), + bytes, len); + ptr->ipdPasswordData.rgbHash.cbLength = len; + + auto len1 = 0; + auto bytes1 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + std::string strData1 = {m_oSaltValue.get().begin(), m_oSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData1.c_str(), strData1.size(), + bytes1, len1); + ptr->ipdPasswordData.rgbSalt.cbLength = len1; + + } + else + { + auto ptr(new XLSB::FileSharing); + objectPtr = XLS::BaseObjectPtr{ptr}; + if (m_oReadOnlyRecommended.IsInit()) + ptr->fReadOnlyRec = m_oReadOnlyRecommended.get(); + ptr->stUserName = m_oUserName.get(); + ptr->wResPass = m_oPassword.get(); + } + return objectPtr; + } void CFileSharing::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.h b/OOXML/XlsxFormat/Workbook/WorkbookPr.h index 0a2cd42fc8..38b07d5833 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.h +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.h @@ -148,6 +148,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From 537e7aa9f5aa97032f2c0cc423de699213f4d2a7 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 14 Jul 2023 19:44:43 +0600 Subject: [PATCH 038/221] added drawing ext conversion of workbook --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 20 ++++++++++++++++++ OOXML/DocxFormat/Drawing/DrawingExt.h | 1 + OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 24 ++++++++++++++++++++++ OOXML/XlsxFormat/Slicer/SlicerCacheExt.h | 3 +++ 4 files changed, 48 insertions(+) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 163f8dc343..1d7dbe83a8 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -606,6 +606,26 @@ namespace OOX return sResult; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorkBook() + { + auto ptr(new XLSB::FRTWORKBOOK); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_arrExt.empty()) + return objectPtr; + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{46BE6895-7355-4a93-B00E-2C351335B9C9}") + { + ptr->m_TABLESLICERCACHEIDS = i->m_oSlicerCachesExt->toBin(); + } + else if(i->m_sUri == L"{BBE1A952-AA13-448e-AADC-164F8A28A991}") + { + ptr->m_SLICERCACHEIDS = i->m_oSlicerCaches->toBin(); + } + } + return objectPtr; + } XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorksheet() { auto ptr(new XLSB::FRTWORKSHEET); diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index 93d1cd95e4..3c28dc94c7 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -186,6 +186,7 @@ namespace OOX std::wstring toXMLWithNS(const std::wstring& sNamespace) const; void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBinWorksheet(); + XLS::BaseObjectPtr toBinWorkBook(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 9655bfca25..247de917d8 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -493,6 +493,18 @@ void CSlicerStyleElement::ReadAttributes(XLS::BaseObjectPtr &obj) } } +XLS::BaseObjectPtr CSlicerCache::toBin() +{ + auto ptr(new XLSB::SLICERCACHEID); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRId.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerCacheID); + ptr->m_BrtBeginSlicerCacheID = XLS::BaseObjectPtr{ptr1}; + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + } + return objectPtr; +} void CSlicerCache::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -547,6 +559,7 @@ XLS::BaseObjectPtr CSlicerRef::toBin() auto ptr1(new XLSB::BeginSlicerEx); ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + return objectPtr; } void CSlicerRef::fromBin(XLS::BaseObjectPtr &obj) @@ -733,6 +746,17 @@ void CSlicerStyle::ReadAttributes(XLS::BaseObjectPtr &obj) m_oName = ptr->stName.value(); } +XLS::BaseObjectPtr CSlicerCaches::toBin() +{ + auto ptr(new XLSB::SLICERCACHEIDS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSlicerCache) + { + ptr->m_arSLICERCACHEID.push_back(i.toBin()); + } + return objectPtr; +} + void CSlicerCaches::fromBin(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h index fa79a0c1c9..e48b569944 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h @@ -181,6 +181,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -258,7 +259,9 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const{} virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName, const std::wstring& sPrefix) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType() const { From b792f98deac7bddb2d9e7157ceb5b351fee47e49 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 14 Jul 2023 19:45:12 +0600 Subject: [PATCH 039/221] added workbook conversion --- OOXML/XlsxFormat/Workbook/Workbook.cpp | 81 +++++++++++++++++++++++++- OOXML/XlsxFormat/Workbook/Workbook.h | 5 +- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 8c6c71b1b0..015217a2cc 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -51,7 +51,7 @@ namespace OOX { namespace Spreadsheet - { + { CWorkbookPivotCache::CWorkbookPivotCache() { } @@ -84,6 +84,18 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginPivotCacheID); } } + XLS::BaseObjectPtr CWorkbookPivotCache::toBin() + { + auto ptr(new XLSB::PIVOTCACHEID); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPivotCacheID); + ptr->m_BrtBeginPivotCacheID = XLS::BaseObjectPtr{ptr1}; + + ptr1->idSx = m_oCacheId->GetValue(); + if(m_oRid.IsInit()) + ptr1->irstcacheRelID.value = m_oRid->GetValue(); + return objectPtr; + } EElementType CWorkbookPivotCache::getType() const { return et_x_WorkbookPivotCache; @@ -166,6 +178,16 @@ namespace OOX } } + XLS::BaseObjectPtr CWorkbookPivotCaches::toBin() + { + auto ptr(new XLSB::PIVOTCACHEIDS); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_arrItems) + ptr->m_arPIVOTCACHEID.push_back(i->toBin()); + + return objectPtr; + } EElementType CWorkbookPivotCaches::getType() const { return et_x_WorkbookPivotCaches; @@ -238,7 +260,7 @@ namespace OOX if (workBookStream->m_FRTWORKBOOK != nullptr) m_oExtLst = workBookStream->m_FRTWORKBOOK; - + if (workBookStream->m_BrtFileSharingIso != nullptr) m_oFileSharing = workBookStream->m_BrtFileSharingIso; else if (workBookStream->m_BrtFileSharing != nullptr) @@ -249,6 +271,59 @@ namespace OOX } } + + XLS::BaseObjectPtr CWorkbook::WriteBin() + { + XLSB::WorkBookStreamPtr workBookStream(new XLSB::WorkBookStream); + + if (m_oBookViews.IsInit()) + { auto viewPtr(new XLSB::BOOKVIEWS); + workBookStream->m_BOOKVIEWS = XLS::BaseObjectPtr{viewPtr}; + + viewPtr->m_arBrtBookView = m_oBookViews->toBin(); + } + if (m_oCalcPr.IsInit()) + workBookStream->m_BrtCalcProp = m_oCalcPr->toBin(); + if (m_oDefinedNames.IsInit()) + { + workBookStream->m_arBrtName = m_oDefinedNames->toBin(); + } + if (m_oSheets.IsInit()) + { + auto ptr(new XLSB::BUNDLESHS); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_arBrtBundleSh = m_oSheets->toBin(); + workBookStream->m_BUNDLESHS = objectPtr; + } + if (m_oWorkbookPr.IsInit()) + workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); + if (m_oPivotCaches.IsInit()) + workBookStream->m_PIVOTCACHEIDS = m_oPivotCaches->toBin(); + + if (m_oWorkbookProtection.IsInit()) + workBookStream->m_BrtBookProtection = m_oWorkbookProtection->toBin(); + + if (m_oExternalReferences.IsInit()) + { + auto ptr(new XLSB::EXTERNALS); + ptr->m_arSUP = m_oExternalReferences->toBin(); + workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr}; + } + if (m_oAppName.IsInit()) + { + auto ptr(new XLSB::FileVersion); + ptr->stAppName = m_oAppName.get(); + workBookStream->m_BrtFileVersion = XLS::BaseObjectPtr{ptr}; + } + + if (m_oExtLst.IsInit()) + workBookStream->m_FRTWORKBOOK = m_oExtLst->toBinWorkBook(); + + if (m_oFileSharing.IsInit()) + workBookStream->m_BrtFileSharing = m_oFileSharing->toBin(); + + return workBookStream; + } void CWorkbook::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -371,7 +446,7 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"> WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"appName", m_oAppName) WritingElement_ReadAttributes_End(oReader) - } + } else if (L"WindowHeight" == sName) { } diff --git a/OOXML/XlsxFormat/Workbook/Workbook.h b/OOXML/XlsxFormat/Workbook/Workbook.h index 59d4a11399..433dbefb45 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.h +++ b/OOXML/XlsxFormat/Workbook/Workbook.h @@ -81,6 +81,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const; @@ -106,6 +107,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType() const; }; @@ -120,6 +122,7 @@ namespace OOX virtual ~CWorkbook(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin(); virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void fromXML(XmlUtils::CXmlNode& node); @@ -154,7 +157,7 @@ namespace OOX nullablem_oPivotCaches; nullable m_oPivotCachesXml; nullable m_oFileSharing; - + CPersonList* m_pPersonList; bool m_bMacroEnabled; }; From d358f2eb5f5701d507ae718eeff7c314a4e1bf08 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Wed, 2 Aug 2023 14:46:55 +0600 Subject: [PATCH 040/221] added conversion attributes check --- OOXML/XlsxFormat/Workbook/CalcPr.cpp | 39 ++- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 13 + OOXML/XlsxFormat/Workbook/Workbook.cpp | 3 +- OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 96 ++++-- .../Worksheets/WorksheetChildOther.cpp | 303 +++++++++++++----- 5 files changed, 325 insertions(+), 129 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.cpp b/OOXML/XlsxFormat/Workbook/CalcPr.cpp index f63ac42d31..01c6c8cd80 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.cpp +++ b/OOXML/XlsxFormat/Workbook/CalcPr.cpp @@ -87,19 +87,32 @@ namespace OOX auto ptr(new XLSB::CalcProp); XLS::BaseObjectPtr objectPtr(ptr); - ptr->recalcID = m_oCalcId->GetValue(); - ptr->fAutoRecalc = m_oCalcMode->GetValue(); - ptr->fFullCalcOnLoad = m_oFullCalcOnLoad->GetValue(); - ptr->fRefA1 = !m_oRefMode->GetValue(); - ptr->fIter = m_oIterate->GetValue(); - ptr->cCalcCount = m_oIterateCount->GetValue(); - ptr->xnumDelta.data.value = m_oIterateDelta->GetValue(); - ptr->fFullPrec = m_oFullPrecision->GetValue(); - ptr->fSomeUncalced = m_oCalcCompleted->GetValue(); - ptr->fSaveRecalc = m_oCalcOnSave->GetValue(); - ptr->fMTREnabled = m_oConcurrentCalc->GetValue(); - ptr->cUserThreadCount = m_oConcurrentManualCount->GetValue(); - ptr->fNoDeps = m_oForceFullCalc->GetValue(); + if(m_oCalcId.IsInit()) + ptr->recalcID = m_oCalcId->GetValue(); + if(m_oCalcMode.IsInit()) + ptr->fAutoRecalc = m_oCalcMode->GetValue(); + if(m_oFullCalcOnLoad.IsInit()) + ptr->fFullCalcOnLoad = m_oFullCalcOnLoad->GetValue(); + if(m_oRefMode.IsInit()) + ptr->fRefA1 = !m_oRefMode->GetValue(); + if(m_oIterate.IsInit()) + ptr->fIter = m_oIterate->GetValue(); + if(m_oIterateCount.IsInit()) + ptr->cCalcCount = m_oIterateCount->GetValue(); + if(m_oIterateDelta.IsInit()) + ptr->xnumDelta.data.value = m_oIterateDelta->GetValue(); + if(m_oFullPrecision.IsInit()) + ptr->fFullPrec = m_oFullPrecision->GetValue(); + if(m_oCalcCompleted.IsInit()) + ptr->fSomeUncalced = m_oCalcCompleted->GetValue(); + if(m_oCalcOnSave.IsInit()) + ptr->fSaveRecalc = m_oCalcOnSave->GetValue(); + if(m_oConcurrentCalc.IsInit()) + ptr->fMTREnabled = m_oConcurrentCalc->GetValue(); + if(m_oConcurrentManualCount.IsInit()) + ptr->cUserThreadCount = m_oConcurrentManualCount->GetValue(); + if(m_oForceFullCalc.IsInit()) + ptr->fNoDeps = m_oForceFullCalc->GetValue(); return objectPtr; } diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 549742369b..123b50a443 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -77,24 +77,37 @@ namespace OOX auto ptr(new XLSB::Name); XLS::BaseObjectPtr objectPtr(ptr); + if(m_oComment.IsInit()) ptr->comment = m_oComment.get(); + if(m_oDescription.IsInit()) ptr->description = m_oDescription.get(); + if(m_oFunction.IsInit()) ptr->fFunc = m_oFunction->GetValue(); + if(m_oFunctionGroupId.IsInit()) ptr->fGrp = m_oFunctionGroupId->GetValue(); + if(m_oHelp.IsInit()) ptr->helpTopic = m_oHelp.get(); + if(m_oHidden.IsInit()) ptr->fHidden = m_oHidden->GetValue(); if (m_oLocalSheetId.IsInit()) ptr->itab = m_oLocalSheetId->GetValue(); + if (m_oName.IsInit()) ptr->name = m_oName.get(); + if (m_oPublishToServer.IsInit()) ptr->fPublished = m_oPublishToServer->GetValue(); + if (m_oShortcutKey.IsInit()) ptr->chKey = std::stoi(m_oShortcutKey.get()); + if (m_oVbProcedure.IsInit()) ptr->fOB = m_oVbProcedure->GetValue(); + if (m_oWorkbookParameter.IsInit()) ptr->fWorkbookParam = m_oWorkbookParameter->GetValue(); + if (m_oXlm.IsInit()) ptr->fFutureFunction = m_oXlm->GetValue(); + if (m_oRef.IsInit()) ptr->rgce = m_oRef.get(); return objectPtr; diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 015217a2cc..91c3cedf14 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -91,7 +91,8 @@ namespace OOX auto ptr1(new XLSB::BeginPivotCacheID); ptr->m_BrtBeginPivotCacheID = XLS::BaseObjectPtr{ptr1}; - ptr1->idSx = m_oCacheId->GetValue(); + if(m_oCacheId.IsInit()) + ptr1->idSx = m_oCacheId->GetValue(); if(m_oRid.IsInit()) ptr1->irstcacheRelID.value = m_oRid->GetValue(); return objectPtr; diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index c113a44e7e..b5c8a37e53 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -94,23 +94,43 @@ namespace OOX auto ptr(new XLSB::WbProp); XLS::BaseObjectPtr objectPtr(ptr); - ptr->fNoSaveSup = m_oAllowRefreshQuery->GetValue(); + if(m_oAllowRefreshQuery.IsInit()) + ptr->fNoSaveSup = m_oAllowRefreshQuery->GetValue(); + if(m_oAutoCompressPictures.IsInit()) ptr->fAutoCompressPictures = m_oAutoCompressPictures->GetValue(); + if(m_oBackupFile.IsInit()) ptr->fBackup = m_oBackupFile->GetValue(); + if(m_oCheckCompatibility.IsInit()) ptr->fCheckCompat = m_oCheckCompatibility->GetValue(); - ptr->strName.value= m_oCodeName->GetValue(); + if(m_oCodeName.IsInit()) + ptr->strName.value = m_oCodeName->GetValue(); + else + ptr->strName.value = false; + if(m_oDate1904.IsInit()) ptr->f1904 = m_oDate1904->GetValue(); + if(m_oDateCompatibility.IsInit()) ptr->fNoSaveSup = m_oDateCompatibility->GetValue(); + if(m_oDefaultThemeVersion.IsInit()) ptr->dwThemeVersion = m_oDefaultThemeVersion->GetValue(); + if(m_oFilterPrivacy.IsInit()) ptr->fFilterPrivacy = m_oFilterPrivacy->GetValue(); + if(m_oHidePivotFieldList.IsInit()) ptr->fHidePivotTableFList = m_oHidePivotFieldList->GetValue(); + if(m_oPromptedSolutions.IsInit()) ptr->fBuggedUserAboutSolution = m_oPromptedSolutions->GetValue(); + if(m_oPublishItems.IsInit()) ptr->fPublishedBookItems = m_oPublishItems->GetValue(); + if(m_oRefreshAllConnections.IsInit()) ptr->fRefreshAll = m_oRefreshAllConnections->GetValue(); + if(m_oShowBorderUnselectedTables.IsInit()) ptr->fHideBorderUnselLists = m_oShowBorderUnselectedTables->GetValue(); + if(m_oShowInkAnnotation.IsInit()) ptr->fShowInkAnnotation = m_oShowInkAnnotation->GetValue(); + if(m_oShowObjects.IsInit()) ptr->mdDspObj = m_oShowObjects->GetValue() ? 1 : 2; + if(m_oShowPivotChartFilter.IsInit()) ptr->fShowPivotChartFilter = m_oShowPivotChartFilter->GetValue(); + if(m_oUpdateLinks.IsInit()) ptr->grbitUpdateLinks = m_oUpdateLinks->GetValue(); return objectPtr; @@ -218,44 +238,58 @@ namespace OOX ptr->ipdBookPasswordData.szAlgName = m_oWorkbookAlgorithmName->GetValue(); ptr->dwBookSpinCount = m_oWorkbookSpinCount->GetValue(); - auto len = 0; - auto bytes = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); - std::string strData = {m_oWorkbookHashValue.get().begin(), m_oWorkbookHashValue.get().end()}; - NSFile::CBase64Converter::Decode(strData.c_str(), strData.size(), - bytes, len); - ptr->ipdBookPasswordData.rgbHash.cbLength = len; + if(m_oWorkbookHashValue.IsInit()) + { + auto len = 0; + auto bytes = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); + std::string strData = {m_oWorkbookHashValue.get().begin(), m_oWorkbookHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData.c_str(), strData.size(), + bytes, len); + ptr->ipdBookPasswordData.rgbHash.cbLength = len; + } + if(m_oWorkbookSaltValue.IsInit()) + { + auto len1 = 0; + auto bytes1 = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); + std::string strData1 = {m_oWorkbookSaltValue.get().begin(), m_oWorkbookSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData1.c_str(), strData1.size(), + bytes1, len1); + ptr->ipdBookPasswordData.rgbSalt.cbLength = len1; + } + if(m_oRevisionsAlgorithmName.IsInit()) + ptr->ipdRevPasswordData.szAlgName = m_oRevisionsAlgorithmName->GetValue(); + if(m_oRevisionsSpinCount.IsInit()) + ptr->dwRevSpinCount = m_oRevisionsSpinCount->GetValue(); - auto len1 = 0; - auto bytes1 = ptr->ipdBookPasswordData.rgbHash.rgbData.data(); - std::string strData1 = {m_oWorkbookSaltValue.get().begin(), m_oWorkbookSaltValue.get().end()}; - NSFile::CBase64Converter::Decode(strData1.c_str(), strData1.size(), - bytes1, len1); - ptr->ipdBookPasswordData.rgbSalt.cbLength = len1; - - ptr->ipdRevPasswordData.szAlgName = m_oRevisionsAlgorithmName->GetValue(); - ptr->dwRevSpinCount = m_oRevisionsSpinCount->GetValue(); - - auto len2 = 0; - auto bytes2 = ptr->ipdRevPasswordData.rgbHash.rgbData.data(); - std::string strData2 = {m_oRevisionsHashValue.get().begin(), m_oRevisionsHashValue.get().end()}; - NSFile::CBase64Converter::Decode(strData2.c_str(), strData2.size(), - bytes2, len2); - ptr->ipdRevPasswordData.rgbHash.cbLength = len2; - - auto len3 = 0; - auto bytes3 = ptr->ipdRevPasswordData.rgbSalt.rgbData.data(); - std::string strData3 = {m_oRevisionsSaltValue.get().begin(), m_oRevisionsSaltValue.get().end()}; - NSFile::CBase64Converter::Decode(strData3.c_str(), strData3.size(), - bytes3, len3); - ptr->ipdRevPasswordData.rgbSalt.cbLength = len3; + if(m_oRevisionsHashValue.IsInit()) + { + auto len2 = 0; + auto bytes2 = ptr->ipdRevPasswordData.rgbHash.rgbData.data(); + std::string strData2 = {m_oRevisionsHashValue.get().begin(), m_oRevisionsHashValue.get().end()}; + NSFile::CBase64Converter::Decode(strData2.c_str(), strData2.size(), + bytes2, len2); + ptr->ipdRevPasswordData.rgbHash.cbLength = len2; + } + if(m_oRevisionsSaltValue.IsInit()) + { + auto len3 = 0; + auto bytes3 = ptr->ipdRevPasswordData.rgbSalt.rgbData.data(); + std::string strData3 = {m_oRevisionsSaltValue.get().begin(), m_oRevisionsSaltValue.get().end()}; + NSFile::CBase64Converter::Decode(strData3.c_str(), strData3.size(), + bytes3, len3); + ptr->ipdRevPasswordData.rgbSalt.cbLength = len3; + } } else { auto ptr(new XLSB::BookProtection); objectPtr = XLS::BaseObjectPtr{ptr}; + if(m_oLockRevision.IsInit()) ptr->wFlags.fLockRevision = m_oLockRevision->GetValue(); + if(m_oLockStructure.IsInit()) ptr->wFlags.fLockStructure = m_oLockStructure->GetValue(); + if(m_oLockWindows.IsInit()) ptr->wFlags.fLockWindow = m_oLockWindows->GetValue(); } return objectPtr; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 3fdf81143b..d45534798e 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -563,7 +563,7 @@ namespace OOX XLS::BaseObjectPtr objectPtr(ptr); if(m_oBlackAndWhite.IsInit()) ptr->fNoColor = m_oBlackAndWhite->m_eValue; - if (ptr->fNoColor) + if (ptr->fNoColor && m_oCellComments.IsInit()) { if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) ptr->fNotes = true; @@ -571,14 +571,29 @@ namespace OOX ptr->fNotes = false; } - ptr->iCopies = m_oCopies->m_eValue; - ptr->fDraft = m_oDraft->m_eValue; - ptr->iErrors = m_oErrors->m_eValue; - ptr->iPageStart = m_oFirstPageNumber->m_eValue; - ptr->iFitHeight = m_oFitToHeight->m_eValue; - ptr->iFitWidth = m_oFitToWidth->m_eValue; - ptr->iRes = m_oHorizontalDpi->m_eValue; - ptr->szRelID = m_oRId->GetValue(); + if (m_oCopies.IsInit()) + ptr->iCopies = m_oCopies->m_eValue; + + if (m_oDraft.IsInit()) + ptr->fDraft = m_oDraft->m_eValue; + + if (m_oErrors.IsInit()) + ptr->iErrors = m_oErrors->m_eValue; + + if (m_oFirstPageNumber.IsInit()) + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + + if (m_oFitToHeight.IsInit()) + ptr->iFitHeight = m_oFitToHeight->m_eValue; + + if (m_oFitToWidth.IsInit()) + ptr->iFitWidth = m_oFitToWidth->m_eValue; + + if (m_oHorizontalDpi.IsInit()) + ptr->iRes = m_oHorizontalDpi->m_eValue; + + if (m_oRId.IsInit()) + ptr->szRelID = m_oRId->GetValue(); if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) ptr->fLandscape = true; @@ -590,10 +605,17 @@ namespace OOX else ptr->fLeftToRight = false; - ptr->iPaperSize = m_oPaperSize->m_eValue; - ptr->iScale = m_oScale->m_eValue; - ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; - ptr->iVRes = m_oVerticalDpi->m_eValue; + if (m_oPaperSize.IsInit()) + ptr->iPaperSize = m_oPaperSize->m_eValue; + + if (m_oScale.IsInit()) + ptr->iScale = m_oScale->m_eValue; + + if (m_oUseFirstPageNumber.IsInit()) + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + + if (m_oVerticalDpi.IsInit()) + ptr->iVRes = m_oVerticalDpi->m_eValue; return objectPtr; } @@ -612,20 +634,37 @@ namespace OOX ptr->fNotes = false; } - ptr->iCopies = m_oCopies->m_eValue; - ptr->fDraft = m_oDraft->m_eValue; - ptr->iPageStart = m_oFirstPageNumber->m_eValue; - ptr->iRes = m_oHorizontalDpi->m_eValue; - ptr->szRelID = m_oRId->GetValue(); + if (m_oCopies.IsInit()) + ptr->iCopies = m_oCopies->m_eValue; - if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) - ptr->fLandscape = true; - else - ptr->fLandscape = false; + if (m_oDraft.IsInit()) + ptr->fDraft = m_oDraft->m_eValue; - ptr->iPaperSize = m_oPaperSize->m_eValue; - ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; - ptr->iVRes = m_oVerticalDpi->m_eValue; + if (m_oFirstPageNumber.IsInit()) + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + + if (m_oHorizontalDpi.IsInit()) + ptr->iRes = m_oHorizontalDpi->m_eValue; + + if (m_oRId.IsInit()) + ptr->szRelID = m_oRId->GetValue(); + + if (m_oOrientation.IsInit()) + { + if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) + ptr->fLandscape = true; + else + ptr->fLandscape = false; + } + + if (m_oPaperSize.IsInit()) + ptr->iPaperSize = m_oPaperSize->m_eValue; + + if (m_oUseFirstPageNumber.IsInit()) + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + + if (m_oVerticalDpi.IsInit()) + ptr->iVRes = m_oVerticalDpi->m_eValue; return objectPtr; } } @@ -1215,33 +1254,55 @@ namespace OOX { auto pWsView(new XLSB::BeginWsView); XLS::BaseObjectPtr castedPtr(pWsView); - pWsView->icvHdr = m_oColorId->m_eValue; - pWsView->fDefaultHdr = m_oDefaultGridColor->m_eValue; - pWsView->fRightToLeft = m_oRightToLeft->m_eValue; - pWsView->fDspFmlaRt = m_oShowFormulas->m_eValue; - pWsView->fDspGridRt = m_oShowGridLines->m_eValue; - pWsView->fDspGuts = m_oShowOutlineSymbols->m_eValue; - pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; - pWsView->fDspRuler = m_oShowRuler->m_eValue; - pWsView->fWhitespaceHidden = m_oShowWhiteSpace->m_eValue; - pWsView->fDspZerosRt = m_oShowZeros->m_eValue; - pWsView->fSelected = m_oTabSelected->m_eValue; - pWsView->topLeftCell = m_oTopLeftCell.get(); - pWsView->xlView = m_oView->m_eValue; - pWsView->fWnProt = m_oWindowProtection->m_eValue; - pWsView->iWbkView = m_oWorkbookViewId->m_eValue; - pWsView->wScale = m_oZoomScale->m_eValue; - pWsView->wScaleNormal = m_oZoomScaleNormal->m_eValue; - pWsView->wScalePLV = m_oZoomScalePageLayoutView->m_eValue; - pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; + if (m_oColorId.IsInit()) + pWsView->icvHdr = m_oColorId->m_eValue; + if (m_oDefaultGridColor.IsInit()) + pWsView->fDefaultHdr = m_oDefaultGridColor->m_eValue; + if (m_oRightToLeft.IsInit()) + pWsView->fRightToLeft = m_oRightToLeft->m_eValue; + if (m_oShowFormulas.IsInit()) + pWsView->fDspFmlaRt = m_oShowFormulas->m_eValue; + if (m_oShowGridLines.IsInit()) + pWsView->fDspGridRt = m_oShowGridLines->m_eValue; + if (m_oShowOutlineSymbols.IsInit()) + pWsView->fDspGuts = m_oShowOutlineSymbols->m_eValue; + if (m_oShowRowColHeaders.IsInit()) + pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; + if (m_oShowRuler.IsInit()) + pWsView->fDspRuler = m_oShowRuler->m_eValue; + if (m_oShowWhiteSpace.IsInit()) + pWsView->fWhitespaceHidden = m_oShowWhiteSpace->m_eValue; + if (m_oShowZeros.IsInit()) + pWsView->fDspZerosRt = m_oShowZeros->m_eValue; + if (m_oTabSelected.IsInit()) + pWsView->fSelected = m_oTabSelected->m_eValue; + if(m_oTopLeftCell.IsInit()) + pWsView->topLeftCell = m_oTopLeftCell.get(); + if (m_oView.IsInit()) + pWsView->xlView = m_oView->m_eValue; + if (m_oWindowProtection.IsInit()) + pWsView->fWnProt = m_oWindowProtection->m_eValue; + if (m_oWorkbookViewId.IsInit()) + pWsView->iWbkView = m_oWorkbookViewId->m_eValue; + if (m_oZoomScale.IsInit()) + pWsView->wScale = m_oZoomScale->m_eValue; + if (m_oZoomScaleNormal.IsInit()) + pWsView->wScaleNormal = m_oZoomScaleNormal->m_eValue; + if (m_oZoomScalePageLayoutView.IsInit()) + pWsView->wScalePLV = m_oZoomScalePageLayoutView->m_eValue; + if (m_oZoomScaleSheetLayoutView.IsInit()) + pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; return castedPtr; } else { auto pWsView(new XLSB::BeginCsView); XLS::BaseObjectPtr castedPtr(pWsView); + if(m_oTabSelected.IsInit()) pWsView->fSelected = m_oTabSelected->m_eValue; + if(m_oWorkbookViewId.IsInit()) pWsView->iWbkView = m_oWorkbookViewId->m_eValue; + if(m_oZoomScale.IsInit()) pWsView->wScale = m_oZoomScale->m_eValue; return castedPtr; } @@ -1852,9 +1913,13 @@ namespace OOX auto castedBegin(new XLSB::BeginHeaderFooter); ptr->m_BrtBeginHeaderFooter = XLS::BaseObjectPtr{castedBegin}; + if(m_oAlignWithMargins.IsInit()) castedBegin->fHFAlignMargins = m_oAlignWithMargins->m_eValue; + if(m_oDifferentFirst.IsInit()) castedBegin->fHFDiffFirst = m_oDifferentFirst->m_eValue; + if(m_oDifferentOddEven.IsInit()) castedBegin->fHFDiffOddEven = m_oDifferentOddEven->m_eValue; + if(m_oScaleWithDoc.IsInit()) castedBegin->fHFScaleWithDoc = m_oScaleWithDoc->m_eValue; if(m_oOddHeader.IsInit()) @@ -2339,24 +2404,56 @@ namespace OOX auto ptr(new XLSB::SheetProtection); XLS::BaseObjectPtr castedPtr(ptr); - ptr->protpwd = std::stoul(m_oPassword.get()); - ptr->fAutoFilter = m_oAutoFilter->GetValue(); + if (m_oPassword.IsInit()) + ptr->protpwd = std::stoul(m_oPassword.get()); - ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); - ptr->fDeleteRows = m_oDeleteRows->GetValue(); - ptr->fFormatCells = m_oFormatCells->GetValue(); - ptr->fFormatColumns = m_oFormatColumns->GetValue(); - ptr->fFormatRows = m_oFormatRows->GetValue(); - ptr->fInsertColumns = m_oInsertColumns->GetValue(); - ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); - ptr->fInsertRows = m_oInsertRows->GetValue(); - ptr->fObjects = m_oObjects->GetValue(); - ptr->fPivotTables = m_oPivotTables->GetValue(); - ptr->fScenarios = m_oScenarios->GetValue(); - ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); - ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); - ptr->fLocked = m_oSheet->GetValue(); - ptr->fSort = m_oSort->GetValue(); + if (m_oAutoFilter.IsInit()) + ptr->fAutoFilter = m_oAutoFilter->GetValue(); + + if (m_oDeleteColumns.IsInit()) + ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + + if (m_oDeleteRows.IsInit()) + ptr->fDeleteRows = m_oDeleteRows->GetValue(); + + if (m_oFormatCells.IsInit()) + ptr->fFormatCells = m_oFormatCells->GetValue(); + + if (m_oFormatColumns.IsInit()) + ptr->fFormatColumns = m_oFormatColumns->GetValue(); + + if (m_oFormatRows.IsInit()) + ptr->fFormatRows = m_oFormatRows->GetValue(); + + if (m_oInsertColumns.IsInit()) + ptr->fInsertColumns = m_oInsertColumns->GetValue(); + + if (m_oInsertHyperlinks.IsInit()) + ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + + if (m_oInsertRows.IsInit()) + ptr->fInsertRows = m_oInsertRows->GetValue(); + + if (m_oObjects.IsInit()) + ptr->fObjects = m_oObjects->GetValue(); + + if (m_oPivotTables.IsInit()) + ptr->fPivotTables = m_oPivotTables->GetValue(); + + if (m_oScenarios.IsInit()) + ptr->fScenarios = m_oScenarios->GetValue(); + + if (m_oSelectLockedCells.IsInit()) + ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + + if (m_oSelectUnlockedCells.IsInit()) + ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + + if (m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + + if (m_oSort.IsInit()) + ptr->fSort = m_oSort->GetValue(); return castedPtr; } @@ -2364,38 +2461,76 @@ namespace OOX { auto ptr(new XLSB::SheetProtectionIso); XLS::BaseObjectPtr castedPtr(ptr); - - ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); - ptr->dwSpinCount = m_oSpinCount->GetValue(); + if(m_oAlgorithmName.IsInit()) + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + if(m_oSpinCount.IsInit()) + ptr->dwSpinCount = m_oSpinCount->GetValue(); + if(m_oHashValue.IsInit()) + { byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); auto tempSize = 0; NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + } - byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); - auto tempSize2 = 0; - NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), - m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); - ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + if(m_oSaltValue.IsInit()) + { + byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + } + if(m_oAutoFilter.IsInit()) ptr->fAutoFilter = m_oAutoFilter->GetValue(); - ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); - ptr->fDeleteRows = m_oDeleteRows->GetValue(); - ptr->fFormatCells = m_oFormatCells->GetValue(); - ptr->fFormatColumns = m_oFormatColumns->GetValue(); - ptr->fFormatRows = m_oFormatRows->GetValue(); - ptr->fInsertColumns = m_oInsertColumns->GetValue(); - ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); - ptr->fInsertRows = m_oInsertRows->GetValue(); - ptr->fObjects = m_oObjects->GetValue(); - ptr->fPivotTables = m_oPivotTables->GetValue(); - ptr->fScenarios = m_oScenarios->GetValue(); - ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); - ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); - ptr->fLocked = m_oSheet->GetValue(); - ptr->fSort = m_oSort->GetValue(); + if (m_oDeleteColumns.IsInit()) + ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + + if (m_oDeleteRows.IsInit()) + ptr->fDeleteRows = m_oDeleteRows->GetValue(); + + if (m_oFormatCells.IsInit()) + ptr->fFormatCells = m_oFormatCells->GetValue(); + + if (m_oFormatColumns.IsInit()) + ptr->fFormatColumns = m_oFormatColumns->GetValue(); + + if (m_oFormatRows.IsInit()) + ptr->fFormatRows = m_oFormatRows->GetValue(); + + if (m_oInsertColumns.IsInit()) + ptr->fInsertColumns = m_oInsertColumns->GetValue(); + + if (m_oInsertHyperlinks.IsInit()) + ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + + if (m_oInsertRows.IsInit()) + ptr->fInsertRows = m_oInsertRows->GetValue(); + + if (m_oObjects.IsInit()) + ptr->fObjects = m_oObjects->GetValue(); + + if (m_oPivotTables.IsInit()) + ptr->fPivotTables = m_oPivotTables->GetValue(); + + if (m_oScenarios.IsInit()) + ptr->fScenarios = m_oScenarios->GetValue(); + + if (m_oSelectLockedCells.IsInit()) + ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + + if (m_oSelectUnlockedCells.IsInit()) + ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + + if (m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + + if (m_oSort.IsInit()) + ptr->fSort = m_oSort->GetValue(); + return castedPtr; } } From 6a26c7881630b91807bda067a1daf9be24d04f08 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 3 Aug 2023 15:12:20 +0300 Subject: [PATCH 041/221] . --- OOXML/XlsxFormat/Styles/rPr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Styles/rPr.h b/OOXML/XlsxFormat/Styles/rPr.h index 3596e3de2a..c88feb4b4f 100644 --- a/OOXML/XlsxFormat/Styles/rPr.h +++ b/OOXML/XlsxFormat/Styles/rPr.h @@ -33,7 +33,7 @@ #include "../WritingElement.h" #include "../../Base/Nullable.h" -#include "../../XlsbFormat/Biff12_records/Color.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BIFF12/Color.h" namespace NSBinPptxRW { From 65675e2c54a0c85f341cc1343429470a13a0aa69 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 4 Aug 2023 11:52:15 +0300 Subject: [PATCH 042/221] . --- OOXML/SystemUtility/SystemUtility.cpp | 17 +++++++++++-- OOXML/SystemUtility/SystemUtility.h | 3 ++- OOXML/XlsbFormat/Xlsb.cpp | 15 ++++++++++- OOXML/XlsbFormat/Xlsb.h | 12 ++++++--- OOXML/XlsxFormat/Workbook/Workbook.cpp | 35 ++++++++++++++++++++------ OOXML/XlsxFormat/Workbook/Workbook.h | 2 +- X2tConverter/src/ASCConverters.cpp | 9 ++++--- 7 files changed, 72 insertions(+), 21 deletions(-) diff --git a/OOXML/SystemUtility/SystemUtility.cpp b/OOXML/SystemUtility/SystemUtility.cpp index 03280da835..a95f833b2f 100644 --- a/OOXML/SystemUtility/SystemUtility.cpp +++ b/OOXML/SystemUtility/SystemUtility.cpp @@ -242,8 +242,8 @@ namespace OOX } std::wstring CPath::GetExtention(bool bIsPoint) const { - int nFind = (int)m_strFilename.rfind('.'); - if (-1 == nFind) + size_t nFind = m_strFilename.rfind('.'); + if (std::wstring::npos == nFind) return L""; if (!bIsPoint) @@ -251,6 +251,19 @@ namespace OOX return m_strFilename.substr(nFind); } + void CPath::SetExtention(const std::wstring& ext) + { + size_t nFind = m_strFilename.rfind('.'); + if (std::wstring::npos == nFind) + { + m_strFilename += L"." + ext; + } + else + { + m_strFilename = m_strFilename.substr(nFind + 1) + ext; + } + + } std::wstring CPath::GetDirectory(bool bIsSlash) const { int nPos = (int)m_strFilename.rfind(FILE_SEPARATOR_CHAR); diff --git a/OOXML/SystemUtility/SystemUtility.h b/OOXML/SystemUtility/SystemUtility.h index 279e113a4c..ad13efc14a 100644 --- a/OOXML/SystemUtility/SystemUtility.h +++ b/OOXML/SystemUtility/SystemUtility.h @@ -42,7 +42,6 @@ namespace OOX //флаг введен, чтобы отличать относительные и абсолютные пути в rels bool m_bIsRoot; - public: CPath(); CPath(const std::wstring& sName, bool bIsNorm = true); CPath(const char*& sName, bool bIsNorm = true); @@ -70,6 +69,8 @@ namespace OOX std::wstring GetPath() const; std::wstring GetFilename() const; + void SetExtention(const std::wstring & ext); + void Normalize(); void SetName(std::wstring sName, bool bNormalize); diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 32a2ae4c92..442a9dcdef 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -30,6 +30,8 @@ * */ #include "Xlsb.h" +#include "../DocxFormat/App.h" +#include "../DocxFormat/Core.h" #include "../XlsxFormat/Workbook/Workbook.h" #include "../XlsxFormat/SharedStrings/SharedStrings.h" @@ -93,7 +95,17 @@ bool OOX::Spreadsheet::CXlsb::ReadBin(const CPath& oFilePath, XLS::BaseObject* o return true; } +bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oDirPath, OOX::CContentTypes& oContentTypes) +{ + if (NULL == m_pWorkbook) + return false; + m_bWriteToXlsb = true; + IFileContainer::Write(oDirPath / L"", OOX::CPath(_T("")), oContentTypes); + + oContentTypes.Write(oDirPath); + return true; +} bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* objStream) { if (m_binaryWriter->CreateFileW(oFilePath.GetPath()) == false) @@ -102,7 +114,8 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* XLS::StreamCacheWriterPtr writer(new XLS::BinaryStreamCacheWriter(m_binaryWriter, xls_global_info)); XLS::BinWriterProcessor proc(writer, objStream); proc.mandatory(*objStream); - m_binaryWriter->WriteFile(m_binaryWriter->GetBuffer(), (static_cast(m_binaryWriter.get()))->GetPosition()); + + m_binaryWriter->WriteFile(m_binaryWriter->GetBuffer(), (static_cast(m_binaryWriter.get()))->GetPosition()); m_binaryWriter->CloseFile(); return true; diff --git a/OOXML/XlsbFormat/Xlsb.h b/OOXML/XlsbFormat/Xlsb.h index 0757d40c05..065dc60d28 100644 --- a/OOXML/XlsbFormat/Xlsb.h +++ b/OOXML/XlsbFormat/Xlsb.h @@ -60,9 +60,12 @@ namespace OOX init(); } ~CXlsb(); - + bool ReadBin(const CPath& oFilePath, XLS::BaseObject* objStream); bool WriteBin(const CPath& oFilePath, XLS::BaseObject* objStream); + + bool WriteBin(const CPath& oDirPath, OOX::CContentTypes& oContentTypes); + XLS::GlobalWorkbookInfo* GetGlobalinfo(); void PrepareSi(); void PrepareTableFormula(); @@ -72,8 +75,10 @@ namespace OOX bool IsWriteToXlsx(); void WriteToXlsx(bool isXlsx); - + std::unordered_map m_mapSheetNameSheetData; + + bool m_bWriteToXlsb = false; private: void init(); @@ -85,8 +90,7 @@ namespace OOX std::wstring m_sPath; OOX::CContentTypes m_oContentTypes; - bool m_bWriteToXlsx; - + bool m_bWriteToXlsx = false; }; } //Spreadsheet diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 91c3cedf14..077845f7fd 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -32,6 +32,7 @@ #pragma once #include "Workbook.h" +#include "../../XlsbFormat/Xlsb.h" #include "../../XlsbFormat/WorkBookStream.h" @@ -273,7 +274,7 @@ namespace OOX } } - XLS::BaseObjectPtr CWorkbook::WriteBin() + XLS::BaseObjectPtr CWorkbook::WriteBin() const { XLSB::WorkBookStreamPtr workBookStream(new XLSB::WorkBookStream); @@ -464,15 +465,23 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"> } void CWorkbook::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); + sXml.WriteString(L""); - toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath.c_str(), sXml.GetData()); + toXML(sXml); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath.c_str(), sXml.GetData()); + } oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); IFileContainer::Write(oPath, oDirectory, oContent); } @@ -487,7 +496,17 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"> } const CPath CWorkbook::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } EElementType CWorkbook::getType () const { diff --git a/OOXML/XlsxFormat/Workbook/Workbook.h b/OOXML/XlsxFormat/Workbook/Workbook.h index 433dbefb45..a3b31d97db 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.h +++ b/OOXML/XlsxFormat/Workbook/Workbook.h @@ -122,7 +122,7 @@ namespace OOX virtual ~CWorkbook(); void readBin(const CPath& oPath); - XLS::BaseObjectPtr WriteBin(); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void fromXML(XmlUtils::CXmlNode& node); diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 58633b4a77..63c1d555ae 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1155,11 +1155,12 @@ namespace NExtractTools //--------------------------------------------------------------------- const OOX::CPath oox_path(sFrom); - OOX::Spreadsheet::CXlsx xlsx(oox_path); - OOX::Spreadsheet::CXlsb xlsb; + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.Read(oox_path); + + OOX::CContentTypes oContentTypes; + nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; - //XLS::BaseObjectPtr object = xlsx.toBin(); - //xlsb.WriteBin(sTempUnpackedXLSB, object.get()); //--------------------------------------------------------------------- if (SUCCEEDED_X2T(nRes)) { From dc95b8a92c29bdc4db12f148b621f662aa839294 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 4 Aug 2023 12:04:07 +0300 Subject: [PATCH 043/221] . --- OOXML/SystemUtility/SystemUtility.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/SystemUtility/SystemUtility.cpp b/OOXML/SystemUtility/SystemUtility.cpp index a95f833b2f..ac6d93af75 100644 --- a/OOXML/SystemUtility/SystemUtility.cpp +++ b/OOXML/SystemUtility/SystemUtility.cpp @@ -260,7 +260,7 @@ namespace OOX } else { - m_strFilename = m_strFilename.substr(nFind + 1) + ext; + m_strFilename = m_strFilename.substr(0, nFind + 1) + ext; } } From eef5b9b9cc7b29d2386abddd70caed6521157e34 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 4 Aug 2023 12:08:47 +0300 Subject: [PATCH 044/221] . --- X2tConverter/src/ASCConverters.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 63c1d555ae..e4996a4d3e 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1159,7 +1159,7 @@ namespace NExtractTools oXlsb.Read(oox_path); OOX::CContentTypes oContentTypes; - nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + nRes = oXlsb.WriteBin(sTempUnpackedXLSB, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; //--------------------------------------------------------------------- if (SUCCEEDED_X2T(nRes)) From 9cfb0ee82ad5296231b41c16432683d73f44e68a Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 4 Aug 2023 20:59:20 +0600 Subject: [PATCH 045/221] addede worksheet writing --- OOXML/SystemUtility/SystemUtility.cpp | 2 +- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 91 ++++++++++++++--------- OOXML/XlsxFormat/Worksheets/Worksheet.h | 2 +- 3 files changed, 59 insertions(+), 36 deletions(-) diff --git a/OOXML/SystemUtility/SystemUtility.cpp b/OOXML/SystemUtility/SystemUtility.cpp index a95f833b2f..cab07df226 100644 --- a/OOXML/SystemUtility/SystemUtility.cpp +++ b/OOXML/SystemUtility/SystemUtility.cpp @@ -260,7 +260,7 @@ namespace OOX } else { - m_strFilename = m_strFilename.substr(nFind + 1) + ext; + m_strFilename = m_strFilename.substr(0, nFind + 1 ) + ext; } } diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index fd68ac3110..edffbe2b46 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -229,7 +229,7 @@ namespace OOX } } - XLS::BaseObjectPtr CWorksheet::writeBin() + XLS::BaseObjectPtr CWorksheet::WriteBin() const { if(m_bIsChartSheet) { @@ -255,6 +255,9 @@ namespace OOX if (m_oMergeCells.IsInit()) workSheetStream->m_MERGECELLS = m_oMergeCells->toBin(); + if ( m_oSheetData.IsInit()) + workSheetStream->m_CELLTABLE = m_oSheetData->toBin(); + if (m_oSheetFormatPr.IsInit()) workSheetStream->m_BrtWsFmtInfo = m_oSheetFormatPr->toBin(); if (m_oSheetViews.IsInit()) @@ -674,52 +677,61 @@ namespace OOX if (bIsWritten) return; bIsWritten = true; + if (!m_bWriteDirectlyToFile) { - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - toXMLStart(sXml); - toXML(sXml); - toXMLEnd(sXml); + toXMLStart(sXml); + toXML(sXml); + toXMLEnd(sXml); - //NSFile::CFileBinary::SaveToFile(oPath.GetPath(), sXml.GetData()); - //for memory optimization for large files + //NSFile::CFileBinary::SaveToFile(oPath.GetPath(), sXml.GetData()); + //for memory optimization for large files - wchar_t* pXmlData = sXml.GetBuffer(); - LONG lwcharLen = (LONG)sXml.GetCurSize(); - const LONG lcurrentLen = 10485760; //10 Mbyte - LONG nCycles = lwcharLen / lcurrentLen; + wchar_t* pXmlData = sXml.GetBuffer(); + LONG lwcharLen = (LONG)sXml.GetCurSize(); + const LONG lcurrentLen = 10485760; //10 Mbyte + LONG nCycles = lwcharLen / lcurrentLen; - LONG lLen = 0; - BYTE* pData = NULL; - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); + LONG lLen = 0; + BYTE* pData = NULL; + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); - while(nCycles--) - { - NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lcurrentLen, pData, lLen); + while(nCycles--) + { + NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lcurrentLen, pData, lLen); - oFile.WriteFile(pData, lLen); + oFile.WriteFile(pData, lLen); - pXmlData += lcurrentLen; + pXmlData += lcurrentLen; - RELEASEARRAYOBJECTS(pData); - } + RELEASEARRAYOBJECTS(pData); + } - if(lwcharLen % lcurrentLen > 0) - { - NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lwcharLen % lcurrentLen, pData, lLen); + if(lwcharLen % lcurrentLen > 0) + { + NSFile::CUtf8Converter::GetUtf8StringFromUnicode(pXmlData, lwcharLen % lcurrentLen, pData, lLen); - oFile.WriteFile(pData, lLen); + oFile.WriteFile(pData, lLen); - RELEASEARRAYOBJECTS(pData); - } + RELEASEARRAYOBJECTS(pData); + } - oFile.CloseFile(); - - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); - } + oFile.CloseFile(); + } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); + } else { CPath oRealPath(oPath.GetDirectory() + FILE_SEPARATOR_STR + m_sOutputFilename); @@ -819,7 +831,18 @@ mc:Ignorable=\"x14ac\">"); } const CPath CWorksheet::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } const CPath& CWorksheet::GetReadPath() const { diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.h b/OOXML/XlsxFormat/Worksheets/Worksheet.h index e472137843..38a3ed1f65 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.h +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.h @@ -76,7 +76,7 @@ namespace OOX virtual ~CWorksheet(); void readBin(const CPath& oPath); - XLS::BaseObjectPtr writeBin(); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); From 3f75431018f966d6c0311e17f1029b812edb5b55 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 4 Aug 2023 21:49:02 +0600 Subject: [PATCH 046/221] started sheet data conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 242 ++++++++++++++++------ OOXML/XlsxFormat/Worksheets/SheetData.h | 13 +- 2 files changed, 187 insertions(+), 68 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 0fe3b4d841..e533ec0d15 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -73,23 +73,23 @@ namespace OOX { namespace Spreadsheet { - static const wchar_t* m_aLetters[] = - { - L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O", L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W", L"X", L"Y", L"Z", L"AA", L"AB", L"AC", L"AD", L"AE", L"AF", L"AG", L"AH", L"AI", L"AJ", L"AK", L"AL", L"AM", L"AN", L"AO", L"AP", L"AQ", L"AR", L"AS", L"AT", L"AU", L"AV", L"AW", L"AX", L"AY", L"AZ", L"BA", L"BB", L"BC", L"BD", L"BE", L"BF", L"BG", L"BH", L"BI", L"BJ", L"BK", L"BL", L"BM", L"BN", L"BO", L"BP", L"BQ", L"BR", L"BS", L"BT", L"BU", L"BV", L"BW", L"BX", L"BY", L"BZ", L"CA", L"CB", L"CC", L"CD", L"CE", L"CF", L"CG", L"CH", L"CI", L"CJ", L"CK", L"CL", L"CM", L"CN", L"CO", L"CP", L"CQ", L"CR", L"CS", L"CT", L"CU", L"CV", L"CW", L"CX", L"CY", L"CZ", L"DA", L"DB", L"DC", L"DD", L"DE", L"DF", L"DG", L"DH", L"DI", L"DJ", L"DK", L"DL", L"DM", L"DN", L"DO", L"DP", L"DQ", L"DR", L"DS", L"DT", L"DU", L"DV", L"DW", L"DX", L"DY", L"DZ", L"EA", L"EB", L"EC", L"ED", L"EE", L"EF", L"EG", L"EH", L"EI", L"EJ", L"EK", L"EL", L"EM", L"EN", L"EO", L"EP", L"EQ", L"ER", L"ES", L"ET", L"EU", L"EV", L"EW", L"EX", L"EY", L"EZ", L"FA", L"FB", L"FC", L"FD", L"FE", L"FF", L"FG", L"FH", L"FI", L"FJ", L"FK", L"FL", L"FM", L"FN", L"FO", L"FP", L"FQ", L"FR", L"FS", L"FT", L"FU", L"FV", L"FW", L"FX", L"FY", L"FZ", L"GA", L"GB", L"GC", L"GD", L"GE", L"GF", L"GG", L"GH", L"GI", L"GJ", L"GK", L"GL", L"GM", L"GN", L"GO", L"GP", L"GQ", L"GR", L"GS", L"GT", L"GU", L"GV", L"GW", L"GX", L"GY", L"GZ", L"HA", L"HB", L"HC", L"HD", L"HE", L"HF", L"HG", L"HH", L"HI", L"HJ", L"HK", L"HL", L"HM", L"HN", L"HO", L"HP", L"HQ", L"HR", L"HS", L"HT", L"HU", L"HV", L"HW", L"HX", L"HY", L"HZ", L"IA", L"IB", L"IC", L"ID", L"IE", L"IF", L"IG", L"IH", L"II", L"IJ", L"IK", L"IL", L"IM", L"IN", L"IO", L"IP", L"IQ", L"IR", L"IS", L"IT", L"IU", L"IV", L"IW", L"IX", L"IY", L"IZ", L"JA", L"JB", L"JC", L"JD", L"JE", L"JF", L"JG", L"JH", L"JI", L"JJ", L"JK", L"JL", L"JM", L"JN", L"JO", L"JP", L"JQ", L"JR", L"JS", L"JT", L"JU", L"JV", L"JW", L"JX", L"JY", L"JZ", L"KA", L"KB", L"KC", L"KD", L"KE", L"KF", L"KG", L"KH", L"KI", L"KJ", L"KK", L"KL", L"KM", L"KN", L"KO", L"KP", L"KQ", L"KR", L"KS", L"KT", L"KU", L"KV", L"KW", L"KX", L"KY", L"KZ", L"LA", L"LB", L"LC", L"LD", L"LE", L"LF", L"LG", L"LH", L"LI", L"LJ", L"LK", L"LL", L"LM", L"LN", L"LO", L"LP", L"LQ", L"LR", L"LS", L"LT", L"LU", L"LV", L"LW", L"LX", L"LY", L"LZ", L"MA", L"MB", L"MC", L"MD", L"ME", L"MF", L"MG", L"MH", L"MI", L"MJ", L"MK", L"ML", L"MM", L"MN", L"MO", L"MP", L"MQ", L"MR", L"MS", L"MT", L"MU", L"MV", L"MW", L"MX", L"MY", L"MZ", L"NA", L"NB", L"NC", L"ND", L"NE", L"NF", L"NG", L"NH", L"NI", L"NJ", L"NK", L"NL", L"NM", L"NN", L"NO", L"NP", L"NQ", L"NR", L"NS", L"NT", L"NU", L"NV", L"NW", L"NX", L"NY", L"NZ", L"OA", L"OB", L"OC", L"OD", L"OE", L"OF", L"OG", L"OH", L"OI", L"OJ", L"OK", L"OL", L"OM", L"ON", L"OO", L"OP", L"OQ", L"OR", L"OS", L"OT", L"OU", L"OV", L"OW", L"OX", L"OY", L"OZ", L"PA", L"PB", L"PC", L"PD", L"PE", L"PF", L"PG", L"PH", L"PI", L"PJ", L"PK", L"PL", L"PM", L"PN", L"PO", L"PP", L"PQ", L"PR", L"PS", L"PT", L"PU", L"PV", L"PW", L"PX", L"PY", L"PZ", L"QA", L"QB", L"QC", L"QD", L"QE", L"QF", L"QG", L"QH", L"QI", L"QJ", L"QK", L"QL", L"QM", L"QN", L"QO", L"QP", L"QQ", L"QR", L"QS", L"QT", L"QU", L"QV", L"QW", L"QX", L"QY", L"QZ", L"RA", L"RB", L"RC", L"RD", L"RE", L"RF", L"RG", L"RH", L"RI", L"RJ", L"RK", L"RL", L"RM", L"RN", L"RO", L"RP", L"RQ", L"RR", L"RS", L"RT", L"RU", L"RV", L"RW", L"RX", L"RY", L"RZ", L"SA", L"SB", L"SC", L"SD", L"SE", L"SF", L"SG", L"SH", L"SI", L"SJ", L"SK", L"SL", L"SM", L"SN", L"SO", L"SP", L"SQ", L"SR", L"SS", L"ST", L"SU", L"SV", L"SW", L"SX", L"SY", L"SZ", L"TA", L"TB", L"TC", L"TD", L"TE", L"TF", L"TG", L"TH", L"TI", L"TJ", L"TK", L"TL", L"TM", L"TN", L"TO", L"TP", L"TQ", L"TR", L"TS", L"TT", L"TU", L"TV", L"TW", L"TX", L"TY", L"TZ", L"UA", L"UB", L"UC", L"UD", L"UE", L"UF", L"UG", L"UH", L"UI", L"UJ", L"UK", L"UL", L"UM", L"UN", L"UO", L"UP", L"UQ", L"UR", L"US", L"UT", L"UU", L"UV", L"UW", L"UX", L"UY", L"UZ", L"VA", L"VB", L"VC", L"VD", L"VE", L"VF", L"VG", L"VH", L"VI", L"VJ", L"VK", L"VL", L"VM", L"VN", L"VO", L"VP", L"VQ", L"VR", L"VS", L"VT", L"VU", L"VV", L"VW", L"VX", L"VY", L"VZ", L"WA", L"WB", L"WC", L"WD", L"WE", L"WF", L"WG", L"WH", L"WI", L"WJ", L"WK", L"WL", L"WM", L"WN", L"WO", L"WP", L"WQ", L"WR", L"WS", L"WT", L"WU", L"WV", L"WW", L"WX", L"WY", - L"WZ", L"XA", L"XB", L"XC", L"XD", L"XE", L"XF", L"XG", L"XH", L"XI", L"XJ", L"XK", L"XL", L"XM", L"XN", L"XO", L"XP", L"XQ", L"XR", L"XS", L"XT", L"XU", L"XV", L"XW", L"XX", L"XY", L"XZ", L"YA", L"YB", L"YC", L"YD", L"YE", L"YF", L"YG", L"YH", L"YI", L"YJ", L"YK", L"YL", L"YM", L"YN", L"YO", L"YP", L"YQ", L"YR", L"YS", L"YT", L"YU", L"YV", L"YW", L"YX", L"YY", L"YZ", L"ZA", L"ZB", L"ZC", L"ZD", L"ZE", L"ZF", L"ZG", L"ZH", L"ZI", L"ZJ", L"ZK", L"ZL", L"ZM", L"ZN", L"ZO", L"ZP", L"ZQ", L"ZR", L"ZS", L"ZT", L"ZU", L"ZV", L"ZW", L"ZX", L"ZY", L"ZZ", L"AAA", L"AAB", L"AAC", L"AAD", L"AAE", L"AAF", L"AAG", L"AAH", L"AAI", L"AAJ", L"AAK", L"AAL", L"AAM", L"AAN", L"AAO", L"AAP", L"AAQ", L"AAR", L"AAS", L"AAT", L"AAU", L"AAV", L"AAW", L"AAX", L"AAY", L"AAZ", L"ABA", L"ABB", L"ABC", L"ABD", L"ABE", L"ABF", L"ABG", L"ABH", L"ABI", L"ABJ", L"ABK", L"ABL", L"ABM", L"ABN", L"ABO", L"ABP", L"ABQ", L"ABR", L"ABS", L"ABT", L"ABU", L"ABV", L"ABW", L"ABX", L"ABY", L"ABZ", L"ACA", L"ACB", L"ACC", L"ACD", L"ACE", L"ACF", L"ACG", L"ACH", L"ACI", L"ACJ", L"ACK", L"ACL", L"ACM", L"ACN", L"ACO", L"ACP", L"ACQ", L"ACR", L"ACS", L"ACT", L"ACU", L"ACV", L"ACW", L"ACX", L"ACY", L"ACZ", L"ADA", L"ADB", L"ADC", L"ADD", L"ADE", L"ADF", L"ADG", L"ADH", L"ADI", L"ADJ", L"ADK", L"ADL", L"ADM", L"ADN", L"ADO", L"ADP", L"ADQ", L"ADR", L"ADS", L"ADT", L"ADU", L"ADV", L"ADW", L"ADX", L"ADY", L"ADZ", L"AEA", L"AEB", L"AEC", L"AED", L"AEE", L"AEF", L"AEG", L"AEH", L"AEI", L"AEJ", L"AEK", L"AEL", L"AEM", L"AEN", L"AEO", L"AEP", L"AEQ", L"AER", L"AES", L"AET", L"AEU", L"AEV", L"AEW", L"AEX", L"AEY", L"AEZ", L"AFA", L"AFB", L"AFC", L"AFD", L"AFE", L"AFF", L"AFG", L"AFH", L"AFI", L"AFJ", L"AFK", L"AFL", L"AFM", L"AFN", L"AFO", L"AFP", L"AFQ", L"AFR", L"AFS", L"AFT", L"AFU", L"AFV", L"AFW", L"AFX", L"AFY", L"AFZ", L"AGA", L"AGB", L"AGC", L"AGD", L"AGE", L"AGF", L"AGG", L"AGH", L"AGI", L"AGJ", L"AGK", L"AGL", L"AGM", L"AGN", L"AGO", L"AGP", L"AGQ", L"AGR", L"AGS", L"AGT", L"AGU", L"AGV", L"AGW", L"AGX", L"AGY", L"AGZ", L"AHA", L"AHB", L"AHC", L"AHD", L"AHE", L"AHF", L"AHG", L"AHH", L"AHI", L"AHJ", L"AHK", L"AHL", L"AHM", L"AHN", L"AHO", L"AHP", L"AHQ", L"AHR", L"AHS", L"AHT", L"AHU", L"AHV", + static const wchar_t* m_aLetters[] = + { + L"A", L"B", L"C", L"D", L"E", L"F", L"G", L"H", L"I", L"J", L"K", L"L", L"M", L"N", L"O", L"P", L"Q", L"R", L"S", L"T", L"U", L"V", L"W", L"X", L"Y", L"Z", L"AA", L"AB", L"AC", L"AD", L"AE", L"AF", L"AG", L"AH", L"AI", L"AJ", L"AK", L"AL", L"AM", L"AN", L"AO", L"AP", L"AQ", L"AR", L"AS", L"AT", L"AU", L"AV", L"AW", L"AX", L"AY", L"AZ", L"BA", L"BB", L"BC", L"BD", L"BE", L"BF", L"BG", L"BH", L"BI", L"BJ", L"BK", L"BL", L"BM", L"BN", L"BO", L"BP", L"BQ", L"BR", L"BS", L"BT", L"BU", L"BV", L"BW", L"BX", L"BY", L"BZ", L"CA", L"CB", L"CC", L"CD", L"CE", L"CF", L"CG", L"CH", L"CI", L"CJ", L"CK", L"CL", L"CM", L"CN", L"CO", L"CP", L"CQ", L"CR", L"CS", L"CT", L"CU", L"CV", L"CW", L"CX", L"CY", L"CZ", L"DA", L"DB", L"DC", L"DD", L"DE", L"DF", L"DG", L"DH", L"DI", L"DJ", L"DK", L"DL", L"DM", L"DN", L"DO", L"DP", L"DQ", L"DR", L"DS", L"DT", L"DU", L"DV", L"DW", L"DX", L"DY", L"DZ", L"EA", L"EB", L"EC", L"ED", L"EE", L"EF", L"EG", L"EH", L"EI", L"EJ", L"EK", L"EL", L"EM", L"EN", L"EO", L"EP", L"EQ", L"ER", L"ES", L"ET", L"EU", L"EV", L"EW", L"EX", L"EY", L"EZ", L"FA", L"FB", L"FC", L"FD", L"FE", L"FF", L"FG", L"FH", L"FI", L"FJ", L"FK", L"FL", L"FM", L"FN", L"FO", L"FP", L"FQ", L"FR", L"FS", L"FT", L"FU", L"FV", L"FW", L"FX", L"FY", L"FZ", L"GA", L"GB", L"GC", L"GD", L"GE", L"GF", L"GG", L"GH", L"GI", L"GJ", L"GK", L"GL", L"GM", L"GN", L"GO", L"GP", L"GQ", L"GR", L"GS", L"GT", L"GU", L"GV", L"GW", L"GX", L"GY", L"GZ", L"HA", L"HB", L"HC", L"HD", L"HE", L"HF", L"HG", L"HH", L"HI", L"HJ", L"HK", L"HL", L"HM", L"HN", L"HO", L"HP", L"HQ", L"HR", L"HS", L"HT", L"HU", L"HV", L"HW", L"HX", L"HY", L"HZ", L"IA", L"IB", L"IC", L"ID", L"IE", L"IF", L"IG", L"IH", L"II", L"IJ", L"IK", L"IL", L"IM", L"IN", L"IO", L"IP", L"IQ", L"IR", L"IS", L"IT", L"IU", L"IV", L"IW", L"IX", L"IY", L"IZ", L"JA", L"JB", L"JC", L"JD", L"JE", L"JF", L"JG", L"JH", L"JI", L"JJ", L"JK", L"JL", L"JM", L"JN", L"JO", L"JP", L"JQ", L"JR", L"JS", L"JT", L"JU", L"JV", L"JW", L"JX", L"JY", L"JZ", L"KA", L"KB", L"KC", L"KD", L"KE", L"KF", L"KG", L"KH", L"KI", L"KJ", L"KK", L"KL", L"KM", L"KN", L"KO", L"KP", L"KQ", L"KR", L"KS", L"KT", L"KU", L"KV", L"KW", L"KX", L"KY", L"KZ", L"LA", L"LB", L"LC", L"LD", L"LE", L"LF", L"LG", L"LH", L"LI", L"LJ", L"LK", L"LL", L"LM", L"LN", L"LO", L"LP", L"LQ", L"LR", L"LS", L"LT", L"LU", L"LV", L"LW", L"LX", L"LY", L"LZ", L"MA", L"MB", L"MC", L"MD", L"ME", L"MF", L"MG", L"MH", L"MI", L"MJ", L"MK", L"ML", L"MM", L"MN", L"MO", L"MP", L"MQ", L"MR", L"MS", L"MT", L"MU", L"MV", L"MW", L"MX", L"MY", L"MZ", L"NA", L"NB", L"NC", L"ND", L"NE", L"NF", L"NG", L"NH", L"NI", L"NJ", L"NK", L"NL", L"NM", L"NN", L"NO", L"NP", L"NQ", L"NR", L"NS", L"NT", L"NU", L"NV", L"NW", L"NX", L"NY", L"NZ", L"OA", L"OB", L"OC", L"OD", L"OE", L"OF", L"OG", L"OH", L"OI", L"OJ", L"OK", L"OL", L"OM", L"ON", L"OO", L"OP", L"OQ", L"OR", L"OS", L"OT", L"OU", L"OV", L"OW", L"OX", L"OY", L"OZ", L"PA", L"PB", L"PC", L"PD", L"PE", L"PF", L"PG", L"PH", L"PI", L"PJ", L"PK", L"PL", L"PM", L"PN", L"PO", L"PP", L"PQ", L"PR", L"PS", L"PT", L"PU", L"PV", L"PW", L"PX", L"PY", L"PZ", L"QA", L"QB", L"QC", L"QD", L"QE", L"QF", L"QG", L"QH", L"QI", L"QJ", L"QK", L"QL", L"QM", L"QN", L"QO", L"QP", L"QQ", L"QR", L"QS", L"QT", L"QU", L"QV", L"QW", L"QX", L"QY", L"QZ", L"RA", L"RB", L"RC", L"RD", L"RE", L"RF", L"RG", L"RH", L"RI", L"RJ", L"RK", L"RL", L"RM", L"RN", L"RO", L"RP", L"RQ", L"RR", L"RS", L"RT", L"RU", L"RV", L"RW", L"RX", L"RY", L"RZ", L"SA", L"SB", L"SC", L"SD", L"SE", L"SF", L"SG", L"SH", L"SI", L"SJ", L"SK", L"SL", L"SM", L"SN", L"SO", L"SP", L"SQ", L"SR", L"SS", L"ST", L"SU", L"SV", L"SW", L"SX", L"SY", L"SZ", L"TA", L"TB", L"TC", L"TD", L"TE", L"TF", L"TG", L"TH", L"TI", L"TJ", L"TK", L"TL", L"TM", L"TN", L"TO", L"TP", L"TQ", L"TR", L"TS", L"TT", L"TU", L"TV", L"TW", L"TX", L"TY", L"TZ", L"UA", L"UB", L"UC", L"UD", L"UE", L"UF", L"UG", L"UH", L"UI", L"UJ", L"UK", L"UL", L"UM", L"UN", L"UO", L"UP", L"UQ", L"UR", L"US", L"UT", L"UU", L"UV", L"UW", L"UX", L"UY", L"UZ", L"VA", L"VB", L"VC", L"VD", L"VE", L"VF", L"VG", L"VH", L"VI", L"VJ", L"VK", L"VL", L"VM", L"VN", L"VO", L"VP", L"VQ", L"VR", L"VS", L"VT", L"VU", L"VV", L"VW", L"VX", L"VY", L"VZ", L"WA", L"WB", L"WC", L"WD", L"WE", L"WF", L"WG", L"WH", L"WI", L"WJ", L"WK", L"WL", L"WM", L"WN", L"WO", L"WP", L"WQ", L"WR", L"WS", L"WT", L"WU", L"WV", L"WW", L"WX", L"WY", + L"WZ", L"XA", L"XB", L"XC", L"XD", L"XE", L"XF", L"XG", L"XH", L"XI", L"XJ", L"XK", L"XL", L"XM", L"XN", L"XO", L"XP", L"XQ", L"XR", L"XS", L"XT", L"XU", L"XV", L"XW", L"XX", L"XY", L"XZ", L"YA", L"YB", L"YC", L"YD", L"YE", L"YF", L"YG", L"YH", L"YI", L"YJ", L"YK", L"YL", L"YM", L"YN", L"YO", L"YP", L"YQ", L"YR", L"YS", L"YT", L"YU", L"YV", L"YW", L"YX", L"YY", L"YZ", L"ZA", L"ZB", L"ZC", L"ZD", L"ZE", L"ZF", L"ZG", L"ZH", L"ZI", L"ZJ", L"ZK", L"ZL", L"ZM", L"ZN", L"ZO", L"ZP", L"ZQ", L"ZR", L"ZS", L"ZT", L"ZU", L"ZV", L"ZW", L"ZX", L"ZY", L"ZZ", L"AAA", L"AAB", L"AAC", L"AAD", L"AAE", L"AAF", L"AAG", L"AAH", L"AAI", L"AAJ", L"AAK", L"AAL", L"AAM", L"AAN", L"AAO", L"AAP", L"AAQ", L"AAR", L"AAS", L"AAT", L"AAU", L"AAV", L"AAW", L"AAX", L"AAY", L"AAZ", L"ABA", L"ABB", L"ABC", L"ABD", L"ABE", L"ABF", L"ABG", L"ABH", L"ABI", L"ABJ", L"ABK", L"ABL", L"ABM", L"ABN", L"ABO", L"ABP", L"ABQ", L"ABR", L"ABS", L"ABT", L"ABU", L"ABV", L"ABW", L"ABX", L"ABY", L"ABZ", L"ACA", L"ACB", L"ACC", L"ACD", L"ACE", L"ACF", L"ACG", L"ACH", L"ACI", L"ACJ", L"ACK", L"ACL", L"ACM", L"ACN", L"ACO", L"ACP", L"ACQ", L"ACR", L"ACS", L"ACT", L"ACU", L"ACV", L"ACW", L"ACX", L"ACY", L"ACZ", L"ADA", L"ADB", L"ADC", L"ADD", L"ADE", L"ADF", L"ADG", L"ADH", L"ADI", L"ADJ", L"ADK", L"ADL", L"ADM", L"ADN", L"ADO", L"ADP", L"ADQ", L"ADR", L"ADS", L"ADT", L"ADU", L"ADV", L"ADW", L"ADX", L"ADY", L"ADZ", L"AEA", L"AEB", L"AEC", L"AED", L"AEE", L"AEF", L"AEG", L"AEH", L"AEI", L"AEJ", L"AEK", L"AEL", L"AEM", L"AEN", L"AEO", L"AEP", L"AEQ", L"AER", L"AES", L"AET", L"AEU", L"AEV", L"AEW", L"AEX", L"AEY", L"AEZ", L"AFA", L"AFB", L"AFC", L"AFD", L"AFE", L"AFF", L"AFG", L"AFH", L"AFI", L"AFJ", L"AFK", L"AFL", L"AFM", L"AFN", L"AFO", L"AFP", L"AFQ", L"AFR", L"AFS", L"AFT", L"AFU", L"AFV", L"AFW", L"AFX", L"AFY", L"AFZ", L"AGA", L"AGB", L"AGC", L"AGD", L"AGE", L"AGF", L"AGG", L"AGH", L"AGI", L"AGJ", L"AGK", L"AGL", L"AGM", L"AGN", L"AGO", L"AGP", L"AGQ", L"AGR", L"AGS", L"AGT", L"AGU", L"AGV", L"AGW", L"AGX", L"AGY", L"AGZ", L"AHA", L"AHB", L"AHC", L"AHD", L"AHE", L"AHF", L"AHG", L"AHH", L"AHI", L"AHJ", L"AHK", L"AHL", L"AHM", L"AHN", L"AHO", L"AHP", L"AHQ", L"AHR", L"AHS", L"AHT", L"AHU", L"AHV", L"AHW", L"AHX", L"AHY", L"AHZ", L"AIA", L"AIB", L"AIC", L"AID", L"AIE", L"AIF", L"AIG", L"AIH", L"AII", L"AIJ", L"AIK", L"AIL", L"AIM", L"AIN", L"AIO", L"AIP", L"AIQ", L"AIR", L"AIS", L"AIT", L"AIU", L"AIV", L"AIW", L"AIX", L"AIY", L"AIZ", L"AJA", L"AJB", L"AJC", L"AJD", L"AJE", L"AJF", L"AJG", L"AJH", L"AJI", L"AJJ", L"AJK", L"AJL", L"AJM", L"AJN", L"AJO", L"AJP", L"AJQ", L"AJR", L"AJS", L"AJT", L"AJU", L"AJV", L"AJW", L"AJX", L"AJY", L"AJZ", L"AKA", L"AKB", L"AKC", L"AKD", L"AKE", L"AKF", L"AKG", L"AKH", L"AKI", L"AKJ", L"AKK", L"AKL", L"AKM", L"AKN", L"AKO", L"AKP", L"AKQ", L"AKR", L"AKS", L"AKT", L"AKU", L"AKV", L"AKW", L"AKX", L"AKY", L"AKZ", L"ALA", L"ALB", L"ALC", L"ALD", L"ALE", L"ALF", L"ALG", L"ALH", L"ALI", L"ALJ", L"ALK", L"ALL", L"ALM", L"ALN", L"ALO", L"ALP", L"ALQ", L"ALR", L"ALS", L"ALT", L"ALU", L"ALV", L"ALW", L"ALX", L"ALY", L"ALZ", L"AMA", L"AMB", L"AMC", L"AMD", L"AME", L"AMF", L"AMG", L"AMH", L"AMI", L"AMJ", L"AMK", L"AML", L"AMM", L"AMN", L"AMO", L"AMP", L"AMQ", L"AMR", L"AMS", L"AMT", L"AMU", L"AMV", L"AMW", L"AMX", L"AMY", L"AMZ", L"ANA", L"ANB", L"ANC", L"AND", L"ANE", L"ANF", L"ANG", L"ANH", L"ANI", L"ANJ", L"ANK", L"ANL", L"ANM", L"ANN", L"ANO", L"ANP", L"ANQ", L"ANR", L"ANS", L"ANT", L"ANU", L"ANV", L"ANW", L"ANX", L"ANY", L"ANZ", L"AOA", L"AOB", L"AOC", L"AOD", L"AOE", L"AOF", L"AOG", L"AOH", L"AOI", L"AOJ", L"AOK", L"AOL", L"AOM", L"AON", L"AOO", L"AOP", L"AOQ", L"AOR", L"AOS", L"AOT", L"AOU", L"AOV", L"AOW", L"AOX", L"AOY", L"AOZ", L"APA", L"APB", L"APC", L"APD", L"APE", L"APF", L"APG", L"APH", L"API", L"APJ", L"APK", L"APL", L"APM", L"APN", L"APO", L"APP", L"APQ", L"APR", L"APS", L"APT", L"APU", L"APV", L"APW", L"APX", L"APY", L"APZ", L"AQA", L"AQB", L"AQC", L"AQD", L"AQE", L"AQF", L"AQG", L"AQH", L"AQI", L"AQJ", L"AQK", L"AQL", L"AQM", L"AQN", L"AQO", L"AQP", L"AQQ", L"AQR", L"AQS", L"AQT", L"AQU", L"AQV", L"AQW", L"AQX", L"AQY", L"AQZ", L"ARA", L"ARB", L"ARC", L"ARD", L"ARE", L"ARF", L"ARG", L"ARH", L"ARI", L"ARJ", L"ARK", L"ARL", L"ARM", L"ARN", L"ARO", L"ARP", L"ARQ", L"ARR", L"ARS", L"ART", L"ARU", L"ARV", L"ARW", L"ARX", L"ARY", L"ARZ", L"ASA", L"ASB", L"ASC", L"ASD", L"ASE", L"ASF", L"ASG", L"ASH", L"ASI", L"ASJ", L"ASK", L"ASL", L"ASM", L"ASN", L"ASO", L"ASP", L"ASQ", L"ASR", L"ASS", L"AST", L"ASU", L"ASV", L"ASW", L"ASX", L"ASY", L"ASZ", L"ATA", L"ATB", L"ATC", L"ATD", L"ATE", L"ATF", L"ATG", L"ATH", L"ATI", L"ATJ", L"ATK", L"ATL", L"ATM", L"ATN", L"ATO", L"ATP", L"ATQ", L"ATR", L"ATS", L"ATT", L"ATU", L"ATV", L"ATW", L"ATX", L"ATY", L"ATZ", L"AUA", L"AUB", L"AUC", L"AUD", L"AUE", L"AUF", L"AUG", L"AUH", L"AUI", L"AUJ", L"AUK", L"AUL", L"AUM", L"AUN", L"AUO", L"AUP", L"AUQ", L"AUR", L"AUS", L"AUT", L"AUU", L"AUV", L"AUW", L"AUX", L"AUY", L"AUZ", L"AVA", L"AVB", L"AVC", L"AVD", L"AVE", L"AVF", L"AVG", L"AVH", L"AVI", L"AVJ", L"AVK", L"AVL", L"AVM", L"AVN", L"AVO", L"AVP", L"AVQ", L"AVR", L"AVS", L"AVT", L"AVU", L"AVV", L"AVW", L"AVX", L"AVY", L"AVZ", L"AWA", L"AWB", L"AWC", L"AWD", L"AWE", L"AWF", L"AWG", L"AWH", L"AWI", L"AWJ", L"AWK", L"AWL", L"AWM", L"AWN", L"AWO", L"AWP", L"AWQ", L"AWR", L"AWS", L"AWT", L"AWU", L"AWV", L"AWW", L"AWX", L"AWY", L"AWZ", L"AXA", L"AXB", L"AXC", L"AXD", L"AXE", L"AXF", L"AXG", L"AXH", L"AXI", L"AXJ", L"AXK", L"AXL", L"AXM", L"AXN", L"AXO", L"AXP", L"AXQ", L"AXR", L"AXS", L"AXT", L"AXU", L"AXV", L"AXW", L"AXX", L"AXY", L"AXZ", L"AYA", L"AYB", L"AYC", L"AYD", L"AYE", L"AYF", L"AYG", L"AYH", L"AYI", L"AYJ", L"AYK", L"AYL", L"AYM", L"AYN", L"AYO", L"AYP", L"AYQ", L"AYR", L"AYS", L"AYT", L"AYU", L"AYV", L"AYW", L"AYX", L"AYY", L"AYZ", L"AZA", L"AZB", L"AZC", L"AZD", L"AZE", L"AZF", L"AZG", L"AZH", L"AZI", L"AZJ", L"AZK", L"AZL", L"AZM", L"AZN", L"AZO", L"AZP", L"AZQ", L"AZR", L"AZS", L"AZT", L"AZU", L"AZV", L"AZW", L"AZX", L"AZY", L"AZZ", L"BAA", L"BAB", L"BAC", L"BAD", L"BAE", L"BAF", L"BAG", L"BAH", L"BAI", L"BAJ", L"BAK", L"BAL", L"BAM", L"BAN", L"BAO", L"BAP", L"BAQ", L"BAR", L"BAS", L"BAT", L"BAU", L"BAV", L"BAW", L"BAX", L"BAY", L"BAZ", L"BBA", L"BBB", L"BBC", L"BBD", L"BBE", L"BBF", L"BBG", L"BBH", L"BBI", L"BBJ", L"BBK", L"BBL", L"BBM", L"BBN", L"BBO", L"BBP", L"BBQ", L"BBR", L"BBS", L"BBT", L"BBU", L"BBV", L"BBW", L"BBX", L"BBY", L"BBZ", L"BCA", L"BCB", L"BCC", L"BCD", L"BCE", L"BCF", L"BCG", L"BCH", L"BCI", L"BCJ", L"BCK", L"BCL", L"BCM", L"BCN", L"BCO", L"BCP", L"BCQ", L"BCR", L"BCS", L"BCT", L"BCU", L"BCV", L"BCW", L"BCX", L"BCY", L"BCZ", L"BDA", L"BDB", L"BDC", L"BDD", L"BDE", L"BDF", L"BDG", L"BDH", L"BDI", L"BDJ", L"BDK", L"BDL", L"BDM", L"BDN", L"BDO", L"BDP", L"BDQ", L"BDR", L"BDS", L"BDT", L"BDU", L"BDV", L"BDW", L"BDX", L"BDY", L"BDZ", L"BEA", L"BEB", L"BEC", L"BED", L"BEE", L"BEF", L"BEG", L"BEH", L"BEI", L"BEJ", L"BEK", L"BEL", L"BEM", L"BEN", L"BEO", L"BEP", L"BEQ", L"BER", L"BES", L"BET", L"BEU", L"BEV", L"BEW", L"BEX", L"BEY", L"BEZ", L"BFA", L"BFB", L"BFC", L"BFD", L"BFE", L"BFF", L"BFG", L"BFH", L"BFI", L"BFJ", L"BFK", L"BFL", L"BFM", L"BFN", L"BFO", L"BFP", L"BFQ", L"BFR", L"BFS", L"BFT", L"BFU", L"BFV", L"BFW", L"BFX", L"BFY", L"BFZ", L"BGA", L"BGB", L"BGC", L"BGD", L"BGE", L"BGF", L"BGG", L"BGH", L"BGI", L"BGJ", L"BGK", L"BGL", L"BGM", L"BGN", L"BGO", L"BGP", L"BGQ", L"BGR", L"BGS", L"BGT", L"BGU", L"BGV", L"BGW", L"BGX", L"BGY", L"BGZ", L"BHA", L"BHB", L"BHC", L"BHD", L"BHE", L"BHF", L"BHG", L"BHH", L"BHI", L"BHJ", L"BHK", L"BHL", L"BHM", L"BHN", L"BHO", L"BHP", L"BHQ", L"BHR", L"BHS", L"BHT", L"BHU", L"BHV", L"BHW", L"BHX", L"BHY", L"BHZ", L"BIA", L"BIB", L"BIC", L"BID", L"BIE", L"BIF", L"BIG", L"BIH", L"BII", L"BIJ", L"BIK", L"BIL", L"BIM", L"BIN", L"BIO", L"BIP", L"BIQ", L"BIR", L"BIS", L"BIT", L"BIU", L"BIV", L"BIW", L"BIX", L"BIY", L"BIZ", L"BJA", L"BJB", L"BJC", L"BJD", L"BJE", L"BJF", L"BJG", L"BJH", L"BJI", L"BJJ", L"BJK", L"BJL", L"BJM", L"BJN", L"BJO", L"BJP", L"BJQ", L"BJR", L"BJS", L"BJT", L"BJU", L"BJV", L"BJW", L"BJX", L"BJY", L"BJZ", L"BKA", L"BKB", L"BKC", L"BKD", L"BKE", L"BKF", L"BKG", L"BKH", L"BKI", L"BKJ", L"BKK", L"BKL", L"BKM", L"BKN", L"BKO", L"BKP", L"BKQ", L"BKR", L"BKS", L"BKT", L"BKU", L"BKV", L"BKW", L"BKX", L"BKY", L"BKZ", L"BLA", L"BLB", L"BLC", L"BLD", L"BLE", L"BLF", L"BLG", L"BLH", L"BLI", L"BLJ", L"BLK", L"BLL", L"BLM", L"BLN", L"BLO", L"BLP", L"BLQ", L"BLR", L"BLS", L"BLT", L"BLU", L"BLV", L"BLW", L"BLX", L"BLY", L"BLZ", L"BMA", L"BMB", L"BMC", L"BMD", L"BME", L"BMF", L"BMG", L"BMH", L"BMI", L"BMJ", L"BMK", L"BML", L"BMM", L"BMN", L"BMO", L"BMP", L"BMQ", L"BMR", L"BMS", L"BMT", L"BMU", L"BMV", L"BMW", L"BMX", L"BMY", L"BMZ", L"BNA", L"BNB", L"BNC", L"BND", L"BNE", L"BNF", L"BNG", L"BNH", L"BNI", L"BNJ", L"BNK", L"BNL", L"BNM", L"BNN", L"BNO", L"BNP", L"BNQ", L"BNR", L"BNS", L"BNT", L"BNU", L"BNV", L"BNW", L"BNX", L"BNY", L"BNZ", L"BOA", L"BOB", L"BOC", L"BOD", L"BOE", L"BOF", L"BOG", L"BOH", L"BOI", L"BOJ", L"BOK", L"BOL", L"BOM", L"BON", L"BOO", L"BOP", L"BOQ", L"BOR", L"BOS", L"BOT", L"BOU", L"BOV", L"BOW", L"BOX", L"BOY", L"BOZ", L"BPA", L"BPB", L"BPC", L"BPD", L"BPE", L"BPF", L"BPG", L"BPH", L"BPI", L"BPJ", L"BPK", L"BPL", L"BPM", L"BPN", L"BPO", L"BPP", L"BPQ", L"BPR", L"BPS", L"BPT", L"BPU", L"BPV", L"BPW", L"BPX", L"BPY", L"BPZ", L"BQA", L"BQB", L"BQC", L"BQD", L"BQE", L"BQF", L"BQG", L"BQH", L"BQI", L"BQJ", L"BQK", L"BQL", L"BQM", L"BQN", L"BQO", L"BQP", L"BQQ", L"BQR", L"BQS", L"BQT", L"BQU", L"BQV", L"BQW", L"BQX", L"BQY", L"BQZ", L"BRA", L"BRB", L"BRC", L"BRD", L"BRE", L"BRF", L"BRG", L"BRH", L"BRI", L"BRJ", L"BRK", L"BRL", L"BRM", L"BRN", L"BRO", L"BRP", L"BRQ", L"BRR", L"BRS", L"BRT", L"BRU", L"BRV", L"BRW", L"BRX", L"BRY", L"BRZ", L"BSA", L"BSB", L"BSC", L"BSD", L"BSE", L"BSF", L"BSG", L"BSH", L"BSI", L"BSJ", L"BSK", L"BSL", L"BSM", L"BSN", L"BSO", L"BSP", L"BSQ", L"BSR", L"BSS", L"BST", L"BSU", L"BSV", L"BSW", L"BSX", L"BSY", L"BSZ", L"BTA", L"BTB", L"BTC", L"BTD", L"BTE", L"BTF", L"BTG", L"BTH", L"BTI", L"BTJ", L"BTK", L"BTL", L"BTM", L"BTN", L"BTO", L"BTP", L"BTQ", L"BTR", L"BTS", L"BTT", L"BTU", L"BTV", L"BTW", L"BTX", L"BTY", L"BTZ", L"BUA", L"BUB", L"BUC", L"BUD", L"BUE", L"BUF", L"BUG", L"BUH", L"BUI", L"BUJ", L"BUK", L"BUL", L"BUM", L"BUN", L"BUO", L"BUP", L"BUQ", L"BUR", L"BUS", L"BUT", L"BUU", L"BUV", L"BUW", L"BUX", L"BUY", L"BUZ", L"BVA", L"BVB", L"BVC", L"BVD", L"BVE", L"BVF", L"BVG", L"BVH", L"BVI", L"BVJ", L"BVK", L"BVL", L"BVM", L"BVN", L"BVO", L"BVP", L"BVQ", L"BVR", L"BVS", L"BVT", L"BVU", L"BVV", L"BVW", L"BVX", L"BVY", L"BVZ", L"BWA", L"BWB", L"BWC", L"BWD", L"BWE", L"BWF", L"BWG", L"BWH", L"BWI", L"BWJ", L"BWK", L"BWL", L"BWM", L"BWN", L"BWO", L"BWP", L"BWQ", L"BWR", L"BWS", L"BWT", L"BWU", L"BWV", L"BWW", L"BWX", L"BWY", L"BWZ", L"BXA", L"BXB", L"BXC", L"BXD", L"BXE", L"BXF", L"BXG", L"BXH", L"BXI", L"BXJ", L"BXK", L"BXL", L"BXM", L"BXN", L"BXO", L"BXP", L"BXQ", L"BXR", L"BXS", L"BXT", L"BXU", L"BXV", L"BXW", L"BXX", L"BXY", L"BXZ", L"BYA", L"BYB", L"BYC", L"BYD", L"BYE", L"BYF", L"BYG", L"BYH", L"BYI", L"BYJ", L"BYK", L"BYL", L"BYM", L"BYN", L"BYO", L"BYP", L"BYQ", L"BYR", L"BYS", L"BYT", L"BYU", L"BYV", L"BYW", L"BYX", L"BYY", L"BYZ", L"BZA", L"BZB", L"BZC", L"BZD", L"BZE", L"BZF", L"BZG", L"BZH", L"BZI", L"BZJ", L"BZK", L"BZL", L"BZM", L"BZN", L"BZO", L"BZP", L"BZQ", L"BZR", L"BZS", L"BZT", L"BZU", L"BZV", L"BZW", L"BZX", L"BZY", L"BZZ", L"CAA", L"CAB", L"CAC", L"CAD", L"CAE", L"CAF", L"CAG", L"CAH", L"CAI", L"CAJ", L"CAK", L"CAL", L"CAM", L"CAN", L"CAO", L"CAP", L"CAQ", L"CAR", L"CAS", L"CAT", L"CAU", L"CAV", L"CAW", L"CAX", L"CAY", L"CAZ", L"CBA", L"CBB", L"CBC", L"CBD", L"CBE", L"CBF", L"CBG", L"CBH", L"CBI", L"CBJ", L"CBK", L"CBL", L"CBM", L"CBN", L"CBO", L"CBP", L"CBQ", L"CBR", L"CBS", L"CBT", L"CBU", L"CBV", L"CBW", L"CBX", L"CBY", L"CBZ", L"CCA", L"CCB", L"CCC", L"CCD", L"CCE", L"CCF", L"CCG", L"CCH", L"CCI", L"CCJ", L"CCK", L"CCL", L"CCM", L"CCN", L"CCO", L"CCP", L"CCQ", L"CCR", L"CCS", L"CCT", L"CCU", L"CCV", L"CCW", L"CCX", L"CCY", L"CCZ", L"CDA", L"CDB", L"CDC", L"CDD", L"CDE", L"CDF", L"CDG", L"CDH", L"CDI", L"CDJ", L"CDK", L"CDL", L"CDM", L"CDN", L"CDO", L"CDP", L"CDQ", L"CDR", L"CDS", L"CDT", L"CDU", L"CDV", L"CDW", L"CDX", L"CDY", L"CDZ", L"CEA", L"CEB", L"CEC", L"CED", L"CEE", L"CEF", L"CEG", L"CEH", L"CEI", L"CEJ", L"CEK", L"CEL", L"CEM", L"CEN", L"CEO", L"CEP", L"CEQ", L"CER", L"CES", L"CET", L"CEU", L"CEV", L"CEW", L"CEX", L"CEY", L"CEZ", L"CFA", L"CFB", L"CFC", L"CFD", L"CFE", L"CFF", L"CFG", L"CFH", L"CFI", L"CFJ", L"CFK", L"CFL", L"CFM", L"CFN", L"CFO", L"CFP", L"CFQ", L"CFR", L"CFS", L"CFT", L"CFU", L"CFV", L"CFW", L"CFX", L"CFY", L"CFZ", L"CGA", L"CGB", L"CGC", L"CGD", L"CGE", L"CGF", L"CGG", L"CGH", L"CGI", L"CGJ", L"CGK", L"CGL", L"CGM", L"CGN", L"CGO", L"CGP", L"CGQ", L"CGR", L"CGS", L"CGT", L"CGU", L"CGV", L"CGW", L"CGX", L"CGY", L"CGZ", L"CHA", L"CHB", L"CHC", L"CHD", L"CHE", L"CHF", L"CHG", L"CHH", L"CHI", L"CHJ", L"CHK", L"CHL", L"CHM", L"CHN", L"CHO", L"CHP", L"CHQ", L"CHR", L"CHS", L"CHT", L"CHU", L"CHV", L"CHW", L"CHX", L"CHY", L"CHZ", L"CIA", L"CIB", L"CIC", L"CID", L"CIE", L"CIF", L"CIG", L"CIH", L"CII", L"CIJ", L"CIK", L"CIL", L"CIM", L"CIN", L"CIO", L"CIP", L"CIQ", L"CIR", L"CIS", L"CIT", L"CIU", L"CIV", L"CIW", L"CIX", L"CIY", L"CIZ", L"CJA", L"CJB", L"CJC", L"CJD", L"CJE", L"CJF", L"CJG", L"CJH", L"CJI", L"CJJ", L"CJK", L"CJL", L"CJM", L"CJN", L"CJO", L"CJP", L"CJQ", L"CJR", L"CJS", L"CJT", L"CJU", L"CJV", L"CJW", L"CJX", L"CJY", L"CJZ", L"CKA", L"CKB", L"CKC", L"CKD", L"CKE", L"CKF", L"CKG", L"CKH", L"CKI", L"CKJ", L"CKK", L"CKL", L"CKM", L"CKN", L"CKO", L"CKP", L"CKQ", L"CKR", L"CKS", L"CKT", L"CKU", L"CKV", L"CKW", L"CKX", L"CKY", L"CKZ", L"CLA", L"CLB", L"CLC", L"CLD", L"CLE", L"CLF", L"CLG", L"CLH", L"CLI", L"CLJ", L"CLK", L"CLL", L"CLM", L"CLN", L"CLO", L"CLP", L"CLQ", L"CLR", L"CLS", L"CLT", L"CLU", L"CLV", L"CLW", L"CLX", L"CLY", L"CLZ", L"CMA", L"CMB", L"CMC", L"CMD", L"CME", L"CMF", L"CMG", L"CMH", L"CMI", L"CMJ", L"CMK", L"CML", L"CMM", L"CMN", L"CMO", L"CMP", L"CMQ", L"CMR", L"CMS", L"CMT", L"CMU", L"CMV", L"CMW", L"CMX", L"CMY", L"CMZ", L"CNA", L"CNB", L"CNC", L"CND", L"CNE", L"CNF", L"CNG", L"CNH", L"CNI", L"CNJ", L"CNK", L"CNL", L"CNM", L"CNN", L"CNO", L"CNP", L"CNQ", L"CNR", L"CNS", L"CNT", L"CNU", L"CNV", L"CNW", L"CNX", L"CNY", L"CNZ", L"COA", L"COB", L"COC", L"COD", L"COE", L"COF", L"COG", L"COH", L"COI", L"COJ", L"COK", L"COL", L"COM", L"CON", L"COO", L"COP", L"COQ", L"COR", L"COS", L"COT", L"COU", L"COV", L"COW", L"COX", L"COY", L"COZ", L"CPA", L"CPB", L"CPC", L"CPD", L"CPE", L"CPF", L"CPG", L"CPH", L"CPI", L"CPJ", L"CPK", L"CPL", L"CPM", L"CPN", L"CPO", L"CPP", L"CPQ", L"CPR", L"CPS", L"CPT", L"CPU", L"CPV", L"CPW", L"CPX", L"CPY", L"CPZ", L"CQA", L"CQB", L"CQC", L"CQD", L"CQE", L"CQF", L"CQG", L"CQH", L"CQI", L"CQJ", L"CQK", L"CQL", L"CQM", L"CQN", L"CQO", L"CQP", L"CQQ", L"CQR", L"CQS", L"CQT", L"CQU", L"CQV", L"CQW", L"CQX", L"CQY", L"CQZ", L"CRA", L"CRB", L"CRC", L"CRD", L"CRE", L"CRF", L"CRG", L"CRH", L"CRI", L"CRJ", L"CRK", L"CRL", L"CRM", L"CRN", L"CRO", L"CRP", L"CRQ", L"CRR", L"CRS", L"CRT", L"CRU", L"CRV", L"CRW", L"CRX", L"CRY", L"CRZ", L"CSA", L"CSB", L"CSC", L"CSD", L"CSE", L"CSF", L"CSG", L"CSH", L"CSI", L"CSJ", L"CSK", L"CSL", L"CSM", L"CSN", L"CSO", L"CSP", L"CSQ", L"CSR", L"CSS", L"CST", L"CSU", L"CSV", L"CSW", L"CSX", L"CSY", L"CSZ", L"CTA", L"CTB", L"CTC", L"CTD", L"CTE", L"CTF", L"CTG", L"CTH", L"CTI", L"CTJ", L"CTK", L"CTL", L"CTM", L"CTN", L"CTO", L"CTP", L"CTQ", L"CTR", L"CTS", L"CTT", L"CTU", L"CTV", L"CTW", L"CTX", L"CTY", L"CTZ", L"CUA", L"CUB", L"CUC", L"CUD", L"CUE", L"CUF", L"CUG", L"CUH", L"CUI", L"CUJ", L"CUK", L"CUL", L"CUM", L"CUN", L"CUO", L"CUP", L"CUQ", L"CUR", L"CUS", L"CUT", L"CUU", L"CUV", L"CUW", L"CUX", L"CUY", L"CUZ", L"CVA", L"CVB", L"CVC", L"CVD", L"CVE", L"CVF", L"CVG", L"CVH", L"CVI", L"CVJ", L"CVK", L"CVL", L"CVM", L"CVN", L"CVO", L"CVP", L"CVQ", L"CVR", L"CVS", L"CVT", L"CVU", L"CVV", L"CVW", L"CVX", L"CVY", L"CVZ", L"CWA", L"CWB", L"CWC", L"CWD", L"CWE", L"CWF", L"CWG", L"CWH", L"CWI", L"CWJ", L"CWK", L"CWL", L"CWM", L"CWN", L"CWO", L"CWP", L"CWQ", L"CWR", L"CWS", L"CWT", L"CWU", L"CWV", L"CWW", L"CWX", L"CWY", L"CWZ", L"CXA", L"CXB", L"CXC", L"CXD", L"CXE", L"CXF", L"CXG", L"CXH", L"CXI", L"CXJ", L"CXK", L"CXL", L"CXM", L"CXN", L"CXO", L"CXP", L"CXQ", L"CXR", L"CXS", L"CXT", L"CXU", L"CXV", L"CXW", L"CXX", L"CXY", L"CXZ", L"CYA", L"CYB", L"CYC", L"CYD", L"CYE", L"CYF", L"CYG", L"CYH", L"CYI", L"CYJ", L"CYK", L"CYL", L"CYM", L"CYN", L"CYO", L"CYP", L"CYQ", L"CYR", L"CYS", L"CYT", L"CYU", L"CYV", L"CYW", L"CYX", L"CYY", L"CYZ", L"CZA", L"CZB", L"CZC", L"CZD", L"CZE", L"CZF", L"CZG", L"CZH", L"CZI", L"CZJ", L"CZK", L"CZL", L"CZM", L"CZN", L"CZO", L"CZP", L"CZQ", L"CZR", L"CZS", L"CZT", L"CZU", L"CZV", L"CZW", L"CZX", L"CZY", L"CZZ", L"DAA", L"DAB", L"DAC", L"DAD", L"DAE", L"DAF", L"DAG", L"DAH", L"DAI", L"DAJ", L"DAK", L"DAL", L"DAM", L"DAN", L"DAO", L"DAP", L"DAQ", L"DAR", L"DAS", L"DAT", L"DAU", L"DAV", L"DAW", L"DAX", L"DAY", L"DAZ", L"DBA", L"DBB", L"DBC", L"DBD", L"DBE", L"DBF", L"DBG", L"DBH", L"DBI", L"DBJ", L"DBK", L"DBL", L"DBM", L"DBN", L"DBO", L"DBP", L"DBQ", L"DBR", L"DBS", L"DBT", L"DBU", L"DBV", L"DBW", L"DBX", L"DBY", L"DBZ", L"DCA", L"DCB", L"DCC", L"DCD", L"DCE", L"DCF", L"DCG", L"DCH", L"DCI", L"DCJ", L"DCK", L"DCL", L"DCM", L"DCN", L"DCO", L"DCP", L"DCQ", L"DCR", L"DCS", L"DCT", L"DCU", L"DCV", L"DCW", L"DCX", L"DCY", L"DCZ", L"DDA", - L"DDB", L"DDC", L"DDD", L"DDE", L"DDF", L"DDG", L"DDH", L"DDI", L"DDJ", L"DDK", L"DDL", L"DDM", L"DDN", L"DDO", L"DDP", L"DDQ", L"DDR", L"DDS", L"DDT", L"DDU", L"DDV", L"DDW", L"DDX", L"DDY", L"DDZ", L"DEA", L"DEB", L"DEC", L"DED", L"DEE", L"DEF", L"DEG", L"DEH", L"DEI", L"DEJ", L"DEK", L"DEL", L"DEM", L"DEN", L"DEO", L"DEP", L"DEQ", L"DER", L"DES", L"DET", L"DEU", L"DEV", L"DEW", L"DEX", L"DEY", L"DEZ", L"DFA", L"DFB", L"DFC", L"DFD", L"DFE", L"DFF", L"DFG", L"DFH", L"DFI", L"DFJ", L"DFK", L"DFL", L"DFM", L"DFN", L"DFO", L"DFP", L"DFQ", L"DFR", L"DFS", L"DFT", L"DFU", L"DFV", L"DFW", L"DFX", L"DFY", L"DFZ", L"DGA", L"DGB", L"DGC", L"DGD", L"DGE", L"DGF", L"DGG", L"DGH", L"DGI", L"DGJ", L"DGK", L"DGL", L"DGM", L"DGN", L"DGO", L"DGP", L"DGQ", L"DGR", L"DGS", L"DGT", L"DGU", L"DGV", L"DGW", L"DGX", L"DGY", L"DGZ", L"DHA", L"DHB", L"DHC", L"DHD", L"DHE", L"DHF", L"DHG", L"DHH", L"DHI", L"DHJ", L"DHK", L"DHL", L"DHM", L"DHN", L"DHO", L"DHP", L"DHQ", L"DHR", L"DHS", L"DHT", L"DHU", L"DHV", L"DHW", L"DHX", L"DHY", L"DHZ", L"DIA", L"DIB", L"DIC", L"DID", L"DIE", L"DIF", L"DIG", L"DIH", L"DII", L"DIJ", L"DIK", L"DIL", L"DIM", L"DIN", L"DIO", L"DIP", L"DIQ", L"DIR", L"DIS", L"DIT", L"DIU", L"DIV", L"DIW", L"DIX", L"DIY", L"DIZ", L"DJA", L"DJB", L"DJC", L"DJD", L"DJE", L"DJF", L"DJG", L"DJH", L"DJI", L"DJJ", L"DJK", L"DJL", L"DJM", L"DJN", L"DJO", L"DJP", L"DJQ", L"DJR", L"DJS", L"DJT", L"DJU", L"DJV", L"DJW", L"DJX", L"DJY", L"DJZ", L"DKA", L"DKB", L"DKC", L"DKD", L"DKE", L"DKF", L"DKG", L"DKH", L"DKI", L"DKJ", L"DKK", L"DKL", L"DKM", L"DKN", L"DKO", L"DKP", L"DKQ", L"DKR", L"DKS", L"DKT", L"DKU", L"DKV", L"DKW", L"DKX", L"DKY", L"DKZ", L"DLA", L"DLB", L"DLC", L"DLD", L"DLE", L"DLF", L"DLG", L"DLH", L"DLI", L"DLJ", L"DLK", L"DLL", L"DLM", L"DLN", L"DLO", L"DLP", L"DLQ", L"DLR", L"DLS", L"DLT", L"DLU", L"DLV", L"DLW", L"DLX", L"DLY", L"DLZ", L"DMA", L"DMB", L"DMC", L"DMD", L"DME", L"DMF", L"DMG", L"DMH", L"DMI", L"DMJ", L"DMK", L"DML", L"DMM", L"DMN", L"DMO", L"DMP", L"DMQ", L"DMR", L"DMS", L"DMT", L"DMU", L"DMV", L"DMW", L"DMX", L"DMY", L"DMZ", L"DNA", L"DNB", L"DNC", L"DND", L"DNE", L"DNF", L"DNG", L"DNH", L"DNI", L"DNJ", L"DNK", L"DNL", L"DNM", L"DNN", L"DNO", L"DNP", L"DNQ", L"DNR", L"DNS", L"DNT", L"DNU", L"DNV", L"DNW", L"DNX", L"DNY", L"DNZ", L"DOA", L"DOB", L"DOC", L"DOD", L"DOE", L"DOF", L"DOG", L"DOH", L"DOI", L"DOJ", L"DOK", L"DOL", L"DOM", L"DON", L"DOO", L"DOP", L"DOQ", L"DOR", L"DOS", L"DOT", L"DOU", L"DOV", L"DOW", L"DOX", L"DOY", L"DOZ", L"DPA", L"DPB", L"DPC", L"DPD", L"DPE", L"DPF", L"DPG", L"DPH", L"DPI", L"DPJ", L"DPK", L"DPL", L"DPM", L"DPN", L"DPO", L"DPP", L"DPQ", L"DPR", L"DPS", L"DPT", L"DPU", L"DPV", L"DPW", L"DPX", L"DPY", L"DPZ", L"DQA", L"DQB", L"DQC", L"DQD", L"DQE", L"DQF", L"DQG", L"DQH", L"DQI", L"DQJ", L"DQK", L"DQL", L"DQM", L"DQN", L"DQO", L"DQP", L"DQQ", L"DQR", L"DQS", L"DQT", L"DQU", L"DQV", L"DQW", L"DQX", L"DQY", L"DQZ", L"DRA", L"DRB", L"DRC", L"DRD", L"DRE", L"DRF", L"DRG", L"DRH", L"DRI", L"DRJ", L"DRK", L"DRL", L"DRM", L"DRN", L"DRO", L"DRP", L"DRQ", L"DRR", L"DRS", L"DRT", L"DRU", L"DRV", L"DRW", L"DRX", L"DRY", L"DRZ", L"DSA", L"DSB", L"DSC", L"DSD", L"DSE", L"DSF", L"DSG", L"DSH", L"DSI", L"DSJ", L"DSK", L"DSL", L"DSM", L"DSN", L"DSO", L"DSP", L"DSQ", L"DSR", L"DSS", L"DST", L"DSU", L"DSV", L"DSW", L"DSX", L"DSY", L"DSZ", L"DTA", L"DTB", L"DTC", L"DTD", L"DTE", L"DTF", L"DTG", L"DTH", L"DTI", L"DTJ", L"DTK", L"DTL", L"DTM", L"DTN", L"DTO", L"DTP", L"DTQ", L"DTR", L"DTS", L"DTT", L"DTU", L"DTV", L"DTW", L"DTX", L"DTY", L"DTZ", L"DUA", L"DUB", L"DUC", L"DUD", L"DUE", L"DUF", L"DUG", L"DUH", L"DUI", L"DUJ", L"DUK", L"DUL", L"DUM", L"DUN", L"DUO", L"DUP", L"DUQ", L"DUR", L"DUS", L"DUT", L"DUU", L"DUV", L"DUW", L"DUX", L"DUY", L"DUZ", L"DVA", L"DVB", L"DVC", L"DVD", L"DVE", L"DVF", L"DVG", L"DVH", L"DVI", L"DVJ", L"DVK", L"DVL", L"DVM", L"DVN", L"DVO", L"DVP", L"DVQ", L"DVR", L"DVS", L"DVT", L"DVU", L"DVV", L"DVW", L"DVX", L"DVY", L"DVZ", L"DWA", L"DWB", L"DWC", L"DWD", L"DWE", L"DWF", L"DWG", L"DWH", L"DWI", L"DWJ", L"DWK", L"DWL", L"DWM", L"DWN", L"DWO", L"DWP", L"DWQ", L"DWR", L"DWS", L"DWT", L"DWU", L"DWV", L"DWW", L"DWX", L"DWY", L"DWZ", L"DXA", L"DXB", L"DXC", L"DXD", L"DXE", L"DXF", L"DXG", L"DXH", L"DXI", L"DXJ", L"DXK", L"DXL", L"DXM", L"DXN", L"DXO", L"DXP", L"DXQ", L"DXR", L"DXS", - L"DXT", L"DXU", L"DXV", L"DXW", L"DXX", L"DXY", L"DXZ", L"DYA", L"DYB", L"DYC", L"DYD", L"DYE", L"DYF", L"DYG", L"DYH", L"DYI", L"DYJ", L"DYK", L"DYL", L"DYM", L"DYN", L"DYO", L"DYP", L"DYQ", L"DYR", L"DYS", L"DYT", L"DYU", L"DYV", L"DYW", L"DYX", L"DYY", L"DYZ", L"DZA", L"DZB", L"DZC", L"DZD", L"DZE", L"DZF", L"DZG", L"DZH", L"DZI", L"DZJ", L"DZK", L"DZL", L"DZM", L"DZN", L"DZO", L"DZP", L"DZQ", L"DZR", L"DZS", L"DZT", L"DZU", L"DZV", L"DZW", L"DZX", L"DZY", L"DZZ", L"EAA", L"EAB", L"EAC", L"EAD", L"EAE", L"EAF", L"EAG", L"EAH", L"EAI", L"EAJ", L"EAK", L"EAL", L"EAM", L"EAN", L"EAO", L"EAP", L"EAQ", L"EAR", L"EAS", L"EAT", L"EAU", L"EAV", L"EAW", L"EAX", L"EAY", L"EAZ", L"EBA", L"EBB", L"EBC", L"EBD", L"EBE", L"EBF", L"EBG", L"EBH", L"EBI", L"EBJ", L"EBK", L"EBL", L"EBM", L"EBN", L"EBO", L"EBP", L"EBQ", L"EBR", L"EBS", L"EBT", L"EBU", L"EBV", L"EBW", L"EBX", L"EBY", L"EBZ", L"ECA", L"ECB", L"ECC", L"ECD", L"ECE", L"ECF", L"ECG", L"ECH", L"ECI", L"ECJ", L"ECK", L"ECL", L"ECM", L"ECN", L"ECO", L"ECP", L"ECQ", L"ECR", L"ECS", L"ECT", L"ECU", L"ECV", L"ECW", L"ECX", L"ECY", L"ECZ", L"EDA", L"EDB", L"EDC", L"EDD", L"EDE", L"EDF", L"EDG", L"EDH", L"EDI", L"EDJ", L"EDK", L"EDL", L"EDM", L"EDN", L"EDO", L"EDP", L"EDQ", L"EDR", L"EDS", L"EDT", L"EDU", L"EDV", L"EDW", L"EDX", L"EDY", L"EDZ", L"EEA", L"EEB", L"EEC", L"EED", L"EEE", L"EEF", L"EEG", L"EEH", L"EEI", L"EEJ", L"EEK", L"EEL", L"EEM", L"EEN", L"EEO", L"EEP", L"EEQ", L"EER", L"EES", L"EET", L"EEU", L"EEV", L"EEW", L"EEX", L"EEY", L"EEZ", L"EFA", L"EFB", L"EFC", L"EFD", L"EFE", L"EFF", L"EFG", L"EFH", L"EFI", L"EFJ", L"EFK", L"EFL", L"EFM", L"EFN", L"EFO", L"EFP", L"EFQ", L"EFR", L"EFS", L"EFT", L"EFU", L"EFV", L"EFW", L"EFX", L"EFY", L"EFZ", L"EGA", L"EGB", L"EGC", L"EGD", L"EGE", L"EGF", L"EGG", L"EGH", L"EGI", L"EGJ", L"EGK", L"EGL", L"EGM", L"EGN", L"EGO", L"EGP", L"EGQ", L"EGR", L"EGS", L"EGT", L"EGU", L"EGV", L"EGW", L"EGX", L"EGY", L"EGZ", L"EHA", L"EHB", L"EHC", L"EHD", L"EHE", L"EHF", L"EHG", L"EHH", L"EHI", L"EHJ", L"EHK", L"EHL", L"EHM", L"EHN", L"EHO", L"EHP", L"EHQ", L"EHR", L"EHS", L"EHT", L"EHU", L"EHV", L"EHW", L"EHX", L"EHY", L"EHZ", L"EIA", L"EIB", L"EIC", L"EID", L"EIE", L"EIF", L"EIG", L"EIH", L"EII", L"EIJ", L"EIK", L"EIL", L"EIM", L"EIN", L"EIO", L"EIP", L"EIQ", L"EIR", L"EIS", L"EIT", L"EIU", L"EIV", L"EIW", L"EIX", L"EIY", L"EIZ", L"EJA", L"EJB", L"EJC", L"EJD", L"EJE", L"EJF", L"EJG", L"EJH", L"EJI", L"EJJ", L"EJK", L"EJL", L"EJM", L"EJN", L"EJO", L"EJP", L"EJQ", L"EJR", L"EJS", L"EJT", L"EJU", L"EJV", L"EJW", L"EJX", L"EJY", L"EJZ", L"EKA", L"EKB", L"EKC", L"EKD", L"EKE", L"EKF", L"EKG", L"EKH", L"EKI", L"EKJ", L"EKK", L"EKL", L"EKM", L"EKN", L"EKO", L"EKP", L"EKQ", L"EKR", L"EKS", L"EKT", L"EKU", L"EKV", L"EKW", L"EKX", L"EKY", L"EKZ", L"ELA", L"ELB", L"ELC", L"ELD", L"ELE", L"ELF", L"ELG", L"ELH", L"ELI", L"ELJ", L"ELK", L"ELL", L"ELM", L"ELN", L"ELO", L"ELP", L"ELQ", L"ELR", L"ELS", L"ELT", L"ELU", L"ELV", L"ELW", L"ELX", L"ELY", L"ELZ", L"EMA", L"EMB", L"EMC", L"EMD", L"EME", L"EMF", L"EMG", L"EMH", L"EMI", L"EMJ", L"EMK", L"EML", L"EMM", L"EMN", L"EMO", L"EMP", L"EMQ", L"EMR", L"EMS", L"EMT", L"EMU", L"EMV", L"EMW", L"EMX", L"EMY", L"EMZ", L"ENA", L"ENB", L"ENC", L"END", L"ENE", L"ENF", L"ENG", L"ENH", L"ENI", L"ENJ", L"ENK", L"ENL", L"ENM", L"ENN", L"ENO", L"ENP", L"ENQ", L"ENR", L"ENS", L"ENT", L"ENU", L"ENV", L"ENW", L"ENX", L"ENY", L"ENZ", L"EOA", L"EOB", L"EOC", L"EOD", L"EOE", L"EOF", L"EOG", L"EOH", L"EOI", L"EOJ", L"EOK", L"EOL", L"EOM", L"EON", L"EOO", L"EOP", L"EOQ", L"EOR", L"EOS", L"EOT", L"EOU", L"EOV", L"EOW", L"EOX", L"EOY", L"EOZ", L"EPA", L"EPB", L"EPC", L"EPD", L"EPE", L"EPF", L"EPG", L"EPH", L"EPI", L"EPJ", L"EPK", L"EPL", L"EPM", L"EPN", L"EPO", L"EPP", L"EPQ", L"EPR", L"EPS", L"EPT", L"EPU", L"EPV", L"EPW", L"EPX", L"EPY", L"EPZ", L"EQA", L"EQB", L"EQC", L"EQD", L"EQE", L"EQF", L"EQG", L"EQH", L"EQI", L"EQJ", L"EQK", L"EQL", L"EQM", L"EQN", L"EQO", L"EQP", L"EQQ", L"EQR", L"EQS", L"EQT", L"EQU", L"EQV", L"EQW", L"EQX", L"EQY", L"EQZ", L"ERA", L"ERB", L"ERC", L"ERD", L"ERE", L"ERF", L"ERG", L"ERH", L"ERI", L"ERJ", L"ERK", L"ERL", L"ERM", L"ERN", L"ERO", L"ERP", L"ERQ", L"ERR", L"ERS", L"ERT", L"ERU", L"ERV", L"ERW", L"ERX", L"ERY", L"ERZ", L"ESA", L"ESB", L"ESC", L"ESD", L"ESE", L"ESF", L"ESG", L"ESH", L"ESI", L"ESJ", L"ESK", + L"DDB", L"DDC", L"DDD", L"DDE", L"DDF", L"DDG", L"DDH", L"DDI", L"DDJ", L"DDK", L"DDL", L"DDM", L"DDN", L"DDO", L"DDP", L"DDQ", L"DDR", L"DDS", L"DDT", L"DDU", L"DDV", L"DDW", L"DDX", L"DDY", L"DDZ", L"DEA", L"DEB", L"DEC", L"DED", L"DEE", L"DEF", L"DEG", L"DEH", L"DEI", L"DEJ", L"DEK", L"DEL", L"DEM", L"DEN", L"DEO", L"DEP", L"DEQ", L"DER", L"DES", L"DET", L"DEU", L"DEV", L"DEW", L"DEX", L"DEY", L"DEZ", L"DFA", L"DFB", L"DFC", L"DFD", L"DFE", L"DFF", L"DFG", L"DFH", L"DFI", L"DFJ", L"DFK", L"DFL", L"DFM", L"DFN", L"DFO", L"DFP", L"DFQ", L"DFR", L"DFS", L"DFT", L"DFU", L"DFV", L"DFW", L"DFX", L"DFY", L"DFZ", L"DGA", L"DGB", L"DGC", L"DGD", L"DGE", L"DGF", L"DGG", L"DGH", L"DGI", L"DGJ", L"DGK", L"DGL", L"DGM", L"DGN", L"DGO", L"DGP", L"DGQ", L"DGR", L"DGS", L"DGT", L"DGU", L"DGV", L"DGW", L"DGX", L"DGY", L"DGZ", L"DHA", L"DHB", L"DHC", L"DHD", L"DHE", L"DHF", L"DHG", L"DHH", L"DHI", L"DHJ", L"DHK", L"DHL", L"DHM", L"DHN", L"DHO", L"DHP", L"DHQ", L"DHR", L"DHS", L"DHT", L"DHU", L"DHV", L"DHW", L"DHX", L"DHY", L"DHZ", L"DIA", L"DIB", L"DIC", L"DID", L"DIE", L"DIF", L"DIG", L"DIH", L"DII", L"DIJ", L"DIK", L"DIL", L"DIM", L"DIN", L"DIO", L"DIP", L"DIQ", L"DIR", L"DIS", L"DIT", L"DIU", L"DIV", L"DIW", L"DIX", L"DIY", L"DIZ", L"DJA", L"DJB", L"DJC", L"DJD", L"DJE", L"DJF", L"DJG", L"DJH", L"DJI", L"DJJ", L"DJK", L"DJL", L"DJM", L"DJN", L"DJO", L"DJP", L"DJQ", L"DJR", L"DJS", L"DJT", L"DJU", L"DJV", L"DJW", L"DJX", L"DJY", L"DJZ", L"DKA", L"DKB", L"DKC", L"DKD", L"DKE", L"DKF", L"DKG", L"DKH", L"DKI", L"DKJ", L"DKK", L"DKL", L"DKM", L"DKN", L"DKO", L"DKP", L"DKQ", L"DKR", L"DKS", L"DKT", L"DKU", L"DKV", L"DKW", L"DKX", L"DKY", L"DKZ", L"DLA", L"DLB", L"DLC", L"DLD", L"DLE", L"DLF", L"DLG", L"DLH", L"DLI", L"DLJ", L"DLK", L"DLL", L"DLM", L"DLN", L"DLO", L"DLP", L"DLQ", L"DLR", L"DLS", L"DLT", L"DLU", L"DLV", L"DLW", L"DLX", L"DLY", L"DLZ", L"DMA", L"DMB", L"DMC", L"DMD", L"DME", L"DMF", L"DMG", L"DMH", L"DMI", L"DMJ", L"DMK", L"DML", L"DMM", L"DMN", L"DMO", L"DMP", L"DMQ", L"DMR", L"DMS", L"DMT", L"DMU", L"DMV", L"DMW", L"DMX", L"DMY", L"DMZ", L"DNA", L"DNB", L"DNC", L"DND", L"DNE", L"DNF", L"DNG", L"DNH", L"DNI", L"DNJ", L"DNK", L"DNL", L"DNM", L"DNN", L"DNO", L"DNP", L"DNQ", L"DNR", L"DNS", L"DNT", L"DNU", L"DNV", L"DNW", L"DNX", L"DNY", L"DNZ", L"DOA", L"DOB", L"DOC", L"DOD", L"DOE", L"DOF", L"DOG", L"DOH", L"DOI", L"DOJ", L"DOK", L"DOL", L"DOM", L"DON", L"DOO", L"DOP", L"DOQ", L"DOR", L"DOS", L"DOT", L"DOU", L"DOV", L"DOW", L"DOX", L"DOY", L"DOZ", L"DPA", L"DPB", L"DPC", L"DPD", L"DPE", L"DPF", L"DPG", L"DPH", L"DPI", L"DPJ", L"DPK", L"DPL", L"DPM", L"DPN", L"DPO", L"DPP", L"DPQ", L"DPR", L"DPS", L"DPT", L"DPU", L"DPV", L"DPW", L"DPX", L"DPY", L"DPZ", L"DQA", L"DQB", L"DQC", L"DQD", L"DQE", L"DQF", L"DQG", L"DQH", L"DQI", L"DQJ", L"DQK", L"DQL", L"DQM", L"DQN", L"DQO", L"DQP", L"DQQ", L"DQR", L"DQS", L"DQT", L"DQU", L"DQV", L"DQW", L"DQX", L"DQY", L"DQZ", L"DRA", L"DRB", L"DRC", L"DRD", L"DRE", L"DRF", L"DRG", L"DRH", L"DRI", L"DRJ", L"DRK", L"DRL", L"DRM", L"DRN", L"DRO", L"DRP", L"DRQ", L"DRR", L"DRS", L"DRT", L"DRU", L"DRV", L"DRW", L"DRX", L"DRY", L"DRZ", L"DSA", L"DSB", L"DSC", L"DSD", L"DSE", L"DSF", L"DSG", L"DSH", L"DSI", L"DSJ", L"DSK", L"DSL", L"DSM", L"DSN", L"DSO", L"DSP", L"DSQ", L"DSR", L"DSS", L"DST", L"DSU", L"DSV", L"DSW", L"DSX", L"DSY", L"DSZ", L"DTA", L"DTB", L"DTC", L"DTD", L"DTE", L"DTF", L"DTG", L"DTH", L"DTI", L"DTJ", L"DTK", L"DTL", L"DTM", L"DTN", L"DTO", L"DTP", L"DTQ", L"DTR", L"DTS", L"DTT", L"DTU", L"DTV", L"DTW", L"DTX", L"DTY", L"DTZ", L"DUA", L"DUB", L"DUC", L"DUD", L"DUE", L"DUF", L"DUG", L"DUH", L"DUI", L"DUJ", L"DUK", L"DUL", L"DUM", L"DUN", L"DUO", L"DUP", L"DUQ", L"DUR", L"DUS", L"DUT", L"DUU", L"DUV", L"DUW", L"DUX", L"DUY", L"DUZ", L"DVA", L"DVB", L"DVC", L"DVD", L"DVE", L"DVF", L"DVG", L"DVH", L"DVI", L"DVJ", L"DVK", L"DVL", L"DVM", L"DVN", L"DVO", L"DVP", L"DVQ", L"DVR", L"DVS", L"DVT", L"DVU", L"DVV", L"DVW", L"DVX", L"DVY", L"DVZ", L"DWA", L"DWB", L"DWC", L"DWD", L"DWE", L"DWF", L"DWG", L"DWH", L"DWI", L"DWJ", L"DWK", L"DWL", L"DWM", L"DWN", L"DWO", L"DWP", L"DWQ", L"DWR", L"DWS", L"DWT", L"DWU", L"DWV", L"DWW", L"DWX", L"DWY", L"DWZ", L"DXA", L"DXB", L"DXC", L"DXD", L"DXE", L"DXF", L"DXG", L"DXH", L"DXI", L"DXJ", L"DXK", L"DXL", L"DXM", L"DXN", L"DXO", L"DXP", L"DXQ", L"DXR", L"DXS", + L"DXT", L"DXU", L"DXV", L"DXW", L"DXX", L"DXY", L"DXZ", L"DYA", L"DYB", L"DYC", L"DYD", L"DYE", L"DYF", L"DYG", L"DYH", L"DYI", L"DYJ", L"DYK", L"DYL", L"DYM", L"DYN", L"DYO", L"DYP", L"DYQ", L"DYR", L"DYS", L"DYT", L"DYU", L"DYV", L"DYW", L"DYX", L"DYY", L"DYZ", L"DZA", L"DZB", L"DZC", L"DZD", L"DZE", L"DZF", L"DZG", L"DZH", L"DZI", L"DZJ", L"DZK", L"DZL", L"DZM", L"DZN", L"DZO", L"DZP", L"DZQ", L"DZR", L"DZS", L"DZT", L"DZU", L"DZV", L"DZW", L"DZX", L"DZY", L"DZZ", L"EAA", L"EAB", L"EAC", L"EAD", L"EAE", L"EAF", L"EAG", L"EAH", L"EAI", L"EAJ", L"EAK", L"EAL", L"EAM", L"EAN", L"EAO", L"EAP", L"EAQ", L"EAR", L"EAS", L"EAT", L"EAU", L"EAV", L"EAW", L"EAX", L"EAY", L"EAZ", L"EBA", L"EBB", L"EBC", L"EBD", L"EBE", L"EBF", L"EBG", L"EBH", L"EBI", L"EBJ", L"EBK", L"EBL", L"EBM", L"EBN", L"EBO", L"EBP", L"EBQ", L"EBR", L"EBS", L"EBT", L"EBU", L"EBV", L"EBW", L"EBX", L"EBY", L"EBZ", L"ECA", L"ECB", L"ECC", L"ECD", L"ECE", L"ECF", L"ECG", L"ECH", L"ECI", L"ECJ", L"ECK", L"ECL", L"ECM", L"ECN", L"ECO", L"ECP", L"ECQ", L"ECR", L"ECS", L"ECT", L"ECU", L"ECV", L"ECW", L"ECX", L"ECY", L"ECZ", L"EDA", L"EDB", L"EDC", L"EDD", L"EDE", L"EDF", L"EDG", L"EDH", L"EDI", L"EDJ", L"EDK", L"EDL", L"EDM", L"EDN", L"EDO", L"EDP", L"EDQ", L"EDR", L"EDS", L"EDT", L"EDU", L"EDV", L"EDW", L"EDX", L"EDY", L"EDZ", L"EEA", L"EEB", L"EEC", L"EED", L"EEE", L"EEF", L"EEG", L"EEH", L"EEI", L"EEJ", L"EEK", L"EEL", L"EEM", L"EEN", L"EEO", L"EEP", L"EEQ", L"EER", L"EES", L"EET", L"EEU", L"EEV", L"EEW", L"EEX", L"EEY", L"EEZ", L"EFA", L"EFB", L"EFC", L"EFD", L"EFE", L"EFF", L"EFG", L"EFH", L"EFI", L"EFJ", L"EFK", L"EFL", L"EFM", L"EFN", L"EFO", L"EFP", L"EFQ", L"EFR", L"EFS", L"EFT", L"EFU", L"EFV", L"EFW", L"EFX", L"EFY", L"EFZ", L"EGA", L"EGB", L"EGC", L"EGD", L"EGE", L"EGF", L"EGG", L"EGH", L"EGI", L"EGJ", L"EGK", L"EGL", L"EGM", L"EGN", L"EGO", L"EGP", L"EGQ", L"EGR", L"EGS", L"EGT", L"EGU", L"EGV", L"EGW", L"EGX", L"EGY", L"EGZ", L"EHA", L"EHB", L"EHC", L"EHD", L"EHE", L"EHF", L"EHG", L"EHH", L"EHI", L"EHJ", L"EHK", L"EHL", L"EHM", L"EHN", L"EHO", L"EHP", L"EHQ", L"EHR", L"EHS", L"EHT", L"EHU", L"EHV", L"EHW", L"EHX", L"EHY", L"EHZ", L"EIA", L"EIB", L"EIC", L"EID", L"EIE", L"EIF", L"EIG", L"EIH", L"EII", L"EIJ", L"EIK", L"EIL", L"EIM", L"EIN", L"EIO", L"EIP", L"EIQ", L"EIR", L"EIS", L"EIT", L"EIU", L"EIV", L"EIW", L"EIX", L"EIY", L"EIZ", L"EJA", L"EJB", L"EJC", L"EJD", L"EJE", L"EJF", L"EJG", L"EJH", L"EJI", L"EJJ", L"EJK", L"EJL", L"EJM", L"EJN", L"EJO", L"EJP", L"EJQ", L"EJR", L"EJS", L"EJT", L"EJU", L"EJV", L"EJW", L"EJX", L"EJY", L"EJZ", L"EKA", L"EKB", L"EKC", L"EKD", L"EKE", L"EKF", L"EKG", L"EKH", L"EKI", L"EKJ", L"EKK", L"EKL", L"EKM", L"EKN", L"EKO", L"EKP", L"EKQ", L"EKR", L"EKS", L"EKT", L"EKU", L"EKV", L"EKW", L"EKX", L"EKY", L"EKZ", L"ELA", L"ELB", L"ELC", L"ELD", L"ELE", L"ELF", L"ELG", L"ELH", L"ELI", L"ELJ", L"ELK", L"ELL", L"ELM", L"ELN", L"ELO", L"ELP", L"ELQ", L"ELR", L"ELS", L"ELT", L"ELU", L"ELV", L"ELW", L"ELX", L"ELY", L"ELZ", L"EMA", L"EMB", L"EMC", L"EMD", L"EME", L"EMF", L"EMG", L"EMH", L"EMI", L"EMJ", L"EMK", L"EML", L"EMM", L"EMN", L"EMO", L"EMP", L"EMQ", L"EMR", L"EMS", L"EMT", L"EMU", L"EMV", L"EMW", L"EMX", L"EMY", L"EMZ", L"ENA", L"ENB", L"ENC", L"END", L"ENE", L"ENF", L"ENG", L"ENH", L"ENI", L"ENJ", L"ENK", L"ENL", L"ENM", L"ENN", L"ENO", L"ENP", L"ENQ", L"ENR", L"ENS", L"ENT", L"ENU", L"ENV", L"ENW", L"ENX", L"ENY", L"ENZ", L"EOA", L"EOB", L"EOC", L"EOD", L"EOE", L"EOF", L"EOG", L"EOH", L"EOI", L"EOJ", L"EOK", L"EOL", L"EOM", L"EON", L"EOO", L"EOP", L"EOQ", L"EOR", L"EOS", L"EOT", L"EOU", L"EOV", L"EOW", L"EOX", L"EOY", L"EOZ", L"EPA", L"EPB", L"EPC", L"EPD", L"EPE", L"EPF", L"EPG", L"EPH", L"EPI", L"EPJ", L"EPK", L"EPL", L"EPM", L"EPN", L"EPO", L"EPP", L"EPQ", L"EPR", L"EPS", L"EPT", L"EPU", L"EPV", L"EPW", L"EPX", L"EPY", L"EPZ", L"EQA", L"EQB", L"EQC", L"EQD", L"EQE", L"EQF", L"EQG", L"EQH", L"EQI", L"EQJ", L"EQK", L"EQL", L"EQM", L"EQN", L"EQO", L"EQP", L"EQQ", L"EQR", L"EQS", L"EQT", L"EQU", L"EQV", L"EQW", L"EQX", L"EQY", L"EQZ", L"ERA", L"ERB", L"ERC", L"ERD", L"ERE", L"ERF", L"ERG", L"ERH", L"ERI", L"ERJ", L"ERK", L"ERL", L"ERM", L"ERN", L"ERO", L"ERP", L"ERQ", L"ERR", L"ERS", L"ERT", L"ERU", L"ERV", L"ERW", L"ERX", L"ERY", L"ERZ", L"ESA", L"ESB", L"ESC", L"ESD", L"ESE", L"ESF", L"ESG", L"ESH", L"ESI", L"ESJ", L"ESK", L"ESL", L"ESM", L"ESN", L"ESO", L"ESP", L"ESQ", L"ESR", L"ESS", L"EST", L"ESU", L"ESV", L"ESW", L"ESX", L"ESY", L"ESZ", L"ETA", L"ETB", L"ETC", L"ETD", L"ETE", L"ETF", L"ETG", L"ETH", L"ETI", L"ETJ", L"ETK", L"ETL", L"ETM", L"ETN", L"ETO", L"ETP", L"ETQ", L"ETR", L"ETS", L"ETT", L"ETU", L"ETV", L"ETW", L"ETX", L"ETY", L"ETZ", L"EUA", L"EUB", L"EUC", L"EUD", L"EUE", L"EUF", L"EUG", L"EUH", L"EUI", L"EUJ", L"EUK", L"EUL", L"EUM", L"EUN", L"EUO", L"EUP", L"EUQ", L"EUR", L"EUS", L"EUT", L"EUU", L"EUV", L"EUW", L"EUX", L"EUY", L"EUZ", L"EVA", L"EVB", L"EVC", L"EVD", L"EVE", L"EVF", L"EVG", L"EVH", L"EVI", L"EVJ", L"EVK", L"EVL", L"EVM", L"EVN", L"EVO", L"EVP", L"EVQ", L"EVR", L"EVS", L"EVT", L"EVU", L"EVV", L"EVW", L"EVX", L"EVY", L"EVZ", L"EWA", L"EWB", L"EWC", L"EWD", L"EWE", L"EWF", L"EWG", L"EWH", L"EWI", L"EWJ", L"EWK", L"EWL", L"EWM", L"EWN", L"EWO", L"EWP", L"EWQ", L"EWR", L"EWS", L"EWT", L"EWU", L"EWV", L"EWW", L"EWX", L"EWY", L"EWZ", L"EXA", L"EXB", L"EXC", L"EXD", L"EXE", L"EXF", L"EXG", L"EXH", L"EXI", L"EXJ", L"EXK", L"EXL", L"EXM", L"EXN", L"EXO", L"EXP", L"EXQ", L"EXR", L"EXS", L"EXT", L"EXU", L"EXV", L"EXW", L"EXX", L"EXY", L"EXZ", L"EYA", L"EYB", L"EYC", L"EYD", L"EYE", L"EYF", L"EYG", L"EYH", L"EYI", L"EYJ", L"EYK", L"EYL", L"EYM", L"EYN", L"EYO", L"EYP", L"EYQ", L"EYR", L"EYS", L"EYT", L"EYU", L"EYV", L"EYW", L"EYX", L"EYY", L"EYZ", L"EZA", L"EZB", L"EZC", L"EZD", L"EZE", L"EZF", L"EZG", L"EZH", L"EZI", L"EZJ", L"EZK", L"EZL", L"EZM", L"EZN", L"EZO", L"EZP", L"EZQ", L"EZR", L"EZS", L"EZT", L"EZU", L"EZV", L"EZW", L"EZX", L"EZY", L"EZZ", L"FAA", L"FAB", L"FAC", L"FAD", L"FAE", L"FAF", L"FAG", L"FAH", L"FAI", L"FAJ", L"FAK", L"FAL", L"FAM", L"FAN", L"FAO", L"FAP", L"FAQ", L"FAR", L"FAS", L"FAT", L"FAU", L"FAV", L"FAW", L"FAX", L"FAY", L"FAZ", L"FBA", L"FBB", L"FBC", L"FBD", L"FBE", L"FBF", L"FBG", L"FBH", L"FBI", L"FBJ", L"FBK", L"FBL", L"FBM", L"FBN", L"FBO", L"FBP", L"FBQ", L"FBR", L"FBS", L"FBT", L"FBU", L"FBV", L"FBW", L"FBX", L"FBY", L"FBZ", L"FCA", L"FCB", L"FCC", L"FCD", L"FCE", L"FCF", L"FCG", L"FCH", L"FCI", L"FCJ", L"FCK", L"FCL", L"FCM", L"FCN", L"FCO", L"FCP", L"FCQ", L"FCR", L"FCS", L"FCT", L"FCU", L"FCV", L"FCW", L"FCX", L"FCY", L"FCZ", L"FDA", L"FDB", L"FDC", L"FDD", L"FDE", L"FDF", - L"FDG", L"FDH", L"FDI", L"FDJ", L"FDK", L"FDL", L"FDM", L"FDN", L"FDO", L"FDP", L"FDQ", L"FDR", L"FDS", L"FDT", L"FDU", L"FDV", L"FDW", L"FDX", L"FDY", L"FDZ", L"FEA", L"FEB", L"FEC", L"FED", L"FEE", L"FEF", L"FEG", L"FEH", L"FEI", L"FEJ", L"FEK", L"FEL", L"FEM", L"FEN", L"FEO", L"FEP", L"FEQ", L"FER", L"FES", L"FET", L"FEU", L"FEV", L"FEW", L"FEX", L"FEY", L"FEZ", L"FFA", L"FFB", L"FFC", L"FFD", L"FFE", L"FFF", L"FFG", L"FFH", L"FFI", L"FFJ", L"FFK", L"FFL", L"FFM", L"FFN", L"FFO", L"FFP", L"FFQ", L"FFR", L"FFS", L"FFT", L"FFU", L"FFV", L"FFW", L"FFX", L"FFY", L"FFZ", L"FGA", L"FGB", L"FGC", L"FGD", L"FGE", L"FGF", L"FGG", L"FGH", L"FGI", L"FGJ", L"FGK", L"FGL", L"FGM", L"FGN", L"FGO", L"FGP", L"FGQ", L"FGR", L"FGS", L"FGT", L"FGU", L"FGV", L"FGW", L"FGX", L"FGY", L"FGZ", L"FHA", L"FHB", L"FHC", L"FHD", L"FHE", L"FHF", L"FHG", L"FHH", L"FHI", L"FHJ", L"FHK", L"FHL", L"FHM", L"FHN", L"FHO", L"FHP", L"FHQ", L"FHR", L"FHS", L"FHT", L"FHU", L"FHV", L"FHW", L"FHX", L"FHY", L"FHZ", L"FIA", L"FIB", L"FIC", L"FID", L"FIE", L"FIF", L"FIG", L"FIH", L"FII", L"FIJ", L"FIK", L"FIL", L"FIM", L"FIN", L"FIO", L"FIP", L"FIQ", L"FIR", L"FIS", L"FIT", L"FIU", L"FIV", L"FIW", L"FIX", L"FIY", L"FIZ", L"FJA", L"FJB", L"FJC", L"FJD", L"FJE", L"FJF", L"FJG", L"FJH", L"FJI", L"FJJ", L"FJK", L"FJL", L"FJM", L"FJN", L"FJO", L"FJP", L"FJQ", L"FJR", L"FJS", L"FJT", L"FJU", L"FJV", L"FJW", L"FJX", L"FJY", L"FJZ", L"FKA", L"FKB", L"FKC", L"FKD", L"FKE", L"FKF", L"FKG", L"FKH", L"FKI", L"FKJ", L"FKK", L"FKL", L"FKM", L"FKN", L"FKO", L"FKP", L"FKQ", L"FKR", L"FKS", L"FKT", L"FKU", L"FKV", L"FKW", L"FKX", L"FKY", L"FKZ", L"FLA", L"FLB", L"FLC", L"FLD", L"FLE", L"FLF", L"FLG", L"FLH", L"FLI", L"FLJ", L"FLK", L"FLL", L"FLM", L"FLN", L"FLO", L"FLP", L"FLQ", L"FLR", L"FLS", L"FLT", L"FLU", L"FLV", L"FLW", L"FLX", L"FLY", L"FLZ", L"FMA", L"FMB", L"FMC", L"FMD", L"FME", L"FMF", L"FMG", L"FMH", L"FMI", L"FMJ", L"FMK", L"FML", L"FMM", L"FMN", L"FMO", L"FMP", L"FMQ", L"FMR", L"FMS", L"FMT", L"FMU", L"FMV", L"FMW", L"FMX", L"FMY", L"FMZ", L"FNA", L"FNB", L"FNC", L"FND", L"FNE", L"FNF", L"FNG", L"FNH", L"FNI", L"FNJ", L"FNK", L"FNL", L"FNM", L"FNN", L"FNO", L"FNP", L"FNQ", L"FNR", L"FNS", L"FNT", L"FNU", L"FNV", L"FNW", L"FNX", L"FNY", L"FNZ", L"FOA", L"FOB", L"FOC", L"FOD", L"FOE", L"FOF", L"FOG", L"FOH", L"FOI", L"FOJ", L"FOK", L"FOL", L"FOM", L"FON", L"FOO", L"FOP", L"FOQ", L"FOR", L"FOS", L"FOT", L"FOU", L"FOV", L"FOW", L"FOX", L"FOY", L"FOZ", L"FPA", L"FPB", L"FPC", L"FPD", L"FPE", L"FPF", L"FPG", L"FPH", L"FPI", L"FPJ", L"FPK", L"FPL", L"FPM", L"FPN", L"FPO", L"FPP", L"FPQ", L"FPR", L"FPS", L"FPT", L"FPU", L"FPV", L"FPW", L"FPX", L"FPY", L"FPZ", L"FQA", L"FQB", L"FQC", L"FQD", L"FQE", L"FQF", L"FQG", L"FQH", L"FQI", L"FQJ", L"FQK", L"FQL", L"FQM", L"FQN", L"FQO", L"FQP", L"FQQ", L"FQR", L"FQS", L"FQT", L"FQU", L"FQV", L"FQW", L"FQX", L"FQY", L"FQZ", L"FRA", L"FRB", L"FRC", L"FRD", L"FRE", L"FRF", L"FRG", L"FRH", L"FRI", L"FRJ", L"FRK", L"FRL", L"FRM", L"FRN", L"FRO", L"FRP", L"FRQ", L"FRR", L"FRS", L"FRT", L"FRU", L"FRV", L"FRW", L"FRX", L"FRY", L"FRZ", L"FSA", L"FSB", L"FSC", L"FSD", L"FSE", L"FSF", L"FSG", L"FSH", L"FSI", L"FSJ", L"FSK", L"FSL", L"FSM", L"FSN", L"FSO", L"FSP", L"FSQ", L"FSR", L"FSS", L"FST", L"FSU", L"FSV", L"FSW", L"FSX", L"FSY", L"FSZ", L"FTA", L"FTB", L"FTC", L"FTD", L"FTE", L"FTF", L"FTG", L"FTH", L"FTI", L"FTJ", L"FTK", L"FTL", L"FTM", L"FTN", L"FTO", L"FTP", L"FTQ", L"FTR", L"FTS", L"FTT", L"FTU", L"FTV", L"FTW", L"FTX", L"FTY", L"FTZ", L"FUA", L"FUB", L"FUC", L"FUD", L"FUE", L"FUF", L"FUG", L"FUH", L"FUI", L"FUJ", L"FUK", L"FUL", L"FUM", L"FUN", L"FUO", L"FUP", L"FUQ", L"FUR", L"FUS", L"FUT", L"FUU", L"FUV", L"FUW", L"FUX", L"FUY", L"FUZ", L"FVA", L"FVB", L"FVC", L"FVD", L"FVE", L"FVF", L"FVG", L"FVH", L"FVI", L"FVJ", L"FVK", L"FVL", L"FVM", L"FVN", L"FVO", L"FVP", L"FVQ", L"FVR", L"FVS", L"FVT", L"FVU", L"FVV", L"FVW", L"FVX", L"FVY", L"FVZ", L"FWA", L"FWB", L"FWC", L"FWD", L"FWE", L"FWF", L"FWG", L"FWH", L"FWI", L"FWJ", L"FWK", L"FWL", L"FWM", L"FWN", L"FWO", L"FWP", L"FWQ", L"FWR", L"FWS", L"FWT", L"FWU", L"FWV", L"FWW", L"FWX", L"FWY", L"FWZ", L"FXA", L"FXB", L"FXC", L"FXD", L"FXE", L"FXF", L"FXG", L"FXH", L"FXI", L"FXJ", L"FXK", L"FXL", L"FXM", L"FXN", L"FXO", L"FXP", L"FXQ", L"FXR", L"FXS", L"FXT", L"FXU", L"FXV", L"FXW", L"FXX", + L"FDG", L"FDH", L"FDI", L"FDJ", L"FDK", L"FDL", L"FDM", L"FDN", L"FDO", L"FDP", L"FDQ", L"FDR", L"FDS", L"FDT", L"FDU", L"FDV", L"FDW", L"FDX", L"FDY", L"FDZ", L"FEA", L"FEB", L"FEC", L"FED", L"FEE", L"FEF", L"FEG", L"FEH", L"FEI", L"FEJ", L"FEK", L"FEL", L"FEM", L"FEN", L"FEO", L"FEP", L"FEQ", L"FER", L"FES", L"FET", L"FEU", L"FEV", L"FEW", L"FEX", L"FEY", L"FEZ", L"FFA", L"FFB", L"FFC", L"FFD", L"FFE", L"FFF", L"FFG", L"FFH", L"FFI", L"FFJ", L"FFK", L"FFL", L"FFM", L"FFN", L"FFO", L"FFP", L"FFQ", L"FFR", L"FFS", L"FFT", L"FFU", L"FFV", L"FFW", L"FFX", L"FFY", L"FFZ", L"FGA", L"FGB", L"FGC", L"FGD", L"FGE", L"FGF", L"FGG", L"FGH", L"FGI", L"FGJ", L"FGK", L"FGL", L"FGM", L"FGN", L"FGO", L"FGP", L"FGQ", L"FGR", L"FGS", L"FGT", L"FGU", L"FGV", L"FGW", L"FGX", L"FGY", L"FGZ", L"FHA", L"FHB", L"FHC", L"FHD", L"FHE", L"FHF", L"FHG", L"FHH", L"FHI", L"FHJ", L"FHK", L"FHL", L"FHM", L"FHN", L"FHO", L"FHP", L"FHQ", L"FHR", L"FHS", L"FHT", L"FHU", L"FHV", L"FHW", L"FHX", L"FHY", L"FHZ", L"FIA", L"FIB", L"FIC", L"FID", L"FIE", L"FIF", L"FIG", L"FIH", L"FII", L"FIJ", L"FIK", L"FIL", L"FIM", L"FIN", L"FIO", L"FIP", L"FIQ", L"FIR", L"FIS", L"FIT", L"FIU", L"FIV", L"FIW", L"FIX", L"FIY", L"FIZ", L"FJA", L"FJB", L"FJC", L"FJD", L"FJE", L"FJF", L"FJG", L"FJH", L"FJI", L"FJJ", L"FJK", L"FJL", L"FJM", L"FJN", L"FJO", L"FJP", L"FJQ", L"FJR", L"FJS", L"FJT", L"FJU", L"FJV", L"FJW", L"FJX", L"FJY", L"FJZ", L"FKA", L"FKB", L"FKC", L"FKD", L"FKE", L"FKF", L"FKG", L"FKH", L"FKI", L"FKJ", L"FKK", L"FKL", L"FKM", L"FKN", L"FKO", L"FKP", L"FKQ", L"FKR", L"FKS", L"FKT", L"FKU", L"FKV", L"FKW", L"FKX", L"FKY", L"FKZ", L"FLA", L"FLB", L"FLC", L"FLD", L"FLE", L"FLF", L"FLG", L"FLH", L"FLI", L"FLJ", L"FLK", L"FLL", L"FLM", L"FLN", L"FLO", L"FLP", L"FLQ", L"FLR", L"FLS", L"FLT", L"FLU", L"FLV", L"FLW", L"FLX", L"FLY", L"FLZ", L"FMA", L"FMB", L"FMC", L"FMD", L"FME", L"FMF", L"FMG", L"FMH", L"FMI", L"FMJ", L"FMK", L"FML", L"FMM", L"FMN", L"FMO", L"FMP", L"FMQ", L"FMR", L"FMS", L"FMT", L"FMU", L"FMV", L"FMW", L"FMX", L"FMY", L"FMZ", L"FNA", L"FNB", L"FNC", L"FND", L"FNE", L"FNF", L"FNG", L"FNH", L"FNI", L"FNJ", L"FNK", L"FNL", L"FNM", L"FNN", L"FNO", L"FNP", L"FNQ", L"FNR", L"FNS", L"FNT", L"FNU", L"FNV", L"FNW", L"FNX", L"FNY", L"FNZ", L"FOA", L"FOB", L"FOC", L"FOD", L"FOE", L"FOF", L"FOG", L"FOH", L"FOI", L"FOJ", L"FOK", L"FOL", L"FOM", L"FON", L"FOO", L"FOP", L"FOQ", L"FOR", L"FOS", L"FOT", L"FOU", L"FOV", L"FOW", L"FOX", L"FOY", L"FOZ", L"FPA", L"FPB", L"FPC", L"FPD", L"FPE", L"FPF", L"FPG", L"FPH", L"FPI", L"FPJ", L"FPK", L"FPL", L"FPM", L"FPN", L"FPO", L"FPP", L"FPQ", L"FPR", L"FPS", L"FPT", L"FPU", L"FPV", L"FPW", L"FPX", L"FPY", L"FPZ", L"FQA", L"FQB", L"FQC", L"FQD", L"FQE", L"FQF", L"FQG", L"FQH", L"FQI", L"FQJ", L"FQK", L"FQL", L"FQM", L"FQN", L"FQO", L"FQP", L"FQQ", L"FQR", L"FQS", L"FQT", L"FQU", L"FQV", L"FQW", L"FQX", L"FQY", L"FQZ", L"FRA", L"FRB", L"FRC", L"FRD", L"FRE", L"FRF", L"FRG", L"FRH", L"FRI", L"FRJ", L"FRK", L"FRL", L"FRM", L"FRN", L"FRO", L"FRP", L"FRQ", L"FRR", L"FRS", L"FRT", L"FRU", L"FRV", L"FRW", L"FRX", L"FRY", L"FRZ", L"FSA", L"FSB", L"FSC", L"FSD", L"FSE", L"FSF", L"FSG", L"FSH", L"FSI", L"FSJ", L"FSK", L"FSL", L"FSM", L"FSN", L"FSO", L"FSP", L"FSQ", L"FSR", L"FSS", L"FST", L"FSU", L"FSV", L"FSW", L"FSX", L"FSY", L"FSZ", L"FTA", L"FTB", L"FTC", L"FTD", L"FTE", L"FTF", L"FTG", L"FTH", L"FTI", L"FTJ", L"FTK", L"FTL", L"FTM", L"FTN", L"FTO", L"FTP", L"FTQ", L"FTR", L"FTS", L"FTT", L"FTU", L"FTV", L"FTW", L"FTX", L"FTY", L"FTZ", L"FUA", L"FUB", L"FUC", L"FUD", L"FUE", L"FUF", L"FUG", L"FUH", L"FUI", L"FUJ", L"FUK", L"FUL", L"FUM", L"FUN", L"FUO", L"FUP", L"FUQ", L"FUR", L"FUS", L"FUT", L"FUU", L"FUV", L"FUW", L"FUX", L"FUY", L"FUZ", L"FVA", L"FVB", L"FVC", L"FVD", L"FVE", L"FVF", L"FVG", L"FVH", L"FVI", L"FVJ", L"FVK", L"FVL", L"FVM", L"FVN", L"FVO", L"FVP", L"FVQ", L"FVR", L"FVS", L"FVT", L"FVU", L"FVV", L"FVW", L"FVX", L"FVY", L"FVZ", L"FWA", L"FWB", L"FWC", L"FWD", L"FWE", L"FWF", L"FWG", L"FWH", L"FWI", L"FWJ", L"FWK", L"FWL", L"FWM", L"FWN", L"FWO", L"FWP", L"FWQ", L"FWR", L"FWS", L"FWT", L"FWU", L"FWV", L"FWW", L"FWX", L"FWY", L"FWZ", L"FXA", L"FXB", L"FXC", L"FXD", L"FXE", L"FXF", L"FXG", L"FXH", L"FXI", L"FXJ", L"FXK", L"FXL", L"FXM", L"FXN", L"FXO", L"FXP", L"FXQ", L"FXR", L"FXS", L"FXT", L"FXU", L"FXV", L"FXW", L"FXX", L"FXY", L"FXZ", L"FYA", L"FYB", L"FYC", L"FYD", L"FYE", L"FYF", L"FYG", L"FYH", L"FYI", L"FYJ", L"FYK", L"FYL", L"FYM", L"FYN", L"FYO", L"FYP", L"FYQ", L"FYR", L"FYS", L"FYT", L"FYU", L"FYV", L"FYW", L"FYX", L"FYY", L"FYZ", L"FZA", L"FZB", L"FZC", L"FZD", L"FZE", L"FZF", L"FZG", L"FZH", L"FZI", L"FZJ", L"FZK", L"FZL", L"FZM", L"FZN", L"FZO", L"FZP", L"FZQ", L"FZR", L"FZS", L"FZT", L"FZU", L"FZV", L"FZW", L"FZX", L"FZY", L"FZZ", L"GAA", L"GAB", L"GAC", L"GAD", L"GAE", L"GAF", L"GAG", L"GAH", L"GAI", L"GAJ", L"GAK", L"GAL", L"GAM", L"GAN", L"GAO", L"GAP", L"GAQ", L"GAR", L"GAS", L"GAT", L"GAU", L"GAV", L"GAW", L"GAX", L"GAY", L"GAZ", L"GBA", L"GBB", L"GBC", L"GBD", L"GBE", L"GBF", L"GBG", L"GBH", L"GBI", L"GBJ", L"GBK", L"GBL", L"GBM", L"GBN", L"GBO", L"GBP", L"GBQ", L"GBR", L"GBS", L"GBT", L"GBU", L"GBV", L"GBW", L"GBX", L"GBY", L"GBZ", L"GCA", L"GCB", L"GCC", L"GCD", L"GCE", L"GCF", L"GCG", L"GCH", L"GCI", L"GCJ", L"GCK", L"GCL", L"GCM", L"GCN", L"GCO", L"GCP", L"GCQ", L"GCR", L"GCS", L"GCT", L"GCU", L"GCV", L"GCW", L"GCX", L"GCY", L"GCZ", L"GDA", L"GDB", L"GDC", L"GDD", L"GDE", L"GDF", L"GDG", L"GDH", L"GDI", L"GDJ", L"GDK", L"GDL", L"GDM", L"GDN", L"GDO", L"GDP", L"GDQ", L"GDR", L"GDS", L"GDT", L"GDU", L"GDV", L"GDW", L"GDX", L"GDY", L"GDZ", L"GEA", L"GEB", L"GEC", L"GED", L"GEE", L"GEF", L"GEG", L"GEH", L"GEI", L"GEJ", L"GEK", L"GEL", L"GEM", L"GEN", L"GEO", L"GEP", L"GEQ", L"GER", L"GES", L"GET", L"GEU", L"GEV", L"GEW", L"GEX", L"GEY", L"GEZ", L"GFA", L"GFB", L"GFC", L"GFD", L"GFE", L"GFF", L"GFG", L"GFH", L"GFI", L"GFJ", L"GFK", L"GFL", L"GFM", L"GFN", L"GFO", L"GFP", L"GFQ", L"GFR", L"GFS", L"GFT", L"GFU", L"GFV", L"GFW", L"GFX", L"GFY", L"GFZ", L"GGA", L"GGB", L"GGC", L"GGD", L"GGE", L"GGF", L"GGG", L"GGH", L"GGI", L"GGJ", L"GGK", L"GGL", L"GGM", L"GGN", L"GGO", L"GGP", L"GGQ", L"GGR", L"GGS", L"GGT", L"GGU", L"GGV", L"GGW", L"GGX", L"GGY", L"GGZ", L"GHA", L"GHB", L"GHC", L"GHD", L"GHE", L"GHF", L"GHG", L"GHH", L"GHI", L"GHJ", L"GHK", L"GHL", L"GHM", L"GHN", L"GHO", L"GHP", L"GHQ", L"GHR", L"GHS", L"GHT", L"GHU", L"GHV", L"GHW", L"GHX", L"GHY", L"GHZ", L"GIA", L"GIB", L"GIC", L"GID", L"GIE", L"GIF", L"GIG", L"GIH", L"GII", L"GIJ", L"GIK", L"GIL", L"GIM", L"GIN", L"GIO", L"GIP", L"GIQ", L"GIR", L"GIS", - L"GIT", L"GIU", L"GIV", L"GIW", L"GIX", L"GIY", L"GIZ", L"GJA", L"GJB", L"GJC", L"GJD", L"GJE", L"GJF", L"GJG", L"GJH", L"GJI", L"GJJ", L"GJK", L"GJL", L"GJM", L"GJN", L"GJO", L"GJP", L"GJQ", L"GJR", L"GJS", L"GJT", L"GJU", L"GJV", L"GJW", L"GJX", L"GJY", L"GJZ", L"GKA", L"GKB", L"GKC", L"GKD", L"GKE", L"GKF", L"GKG", L"GKH", L"GKI", L"GKJ", L"GKK", L"GKL", L"GKM", L"GKN", L"GKO", L"GKP", L"GKQ", L"GKR", L"GKS", L"GKT", L"GKU", L"GKV", L"GKW", L"GKX", L"GKY", L"GKZ", L"GLA", L"GLB", L"GLC", L"GLD", L"GLE", L"GLF", L"GLG", L"GLH", L"GLI", L"GLJ", L"GLK", L"GLL", L"GLM", L"GLN", L"GLO", L"GLP", L"GLQ", L"GLR", L"GLS", L"GLT", L"GLU", L"GLV", L"GLW", L"GLX", L"GLY", L"GLZ", L"GMA", L"GMB", L"GMC", L"GMD", L"GME", L"GMF", L"GMG", L"GMH", L"GMI", L"GMJ", L"GMK", L"GML", L"GMM", L"GMN", L"GMO", L"GMP", L"GMQ", L"GMR", L"GMS", L"GMT", L"GMU", L"GMV", L"GMW", L"GMX", L"GMY", L"GMZ", L"GNA", L"GNB", L"GNC", L"GND", L"GNE", L"GNF", L"GNG", L"GNH", L"GNI", L"GNJ", L"GNK", L"GNL", L"GNM", L"GNN", L"GNO", L"GNP", L"GNQ", L"GNR", L"GNS", L"GNT", L"GNU", L"GNV", L"GNW", L"GNX", L"GNY", L"GNZ", L"GOA", L"GOB", L"GOC", L"GOD", L"GOE", L"GOF", L"GOG", L"GOH", L"GOI", L"GOJ", L"GOK", L"GOL", L"GOM", L"GON", L"GOO", L"GOP", L"GOQ", L"GOR", L"GOS", L"GOT", L"GOU", L"GOV", L"GOW", L"GOX", L"GOY", L"GOZ", L"GPA", L"GPB", L"GPC", L"GPD", L"GPE", L"GPF", L"GPG", L"GPH", L"GPI", L"GPJ", L"GPK", L"GPL", L"GPM", L"GPN", L"GPO", L"GPP", L"GPQ", L"GPR", L"GPS", L"GPT", L"GPU", L"GPV", L"GPW", L"GPX", L"GPY", L"GPZ", L"GQA", L"GQB", L"GQC", L"GQD", L"GQE", L"GQF", L"GQG", L"GQH", L"GQI", L"GQJ", L"GQK", L"GQL", L"GQM", L"GQN", L"GQO", L"GQP", L"GQQ", L"GQR", L"GQS", L"GQT", L"GQU", L"GQV", L"GQW", L"GQX", L"GQY", L"GQZ", L"GRA", L"GRB", L"GRC", L"GRD", L"GRE", L"GRF", L"GRG", L"GRH", L"GRI", L"GRJ", L"GRK", L"GRL", L"GRM", L"GRN", L"GRO", L"GRP", L"GRQ", L"GRR", L"GRS", L"GRT", L"GRU", L"GRV", L"GRW", L"GRX", L"GRY", L"GRZ", L"GSA", L"GSB", L"GSC", L"GSD", L"GSE", L"GSF", L"GSG", L"GSH", L"GSI", L"GSJ", L"GSK", L"GSL", L"GSM", L"GSN", L"GSO", L"GSP", L"GSQ", L"GSR", L"GSS", L"GST", L"GSU", L"GSV", L"GSW", L"GSX", L"GSY", L"GSZ", L"GTA", L"GTB", L"GTC", L"GTD", L"GTE", L"GTF", - L"GTG", L"GTH", L"GTI", L"GTJ", L"GTK", L"GTL", L"GTM", L"GTN", L"GTO", L"GTP", L"GTQ", L"GTR", L"GTS", L"GTT", L"GTU", L"GTV", L"GTW", L"GTX", L"GTY", L"GTZ", L"GUA", L"GUB", L"GUC", L"GUD", L"GUE", L"GUF", L"GUG", L"GUH", L"GUI", L"GUJ", L"GUK", L"GUL", L"GUM", L"GUN", L"GUO", L"GUP", L"GUQ", L"GUR", L"GUS", L"GUT", L"GUU", L"GUV", L"GUW", L"GUX", L"GUY", L"GUZ", L"GVA", L"GVB", L"GVC", L"GVD", L"GVE", L"GVF", L"GVG", L"GVH", L"GVI", L"GVJ", L"GVK", L"GVL", L"GVM", L"GVN", L"GVO", L"GVP", L"GVQ", L"GVR", L"GVS", L"GVT", L"GVU", L"GVV", L"GVW", L"GVX", L"GVY", L"GVZ", L"GWA", L"GWB", L"GWC", L"GWD", L"GWE", L"GWF", L"GWG", L"GWH", L"GWI", L"GWJ", L"GWK", L"GWL", L"GWM", L"GWN", L"GWO", L"GWP", L"GWQ", L"GWR", L"GWS", L"GWT", L"GWU", L"GWV", L"GWW", L"GWX", L"GWY", L"GWZ", L"GXA", L"GXB", L"GXC", L"GXD", L"GXE", L"GXF", L"GXG", L"GXH", L"GXI", L"GXJ", L"GXK", L"GXL", L"GXM", L"GXN", L"GXO", L"GXP", L"GXQ", L"GXR", L"GXS", L"GXT", L"GXU", L"GXV", L"GXW", L"GXX", L"GXY", L"GXZ", L"GYA", L"GYB", L"GYC", L"GYD", L"GYE", L"GYF", L"GYG", L"GYH", L"GYI", L"GYJ", L"GYK", L"GYL", L"GYM", L"GYN", L"GYO", L"GYP", L"GYQ", L"GYR", L"GYS", L"GYT", L"GYU", L"GYV", L"GYW", L"GYX", L"GYY", L"GYZ", L"GZA", L"GZB", L"GZC", L"GZD", L"GZE", L"GZF", L"GZG", L"GZH", L"GZI", L"GZJ", L"GZK", L"GZL", L"GZM", L"GZN", L"GZO", L"GZP", L"GZQ", L"GZR", L"GZS", L"GZT", L"GZU", L"GZV", L"GZW", L"GZX", L"GZY", L"GZZ", L"HAA", L"HAB", L"HAC", L"HAD", L"HAE", L"HAF", L"HAG", L"HAH", L"HAI", L"HAJ", L"HAK", L"HAL", L"HAM", L"HAN", L"HAO", L"HAP", L"HAQ", L"HAR", L"HAS", L"HAT", L"HAU", L"HAV", L"HAW", L"HAX", L"HAY", L"HAZ", L"HBA", L"HBB", L"HBC", L"HBD", L"HBE", L"HBF", L"HBG", L"HBH", L"HBI", L"HBJ", L"HBK", L"HBL", L"HBM", L"HBN", L"HBO", L"HBP", L"HBQ", L"HBR", L"HBS", L"HBT", L"HBU", L"HBV", L"HBW", L"HBX", L"HBY", L"HBZ", L"HCA", L"HCB", L"HCC", L"HCD", L"HCE", L"HCF", L"HCG", L"HCH", L"HCI", L"HCJ", L"HCK", L"HCL", L"HCM", L"HCN", L"HCO", L"HCP", L"HCQ", L"HCR", L"HCS", L"HCT", L"HCU", L"HCV", L"HCW", L"HCX", L"HCY", L"HCZ", L"HDA", L"HDB", L"HDC", L"HDD", L"HDE", L"HDF", L"HDG", L"HDH", L"HDI", L"HDJ", L"HDK", L"HDL", L"HDM", L"HDN", L"HDO", L"HDP", L"HDQ", L"HDR", L"HDS", - L"HDT", L"HDU", L"HDV", L"HDW", L"HDX", L"HDY", L"HDZ", L"HEA", L"HEB", L"HEC", L"HED", L"HEE", L"HEF", L"HEG", L"HEH", L"HEI", L"HEJ", L"HEK", L"HEL", L"HEM", L"HEN", L"HEO", L"HEP", L"HEQ", L"HER", L"HES", L"HET", L"HEU", L"HEV", L"HEW", L"HEX", L"HEY", L"HEZ", L"HFA", L"HFB", L"HFC", L"HFD", L"HFE", L"HFF", L"HFG", L"HFH", L"HFI", L"HFJ", L"HFK", L"HFL", L"HFM", L"HFN", L"HFO", L"HFP", L"HFQ", L"HFR", L"HFS", L"HFT", L"HFU", L"HFV", L"HFW", L"HFX", L"HFY", L"HFZ", L"HGA", L"HGB", L"HGC", L"HGD", L"HGE", L"HGF", L"HGG", L"HGH", L"HGI", L"HGJ", L"HGK", L"HGL", L"HGM", L"HGN", L"HGO", L"HGP", L"HGQ", L"HGR", L"HGS", L"HGT", L"HGU", L"HGV", L"HGW", L"HGX", L"HGY", L"HGZ", L"HHA", L"HHB", L"HHC", L"HHD", L"HHE", L"HHF", L"HHG", L"HHH", L"HHI", L"HHJ", L"HHK", L"HHL", L"HHM", L"HHN", L"HHO", L"HHP", L"HHQ", L"HHR", L"HHS", L"HHT", L"HHU", L"HHV", L"HHW", L"HHX", L"HHY", L"HHZ", L"HIA", L"HIB", L"HIC", L"HID", L"HIE", L"HIF", L"HIG", L"HIH", L"HII", L"HIJ", L"HIK", L"HIL", L"HIM", L"HIN", L"HIO", L"HIP", L"HIQ", L"HIR", L"HIS", L"HIT", L"HIU", L"HIV", L"HIW", L"HIX", L"HIY", L"HIZ", L"HJA", L"HJB", L"HJC", L"HJD", L"HJE", L"HJF", L"HJG", L"HJH", L"HJI", L"HJJ", L"HJK", L"HJL", L"HJM", L"HJN", L"HJO", L"HJP", L"HJQ", L"HJR", L"HJS", L"HJT", L"HJU", L"HJV", L"HJW", L"HJX", L"HJY", L"HJZ", L"HKA", L"HKB", L"HKC", L"HKD", L"HKE", L"HKF", L"HKG", L"HKH", L"HKI", L"HKJ", L"HKK", L"HKL", L"HKM", L"HKN", L"HKO", L"HKP", L"HKQ", L"HKR", L"HKS", L"HKT", L"HKU", L"HKV", L"HKW", L"HKX", L"HKY", L"HKZ", L"HLA", L"HLB", L"HLC", L"HLD", L"HLE", L"HLF", L"HLG", L"HLH", L"HLI", L"HLJ", L"HLK", L"HLL", L"HLM", L"HLN", L"HLO", L"HLP", L"HLQ", L"HLR", L"HLS", L"HLT", L"HLU", L"HLV", L"HLW", L"HLX", L"HLY", L"HLZ", L"HMA", L"HMB", L"HMC", L"HMD", L"HME", L"HMF", L"HMG", L"HMH", L"HMI", L"HMJ", L"HMK", L"HML", L"HMM", L"HMN", L"HMO", L"HMP", L"HMQ", L"HMR", L"HMS", L"HMT", L"HMU", L"HMV", L"HMW", L"HMX", L"HMY", L"HMZ", L"HNA", L"HNB", L"HNC", L"HND", L"HNE", L"HNF", L"HNG", L"HNH", L"HNI", L"HNJ", L"HNK", L"HNL", L"HNM", L"HNN", L"HNO", L"HNP", L"HNQ", L"HNR", L"HNS", L"HNT", L"HNU", L"HNV", L"HNW", L"HNX", L"HNY", L"HNZ", L"HOA", L"HOB", L"HOC", L"HOD", L"HOE", L"HOF", + L"GIT", L"GIU", L"GIV", L"GIW", L"GIX", L"GIY", L"GIZ", L"GJA", L"GJB", L"GJC", L"GJD", L"GJE", L"GJF", L"GJG", L"GJH", L"GJI", L"GJJ", L"GJK", L"GJL", L"GJM", L"GJN", L"GJO", L"GJP", L"GJQ", L"GJR", L"GJS", L"GJT", L"GJU", L"GJV", L"GJW", L"GJX", L"GJY", L"GJZ", L"GKA", L"GKB", L"GKC", L"GKD", L"GKE", L"GKF", L"GKG", L"GKH", L"GKI", L"GKJ", L"GKK", L"GKL", L"GKM", L"GKN", L"GKO", L"GKP", L"GKQ", L"GKR", L"GKS", L"GKT", L"GKU", L"GKV", L"GKW", L"GKX", L"GKY", L"GKZ", L"GLA", L"GLB", L"GLC", L"GLD", L"GLE", L"GLF", L"GLG", L"GLH", L"GLI", L"GLJ", L"GLK", L"GLL", L"GLM", L"GLN", L"GLO", L"GLP", L"GLQ", L"GLR", L"GLS", L"GLT", L"GLU", L"GLV", L"GLW", L"GLX", L"GLY", L"GLZ", L"GMA", L"GMB", L"GMC", L"GMD", L"GME", L"GMF", L"GMG", L"GMH", L"GMI", L"GMJ", L"GMK", L"GML", L"GMM", L"GMN", L"GMO", L"GMP", L"GMQ", L"GMR", L"GMS", L"GMT", L"GMU", L"GMV", L"GMW", L"GMX", L"GMY", L"GMZ", L"GNA", L"GNB", L"GNC", L"GND", L"GNE", L"GNF", L"GNG", L"GNH", L"GNI", L"GNJ", L"GNK", L"GNL", L"GNM", L"GNN", L"GNO", L"GNP", L"GNQ", L"GNR", L"GNS", L"GNT", L"GNU", L"GNV", L"GNW", L"GNX", L"GNY", L"GNZ", L"GOA", L"GOB", L"GOC", L"GOD", L"GOE", L"GOF", L"GOG", L"GOH", L"GOI", L"GOJ", L"GOK", L"GOL", L"GOM", L"GON", L"GOO", L"GOP", L"GOQ", L"GOR", L"GOS", L"GOT", L"GOU", L"GOV", L"GOW", L"GOX", L"GOY", L"GOZ", L"GPA", L"GPB", L"GPC", L"GPD", L"GPE", L"GPF", L"GPG", L"GPH", L"GPI", L"GPJ", L"GPK", L"GPL", L"GPM", L"GPN", L"GPO", L"GPP", L"GPQ", L"GPR", L"GPS", L"GPT", L"GPU", L"GPV", L"GPW", L"GPX", L"GPY", L"GPZ", L"GQA", L"GQB", L"GQC", L"GQD", L"GQE", L"GQF", L"GQG", L"GQH", L"GQI", L"GQJ", L"GQK", L"GQL", L"GQM", L"GQN", L"GQO", L"GQP", L"GQQ", L"GQR", L"GQS", L"GQT", L"GQU", L"GQV", L"GQW", L"GQX", L"GQY", L"GQZ", L"GRA", L"GRB", L"GRC", L"GRD", L"GRE", L"GRF", L"GRG", L"GRH", L"GRI", L"GRJ", L"GRK", L"GRL", L"GRM", L"GRN", L"GRO", L"GRP", L"GRQ", L"GRR", L"GRS", L"GRT", L"GRU", L"GRV", L"GRW", L"GRX", L"GRY", L"GRZ", L"GSA", L"GSB", L"GSC", L"GSD", L"GSE", L"GSF", L"GSG", L"GSH", L"GSI", L"GSJ", L"GSK", L"GSL", L"GSM", L"GSN", L"GSO", L"GSP", L"GSQ", L"GSR", L"GSS", L"GST", L"GSU", L"GSV", L"GSW", L"GSX", L"GSY", L"GSZ", L"GTA", L"GTB", L"GTC", L"GTD", L"GTE", L"GTF", + L"GTG", L"GTH", L"GTI", L"GTJ", L"GTK", L"GTL", L"GTM", L"GTN", L"GTO", L"GTP", L"GTQ", L"GTR", L"GTS", L"GTT", L"GTU", L"GTV", L"GTW", L"GTX", L"GTY", L"GTZ", L"GUA", L"GUB", L"GUC", L"GUD", L"GUE", L"GUF", L"GUG", L"GUH", L"GUI", L"GUJ", L"GUK", L"GUL", L"GUM", L"GUN", L"GUO", L"GUP", L"GUQ", L"GUR", L"GUS", L"GUT", L"GUU", L"GUV", L"GUW", L"GUX", L"GUY", L"GUZ", L"GVA", L"GVB", L"GVC", L"GVD", L"GVE", L"GVF", L"GVG", L"GVH", L"GVI", L"GVJ", L"GVK", L"GVL", L"GVM", L"GVN", L"GVO", L"GVP", L"GVQ", L"GVR", L"GVS", L"GVT", L"GVU", L"GVV", L"GVW", L"GVX", L"GVY", L"GVZ", L"GWA", L"GWB", L"GWC", L"GWD", L"GWE", L"GWF", L"GWG", L"GWH", L"GWI", L"GWJ", L"GWK", L"GWL", L"GWM", L"GWN", L"GWO", L"GWP", L"GWQ", L"GWR", L"GWS", L"GWT", L"GWU", L"GWV", L"GWW", L"GWX", L"GWY", L"GWZ", L"GXA", L"GXB", L"GXC", L"GXD", L"GXE", L"GXF", L"GXG", L"GXH", L"GXI", L"GXJ", L"GXK", L"GXL", L"GXM", L"GXN", L"GXO", L"GXP", L"GXQ", L"GXR", L"GXS", L"GXT", L"GXU", L"GXV", L"GXW", L"GXX", L"GXY", L"GXZ", L"GYA", L"GYB", L"GYC", L"GYD", L"GYE", L"GYF", L"GYG", L"GYH", L"GYI", L"GYJ", L"GYK", L"GYL", L"GYM", L"GYN", L"GYO", L"GYP", L"GYQ", L"GYR", L"GYS", L"GYT", L"GYU", L"GYV", L"GYW", L"GYX", L"GYY", L"GYZ", L"GZA", L"GZB", L"GZC", L"GZD", L"GZE", L"GZF", L"GZG", L"GZH", L"GZI", L"GZJ", L"GZK", L"GZL", L"GZM", L"GZN", L"GZO", L"GZP", L"GZQ", L"GZR", L"GZS", L"GZT", L"GZU", L"GZV", L"GZW", L"GZX", L"GZY", L"GZZ", L"HAA", L"HAB", L"HAC", L"HAD", L"HAE", L"HAF", L"HAG", L"HAH", L"HAI", L"HAJ", L"HAK", L"HAL", L"HAM", L"HAN", L"HAO", L"HAP", L"HAQ", L"HAR", L"HAS", L"HAT", L"HAU", L"HAV", L"HAW", L"HAX", L"HAY", L"HAZ", L"HBA", L"HBB", L"HBC", L"HBD", L"HBE", L"HBF", L"HBG", L"HBH", L"HBI", L"HBJ", L"HBK", L"HBL", L"HBM", L"HBN", L"HBO", L"HBP", L"HBQ", L"HBR", L"HBS", L"HBT", L"HBU", L"HBV", L"HBW", L"HBX", L"HBY", L"HBZ", L"HCA", L"HCB", L"HCC", L"HCD", L"HCE", L"HCF", L"HCG", L"HCH", L"HCI", L"HCJ", L"HCK", L"HCL", L"HCM", L"HCN", L"HCO", L"HCP", L"HCQ", L"HCR", L"HCS", L"HCT", L"HCU", L"HCV", L"HCW", L"HCX", L"HCY", L"HCZ", L"HDA", L"HDB", L"HDC", L"HDD", L"HDE", L"HDF", L"HDG", L"HDH", L"HDI", L"HDJ", L"HDK", L"HDL", L"HDM", L"HDN", L"HDO", L"HDP", L"HDQ", L"HDR", L"HDS", + L"HDT", L"HDU", L"HDV", L"HDW", L"HDX", L"HDY", L"HDZ", L"HEA", L"HEB", L"HEC", L"HED", L"HEE", L"HEF", L"HEG", L"HEH", L"HEI", L"HEJ", L"HEK", L"HEL", L"HEM", L"HEN", L"HEO", L"HEP", L"HEQ", L"HER", L"HES", L"HET", L"HEU", L"HEV", L"HEW", L"HEX", L"HEY", L"HEZ", L"HFA", L"HFB", L"HFC", L"HFD", L"HFE", L"HFF", L"HFG", L"HFH", L"HFI", L"HFJ", L"HFK", L"HFL", L"HFM", L"HFN", L"HFO", L"HFP", L"HFQ", L"HFR", L"HFS", L"HFT", L"HFU", L"HFV", L"HFW", L"HFX", L"HFY", L"HFZ", L"HGA", L"HGB", L"HGC", L"HGD", L"HGE", L"HGF", L"HGG", L"HGH", L"HGI", L"HGJ", L"HGK", L"HGL", L"HGM", L"HGN", L"HGO", L"HGP", L"HGQ", L"HGR", L"HGS", L"HGT", L"HGU", L"HGV", L"HGW", L"HGX", L"HGY", L"HGZ", L"HHA", L"HHB", L"HHC", L"HHD", L"HHE", L"HHF", L"HHG", L"HHH", L"HHI", L"HHJ", L"HHK", L"HHL", L"HHM", L"HHN", L"HHO", L"HHP", L"HHQ", L"HHR", L"HHS", L"HHT", L"HHU", L"HHV", L"HHW", L"HHX", L"HHY", L"HHZ", L"HIA", L"HIB", L"HIC", L"HID", L"HIE", L"HIF", L"HIG", L"HIH", L"HII", L"HIJ", L"HIK", L"HIL", L"HIM", L"HIN", L"HIO", L"HIP", L"HIQ", L"HIR", L"HIS", L"HIT", L"HIU", L"HIV", L"HIW", L"HIX", L"HIY", L"HIZ", L"HJA", L"HJB", L"HJC", L"HJD", L"HJE", L"HJF", L"HJG", L"HJH", L"HJI", L"HJJ", L"HJK", L"HJL", L"HJM", L"HJN", L"HJO", L"HJP", L"HJQ", L"HJR", L"HJS", L"HJT", L"HJU", L"HJV", L"HJW", L"HJX", L"HJY", L"HJZ", L"HKA", L"HKB", L"HKC", L"HKD", L"HKE", L"HKF", L"HKG", L"HKH", L"HKI", L"HKJ", L"HKK", L"HKL", L"HKM", L"HKN", L"HKO", L"HKP", L"HKQ", L"HKR", L"HKS", L"HKT", L"HKU", L"HKV", L"HKW", L"HKX", L"HKY", L"HKZ", L"HLA", L"HLB", L"HLC", L"HLD", L"HLE", L"HLF", L"HLG", L"HLH", L"HLI", L"HLJ", L"HLK", L"HLL", L"HLM", L"HLN", L"HLO", L"HLP", L"HLQ", L"HLR", L"HLS", L"HLT", L"HLU", L"HLV", L"HLW", L"HLX", L"HLY", L"HLZ", L"HMA", L"HMB", L"HMC", L"HMD", L"HME", L"HMF", L"HMG", L"HMH", L"HMI", L"HMJ", L"HMK", L"HML", L"HMM", L"HMN", L"HMO", L"HMP", L"HMQ", L"HMR", L"HMS", L"HMT", L"HMU", L"HMV", L"HMW", L"HMX", L"HMY", L"HMZ", L"HNA", L"HNB", L"HNC", L"HND", L"HNE", L"HNF", L"HNG", L"HNH", L"HNI", L"HNJ", L"HNK", L"HNL", L"HNM", L"HNN", L"HNO", L"HNP", L"HNQ", L"HNR", L"HNS", L"HNT", L"HNU", L"HNV", L"HNW", L"HNX", L"HNY", L"HNZ", L"HOA", L"HOB", L"HOC", L"HOD", L"HOE", L"HOF", L"HOG", L"HOH", L"HOI", L"HOJ", L"HOK", L"HOL", L"HOM", L"HON", L"HOO", L"HOP", L"HOQ", L"HOR", L"HOS", L"HOT", L"HOU", L"HOV", L"HOW", L"HOX", L"HOY", L"HOZ", L"HPA", L"HPB", L"HPC", L"HPD", L"HPE", L"HPF", L"HPG", L"HPH", L"HPI", L"HPJ", L"HPK", L"HPL", L"HPM", L"HPN", L"HPO", L"HPP", L"HPQ", L"HPR", L"HPS", L"HPT", L"HPU", L"HPV", L"HPW", L"HPX", L"HPY", L"HPZ", L"HQA", L"HQB", L"HQC", L"HQD", L"HQE", L"HQF", L"HQG", L"HQH", L"HQI", L"HQJ", L"HQK", L"HQL", L"HQM", L"HQN", L"HQO", L"HQP", L"HQQ", L"HQR", L"HQS", L"HQT", L"HQU", L"HQV", L"HQW", L"HQX", L"HQY", L"HQZ", L"HRA", L"HRB", L"HRC", L"HRD", L"HRE", L"HRF", L"HRG", L"HRH", L"HRI", L"HRJ", L"HRK", L"HRL", L"HRM", L"HRN", L"HRO", L"HRP", L"HRQ", L"HRR", L"HRS", L"HRT", L"HRU", L"HRV", L"HRW", L"HRX", L"HRY", L"HRZ", L"HSA", L"HSB", L"HSC", L"HSD", L"HSE", L"HSF", L"HSG", L"HSH", L"HSI", L"HSJ", L"HSK", L"HSL", L"HSM", L"HSN", L"HSO", L"HSP", L"HSQ", L"HSR", L"HSS", L"HST", L"HSU", L"HSV", L"HSW", L"HSX", L"HSY", L"HSZ", L"HTA", L"HTB", L"HTC", L"HTD", L"HTE", L"HTF", L"HTG", L"HTH", L"HTI", L"HTJ", L"HTK", L"HTL", L"HTM", L"HTN", L"HTO", L"HTP", L"HTQ", L"HTR", L"HTS", L"HTT", L"HTU", L"HTV", L"HTW", L"HTX", L"HTY", L"HTZ", L"HUA", L"HUB", L"HUC", L"HUD", L"HUE", L"HUF", L"HUG", L"HUH", L"HUI", L"HUJ", L"HUK", L"HUL", L"HUM", L"HUN", L"HUO", L"HUP", L"HUQ", L"HUR", L"HUS", L"HUT", L"HUU", L"HUV", L"HUW", L"HUX", L"HUY", L"HUZ", L"HVA", L"HVB", L"HVC", L"HVD", L"HVE", L"HVF", L"HVG", L"HVH", L"HVI", L"HVJ", L"HVK", L"HVL", L"HVM", L"HVN", L"HVO", L"HVP", L"HVQ", L"HVR", L"HVS", L"HVT", L"HVU", L"HVV", L"HVW", L"HVX", L"HVY", L"HVZ", L"HWA", L"HWB", L"HWC", L"HWD", L"HWE", L"HWF", L"HWG", L"HWH", L"HWI", L"HWJ", L"HWK", L"HWL", L"HWM", L"HWN", L"HWO", L"HWP", L"HWQ", L"HWR", L"HWS", L"HWT", L"HWU", L"HWV", L"HWW", L"HWX", L"HWY", L"HWZ", L"HXA", L"HXB", L"HXC", L"HXD", L"HXE", L"HXF", L"HXG", L"HXH", L"HXI", L"HXJ", L"HXK", L"HXL", L"HXM", L"HXN", L"HXO", L"HXP", L"HXQ", L"HXR", L"HXS", L"HXT", L"HXU", L"HXV", L"HXW", L"HXX", L"HXY", L"HXZ", L"HYA", L"HYB", L"HYC", L"HYD", L"HYE", L"HYF", L"HYG", L"HYH", L"HYI", L"HYJ", L"HYK", L"HYL", L"HYM", L"HYN", L"HYO", L"HYP", L"HYQ", L"HYR", L"HYS", L"HYT", L"HYU", L"HYV", L"HYW", L"HYX", L"HYY", L"HYZ", L"HZA", L"HZB", L"HZC", L"HZD", L"HZE", L"HZF", L"HZG", L"HZH", L"HZI", L"HZJ", L"HZK", L"HZL", L"HZM", L"HZN", L"HZO", L"HZP", L"HZQ", L"HZR", L"HZS", L"HZT", L"HZU", L"HZV", L"HZW", L"HZX", L"HZY", L"HZZ", L"IAA", L"IAB", L"IAC", L"IAD", L"IAE", L"IAF", L"IAG", L"IAH", L"IAI", L"IAJ", L"IAK", L"IAL", L"IAM", L"IAN", L"IAO", L"IAP", L"IAQ", L"IAR", L"IAS", L"IAT", L"IAU", L"IAV", L"IAW", L"IAX", L"IAY", L"IAZ", L"IBA", L"IBB", L"IBC", L"IBD", L"IBE", L"IBF", L"IBG", L"IBH", L"IBI", L"IBJ", L"IBK", L"IBL", L"IBM", L"IBN", L"IBO", L"IBP", L"IBQ", L"IBR", L"IBS", L"IBT", L"IBU", L"IBV", L"IBW", L"IBX", L"IBY", L"IBZ", L"ICA", L"ICB", L"ICC", L"ICD", L"ICE", L"ICF", L"ICG", L"ICH", L"ICI", L"ICJ", L"ICK", L"ICL", L"ICM", L"ICN", L"ICO", L"ICP", L"ICQ", L"ICR", L"ICS", L"ICT", L"ICU", L"ICV", L"ICW", L"ICX", L"ICY", L"ICZ", L"IDA", L"IDB", L"IDC", L"IDD", L"IDE", L"IDF", L"IDG", L"IDH", L"IDI", L"IDJ", L"IDK", L"IDL", L"IDM", L"IDN", L"IDO", L"IDP", L"IDQ", L"IDR", L"IDS", L"IDT", L"IDU", L"IDV", L"IDW", L"IDX", L"IDY", L"IDZ", L"IEA", L"IEB", L"IEC", L"IED", L"IEE", L"IEF", L"IEG", L"IEH", L"IEI", L"IEJ", L"IEK", L"IEL", L"IEM", L"IEN", L"IEO", L"IEP", L"IEQ", L"IER", L"IES", L"IET", L"IEU", L"IEV", L"IEW", L"IEX", L"IEY", L"IEZ", L"IFA", L"IFB", L"IFC", L"IFD", L"IFE", L"IFF", L"IFG", L"IFH", L"IFI", L"IFJ", L"IFK", L"IFL", L"IFM", L"IFN", L"IFO", L"IFP", L"IFQ", L"IFR", L"IFS", L"IFT", L"IFU", L"IFV", L"IFW", L"IFX", L"IFY", L"IFZ", L"IGA", L"IGB", L"IGC", L"IGD", L"IGE", L"IGF", L"IGG", L"IGH", L"IGI", L"IGJ", L"IGK", L"IGL", L"IGM", L"IGN", L"IGO", L"IGP", L"IGQ", L"IGR", L"IGS", L"IGT", L"IGU", L"IGV", L"IGW", L"IGX", L"IGY", L"IGZ", L"IHA", L"IHB", L"IHC", L"IHD", L"IHE", L"IHF", L"IHG", L"IHH", L"IHI", L"IHJ", L"IHK", L"IHL", L"IHM", L"IHN", L"IHO", L"IHP", L"IHQ", L"IHR", L"IHS", L"IHT", L"IHU", L"IHV", L"IHW", L"IHX", L"IHY", L"IHZ", L"IIA", L"IIB", L"IIC", L"IID", L"IIE", L"IIF", L"IIG", L"IIH", L"III", L"IIJ", L"IIK", L"IIL", L"IIM", L"IIN", L"IIO", L"IIP", L"IIQ", L"IIR", L"IIS", L"IIT", L"IIU", L"IIV", L"IIW", L"IIX", L"IIY", L"IIZ", L"IJA", L"IJB", L"IJC", L"IJD", L"IJE", L"IJF", L"IJG", L"IJH", L"IJI", L"IJJ", L"IJK", L"IJL", L"IJM", L"IJN", L"IJO", L"IJP", L"IJQ", L"IJR", L"IJS", L"IJT", L"IJU", L"IJV", L"IJW", L"IJX", L"IJY", L"IJZ", L"IKA", L"IKB", L"IKC", L"IKD", L"IKE", L"IKF", L"IKG", L"IKH", L"IKI", L"IKJ", L"IKK", L"IKL", L"IKM", L"IKN", L"IKO", L"IKP", L"IKQ", L"IKR", L"IKS", L"IKT", L"IKU", L"IKV", L"IKW", L"IKX", L"IKY", L"IKZ", L"ILA", L"ILB", L"ILC", L"ILD", L"ILE", L"ILF", L"ILG", L"ILH", L"ILI", L"ILJ", L"ILK", L"ILL", L"ILM", L"ILN", L"ILO", L"ILP", L"ILQ", L"ILR", L"ILS", L"ILT", L"ILU", L"ILV", L"ILW", L"ILX", L"ILY", L"ILZ", L"IMA", L"IMB", L"IMC", L"IMD", L"IME", L"IMF", L"IMG", L"IMH", L"IMI", L"IMJ", L"IMK", L"IML", L"IMM", L"IMN", L"IMO", L"IMP", L"IMQ", L"IMR", L"IMS", L"IMT", L"IMU", L"IMV", L"IMW", L"IMX", L"IMY", L"IMZ", L"INA", L"INB", L"INC", L"IND", L"INE", L"INF", L"ING", L"INH", L"INI", L"INJ", L"INK", L"INL", L"INM", L"INN", L"INO", L"INP", L"INQ", L"INR", L"INS", L"INT", L"INU", L"INV", L"INW", L"INX", L"INY", L"INZ", L"IOA", L"IOB", L"IOC", L"IOD", L"IOE", L"IOF", L"IOG", L"IOH", L"IOI", L"IOJ", L"IOK", L"IOL", L"IOM", L"ION", L"IOO", L"IOP", L"IOQ", L"IOR", L"IOS", L"IOT", L"IOU", L"IOV", L"IOW", L"IOX", L"IOY", L"IOZ", L"IPA", L"IPB", L"IPC", L"IPD", L"IPE", L"IPF", L"IPG", L"IPH", L"IPI", L"IPJ", L"IPK", L"IPL", L"IPM", L"IPN", L"IPO", L"IPP", L"IPQ", L"IPR", L"IPS", L"IPT", L"IPU", L"IPV", L"IPW", L"IPX", L"IPY", L"IPZ", L"IQA", L"IQB", L"IQC", L"IQD", L"IQE", L"IQF", L"IQG", L"IQH", L"IQI", L"IQJ", L"IQK", L"IQL", L"IQM", L"IQN", L"IQO", L"IQP", L"IQQ", L"IQR", L"IQS", L"IQT", L"IQU", L"IQV", L"IQW", L"IQX", L"IQY", L"IQZ", L"IRA", L"IRB", L"IRC", L"IRD", L"IRE", L"IRF", L"IRG", L"IRH", L"IRI", L"IRJ", L"IRK", L"IRL", L"IRM", L"IRN", L"IRO", L"IRP", L"IRQ", L"IRR", L"IRS", L"IRT", L"IRU", L"IRV", L"IRW", L"IRX", L"IRY", L"IRZ", L"ISA", L"ISB", L"ISC", L"ISD", L"ISE", L"ISF", L"ISG", L"ISH", L"ISI", L"ISJ", L"ISK", L"ISL", L"ISM", L"ISN", L"ISO", L"ISP", L"ISQ", L"ISR", L"ISS", L"IST", L"ISU", L"ISV", L"ISW", L"ISX", L"ISY", L"ISZ", L"ITA", L"ITB", L"ITC", L"ITD", L"ITE", L"ITF", L"ITG", L"ITH", L"ITI", L"ITJ", L"ITK", @@ -97,37 +97,37 @@ namespace OOX L"JDY", L"JDZ", L"JEA", L"JEB", L"JEC", L"JED", L"JEE", L"JEF", L"JEG", L"JEH", L"JEI", L"JEJ", L"JEK", L"JEL", L"JEM", L"JEN", L"JEO", L"JEP", L"JEQ", L"JER", L"JES", L"JET", L"JEU", L"JEV", L"JEW", L"JEX", L"JEY", L"JEZ", L"JFA", L"JFB", L"JFC", L"JFD", L"JFE", L"JFF", L"JFG", L"JFH", L"JFI", L"JFJ", L"JFK", L"JFL", L"JFM", L"JFN", L"JFO", L"JFP", L"JFQ", L"JFR", L"JFS", L"JFT", L"JFU", L"JFV", L"JFW", L"JFX", L"JFY", L"JFZ", L"JGA", L"JGB", L"JGC", L"JGD", L"JGE", L"JGF", L"JGG", L"JGH", L"JGI", L"JGJ", L"JGK", L"JGL", L"JGM", L"JGN", L"JGO", L"JGP", L"JGQ", L"JGR", L"JGS", L"JGT", L"JGU", L"JGV", L"JGW", L"JGX", L"JGY", L"JGZ", L"JHA", L"JHB", L"JHC", L"JHD", L"JHE", L"JHF", L"JHG", L"JHH", L"JHI", L"JHJ", L"JHK", L"JHL", L"JHM", L"JHN", L"JHO", L"JHP", L"JHQ", L"JHR", L"JHS", L"JHT", L"JHU", L"JHV", L"JHW", L"JHX", L"JHY", L"JHZ", L"JIA", L"JIB", L"JIC", L"JID", L"JIE", L"JIF", L"JIG", L"JIH", L"JII", L"JIJ", L"JIK", L"JIL", L"JIM", L"JIN", L"JIO", L"JIP", L"JIQ", L"JIR", L"JIS", L"JIT", L"JIU", L"JIV", L"JIW", L"JIX", L"JIY", L"JIZ", L"JJA", L"JJB", L"JJC", L"JJD", L"JJE", L"JJF", L"JJG", L"JJH", L"JJI", L"JJJ", L"JJK", L"JJL", L"JJM", L"JJN", L"JJO", L"JJP", L"JJQ", L"JJR", L"JJS", L"JJT", L"JJU", L"JJV", L"JJW", L"JJX", L"JJY", L"JJZ", L"JKA", L"JKB", L"JKC", L"JKD", L"JKE", L"JKF", L"JKG", L"JKH", L"JKI", L"JKJ", L"JKK", L"JKL", L"JKM", L"JKN", L"JKO", L"JKP", L"JKQ", L"JKR", L"JKS", L"JKT", L"JKU", L"JKV", L"JKW", L"JKX", L"JKY", L"JKZ", L"JLA", L"JLB", L"JLC", L"JLD", L"JLE", L"JLF", L"JLG", L"JLH", L"JLI", L"JLJ", L"JLK", L"JLL", L"JLM", L"JLN", L"JLO", L"JLP", L"JLQ", L"JLR", L"JLS", L"JLT", L"JLU", L"JLV", L"JLW", L"JLX", L"JLY", L"JLZ", L"JMA", L"JMB", L"JMC", L"JMD", L"JME", L"JMF", L"JMG", L"JMH", L"JMI", L"JMJ", L"JMK", L"JML", L"JMM", L"JMN", L"JMO", L"JMP", L"JMQ", L"JMR", L"JMS", L"JMT", L"JMU", L"JMV", L"JMW", L"JMX", L"JMY", L"JMZ", L"JNA", L"JNB", L"JNC", L"JND", L"JNE", L"JNF", L"JNG", L"JNH", L"JNI", L"JNJ", L"JNK", L"JNL", L"JNM", L"JNN", L"JNO", L"JNP", L"JNQ", L"JNR", L"JNS", L"JNT", L"JNU", L"JNV", L"JNW", L"JNX", L"JNY", L"JNZ", L"JOA", L"JOB", L"JOC", L"JOD", L"JOE", L"JOF", L"JOG", L"JOH", L"JOI", L"JOJ", L"JOK", L"JOL", L"JOM", L"JON", L"JOO", L"JOP", L"JOQ", L"JOR", L"JOS", L"JOT", L"JOU", L"JOV", L"JOW", L"JOX", L"JOY", L"JOZ", L"JPA", L"JPB", L"JPC", L"JPD", L"JPE", L"JPF", L"JPG", L"JPH", L"JPI", L"JPJ", L"JPK", L"JPL", L"JPM", L"JPN", L"JPO", L"JPP", L"JPQ", L"JPR", L"JPS", L"JPT", L"JPU", L"JPV", L"JPW", L"JPX", L"JPY", L"JPZ", L"JQA", L"JQB", L"JQC", L"JQD", L"JQE", L"JQF", L"JQG", L"JQH", L"JQI", L"JQJ", L"JQK", L"JQL", L"JQM", L"JQN", L"JQO", L"JQP", L"JQQ", L"JQR", L"JQS", L"JQT", L"JQU", L"JQV", L"JQW", L"JQX", L"JQY", L"JQZ", L"JRA", L"JRB", L"JRC", L"JRD", L"JRE", L"JRF", L"JRG", L"JRH", L"JRI", L"JRJ", L"JRK", L"JRL", L"JRM", L"JRN", L"JRO", L"JRP", L"JRQ", L"JRR", L"JRS", L"JRT", L"JRU", L"JRV", L"JRW", L"JRX", L"JRY", L"JRZ", L"JSA", L"JSB", L"JSC", L"JSD", L"JSE", L"JSF", L"JSG", L"JSH", L"JSI", L"JSJ", L"JSK", L"JSL", L"JSM", L"JSN", L"JSO", L"JSP", L"JSQ", L"JSR", L"JSS", L"JST", L"JSU", L"JSV", L"JSW", L"JSX", L"JSY", L"JSZ", L"JTA", L"JTB", L"JTC", L"JTD", L"JTE", L"JTF", L"JTG", L"JTH", L"JTI", L"JTJ", L"JTK", L"JTL", L"JTM", L"JTN", L"JTO", L"JTP", L"JTQ", L"JTR", L"JTS", L"JTT", L"JTU", L"JTV", L"JTW", L"JTX", L"JTY", L"JTZ", L"JUA", L"JUB", L"JUC", L"JUD", L"JUE", L"JUF", L"JUG", L"JUH", L"JUI", L"JUJ", L"JUK", L"JUL", L"JUM", L"JUN", L"JUO", L"JUP", L"JUQ", L"JUR", L"JUS", L"JUT", L"JUU", L"JUV", L"JUW", L"JUX", L"JUY", L"JUZ", L"JVA", L"JVB", L"JVC", L"JVD", L"JVE", L"JVF", L"JVG", L"JVH", L"JVI", L"JVJ", L"JVK", L"JVL", L"JVM", L"JVN", L"JVO", L"JVP", L"JVQ", L"JVR", L"JVS", L"JVT", L"JVU", L"JVV", L"JVW", L"JVX", L"JVY", L"JVZ", L"JWA", L"JWB", L"JWC", L"JWD", L"JWE", L"JWF", L"JWG", L"JWH", L"JWI", L"JWJ", L"JWK", L"JWL", L"JWM", L"JWN", L"JWO", L"JWP", L"JWQ", L"JWR", L"JWS", L"JWT", L"JWU", L"JWV", L"JWW", L"JWX", L"JWY", L"JWZ", L"JXA", L"JXB", L"JXC", L"JXD", L"JXE", L"JXF", L"JXG", L"JXH", L"JXI", L"JXJ", L"JXK", L"JXL", L"JXM", L"JXN", L"JXO", L"JXP", L"JXQ", L"JXR", L"JXS", L"JXT", L"JXU", L"JXV", L"JXW", L"JXX", L"JXY", L"JXZ", L"JYA", L"JYB", L"JYC", L"JYD", L"JYE", L"JYF", L"JYG", L"JYH", L"JYI", L"JYJ", L"JYK", L"JYL", L"JYM", L"JYN", L"JYO", L"JYP", L"JYQ", L"JYR", L"JYS", L"JYT", L"JYU", L"JYV", L"JYW", L"JYX", L"JYY", L"JYZ", L"JZA", L"JZB", L"JZC", L"JZD", L"JZE", L"JZF", L"JZG", L"JZH", L"JZI", L"JZJ", L"JZK", L"JZL", L"JZM", L"JZN", L"JZO", L"JZP", L"JZQ", L"JZR", L"JZS", L"JZT", L"JZU", L"JZV", L"JZW", L"JZX", L"JZY", L"JZZ", L"KAA", L"KAB", L"KAC", L"KAD", L"KAE", L"KAF", L"KAG", L"KAH", L"KAI", L"KAJ", L"KAK", L"KAL", L"KAM", L"KAN", L"KAO", L"KAP", L"KAQ", L"KAR", L"KAS", L"KAT", L"KAU", L"KAV", L"KAW", L"KAX", L"KAY", L"KAZ", L"KBA", L"KBB", L"KBC", L"KBD", L"KBE", L"KBF", L"KBG", L"KBH", L"KBI", L"KBJ", L"KBK", L"KBL", L"KBM", L"KBN", L"KBO", L"KBP", L"KBQ", L"KBR", L"KBS", L"KBT", L"KBU", L"KBV", L"KBW", L"KBX", L"KBY", L"KBZ", L"KCA", L"KCB", L"KCC", L"KCD", L"KCE", L"KCF", L"KCG", L"KCH", L"KCI", L"KCJ", L"KCK", L"KCL", L"KCM", L"KCN", L"KCO", L"KCP", L"KCQ", L"KCR", L"KCS", L"KCT", L"KCU", L"KCV", L"KCW", L"KCX", L"KCY", L"KCZ", L"KDA", L"KDB", L"KDC", L"KDD", L"KDE", L"KDF", L"KDG", L"KDH", L"KDI", L"KDJ", L"KDK", L"KDL", L"KDM", L"KDN", L"KDO", L"KDP", L"KDQ", L"KDR", L"KDS", L"KDT", L"KDU", L"KDV", L"KDW", L"KDX", L"KDY", L"KDZ", L"KEA", L"KEB", L"KEC", L"KED", L"KEE", L"KEF", L"KEG", L"KEH", L"KEI", L"KEJ", L"KEK", L"KEL", L"KEM", L"KEN", L"KEO", L"KEP", L"KEQ", L"KER", L"KES", L"KET", L"KEU", L"KEV", L"KEW", L"KEX", L"KEY", L"KEZ", L"KFA", L"KFB", L"KFC", L"KFD", L"KFE", L"KFF", L"KFG", L"KFH", L"KFI", L"KFJ", L"KFK", L"KFL", L"KFM", L"KFN", L"KFO", L"KFP", L"KFQ", L"KFR", L"KFS", L"KFT", L"KFU", L"KFV", L"KFW", L"KFX", L"KFY", L"KFZ", L"KGA", L"KGB", L"KGC", L"KGD", L"KGE", L"KGF", L"KGG", L"KGH", L"KGI", L"KGJ", L"KGK", L"KGL", L"KGM", L"KGN", L"KGO", L"KGP", L"KGQ", L"KGR", L"KGS", L"KGT", L"KGU", L"KGV", L"KGW", L"KGX", L"KGY", L"KGZ", L"KHA", L"KHB", L"KHC", L"KHD", L"KHE", L"KHF", L"KHG", L"KHH", L"KHI", L"KHJ", L"KHK", L"KHL", L"KHM", L"KHN", L"KHO", L"KHP", L"KHQ", L"KHR", L"KHS", L"KHT", L"KHU", L"KHV", L"KHW", L"KHX", L"KHY", L"KHZ", L"KIA", L"KIB", L"KIC", L"KID", L"KIE", L"KIF", L"KIG", L"KIH", L"KII", L"KIJ", L"KIK", L"KIL", L"KIM", L"KIN", L"KIO", L"KIP", L"KIQ", L"KIR", L"KIS", L"KIT", L"KIU", L"KIV", L"KIW", L"KIX", L"KIY", L"KIZ", L"KJA", L"KJB", L"KJC", L"KJD", L"KJE", L"KJF", L"KJG", L"KJH", L"KJI", L"KJJ", L"KJK", - L"KJL", L"KJM", L"KJN", L"KJO", L"KJP", L"KJQ", L"KJR", L"KJS", L"KJT", L"KJU", L"KJV", L"KJW", L"KJX", L"KJY", L"KJZ", L"KKA", L"KKB", L"KKC", L"KKD", L"KKE", L"KKF", L"KKG", L"KKH", L"KKI", L"KKJ", L"KKK", L"KKL", L"KKM", L"KKN", L"KKO", L"KKP", L"KKQ", L"KKR", L"KKS", L"KKT", L"KKU", L"KKV", L"KKW", L"KKX", L"KKY", L"KKZ", L"KLA", L"KLB", L"KLC", L"KLD", L"KLE", L"KLF", L"KLG", L"KLH", L"KLI", L"KLJ", L"KLK", L"KLL", L"KLM", L"KLN", L"KLO", L"KLP", L"KLQ", L"KLR", L"KLS", L"KLT", L"KLU", L"KLV", L"KLW", L"KLX", L"KLY", L"KLZ", L"KMA", L"KMB", L"KMC", L"KMD", L"KME", L"KMF", L"KMG", L"KMH", L"KMI", L"KMJ", L"KMK", L"KML", L"KMM", L"KMN", L"KMO", L"KMP", L"KMQ", L"KMR", L"KMS", L"KMT", L"KMU", L"KMV", L"KMW", L"KMX", L"KMY", L"KMZ", L"KNA", L"KNB", L"KNC", L"KND", L"KNE", L"KNF", L"KNG", L"KNH", L"KNI", L"KNJ", L"KNK", L"KNL", L"KNM", L"KNN", L"KNO", L"KNP", L"KNQ", L"KNR", L"KNS", L"KNT", L"KNU", L"KNV", L"KNW", L"KNX", L"KNY", L"KNZ", L"KOA", L"KOB", L"KOC", L"KOD", L"KOE", L"KOF", L"KOG", L"KOH", L"KOI", L"KOJ", L"KOK", L"KOL", L"KOM", L"KON", L"KOO", L"KOP", L"KOQ", L"KOR", L"KOS", L"KOT", L"KOU", L"KOV", L"KOW", L"KOX", L"KOY", L"KOZ", L"KPA", L"KPB", L"KPC", L"KPD", L"KPE", L"KPF", L"KPG", L"KPH", L"KPI", L"KPJ", L"KPK", L"KPL", L"KPM", L"KPN", L"KPO", L"KPP", L"KPQ", L"KPR", L"KPS", L"KPT", L"KPU", L"KPV", L"KPW", L"KPX", L"KPY", L"KPZ", L"KQA", L"KQB", L"KQC", L"KQD", L"KQE", L"KQF", L"KQG", L"KQH", L"KQI", L"KQJ", L"KQK", L"KQL", L"KQM", L"KQN", L"KQO", L"KQP", L"KQQ", L"KQR", L"KQS", L"KQT", L"KQU", L"KQV", L"KQW", L"KQX", L"KQY", L"KQZ", L"KRA", L"KRB", L"KRC", L"KRD", L"KRE", L"KRF", L"KRG", L"KRH", L"KRI", L"KRJ", L"KRK", L"KRL", L"KRM", L"KRN", L"KRO", L"KRP", L"KRQ", L"KRR", L"KRS", L"KRT", L"KRU", L"KRV", L"KRW", L"KRX", L"KRY", L"KRZ", L"KSA", L"KSB", L"KSC", L"KSD", L"KSE", L"KSF", L"KSG", L"KSH", L"KSI", L"KSJ", L"KSK", L"KSL", L"KSM", L"KSN", L"KSO", L"KSP", L"KSQ", L"KSR", L"KSS", L"KST", L"KSU", L"KSV", L"KSW", L"KSX", L"KSY", L"KSZ", L"KTA", L"KTB", L"KTC", L"KTD", L"KTE", L"KTF", L"KTG", L"KTH", L"KTI", L"KTJ", L"KTK", L"KTL", L"KTM", L"KTN", L"KTO", L"KTP", L"KTQ", L"KTR", L"KTS", L"KTT", L"KTU", L"KTV", L"KTW", L"KTX", - L"KTY", L"KTZ", L"KUA", L"KUB", L"KUC", L"KUD", L"KUE", L"KUF", L"KUG", L"KUH", L"KUI", L"KUJ", L"KUK", L"KUL", L"KUM", L"KUN", L"KUO", L"KUP", L"KUQ", L"KUR", L"KUS", L"KUT", L"KUU", L"KUV", L"KUW", L"KUX", L"KUY", L"KUZ", L"KVA", L"KVB", L"KVC", L"KVD", L"KVE", L"KVF", L"KVG", L"KVH", L"KVI", L"KVJ", L"KVK", L"KVL", L"KVM", L"KVN", L"KVO", L"KVP", L"KVQ", L"KVR", L"KVS", L"KVT", L"KVU", L"KVV", L"KVW", L"KVX", L"KVY", L"KVZ", L"KWA", L"KWB", L"KWC", L"KWD", L"KWE", L"KWF", L"KWG", L"KWH", L"KWI", L"KWJ", L"KWK", L"KWL", L"KWM", L"KWN", L"KWO", L"KWP", L"KWQ", L"KWR", L"KWS", L"KWT", L"KWU", L"KWV", L"KWW", L"KWX", L"KWY", L"KWZ", L"KXA", L"KXB", L"KXC", L"KXD", L"KXE", L"KXF", L"KXG", L"KXH", L"KXI", L"KXJ", L"KXK", L"KXL", L"KXM", L"KXN", L"KXO", L"KXP", L"KXQ", L"KXR", L"KXS", L"KXT", L"KXU", L"KXV", L"KXW", L"KXX", L"KXY", L"KXZ", L"KYA", L"KYB", L"KYC", L"KYD", L"KYE", L"KYF", L"KYG", L"KYH", L"KYI", L"KYJ", L"KYK", L"KYL", L"KYM", L"KYN", L"KYO", L"KYP", L"KYQ", L"KYR", L"KYS", L"KYT", L"KYU", L"KYV", L"KYW", L"KYX", L"KYY", L"KYZ", L"KZA", L"KZB", L"KZC", L"KZD", L"KZE", L"KZF", L"KZG", L"KZH", L"KZI", L"KZJ", L"KZK", L"KZL", L"KZM", L"KZN", L"KZO", L"KZP", L"KZQ", L"KZR", L"KZS", L"KZT", L"KZU", L"KZV", L"KZW", L"KZX", L"KZY", L"KZZ", L"LAA", L"LAB", L"LAC", L"LAD", L"LAE", L"LAF", L"LAG", L"LAH", L"LAI", L"LAJ", L"LAK", L"LAL", L"LAM", L"LAN", L"LAO", L"LAP", L"LAQ", L"LAR", L"LAS", L"LAT", L"LAU", L"LAV", L"LAW", L"LAX", L"LAY", L"LAZ", L"LBA", L"LBB", L"LBC", L"LBD", L"LBE", L"LBF", L"LBG", L"LBH", L"LBI", L"LBJ", L"LBK", L"LBL", L"LBM", L"LBN", L"LBO", L"LBP", L"LBQ", L"LBR", L"LBS", L"LBT", L"LBU", L"LBV", L"LBW", L"LBX", L"LBY", L"LBZ", L"LCA", L"LCB", L"LCC", L"LCD", L"LCE", L"LCF", L"LCG", L"LCH", L"LCI", L"LCJ", L"LCK", L"LCL", L"LCM", L"LCN", L"LCO", L"LCP", L"LCQ", L"LCR", L"LCS", L"LCT", L"LCU", L"LCV", L"LCW", L"LCX", L"LCY", L"LCZ", L"LDA", L"LDB", L"LDC", L"LDD", L"LDE", L"LDF", L"LDG", L"LDH", L"LDI", L"LDJ", L"LDK", L"LDL", L"LDM", L"LDN", L"LDO", L"LDP", L"LDQ", L"LDR", L"LDS", L"LDT", L"LDU", L"LDV", L"LDW", L"LDX", L"LDY", L"LDZ", L"LEA", L"LEB", L"LEC", L"LED", L"LEE", L"LEF", L"LEG", L"LEH", L"LEI", L"LEJ", L"LEK", - L"LEL", L"LEM", L"LEN", L"LEO", L"LEP", L"LEQ", L"LER", L"LES", L"LET", L"LEU", L"LEV", L"LEW", L"LEX", L"LEY", L"LEZ", L"LFA", L"LFB", L"LFC", L"LFD", L"LFE", L"LFF", L"LFG", L"LFH", L"LFI", L"LFJ", L"LFK", L"LFL", L"LFM", L"LFN", L"LFO", L"LFP", L"LFQ", L"LFR", L"LFS", L"LFT", L"LFU", L"LFV", L"LFW", L"LFX", L"LFY", L"LFZ", L"LGA", L"LGB", L"LGC", L"LGD", L"LGE", L"LGF", L"LGG", L"LGH", L"LGI", L"LGJ", L"LGK", L"LGL", L"LGM", L"LGN", L"LGO", L"LGP", L"LGQ", L"LGR", L"LGS", L"LGT", L"LGU", L"LGV", L"LGW", L"LGX", L"LGY", L"LGZ", L"LHA", L"LHB", L"LHC", L"LHD", L"LHE", L"LHF", L"LHG", L"LHH", L"LHI", L"LHJ", L"LHK", L"LHL", L"LHM", L"LHN", L"LHO", L"LHP", L"LHQ", L"LHR", L"LHS", L"LHT", L"LHU", L"LHV", L"LHW", L"LHX", L"LHY", L"LHZ", L"LIA", L"LIB", L"LIC", L"LID", L"LIE", L"LIF", L"LIG", L"LIH", L"LII", L"LIJ", L"LIK", L"LIL", L"LIM", L"LIN", L"LIO", L"LIP", L"LIQ", L"LIR", L"LIS", L"LIT", L"LIU", L"LIV", L"LIW", L"LIX", L"LIY", L"LIZ", L"LJA", L"LJB", L"LJC", L"LJD", L"LJE", L"LJF", L"LJG", L"LJH", L"LJI", L"LJJ", L"LJK", L"LJL", L"LJM", L"LJN", L"LJO", L"LJP", L"LJQ", L"LJR", L"LJS", L"LJT", L"LJU", L"LJV", L"LJW", L"LJX", L"LJY", L"LJZ", L"LKA", L"LKB", L"LKC", L"LKD", L"LKE", L"LKF", L"LKG", L"LKH", L"LKI", L"LKJ", L"LKK", L"LKL", L"LKM", L"LKN", L"LKO", L"LKP", L"LKQ", L"LKR", L"LKS", L"LKT", L"LKU", L"LKV", L"LKW", L"LKX", L"LKY", L"LKZ", L"LLA", L"LLB", L"LLC", L"LLD", L"LLE", L"LLF", L"LLG", L"LLH", L"LLI", L"LLJ", L"LLK", L"LLL", L"LLM", L"LLN", L"LLO", L"LLP", L"LLQ", L"LLR", L"LLS", L"LLT", L"LLU", L"LLV", L"LLW", L"LLX", L"LLY", L"LLZ", L"LMA", L"LMB", L"LMC", L"LMD", L"LME", L"LMF", L"LMG", L"LMH", L"LMI", L"LMJ", L"LMK", L"LML", L"LMM", L"LMN", L"LMO", L"LMP", L"LMQ", L"LMR", L"LMS", L"LMT", L"LMU", L"LMV", L"LMW", L"LMX", L"LMY", L"LMZ", L"LNA", L"LNB", L"LNC", L"LND", L"LNE", L"LNF", L"LNG", L"LNH", L"LNI", L"LNJ", L"LNK", L"LNL", L"LNM", L"LNN", L"LNO", L"LNP", L"LNQ", L"LNR", L"LNS", L"LNT", L"LNU", L"LNV", L"LNW", L"LNX", L"LNY", L"LNZ", L"LOA", L"LOB", L"LOC", L"LOD", L"LOE", L"LOF", L"LOG", L"LOH", L"LOI", L"LOJ", L"LOK", L"LOL", L"LOM", L"LON", L"LOO", L"LOP", L"LOQ", L"LOR", L"LOS", L"LOT", L"LOU", L"LOV", L"LOW", L"LOX", + L"KJL", L"KJM", L"KJN", L"KJO", L"KJP", L"KJQ", L"KJR", L"KJS", L"KJT", L"KJU", L"KJV", L"KJW", L"KJX", L"KJY", L"KJZ", L"KKA", L"KKB", L"KKC", L"KKD", L"KKE", L"KKF", L"KKG", L"KKH", L"KKI", L"KKJ", L"KKK", L"KKL", L"KKM", L"KKN", L"KKO", L"KKP", L"KKQ", L"KKR", L"KKS", L"KKT", L"KKU", L"KKV", L"KKW", L"KKX", L"KKY", L"KKZ", L"KLA", L"KLB", L"KLC", L"KLD", L"KLE", L"KLF", L"KLG", L"KLH", L"KLI", L"KLJ", L"KLK", L"KLL", L"KLM", L"KLN", L"KLO", L"KLP", L"KLQ", L"KLR", L"KLS", L"KLT", L"KLU", L"KLV", L"KLW", L"KLX", L"KLY", L"KLZ", L"KMA", L"KMB", L"KMC", L"KMD", L"KME", L"KMF", L"KMG", L"KMH", L"KMI", L"KMJ", L"KMK", L"KML", L"KMM", L"KMN", L"KMO", L"KMP", L"KMQ", L"KMR", L"KMS", L"KMT", L"KMU", L"KMV", L"KMW", L"KMX", L"KMY", L"KMZ", L"KNA", L"KNB", L"KNC", L"KND", L"KNE", L"KNF", L"KNG", L"KNH", L"KNI", L"KNJ", L"KNK", L"KNL", L"KNM", L"KNN", L"KNO", L"KNP", L"KNQ", L"KNR", L"KNS", L"KNT", L"KNU", L"KNV", L"KNW", L"KNX", L"KNY", L"KNZ", L"KOA", L"KOB", L"KOC", L"KOD", L"KOE", L"KOF", L"KOG", L"KOH", L"KOI", L"KOJ", L"KOK", L"KOL", L"KOM", L"KON", L"KOO", L"KOP", L"KOQ", L"KOR", L"KOS", L"KOT", L"KOU", L"KOV", L"KOW", L"KOX", L"KOY", L"KOZ", L"KPA", L"KPB", L"KPC", L"KPD", L"KPE", L"KPF", L"KPG", L"KPH", L"KPI", L"KPJ", L"KPK", L"KPL", L"KPM", L"KPN", L"KPO", L"KPP", L"KPQ", L"KPR", L"KPS", L"KPT", L"KPU", L"KPV", L"KPW", L"KPX", L"KPY", L"KPZ", L"KQA", L"KQB", L"KQC", L"KQD", L"KQE", L"KQF", L"KQG", L"KQH", L"KQI", L"KQJ", L"KQK", L"KQL", L"KQM", L"KQN", L"KQO", L"KQP", L"KQQ", L"KQR", L"KQS", L"KQT", L"KQU", L"KQV", L"KQW", L"KQX", L"KQY", L"KQZ", L"KRA", L"KRB", L"KRC", L"KRD", L"KRE", L"KRF", L"KRG", L"KRH", L"KRI", L"KRJ", L"KRK", L"KRL", L"KRM", L"KRN", L"KRO", L"KRP", L"KRQ", L"KRR", L"KRS", L"KRT", L"KRU", L"KRV", L"KRW", L"KRX", L"KRY", L"KRZ", L"KSA", L"KSB", L"KSC", L"KSD", L"KSE", L"KSF", L"KSG", L"KSH", L"KSI", L"KSJ", L"KSK", L"KSL", L"KSM", L"KSN", L"KSO", L"KSP", L"KSQ", L"KSR", L"KSS", L"KST", L"KSU", L"KSV", L"KSW", L"KSX", L"KSY", L"KSZ", L"KTA", L"KTB", L"KTC", L"KTD", L"KTE", L"KTF", L"KTG", L"KTH", L"KTI", L"KTJ", L"KTK", L"KTL", L"KTM", L"KTN", L"KTO", L"KTP", L"KTQ", L"KTR", L"KTS", L"KTT", L"KTU", L"KTV", L"KTW", L"KTX", + L"KTY", L"KTZ", L"KUA", L"KUB", L"KUC", L"KUD", L"KUE", L"KUF", L"KUG", L"KUH", L"KUI", L"KUJ", L"KUK", L"KUL", L"KUM", L"KUN", L"KUO", L"KUP", L"KUQ", L"KUR", L"KUS", L"KUT", L"KUU", L"KUV", L"KUW", L"KUX", L"KUY", L"KUZ", L"KVA", L"KVB", L"KVC", L"KVD", L"KVE", L"KVF", L"KVG", L"KVH", L"KVI", L"KVJ", L"KVK", L"KVL", L"KVM", L"KVN", L"KVO", L"KVP", L"KVQ", L"KVR", L"KVS", L"KVT", L"KVU", L"KVV", L"KVW", L"KVX", L"KVY", L"KVZ", L"KWA", L"KWB", L"KWC", L"KWD", L"KWE", L"KWF", L"KWG", L"KWH", L"KWI", L"KWJ", L"KWK", L"KWL", L"KWM", L"KWN", L"KWO", L"KWP", L"KWQ", L"KWR", L"KWS", L"KWT", L"KWU", L"KWV", L"KWW", L"KWX", L"KWY", L"KWZ", L"KXA", L"KXB", L"KXC", L"KXD", L"KXE", L"KXF", L"KXG", L"KXH", L"KXI", L"KXJ", L"KXK", L"KXL", L"KXM", L"KXN", L"KXO", L"KXP", L"KXQ", L"KXR", L"KXS", L"KXT", L"KXU", L"KXV", L"KXW", L"KXX", L"KXY", L"KXZ", L"KYA", L"KYB", L"KYC", L"KYD", L"KYE", L"KYF", L"KYG", L"KYH", L"KYI", L"KYJ", L"KYK", L"KYL", L"KYM", L"KYN", L"KYO", L"KYP", L"KYQ", L"KYR", L"KYS", L"KYT", L"KYU", L"KYV", L"KYW", L"KYX", L"KYY", L"KYZ", L"KZA", L"KZB", L"KZC", L"KZD", L"KZE", L"KZF", L"KZG", L"KZH", L"KZI", L"KZJ", L"KZK", L"KZL", L"KZM", L"KZN", L"KZO", L"KZP", L"KZQ", L"KZR", L"KZS", L"KZT", L"KZU", L"KZV", L"KZW", L"KZX", L"KZY", L"KZZ", L"LAA", L"LAB", L"LAC", L"LAD", L"LAE", L"LAF", L"LAG", L"LAH", L"LAI", L"LAJ", L"LAK", L"LAL", L"LAM", L"LAN", L"LAO", L"LAP", L"LAQ", L"LAR", L"LAS", L"LAT", L"LAU", L"LAV", L"LAW", L"LAX", L"LAY", L"LAZ", L"LBA", L"LBB", L"LBC", L"LBD", L"LBE", L"LBF", L"LBG", L"LBH", L"LBI", L"LBJ", L"LBK", L"LBL", L"LBM", L"LBN", L"LBO", L"LBP", L"LBQ", L"LBR", L"LBS", L"LBT", L"LBU", L"LBV", L"LBW", L"LBX", L"LBY", L"LBZ", L"LCA", L"LCB", L"LCC", L"LCD", L"LCE", L"LCF", L"LCG", L"LCH", L"LCI", L"LCJ", L"LCK", L"LCL", L"LCM", L"LCN", L"LCO", L"LCP", L"LCQ", L"LCR", L"LCS", L"LCT", L"LCU", L"LCV", L"LCW", L"LCX", L"LCY", L"LCZ", L"LDA", L"LDB", L"LDC", L"LDD", L"LDE", L"LDF", L"LDG", L"LDH", L"LDI", L"LDJ", L"LDK", L"LDL", L"LDM", L"LDN", L"LDO", L"LDP", L"LDQ", L"LDR", L"LDS", L"LDT", L"LDU", L"LDV", L"LDW", L"LDX", L"LDY", L"LDZ", L"LEA", L"LEB", L"LEC", L"LED", L"LEE", L"LEF", L"LEG", L"LEH", L"LEI", L"LEJ", L"LEK", + L"LEL", L"LEM", L"LEN", L"LEO", L"LEP", L"LEQ", L"LER", L"LES", L"LET", L"LEU", L"LEV", L"LEW", L"LEX", L"LEY", L"LEZ", L"LFA", L"LFB", L"LFC", L"LFD", L"LFE", L"LFF", L"LFG", L"LFH", L"LFI", L"LFJ", L"LFK", L"LFL", L"LFM", L"LFN", L"LFO", L"LFP", L"LFQ", L"LFR", L"LFS", L"LFT", L"LFU", L"LFV", L"LFW", L"LFX", L"LFY", L"LFZ", L"LGA", L"LGB", L"LGC", L"LGD", L"LGE", L"LGF", L"LGG", L"LGH", L"LGI", L"LGJ", L"LGK", L"LGL", L"LGM", L"LGN", L"LGO", L"LGP", L"LGQ", L"LGR", L"LGS", L"LGT", L"LGU", L"LGV", L"LGW", L"LGX", L"LGY", L"LGZ", L"LHA", L"LHB", L"LHC", L"LHD", L"LHE", L"LHF", L"LHG", L"LHH", L"LHI", L"LHJ", L"LHK", L"LHL", L"LHM", L"LHN", L"LHO", L"LHP", L"LHQ", L"LHR", L"LHS", L"LHT", L"LHU", L"LHV", L"LHW", L"LHX", L"LHY", L"LHZ", L"LIA", L"LIB", L"LIC", L"LID", L"LIE", L"LIF", L"LIG", L"LIH", L"LII", L"LIJ", L"LIK", L"LIL", L"LIM", L"LIN", L"LIO", L"LIP", L"LIQ", L"LIR", L"LIS", L"LIT", L"LIU", L"LIV", L"LIW", L"LIX", L"LIY", L"LIZ", L"LJA", L"LJB", L"LJC", L"LJD", L"LJE", L"LJF", L"LJG", L"LJH", L"LJI", L"LJJ", L"LJK", L"LJL", L"LJM", L"LJN", L"LJO", L"LJP", L"LJQ", L"LJR", L"LJS", L"LJT", L"LJU", L"LJV", L"LJW", L"LJX", L"LJY", L"LJZ", L"LKA", L"LKB", L"LKC", L"LKD", L"LKE", L"LKF", L"LKG", L"LKH", L"LKI", L"LKJ", L"LKK", L"LKL", L"LKM", L"LKN", L"LKO", L"LKP", L"LKQ", L"LKR", L"LKS", L"LKT", L"LKU", L"LKV", L"LKW", L"LKX", L"LKY", L"LKZ", L"LLA", L"LLB", L"LLC", L"LLD", L"LLE", L"LLF", L"LLG", L"LLH", L"LLI", L"LLJ", L"LLK", L"LLL", L"LLM", L"LLN", L"LLO", L"LLP", L"LLQ", L"LLR", L"LLS", L"LLT", L"LLU", L"LLV", L"LLW", L"LLX", L"LLY", L"LLZ", L"LMA", L"LMB", L"LMC", L"LMD", L"LME", L"LMF", L"LMG", L"LMH", L"LMI", L"LMJ", L"LMK", L"LML", L"LMM", L"LMN", L"LMO", L"LMP", L"LMQ", L"LMR", L"LMS", L"LMT", L"LMU", L"LMV", L"LMW", L"LMX", L"LMY", L"LMZ", L"LNA", L"LNB", L"LNC", L"LND", L"LNE", L"LNF", L"LNG", L"LNH", L"LNI", L"LNJ", L"LNK", L"LNL", L"LNM", L"LNN", L"LNO", L"LNP", L"LNQ", L"LNR", L"LNS", L"LNT", L"LNU", L"LNV", L"LNW", L"LNX", L"LNY", L"LNZ", L"LOA", L"LOB", L"LOC", L"LOD", L"LOE", L"LOF", L"LOG", L"LOH", L"LOI", L"LOJ", L"LOK", L"LOL", L"LOM", L"LON", L"LOO", L"LOP", L"LOQ", L"LOR", L"LOS", L"LOT", L"LOU", L"LOV", L"LOW", L"LOX", L"LOY", L"LOZ", L"LPA", L"LPB", L"LPC", L"LPD", L"LPE", L"LPF", L"LPG", L"LPH", L"LPI", L"LPJ", L"LPK", L"LPL", L"LPM", L"LPN", L"LPO", L"LPP", L"LPQ", L"LPR", L"LPS", L"LPT", L"LPU", L"LPV", L"LPW", L"LPX", L"LPY", L"LPZ", L"LQA", L"LQB", L"LQC", L"LQD", L"LQE", L"LQF", L"LQG", L"LQH", L"LQI", L"LQJ", L"LQK", L"LQL", L"LQM", L"LQN", L"LQO", L"LQP", L"LQQ", L"LQR", L"LQS", L"LQT", L"LQU", L"LQV", L"LQW", L"LQX", L"LQY", L"LQZ", L"LRA", L"LRB", L"LRC", L"LRD", L"LRE", L"LRF", L"LRG", L"LRH", L"LRI", L"LRJ", L"LRK", L"LRL", L"LRM", L"LRN", L"LRO", L"LRP", L"LRQ", L"LRR", L"LRS", L"LRT", L"LRU", L"LRV", L"LRW", L"LRX", L"LRY", L"LRZ", L"LSA", L"LSB", L"LSC", L"LSD", L"LSE", L"LSF", L"LSG", L"LSH", L"LSI", L"LSJ", L"LSK", L"LSL", L"LSM", L"LSN", L"LSO", L"LSP", L"LSQ", L"LSR", L"LSS", L"LST", L"LSU", L"LSV", L"LSW", L"LSX", L"LSY", L"LSZ", L"LTA", L"LTB", L"LTC", L"LTD", L"LTE", L"LTF", L"LTG", L"LTH", L"LTI", L"LTJ", L"LTK", L"LTL", L"LTM", L"LTN", L"LTO", L"LTP", L"LTQ", L"LTR", L"LTS", L"LTT", L"LTU", L"LTV", L"LTW", L"LTX", L"LTY", L"LTZ", L"LUA", L"LUB", L"LUC", L"LUD", L"LUE", L"LUF", L"LUG", L"LUH", L"LUI", L"LUJ", L"LUK", L"LUL", L"LUM", L"LUN", L"LUO", L"LUP", L"LUQ", L"LUR", L"LUS", L"LUT", L"LUU", L"LUV", L"LUW", L"LUX", L"LUY", L"LUZ", L"LVA", L"LVB", L"LVC", L"LVD", L"LVE", L"LVF", L"LVG", L"LVH", L"LVI", L"LVJ", L"LVK", L"LVL", L"LVM", L"LVN", L"LVO", L"LVP", L"LVQ", L"LVR", L"LVS", L"LVT", L"LVU", L"LVV", L"LVW", L"LVX", L"LVY", L"LVZ", L"LWA", L"LWB", L"LWC", L"LWD", L"LWE", L"LWF", L"LWG", L"LWH", L"LWI", L"LWJ", L"LWK", L"LWL", L"LWM", L"LWN", L"LWO", L"LWP", L"LWQ", L"LWR", L"LWS", L"LWT", L"LWU", L"LWV", L"LWW", L"LWX", L"LWY", L"LWZ", L"LXA", L"LXB", L"LXC", L"LXD", L"LXE", L"LXF", L"LXG", L"LXH", L"LXI", L"LXJ", L"LXK", L"LXL", L"LXM", L"LXN", L"LXO", L"LXP", L"LXQ", L"LXR", L"LXS", L"LXT", L"LXU", L"LXV", L"LXW", L"LXX", L"LXY", L"LXZ", L"LYA", L"LYB", L"LYC", L"LYD", L"LYE", L"LYF", L"LYG", L"LYH", L"LYI", L"LYJ", L"LYK", L"LYL", L"LYM", L"LYN", L"LYO", L"LYP", L"LYQ", L"LYR", L"LYS", L"LYT", L"LYU", L"LYV", L"LYW", L"LYX", L"LYY", L"LYZ", L"LZA", L"LZB", L"LZC", L"LZD", L"LZE", L"LZF", L"LZG", L"LZH", L"LZI", L"LZJ", L"LZK", L"LZL", L"LZM", L"LZN", L"LZO", L"LZP", L"LZQ", L"LZR", L"LZS", L"LZT", L"LZU", L"LZV", L"LZW", L"LZX", L"LZY", L"LZZ", L"MAA", L"MAB", L"MAC", L"MAD", L"MAE", L"MAF", L"MAG", L"MAH", L"MAI", L"MAJ", L"MAK", L"MAL", L"MAM", L"MAN", L"MAO", L"MAP", L"MAQ", L"MAR", L"MAS", L"MAT", L"MAU", L"MAV", L"MAW", L"MAX", L"MAY", L"MAZ", L"MBA", L"MBB", L"MBC", L"MBD", L"MBE", L"MBF", L"MBG", L"MBH", L"MBI", L"MBJ", L"MBK", L"MBL", L"MBM", L"MBN", L"MBO", L"MBP", L"MBQ", L"MBR", L"MBS", L"MBT", L"MBU", L"MBV", L"MBW", L"MBX", L"MBY", L"MBZ", L"MCA", L"MCB", L"MCC", L"MCD", L"MCE", L"MCF", L"MCG", L"MCH", L"MCI", L"MCJ", L"MCK", L"MCL", L"MCM", L"MCN", L"MCO", L"MCP", L"MCQ", L"MCR", L"MCS", L"MCT", L"MCU", L"MCV", L"MCW", L"MCX", L"MCY", L"MCZ", L"MDA", L"MDB", L"MDC", L"MDD", L"MDE", L"MDF", L"MDG", L"MDH", L"MDI", L"MDJ", L"MDK", L"MDL", L"MDM", L"MDN", L"MDO", L"MDP", L"MDQ", L"MDR", L"MDS", L"MDT", L"MDU", L"MDV", L"MDW", L"MDX", L"MDY", L"MDZ", L"MEA", L"MEB", L"MEC", L"MED", L"MEE", L"MEF", L"MEG", L"MEH", L"MEI", L"MEJ", L"MEK", L"MEL", L"MEM", L"MEN", L"MEO", L"MEP", L"MEQ", L"MER", L"MES", L"MET", L"MEU", L"MEV", L"MEW", L"MEX", L"MEY", L"MEZ", L"MFA", L"MFB", L"MFC", L"MFD", L"MFE", L"MFF", L"MFG", L"MFH", L"MFI", L"MFJ", L"MFK", L"MFL", L"MFM", L"MFN", L"MFO", L"MFP", L"MFQ", L"MFR", L"MFS", L"MFT", L"MFU", L"MFV", L"MFW", L"MFX", L"MFY", L"MFZ", L"MGA", L"MGB", L"MGC", L"MGD", L"MGE", L"MGF", L"MGG", L"MGH", L"MGI", L"MGJ", L"MGK", L"MGL", L"MGM", L"MGN", L"MGO", L"MGP", L"MGQ", L"MGR", L"MGS", L"MGT", L"MGU", L"MGV", L"MGW", L"MGX", L"MGY", L"MGZ", L"MHA", L"MHB", L"MHC", L"MHD", L"MHE", L"MHF", L"MHG", L"MHH", L"MHI", L"MHJ", L"MHK", L"MHL", L"MHM", L"MHN", L"MHO", L"MHP", L"MHQ", L"MHR", L"MHS", L"MHT", L"MHU", L"MHV", L"MHW", L"MHX", L"MHY", L"MHZ", L"MIA", L"MIB", L"MIC", L"MID", L"MIE", L"MIF", L"MIG", L"MIH", L"MII", L"MIJ", L"MIK", L"MIL", L"MIM", L"MIN", L"MIO", L"MIP", L"MIQ", L"MIR", L"MIS", L"MIT", L"MIU", L"MIV", L"MIW", L"MIX", L"MIY", L"MIZ", L"MJA", L"MJB", L"MJC", L"MJD", L"MJE", L"MJF", L"MJG", L"MJH", L"MJI", L"MJJ", L"MJK", L"MJL", L"MJM", L"MJN", L"MJO", L"MJP", L"MJQ", L"MJR", L"MJS", L"MJT", L"MJU", L"MJV", L"MJW", L"MJX", L"MJY", L"MJZ", L"MKA", L"MKB", L"MKC", L"MKD", L"MKE", L"MKF", L"MKG", L"MKH", L"MKI", L"MKJ", L"MKK", L"MKL", L"MKM", L"MKN", L"MKO", L"MKP", L"MKQ", L"MKR", L"MKS", L"MKT", L"MKU", L"MKV", L"MKW", L"MKX", L"MKY", L"MKZ", L"MLA", L"MLB", L"MLC", L"MLD", L"MLE", L"MLF", L"MLG", L"MLH", L"MLI", L"MLJ", L"MLK", L"MLL", L"MLM", L"MLN", L"MLO", L"MLP", L"MLQ", L"MLR", L"MLS", L"MLT", L"MLU", L"MLV", L"MLW", L"MLX", L"MLY", L"MLZ", L"MMA", L"MMB", L"MMC", L"MMD", L"MME", L"MMF", L"MMG", L"MMH", L"MMI", L"MMJ", L"MMK", L"MML", L"MMM", L"MMN", L"MMO", L"MMP", L"MMQ", L"MMR", L"MMS", L"MMT", L"MMU", L"MMV", L"MMW", L"MMX", L"MMY", L"MMZ", L"MNA", L"MNB", L"MNC", L"MND", L"MNE", L"MNF", L"MNG", L"MNH", L"MNI", L"MNJ", L"MNK", L"MNL", L"MNM", L"MNN", L"MNO", L"MNP", L"MNQ", L"MNR", L"MNS", L"MNT", L"MNU", L"MNV", L"MNW", L"MNX", L"MNY", L"MNZ", L"MOA", L"MOB", L"MOC", L"MOD", L"MOE", L"MOF", L"MOG", L"MOH", L"MOI", L"MOJ", L"MOK", L"MOL", L"MOM", L"MON", L"MOO", L"MOP", L"MOQ", L"MOR", L"MOS", L"MOT", L"MOU", L"MOV", L"MOW", L"MOX", L"MOY", L"MOZ", L"MPA", L"MPB", L"MPC", L"MPD", L"MPE", L"MPF", L"MPG", L"MPH", L"MPI", L"MPJ", L"MPK", L"MPL", L"MPM", L"MPN", L"MPO", L"MPP", L"MPQ", L"MPR", L"MPS", L"MPT", L"MPU", L"MPV", L"MPW", L"MPX", L"MPY", L"MPZ", L"MQA", L"MQB", L"MQC", L"MQD", L"MQE", L"MQF", L"MQG", L"MQH", L"MQI", L"MQJ", L"MQK", L"MQL", L"MQM", L"MQN", L"MQO", L"MQP", L"MQQ", L"MQR", L"MQS", L"MQT", L"MQU", L"MQV", L"MQW", L"MQX", L"MQY", L"MQZ", L"MRA", L"MRB", L"MRC", L"MRD", L"MRE", L"MRF", L"MRG", L"MRH", L"MRI", L"MRJ", L"MRK", L"MRL", L"MRM", L"MRN", L"MRO", L"MRP", L"MRQ", L"MRR", L"MRS", L"MRT", L"MRU", L"MRV", L"MRW", L"MRX", L"MRY", L"MRZ", L"MSA", L"MSB", L"MSC", L"MSD", L"MSE", L"MSF", L"MSG", L"MSH", L"MSI", L"MSJ", L"MSK", L"MSL", L"MSM", L"MSN", L"MSO", L"MSP", L"MSQ", L"MSR", L"MSS", L"MST", L"MSU", L"MSV", L"MSW", L"MSX", L"MSY", L"MSZ", L"MTA", L"MTB", L"MTC", L"MTD", L"MTE", L"MTF", L"MTG", L"MTH", L"MTI", L"MTJ", L"MTK", L"MTL", L"MTM", L"MTN", L"MTO", L"MTP", L"MTQ", L"MTR", L"MTS", L"MTT", L"MTU", L"MTV", L"MTW", L"MTX", L"MTY", L"MTZ", L"MUA", L"MUB", L"MUC", - L"MUD", L"MUE", L"MUF", L"MUG", L"MUH", L"MUI", L"MUJ", L"MUK", L"MUL", L"MUM", L"MUN", L"MUO", L"MUP", L"MUQ", L"MUR", L"MUS", L"MUT", L"MUU", L"MUV", L"MUW", L"MUX", L"MUY", L"MUZ", L"MVA", L"MVB", L"MVC", L"MVD", L"MVE", L"MVF", L"MVG", L"MVH", L"MVI", L"MVJ", L"MVK", L"MVL", L"MVM", L"MVN", L"MVO", L"MVP", L"MVQ", L"MVR", L"MVS", L"MVT", L"MVU", L"MVV", L"MVW", L"MVX", L"MVY", L"MVZ", L"MWA", L"MWB", L"MWC", L"MWD", L"MWE", L"MWF", L"MWG", L"MWH", L"MWI", L"MWJ", L"MWK", L"MWL", L"MWM", L"MWN", L"MWO", L"MWP", L"MWQ", L"MWR", L"MWS", L"MWT", L"MWU", L"MWV", L"MWW", L"MWX", L"MWY", L"MWZ", L"MXA", L"MXB", L"MXC", L"MXD", L"MXE", L"MXF", L"MXG", L"MXH", L"MXI", L"MXJ", L"MXK", L"MXL", L"MXM", L"MXN", L"MXO", L"MXP", L"MXQ", L"MXR", L"MXS", L"MXT", L"MXU", L"MXV", L"MXW", L"MXX", L"MXY", L"MXZ", L"MYA", L"MYB", L"MYC", L"MYD", L"MYE", L"MYF", L"MYG", L"MYH", L"MYI", L"MYJ", L"MYK", L"MYL", L"MYM", L"MYN", L"MYO", L"MYP", L"MYQ", L"MYR", L"MYS", L"MYT", L"MYU", L"MYV", L"MYW", L"MYX", L"MYY", L"MYZ", L"MZA", L"MZB", L"MZC", L"MZD", L"MZE", L"MZF", L"MZG", L"MZH", L"MZI", L"MZJ", L"MZK", L"MZL", L"MZM", L"MZN", L"MZO", L"MZP", L"MZQ", L"MZR", L"MZS", L"MZT", L"MZU", L"MZV", L"MZW", L"MZX", L"MZY", L"MZZ", L"NAA", L"NAB", L"NAC", L"NAD", L"NAE", L"NAF", L"NAG", L"NAH", L"NAI", L"NAJ", L"NAK", L"NAL", L"NAM", L"NAN", L"NAO", L"NAP", L"NAQ", L"NAR", L"NAS", L"NAT", L"NAU", L"NAV", L"NAW", L"NAX", L"NAY", L"NAZ", L"NBA", L"NBB", L"NBC", L"NBD", L"NBE", L"NBF", L"NBG", L"NBH", L"NBI", L"NBJ", L"NBK", L"NBL", L"NBM", L"NBN", L"NBO", L"NBP", L"NBQ", L"NBR", L"NBS", L"NBT", L"NBU", L"NBV", L"NBW", L"NBX", L"NBY", L"NBZ", L"NCA", L"NCB", L"NCC", L"NCD", L"NCE", L"NCF", L"NCG", L"NCH", L"NCI", L"NCJ", L"NCK", L"NCL", L"NCM", L"NCN", L"NCO", L"NCP", L"NCQ", L"NCR", L"NCS", L"NCT", L"NCU", L"NCV", L"NCW", L"NCX", L"NCY", L"NCZ", L"NDA", L"NDB", L"NDC", L"NDD", L"NDE", L"NDF", L"NDG", L"NDH", L"NDI", L"NDJ", L"NDK", L"NDL", L"NDM", L"NDN", L"NDO", L"NDP", L"NDQ", L"NDR", L"NDS", L"NDT", L"NDU", L"NDV", L"NDW", L"NDX", L"NDY", L"NDZ", L"NEA", L"NEB", L"NEC", L"NED", L"NEE", L"NEF", L"NEG", L"NEH", L"NEI", L"NEJ", L"NEK", L"NEL", L"NEM", L"NEN", L"NEO", L"NEP", - L"NEQ", L"NER", L"NES", L"NET", L"NEU", L"NEV", L"NEW", L"NEX", L"NEY", L"NEZ", L"NFA", L"NFB", L"NFC", L"NFD", L"NFE", L"NFF", L"NFG", L"NFH", L"NFI", L"NFJ", L"NFK", L"NFL", L"NFM", L"NFN", L"NFO", L"NFP", L"NFQ", L"NFR", L"NFS", L"NFT", L"NFU", L"NFV", L"NFW", L"NFX", L"NFY", L"NFZ", L"NGA", L"NGB", L"NGC", L"NGD", L"NGE", L"NGF", L"NGG", L"NGH", L"NGI", L"NGJ", L"NGK", L"NGL", L"NGM", L"NGN", L"NGO", L"NGP", L"NGQ", L"NGR", L"NGS", L"NGT", L"NGU", L"NGV", L"NGW", L"NGX", L"NGY", L"NGZ", L"NHA", L"NHB", L"NHC", L"NHD", L"NHE", L"NHF", L"NHG", L"NHH", L"NHI", L"NHJ", L"NHK", L"NHL", L"NHM", L"NHN", L"NHO", L"NHP", L"NHQ", L"NHR", L"NHS", L"NHT", L"NHU", L"NHV", L"NHW", L"NHX", L"NHY", L"NHZ", L"NIA", L"NIB", L"NIC", L"NID", L"NIE", L"NIF", L"NIG", L"NIH", L"NII", L"NIJ", L"NIK", L"NIL", L"NIM", L"NIN", L"NIO", L"NIP", L"NIQ", L"NIR", L"NIS", L"NIT", L"NIU", L"NIV", L"NIW", L"NIX", L"NIY", L"NIZ", L"NJA", L"NJB", L"NJC", L"NJD", L"NJE", L"NJF", L"NJG", L"NJH", L"NJI", L"NJJ", L"NJK", L"NJL", L"NJM", L"NJN", L"NJO", L"NJP", L"NJQ", L"NJR", L"NJS", L"NJT", L"NJU", L"NJV", L"NJW", L"NJX", L"NJY", L"NJZ", L"NKA", L"NKB", L"NKC", L"NKD", L"NKE", L"NKF", L"NKG", L"NKH", L"NKI", L"NKJ", L"NKK", L"NKL", L"NKM", L"NKN", L"NKO", L"NKP", L"NKQ", L"NKR", L"NKS", L"NKT", L"NKU", L"NKV", L"NKW", L"NKX", L"NKY", L"NKZ", L"NLA", L"NLB", L"NLC", L"NLD", L"NLE", L"NLF", L"NLG", L"NLH", L"NLI", L"NLJ", L"NLK", L"NLL", L"NLM", L"NLN", L"NLO", L"NLP", L"NLQ", L"NLR", L"NLS", L"NLT", L"NLU", L"NLV", L"NLW", L"NLX", L"NLY", L"NLZ", L"NMA", L"NMB", L"NMC", L"NMD", L"NME", L"NMF", L"NMG", L"NMH", L"NMI", L"NMJ", L"NMK", L"NML", L"NMM", L"NMN", L"NMO", L"NMP", L"NMQ", L"NMR", L"NMS", L"NMT", L"NMU", L"NMV", L"NMW", L"NMX", L"NMY", L"NMZ", L"NNA", L"NNB", L"NNC", L"NND", L"NNE", L"NNF", L"NNG", L"NNH", L"NNI", L"NNJ", L"NNK", L"NNL", L"NNM", L"NNN", L"NNO", L"NNP", L"NNQ", L"NNR", L"NNS", L"NNT", L"NNU", L"NNV", L"NNW", L"NNX", L"NNY", L"NNZ", L"NOA", L"NOB", L"NOC", L"NOD", L"NOE", L"NOF", L"NOG", L"NOH", L"NOI", L"NOJ", L"NOK", L"NOL", L"NOM", L"NON", L"NOO", L"NOP", L"NOQ", L"NOR", L"NOS", L"NOT", L"NOU", L"NOV", L"NOW", L"NOX", L"NOY", L"NOZ", L"NPA", L"NPB", L"NPC", - L"NPD", L"NPE", L"NPF", L"NPG", L"NPH", L"NPI", L"NPJ", L"NPK", L"NPL", L"NPM", L"NPN", L"NPO", L"NPP", L"NPQ", L"NPR", L"NPS", L"NPT", L"NPU", L"NPV", L"NPW", L"NPX", L"NPY", L"NPZ", L"NQA", L"NQB", L"NQC", L"NQD", L"NQE", L"NQF", L"NQG", L"NQH", L"NQI", L"NQJ", L"NQK", L"NQL", L"NQM", L"NQN", L"NQO", L"NQP", L"NQQ", L"NQR", L"NQS", L"NQT", L"NQU", L"NQV", L"NQW", L"NQX", L"NQY", L"NQZ", L"NRA", L"NRB", L"NRC", L"NRD", L"NRE", L"NRF", L"NRG", L"NRH", L"NRI", L"NRJ", L"NRK", L"NRL", L"NRM", L"NRN", L"NRO", L"NRP", L"NRQ", L"NRR", L"NRS", L"NRT", L"NRU", L"NRV", L"NRW", L"NRX", L"NRY", L"NRZ", L"NSA", L"NSB", L"NSC", L"NSD", L"NSE", L"NSF", L"NSG", L"NSH", L"NSI", L"NSJ", L"NSK", L"NSL", L"NSM", L"NSN", L"NSO", L"NSP", L"NSQ", L"NSR", L"NSS", L"NST", L"NSU", L"NSV", L"NSW", L"NSX", L"NSY", L"NSZ", L"NTA", L"NTB", L"NTC", L"NTD", L"NTE", L"NTF", L"NTG", L"NTH", L"NTI", L"NTJ", L"NTK", L"NTL", L"NTM", L"NTN", L"NTO", L"NTP", L"NTQ", L"NTR", L"NTS", L"NTT", L"NTU", L"NTV", L"NTW", L"NTX", L"NTY", L"NTZ", L"NUA", L"NUB", L"NUC", L"NUD", L"NUE", L"NUF", L"NUG", L"NUH", L"NUI", L"NUJ", L"NUK", L"NUL", L"NUM", L"NUN", L"NUO", L"NUP", L"NUQ", L"NUR", L"NUS", L"NUT", L"NUU", L"NUV", L"NUW", L"NUX", L"NUY", L"NUZ", L"NVA", L"NVB", L"NVC", L"NVD", L"NVE", L"NVF", L"NVG", L"NVH", L"NVI", L"NVJ", L"NVK", L"NVL", L"NVM", L"NVN", L"NVO", L"NVP", L"NVQ", L"NVR", L"NVS", L"NVT", L"NVU", L"NVV", L"NVW", L"NVX", L"NVY", L"NVZ", L"NWA", L"NWB", L"NWC", L"NWD", L"NWE", L"NWF", L"NWG", L"NWH", L"NWI", L"NWJ", L"NWK", L"NWL", L"NWM", L"NWN", L"NWO", L"NWP", L"NWQ", L"NWR", L"NWS", L"NWT", L"NWU", L"NWV", L"NWW", L"NWX", L"NWY", L"NWZ", L"NXA", L"NXB", L"NXC", L"NXD", L"NXE", L"NXF", L"NXG", L"NXH", L"NXI", L"NXJ", L"NXK", L"NXL", L"NXM", L"NXN", L"NXO", L"NXP", L"NXQ", L"NXR", L"NXS", L"NXT", L"NXU", L"NXV", L"NXW", L"NXX", L"NXY", L"NXZ", L"NYA", L"NYB", L"NYC", L"NYD", L"NYE", L"NYF", L"NYG", L"NYH", L"NYI", L"NYJ", L"NYK", L"NYL", L"NYM", L"NYN", L"NYO", L"NYP", L"NYQ", L"NYR", L"NYS", L"NYT", L"NYU", L"NYV", L"NYW", L"NYX", L"NYY", L"NYZ", L"NZA", L"NZB", L"NZC", L"NZD", L"NZE", L"NZF", L"NZG", L"NZH", L"NZI", L"NZJ", L"NZK", L"NZL", L"NZM", L"NZN", L"NZO", L"NZP", - L"NZQ", L"NZR", L"NZS", L"NZT", L"NZU", L"NZV", L"NZW", L"NZX", L"NZY", L"NZZ", L"OAA", L"OAB", L"OAC", L"OAD", L"OAE", L"OAF", L"OAG", L"OAH", L"OAI", L"OAJ", L"OAK", L"OAL", L"OAM", L"OAN", L"OAO", L"OAP", L"OAQ", L"OAR", L"OAS", L"OAT", L"OAU", L"OAV", L"OAW", L"OAX", L"OAY", L"OAZ", L"OBA", L"OBB", L"OBC", L"OBD", L"OBE", L"OBF", L"OBG", L"OBH", L"OBI", L"OBJ", L"OBK", L"OBL", L"OBM", L"OBN", L"OBO", L"OBP", L"OBQ", L"OBR", L"OBS", L"OBT", L"OBU", L"OBV", L"OBW", L"OBX", L"OBY", L"OBZ", L"OCA", L"OCB", L"OCC", L"OCD", L"OCE", L"OCF", L"OCG", L"OCH", L"OCI", L"OCJ", L"OCK", L"OCL", L"OCM", L"OCN", L"OCO", L"OCP", L"OCQ", L"OCR", L"OCS", L"OCT", L"OCU", L"OCV", L"OCW", L"OCX", L"OCY", L"OCZ", L"ODA", L"ODB", L"ODC", L"ODD", L"ODE", L"ODF", L"ODG", L"ODH", L"ODI", L"ODJ", L"ODK", L"ODL", L"ODM", L"ODN", L"ODO", L"ODP", L"ODQ", L"ODR", L"ODS", L"ODT", L"ODU", L"ODV", L"ODW", L"ODX", L"ODY", L"ODZ", L"OEA", L"OEB", L"OEC", L"OED", L"OEE", L"OEF", L"OEG", L"OEH", L"OEI", L"OEJ", L"OEK", L"OEL", L"OEM", L"OEN", L"OEO", L"OEP", L"OEQ", L"OER", L"OES", L"OET", L"OEU", L"OEV", L"OEW", L"OEX", L"OEY", L"OEZ", L"OFA", L"OFB", L"OFC", L"OFD", L"OFE", L"OFF", L"OFG", L"OFH", L"OFI", L"OFJ", L"OFK", L"OFL", L"OFM", L"OFN", L"OFO", L"OFP", L"OFQ", L"OFR", L"OFS", L"OFT", L"OFU", L"OFV", L"OFW", L"OFX", L"OFY", L"OFZ", L"OGA", L"OGB", L"OGC", L"OGD", L"OGE", L"OGF", L"OGG", L"OGH", L"OGI", L"OGJ", L"OGK", L"OGL", L"OGM", L"OGN", L"OGO", L"OGP", L"OGQ", L"OGR", L"OGS", L"OGT", L"OGU", L"OGV", L"OGW", L"OGX", L"OGY", L"OGZ", L"OHA", L"OHB", L"OHC", L"OHD", L"OHE", L"OHF", L"OHG", L"OHH", L"OHI", L"OHJ", L"OHK", L"OHL", L"OHM", L"OHN", L"OHO", L"OHP", L"OHQ", L"OHR", L"OHS", L"OHT", L"OHU", L"OHV", L"OHW", L"OHX", L"OHY", L"OHZ", L"OIA", L"OIB", L"OIC", L"OID", L"OIE", L"OIF", L"OIG", L"OIH", L"OII", L"OIJ", L"OIK", L"OIL", L"OIM", L"OIN", L"OIO", L"OIP", L"OIQ", L"OIR", L"OIS", L"OIT", L"OIU", L"OIV", L"OIW", L"OIX", L"OIY", L"OIZ", L"OJA", L"OJB", L"OJC", L"OJD", L"OJE", L"OJF", L"OJG", L"OJH", L"OJI", L"OJJ", L"OJK", L"OJL", L"OJM", L"OJN", L"OJO", L"OJP", L"OJQ", L"OJR", L"OJS", L"OJT", L"OJU", L"OJV", L"OJW", L"OJX", L"OJY", L"OJZ", L"OKA", L"OKB", L"OKC", - L"OKD", L"OKE", L"OKF", L"OKG", L"OKH", L"OKI", L"OKJ", L"OKK", L"OKL", L"OKM", L"OKN", L"OKO", L"OKP", L"OKQ", L"OKR", L"OKS", L"OKT", L"OKU", L"OKV", L"OKW", L"OKX", L"OKY", L"OKZ", L"OLA", L"OLB", L"OLC", L"OLD", L"OLE", L"OLF", L"OLG", L"OLH", L"OLI", L"OLJ", L"OLK", L"OLL", L"OLM", L"OLN", L"OLO", L"OLP", L"OLQ", L"OLR", L"OLS", L"OLT", L"OLU", L"OLV", L"OLW", L"OLX", L"OLY", L"OLZ", L"OMA", L"OMB", L"OMC", L"OMD", L"OME", L"OMF", L"OMG", L"OMH", L"OMI", L"OMJ", L"OMK", L"OML", L"OMM", L"OMN", L"OMO", L"OMP", L"OMQ", L"OMR", L"OMS", L"OMT", L"OMU", L"OMV", L"OMW", L"OMX", L"OMY", L"OMZ", L"ONA", L"ONB", L"ONC", L"OND", L"ONE", L"ONF", L"ONG", L"ONH", L"ONI", L"ONJ", L"ONK", L"ONL", L"ONM", L"ONN", L"ONO", L"ONP", L"ONQ", L"ONR", L"ONS", L"ONT", L"ONU", L"ONV", L"ONW", L"ONX", L"ONY", L"ONZ", L"OOA", L"OOB", L"OOC", L"OOD", L"OOE", L"OOF", L"OOG", L"OOH", L"OOI", L"OOJ", L"OOK", L"OOL", L"OOM", L"OON", L"OOO", L"OOP", L"OOQ", L"OOR", L"OOS", L"OOT", L"OOU", L"OOV", L"OOW", L"OOX", L"OOY", L"OOZ", L"OPA", L"OPB", L"OPC", L"OPD", L"OPE", L"OPF", L"OPG", L"OPH", L"OPI", L"OPJ", L"OPK", L"OPL", L"OPM", L"OPN", L"OPO", L"OPP", L"OPQ", L"OPR", L"OPS", L"OPT", L"OPU", L"OPV", L"OPW", L"OPX", L"OPY", L"OPZ", L"OQA", L"OQB", L"OQC", L"OQD", L"OQE", L"OQF", L"OQG", L"OQH", L"OQI", L"OQJ", L"OQK", L"OQL", L"OQM", L"OQN", L"OQO", L"OQP", L"OQQ", L"OQR", L"OQS", L"OQT", L"OQU", L"OQV", L"OQW", L"OQX", L"OQY", L"OQZ", L"ORA", L"ORB", L"ORC", L"ORD", L"ORE", L"ORF", L"ORG", L"ORH", L"ORI", L"ORJ", L"ORK", L"ORL", L"ORM", L"ORN", L"ORO", L"ORP", L"ORQ", L"ORR", L"ORS", L"ORT", L"ORU", L"ORV", L"ORW", L"ORX", L"ORY", L"ORZ", L"OSA", L"OSB", L"OSC", L"OSD", L"OSE", L"OSF", L"OSG", L"OSH", L"OSI", L"OSJ", L"OSK", L"OSL", L"OSM", L"OSN", L"OSO", L"OSP", L"OSQ", L"OSR", L"OSS", L"OST", L"OSU", L"OSV", L"OSW", L"OSX", L"OSY", L"OSZ", L"OTA", L"OTB", L"OTC", L"OTD", L"OTE", L"OTF", L"OTG", L"OTH", L"OTI", L"OTJ", L"OTK", L"OTL", L"OTM", L"OTN", L"OTO", L"OTP", L"OTQ", L"OTR", L"OTS", L"OTT", L"OTU", L"OTV", L"OTW", L"OTX", L"OTY", L"OTZ", L"OUA", L"OUB", L"OUC", L"OUD", L"OUE", L"OUF", L"OUG", L"OUH", L"OUI", L"OUJ", L"OUK", L"OUL", L"OUM", L"OUN", L"OUO", L"OUP", - L"OUQ", L"OUR", L"OUS", L"OUT", L"OUU", L"OUV", L"OUW", L"OUX", L"OUY", L"OUZ", L"OVA", L"OVB", L"OVC", L"OVD", L"OVE", L"OVF", L"OVG", L"OVH", L"OVI", L"OVJ", L"OVK", L"OVL", L"OVM", L"OVN", L"OVO", L"OVP", L"OVQ", L"OVR", L"OVS", L"OVT", L"OVU", L"OVV", L"OVW", L"OVX", L"OVY", L"OVZ", L"OWA", L"OWB", L"OWC", L"OWD", L"OWE", L"OWF", L"OWG", L"OWH", L"OWI", L"OWJ", L"OWK", L"OWL", L"OWM", L"OWN", L"OWO", L"OWP", L"OWQ", L"OWR", L"OWS", L"OWT", L"OWU", L"OWV", L"OWW", L"OWX", L"OWY", L"OWZ", L"OXA", L"OXB", L"OXC", L"OXD", L"OXE", L"OXF", L"OXG", L"OXH", L"OXI", L"OXJ", L"OXK", L"OXL", L"OXM", L"OXN", L"OXO", L"OXP", L"OXQ", L"OXR", L"OXS", L"OXT", L"OXU", L"OXV", L"OXW", L"OXX", L"OXY", L"OXZ", L"OYA", L"OYB", L"OYC", L"OYD", L"OYE", L"OYF", L"OYG", L"OYH", L"OYI", L"OYJ", L"OYK", L"OYL", L"OYM", L"OYN", L"OYO", L"OYP", L"OYQ", L"OYR", L"OYS", L"OYT", L"OYU", L"OYV", L"OYW", L"OYX", L"OYY", L"OYZ", L"OZA", L"OZB", L"OZC", L"OZD", L"OZE", L"OZF", L"OZG", L"OZH", L"OZI", L"OZJ", L"OZK", L"OZL", L"OZM", L"OZN", L"OZO", L"OZP", L"OZQ", L"OZR", L"OZS", L"OZT", L"OZU", L"OZV", L"OZW", L"OZX", L"OZY", L"OZZ", L"PAA", L"PAB", L"PAC", L"PAD", L"PAE", L"PAF", L"PAG", L"PAH", L"PAI", L"PAJ", L"PAK", L"PAL", L"PAM", L"PAN", L"PAO", L"PAP", L"PAQ", L"PAR", L"PAS", L"PAT", L"PAU", L"PAV", L"PAW", L"PAX", L"PAY", L"PAZ", L"PBA", L"PBB", L"PBC", L"PBD", L"PBE", L"PBF", L"PBG", L"PBH", L"PBI", L"PBJ", L"PBK", L"PBL", L"PBM", L"PBN", L"PBO", L"PBP", L"PBQ", L"PBR", L"PBS", L"PBT", L"PBU", L"PBV", L"PBW", L"PBX", L"PBY", L"PBZ", L"PCA", L"PCB", L"PCC", L"PCD", L"PCE", L"PCF", L"PCG", L"PCH", L"PCI", L"PCJ", L"PCK", L"PCL", L"PCM", L"PCN", L"PCO", L"PCP", L"PCQ", L"PCR", L"PCS", L"PCT", L"PCU", L"PCV", L"PCW", L"PCX", L"PCY", L"PCZ", L"PDA", L"PDB", L"PDC", L"PDD", L"PDE", L"PDF", L"PDG", L"PDH", L"PDI", L"PDJ", L"PDK", L"PDL", L"PDM", L"PDN", L"PDO", L"PDP", L"PDQ", L"PDR", L"PDS", L"PDT", L"PDU", L"PDV", L"PDW", L"PDX", L"PDY", L"PDZ", L"PEA", L"PEB", L"PEC", L"PED", L"PEE", L"PEF", L"PEG", L"PEH", L"PEI", L"PEJ", L"PEK", L"PEL", L"PEM", L"PEN", L"PEO", L"PEP", L"PEQ", L"PER", L"PES", L"PET", L"PEU", L"PEV", L"PEW", L"PEX", L"PEY", L"PEZ", L"PFA", L"PFB", L"PFC", + L"MUD", L"MUE", L"MUF", L"MUG", L"MUH", L"MUI", L"MUJ", L"MUK", L"MUL", L"MUM", L"MUN", L"MUO", L"MUP", L"MUQ", L"MUR", L"MUS", L"MUT", L"MUU", L"MUV", L"MUW", L"MUX", L"MUY", L"MUZ", L"MVA", L"MVB", L"MVC", L"MVD", L"MVE", L"MVF", L"MVG", L"MVH", L"MVI", L"MVJ", L"MVK", L"MVL", L"MVM", L"MVN", L"MVO", L"MVP", L"MVQ", L"MVR", L"MVS", L"MVT", L"MVU", L"MVV", L"MVW", L"MVX", L"MVY", L"MVZ", L"MWA", L"MWB", L"MWC", L"MWD", L"MWE", L"MWF", L"MWG", L"MWH", L"MWI", L"MWJ", L"MWK", L"MWL", L"MWM", L"MWN", L"MWO", L"MWP", L"MWQ", L"MWR", L"MWS", L"MWT", L"MWU", L"MWV", L"MWW", L"MWX", L"MWY", L"MWZ", L"MXA", L"MXB", L"MXC", L"MXD", L"MXE", L"MXF", L"MXG", L"MXH", L"MXI", L"MXJ", L"MXK", L"MXL", L"MXM", L"MXN", L"MXO", L"MXP", L"MXQ", L"MXR", L"MXS", L"MXT", L"MXU", L"MXV", L"MXW", L"MXX", L"MXY", L"MXZ", L"MYA", L"MYB", L"MYC", L"MYD", L"MYE", L"MYF", L"MYG", L"MYH", L"MYI", L"MYJ", L"MYK", L"MYL", L"MYM", L"MYN", L"MYO", L"MYP", L"MYQ", L"MYR", L"MYS", L"MYT", L"MYU", L"MYV", L"MYW", L"MYX", L"MYY", L"MYZ", L"MZA", L"MZB", L"MZC", L"MZD", L"MZE", L"MZF", L"MZG", L"MZH", L"MZI", L"MZJ", L"MZK", L"MZL", L"MZM", L"MZN", L"MZO", L"MZP", L"MZQ", L"MZR", L"MZS", L"MZT", L"MZU", L"MZV", L"MZW", L"MZX", L"MZY", L"MZZ", L"NAA", L"NAB", L"NAC", L"NAD", L"NAE", L"NAF", L"NAG", L"NAH", L"NAI", L"NAJ", L"NAK", L"NAL", L"NAM", L"NAN", L"NAO", L"NAP", L"NAQ", L"NAR", L"NAS", L"NAT", L"NAU", L"NAV", L"NAW", L"NAX", L"NAY", L"NAZ", L"NBA", L"NBB", L"NBC", L"NBD", L"NBE", L"NBF", L"NBG", L"NBH", L"NBI", L"NBJ", L"NBK", L"NBL", L"NBM", L"NBN", L"NBO", L"NBP", L"NBQ", L"NBR", L"NBS", L"NBT", L"NBU", L"NBV", L"NBW", L"NBX", L"NBY", L"NBZ", L"NCA", L"NCB", L"NCC", L"NCD", L"NCE", L"NCF", L"NCG", L"NCH", L"NCI", L"NCJ", L"NCK", L"NCL", L"NCM", L"NCN", L"NCO", L"NCP", L"NCQ", L"NCR", L"NCS", L"NCT", L"NCU", L"NCV", L"NCW", L"NCX", L"NCY", L"NCZ", L"NDA", L"NDB", L"NDC", L"NDD", L"NDE", L"NDF", L"NDG", L"NDH", L"NDI", L"NDJ", L"NDK", L"NDL", L"NDM", L"NDN", L"NDO", L"NDP", L"NDQ", L"NDR", L"NDS", L"NDT", L"NDU", L"NDV", L"NDW", L"NDX", L"NDY", L"NDZ", L"NEA", L"NEB", L"NEC", L"NED", L"NEE", L"NEF", L"NEG", L"NEH", L"NEI", L"NEJ", L"NEK", L"NEL", L"NEM", L"NEN", L"NEO", L"NEP", + L"NEQ", L"NER", L"NES", L"NET", L"NEU", L"NEV", L"NEW", L"NEX", L"NEY", L"NEZ", L"NFA", L"NFB", L"NFC", L"NFD", L"NFE", L"NFF", L"NFG", L"NFH", L"NFI", L"NFJ", L"NFK", L"NFL", L"NFM", L"NFN", L"NFO", L"NFP", L"NFQ", L"NFR", L"NFS", L"NFT", L"NFU", L"NFV", L"NFW", L"NFX", L"NFY", L"NFZ", L"NGA", L"NGB", L"NGC", L"NGD", L"NGE", L"NGF", L"NGG", L"NGH", L"NGI", L"NGJ", L"NGK", L"NGL", L"NGM", L"NGN", L"NGO", L"NGP", L"NGQ", L"NGR", L"NGS", L"NGT", L"NGU", L"NGV", L"NGW", L"NGX", L"NGY", L"NGZ", L"NHA", L"NHB", L"NHC", L"NHD", L"NHE", L"NHF", L"NHG", L"NHH", L"NHI", L"NHJ", L"NHK", L"NHL", L"NHM", L"NHN", L"NHO", L"NHP", L"NHQ", L"NHR", L"NHS", L"NHT", L"NHU", L"NHV", L"NHW", L"NHX", L"NHY", L"NHZ", L"NIA", L"NIB", L"NIC", L"NID", L"NIE", L"NIF", L"NIG", L"NIH", L"NII", L"NIJ", L"NIK", L"NIL", L"NIM", L"NIN", L"NIO", L"NIP", L"NIQ", L"NIR", L"NIS", L"NIT", L"NIU", L"NIV", L"NIW", L"NIX", L"NIY", L"NIZ", L"NJA", L"NJB", L"NJC", L"NJD", L"NJE", L"NJF", L"NJG", L"NJH", L"NJI", L"NJJ", L"NJK", L"NJL", L"NJM", L"NJN", L"NJO", L"NJP", L"NJQ", L"NJR", L"NJS", L"NJT", L"NJU", L"NJV", L"NJW", L"NJX", L"NJY", L"NJZ", L"NKA", L"NKB", L"NKC", L"NKD", L"NKE", L"NKF", L"NKG", L"NKH", L"NKI", L"NKJ", L"NKK", L"NKL", L"NKM", L"NKN", L"NKO", L"NKP", L"NKQ", L"NKR", L"NKS", L"NKT", L"NKU", L"NKV", L"NKW", L"NKX", L"NKY", L"NKZ", L"NLA", L"NLB", L"NLC", L"NLD", L"NLE", L"NLF", L"NLG", L"NLH", L"NLI", L"NLJ", L"NLK", L"NLL", L"NLM", L"NLN", L"NLO", L"NLP", L"NLQ", L"NLR", L"NLS", L"NLT", L"NLU", L"NLV", L"NLW", L"NLX", L"NLY", L"NLZ", L"NMA", L"NMB", L"NMC", L"NMD", L"NME", L"NMF", L"NMG", L"NMH", L"NMI", L"NMJ", L"NMK", L"NML", L"NMM", L"NMN", L"NMO", L"NMP", L"NMQ", L"NMR", L"NMS", L"NMT", L"NMU", L"NMV", L"NMW", L"NMX", L"NMY", L"NMZ", L"NNA", L"NNB", L"NNC", L"NND", L"NNE", L"NNF", L"NNG", L"NNH", L"NNI", L"NNJ", L"NNK", L"NNL", L"NNM", L"NNN", L"NNO", L"NNP", L"NNQ", L"NNR", L"NNS", L"NNT", L"NNU", L"NNV", L"NNW", L"NNX", L"NNY", L"NNZ", L"NOA", L"NOB", L"NOC", L"NOD", L"NOE", L"NOF", L"NOG", L"NOH", L"NOI", L"NOJ", L"NOK", L"NOL", L"NOM", L"NON", L"NOO", L"NOP", L"NOQ", L"NOR", L"NOS", L"NOT", L"NOU", L"NOV", L"NOW", L"NOX", L"NOY", L"NOZ", L"NPA", L"NPB", L"NPC", + L"NPD", L"NPE", L"NPF", L"NPG", L"NPH", L"NPI", L"NPJ", L"NPK", L"NPL", L"NPM", L"NPN", L"NPO", L"NPP", L"NPQ", L"NPR", L"NPS", L"NPT", L"NPU", L"NPV", L"NPW", L"NPX", L"NPY", L"NPZ", L"NQA", L"NQB", L"NQC", L"NQD", L"NQE", L"NQF", L"NQG", L"NQH", L"NQI", L"NQJ", L"NQK", L"NQL", L"NQM", L"NQN", L"NQO", L"NQP", L"NQQ", L"NQR", L"NQS", L"NQT", L"NQU", L"NQV", L"NQW", L"NQX", L"NQY", L"NQZ", L"NRA", L"NRB", L"NRC", L"NRD", L"NRE", L"NRF", L"NRG", L"NRH", L"NRI", L"NRJ", L"NRK", L"NRL", L"NRM", L"NRN", L"NRO", L"NRP", L"NRQ", L"NRR", L"NRS", L"NRT", L"NRU", L"NRV", L"NRW", L"NRX", L"NRY", L"NRZ", L"NSA", L"NSB", L"NSC", L"NSD", L"NSE", L"NSF", L"NSG", L"NSH", L"NSI", L"NSJ", L"NSK", L"NSL", L"NSM", L"NSN", L"NSO", L"NSP", L"NSQ", L"NSR", L"NSS", L"NST", L"NSU", L"NSV", L"NSW", L"NSX", L"NSY", L"NSZ", L"NTA", L"NTB", L"NTC", L"NTD", L"NTE", L"NTF", L"NTG", L"NTH", L"NTI", L"NTJ", L"NTK", L"NTL", L"NTM", L"NTN", L"NTO", L"NTP", L"NTQ", L"NTR", L"NTS", L"NTT", L"NTU", L"NTV", L"NTW", L"NTX", L"NTY", L"NTZ", L"NUA", L"NUB", L"NUC", L"NUD", L"NUE", L"NUF", L"NUG", L"NUH", L"NUI", L"NUJ", L"NUK", L"NUL", L"NUM", L"NUN", L"NUO", L"NUP", L"NUQ", L"NUR", L"NUS", L"NUT", L"NUU", L"NUV", L"NUW", L"NUX", L"NUY", L"NUZ", L"NVA", L"NVB", L"NVC", L"NVD", L"NVE", L"NVF", L"NVG", L"NVH", L"NVI", L"NVJ", L"NVK", L"NVL", L"NVM", L"NVN", L"NVO", L"NVP", L"NVQ", L"NVR", L"NVS", L"NVT", L"NVU", L"NVV", L"NVW", L"NVX", L"NVY", L"NVZ", L"NWA", L"NWB", L"NWC", L"NWD", L"NWE", L"NWF", L"NWG", L"NWH", L"NWI", L"NWJ", L"NWK", L"NWL", L"NWM", L"NWN", L"NWO", L"NWP", L"NWQ", L"NWR", L"NWS", L"NWT", L"NWU", L"NWV", L"NWW", L"NWX", L"NWY", L"NWZ", L"NXA", L"NXB", L"NXC", L"NXD", L"NXE", L"NXF", L"NXG", L"NXH", L"NXI", L"NXJ", L"NXK", L"NXL", L"NXM", L"NXN", L"NXO", L"NXP", L"NXQ", L"NXR", L"NXS", L"NXT", L"NXU", L"NXV", L"NXW", L"NXX", L"NXY", L"NXZ", L"NYA", L"NYB", L"NYC", L"NYD", L"NYE", L"NYF", L"NYG", L"NYH", L"NYI", L"NYJ", L"NYK", L"NYL", L"NYM", L"NYN", L"NYO", L"NYP", L"NYQ", L"NYR", L"NYS", L"NYT", L"NYU", L"NYV", L"NYW", L"NYX", L"NYY", L"NYZ", L"NZA", L"NZB", L"NZC", L"NZD", L"NZE", L"NZF", L"NZG", L"NZH", L"NZI", L"NZJ", L"NZK", L"NZL", L"NZM", L"NZN", L"NZO", L"NZP", + L"NZQ", L"NZR", L"NZS", L"NZT", L"NZU", L"NZV", L"NZW", L"NZX", L"NZY", L"NZZ", L"OAA", L"OAB", L"OAC", L"OAD", L"OAE", L"OAF", L"OAG", L"OAH", L"OAI", L"OAJ", L"OAK", L"OAL", L"OAM", L"OAN", L"OAO", L"OAP", L"OAQ", L"OAR", L"OAS", L"OAT", L"OAU", L"OAV", L"OAW", L"OAX", L"OAY", L"OAZ", L"OBA", L"OBB", L"OBC", L"OBD", L"OBE", L"OBF", L"OBG", L"OBH", L"OBI", L"OBJ", L"OBK", L"OBL", L"OBM", L"OBN", L"OBO", L"OBP", L"OBQ", L"OBR", L"OBS", L"OBT", L"OBU", L"OBV", L"OBW", L"OBX", L"OBY", L"OBZ", L"OCA", L"OCB", L"OCC", L"OCD", L"OCE", L"OCF", L"OCG", L"OCH", L"OCI", L"OCJ", L"OCK", L"OCL", L"OCM", L"OCN", L"OCO", L"OCP", L"OCQ", L"OCR", L"OCS", L"OCT", L"OCU", L"OCV", L"OCW", L"OCX", L"OCY", L"OCZ", L"ODA", L"ODB", L"ODC", L"ODD", L"ODE", L"ODF", L"ODG", L"ODH", L"ODI", L"ODJ", L"ODK", L"ODL", L"ODM", L"ODN", L"ODO", L"ODP", L"ODQ", L"ODR", L"ODS", L"ODT", L"ODU", L"ODV", L"ODW", L"ODX", L"ODY", L"ODZ", L"OEA", L"OEB", L"OEC", L"OED", L"OEE", L"OEF", L"OEG", L"OEH", L"OEI", L"OEJ", L"OEK", L"OEL", L"OEM", L"OEN", L"OEO", L"OEP", L"OEQ", L"OER", L"OES", L"OET", L"OEU", L"OEV", L"OEW", L"OEX", L"OEY", L"OEZ", L"OFA", L"OFB", L"OFC", L"OFD", L"OFE", L"OFF", L"OFG", L"OFH", L"OFI", L"OFJ", L"OFK", L"OFL", L"OFM", L"OFN", L"OFO", L"OFP", L"OFQ", L"OFR", L"OFS", L"OFT", L"OFU", L"OFV", L"OFW", L"OFX", L"OFY", L"OFZ", L"OGA", L"OGB", L"OGC", L"OGD", L"OGE", L"OGF", L"OGG", L"OGH", L"OGI", L"OGJ", L"OGK", L"OGL", L"OGM", L"OGN", L"OGO", L"OGP", L"OGQ", L"OGR", L"OGS", L"OGT", L"OGU", L"OGV", L"OGW", L"OGX", L"OGY", L"OGZ", L"OHA", L"OHB", L"OHC", L"OHD", L"OHE", L"OHF", L"OHG", L"OHH", L"OHI", L"OHJ", L"OHK", L"OHL", L"OHM", L"OHN", L"OHO", L"OHP", L"OHQ", L"OHR", L"OHS", L"OHT", L"OHU", L"OHV", L"OHW", L"OHX", L"OHY", L"OHZ", L"OIA", L"OIB", L"OIC", L"OID", L"OIE", L"OIF", L"OIG", L"OIH", L"OII", L"OIJ", L"OIK", L"OIL", L"OIM", L"OIN", L"OIO", L"OIP", L"OIQ", L"OIR", L"OIS", L"OIT", L"OIU", L"OIV", L"OIW", L"OIX", L"OIY", L"OIZ", L"OJA", L"OJB", L"OJC", L"OJD", L"OJE", L"OJF", L"OJG", L"OJH", L"OJI", L"OJJ", L"OJK", L"OJL", L"OJM", L"OJN", L"OJO", L"OJP", L"OJQ", L"OJR", L"OJS", L"OJT", L"OJU", L"OJV", L"OJW", L"OJX", L"OJY", L"OJZ", L"OKA", L"OKB", L"OKC", + L"OKD", L"OKE", L"OKF", L"OKG", L"OKH", L"OKI", L"OKJ", L"OKK", L"OKL", L"OKM", L"OKN", L"OKO", L"OKP", L"OKQ", L"OKR", L"OKS", L"OKT", L"OKU", L"OKV", L"OKW", L"OKX", L"OKY", L"OKZ", L"OLA", L"OLB", L"OLC", L"OLD", L"OLE", L"OLF", L"OLG", L"OLH", L"OLI", L"OLJ", L"OLK", L"OLL", L"OLM", L"OLN", L"OLO", L"OLP", L"OLQ", L"OLR", L"OLS", L"OLT", L"OLU", L"OLV", L"OLW", L"OLX", L"OLY", L"OLZ", L"OMA", L"OMB", L"OMC", L"OMD", L"OME", L"OMF", L"OMG", L"OMH", L"OMI", L"OMJ", L"OMK", L"OML", L"OMM", L"OMN", L"OMO", L"OMP", L"OMQ", L"OMR", L"OMS", L"OMT", L"OMU", L"OMV", L"OMW", L"OMX", L"OMY", L"OMZ", L"ONA", L"ONB", L"ONC", L"OND", L"ONE", L"ONF", L"ONG", L"ONH", L"ONI", L"ONJ", L"ONK", L"ONL", L"ONM", L"ONN", L"ONO", L"ONP", L"ONQ", L"ONR", L"ONS", L"ONT", L"ONU", L"ONV", L"ONW", L"ONX", L"ONY", L"ONZ", L"OOA", L"OOB", L"OOC", L"OOD", L"OOE", L"OOF", L"OOG", L"OOH", L"OOI", L"OOJ", L"OOK", L"OOL", L"OOM", L"OON", L"OOO", L"OOP", L"OOQ", L"OOR", L"OOS", L"OOT", L"OOU", L"OOV", L"OOW", L"OOX", L"OOY", L"OOZ", L"OPA", L"OPB", L"OPC", L"OPD", L"OPE", L"OPF", L"OPG", L"OPH", L"OPI", L"OPJ", L"OPK", L"OPL", L"OPM", L"OPN", L"OPO", L"OPP", L"OPQ", L"OPR", L"OPS", L"OPT", L"OPU", L"OPV", L"OPW", L"OPX", L"OPY", L"OPZ", L"OQA", L"OQB", L"OQC", L"OQD", L"OQE", L"OQF", L"OQG", L"OQH", L"OQI", L"OQJ", L"OQK", L"OQL", L"OQM", L"OQN", L"OQO", L"OQP", L"OQQ", L"OQR", L"OQS", L"OQT", L"OQU", L"OQV", L"OQW", L"OQX", L"OQY", L"OQZ", L"ORA", L"ORB", L"ORC", L"ORD", L"ORE", L"ORF", L"ORG", L"ORH", L"ORI", L"ORJ", L"ORK", L"ORL", L"ORM", L"ORN", L"ORO", L"ORP", L"ORQ", L"ORR", L"ORS", L"ORT", L"ORU", L"ORV", L"ORW", L"ORX", L"ORY", L"ORZ", L"OSA", L"OSB", L"OSC", L"OSD", L"OSE", L"OSF", L"OSG", L"OSH", L"OSI", L"OSJ", L"OSK", L"OSL", L"OSM", L"OSN", L"OSO", L"OSP", L"OSQ", L"OSR", L"OSS", L"OST", L"OSU", L"OSV", L"OSW", L"OSX", L"OSY", L"OSZ", L"OTA", L"OTB", L"OTC", L"OTD", L"OTE", L"OTF", L"OTG", L"OTH", L"OTI", L"OTJ", L"OTK", L"OTL", L"OTM", L"OTN", L"OTO", L"OTP", L"OTQ", L"OTR", L"OTS", L"OTT", L"OTU", L"OTV", L"OTW", L"OTX", L"OTY", L"OTZ", L"OUA", L"OUB", L"OUC", L"OUD", L"OUE", L"OUF", L"OUG", L"OUH", L"OUI", L"OUJ", L"OUK", L"OUL", L"OUM", L"OUN", L"OUO", L"OUP", + L"OUQ", L"OUR", L"OUS", L"OUT", L"OUU", L"OUV", L"OUW", L"OUX", L"OUY", L"OUZ", L"OVA", L"OVB", L"OVC", L"OVD", L"OVE", L"OVF", L"OVG", L"OVH", L"OVI", L"OVJ", L"OVK", L"OVL", L"OVM", L"OVN", L"OVO", L"OVP", L"OVQ", L"OVR", L"OVS", L"OVT", L"OVU", L"OVV", L"OVW", L"OVX", L"OVY", L"OVZ", L"OWA", L"OWB", L"OWC", L"OWD", L"OWE", L"OWF", L"OWG", L"OWH", L"OWI", L"OWJ", L"OWK", L"OWL", L"OWM", L"OWN", L"OWO", L"OWP", L"OWQ", L"OWR", L"OWS", L"OWT", L"OWU", L"OWV", L"OWW", L"OWX", L"OWY", L"OWZ", L"OXA", L"OXB", L"OXC", L"OXD", L"OXE", L"OXF", L"OXG", L"OXH", L"OXI", L"OXJ", L"OXK", L"OXL", L"OXM", L"OXN", L"OXO", L"OXP", L"OXQ", L"OXR", L"OXS", L"OXT", L"OXU", L"OXV", L"OXW", L"OXX", L"OXY", L"OXZ", L"OYA", L"OYB", L"OYC", L"OYD", L"OYE", L"OYF", L"OYG", L"OYH", L"OYI", L"OYJ", L"OYK", L"OYL", L"OYM", L"OYN", L"OYO", L"OYP", L"OYQ", L"OYR", L"OYS", L"OYT", L"OYU", L"OYV", L"OYW", L"OYX", L"OYY", L"OYZ", L"OZA", L"OZB", L"OZC", L"OZD", L"OZE", L"OZF", L"OZG", L"OZH", L"OZI", L"OZJ", L"OZK", L"OZL", L"OZM", L"OZN", L"OZO", L"OZP", L"OZQ", L"OZR", L"OZS", L"OZT", L"OZU", L"OZV", L"OZW", L"OZX", L"OZY", L"OZZ", L"PAA", L"PAB", L"PAC", L"PAD", L"PAE", L"PAF", L"PAG", L"PAH", L"PAI", L"PAJ", L"PAK", L"PAL", L"PAM", L"PAN", L"PAO", L"PAP", L"PAQ", L"PAR", L"PAS", L"PAT", L"PAU", L"PAV", L"PAW", L"PAX", L"PAY", L"PAZ", L"PBA", L"PBB", L"PBC", L"PBD", L"PBE", L"PBF", L"PBG", L"PBH", L"PBI", L"PBJ", L"PBK", L"PBL", L"PBM", L"PBN", L"PBO", L"PBP", L"PBQ", L"PBR", L"PBS", L"PBT", L"PBU", L"PBV", L"PBW", L"PBX", L"PBY", L"PBZ", L"PCA", L"PCB", L"PCC", L"PCD", L"PCE", L"PCF", L"PCG", L"PCH", L"PCI", L"PCJ", L"PCK", L"PCL", L"PCM", L"PCN", L"PCO", L"PCP", L"PCQ", L"PCR", L"PCS", L"PCT", L"PCU", L"PCV", L"PCW", L"PCX", L"PCY", L"PCZ", L"PDA", L"PDB", L"PDC", L"PDD", L"PDE", L"PDF", L"PDG", L"PDH", L"PDI", L"PDJ", L"PDK", L"PDL", L"PDM", L"PDN", L"PDO", L"PDP", L"PDQ", L"PDR", L"PDS", L"PDT", L"PDU", L"PDV", L"PDW", L"PDX", L"PDY", L"PDZ", L"PEA", L"PEB", L"PEC", L"PED", L"PEE", L"PEF", L"PEG", L"PEH", L"PEI", L"PEJ", L"PEK", L"PEL", L"PEM", L"PEN", L"PEO", L"PEP", L"PEQ", L"PER", L"PES", L"PET", L"PEU", L"PEV", L"PEW", L"PEX", L"PEY", L"PEZ", L"PFA", L"PFB", L"PFC", L"PFD", L"PFE", L"PFF", L"PFG", L"PFH", L"PFI", L"PFJ", L"PFK", L"PFL", L"PFM", L"PFN", L"PFO", L"PFP", L"PFQ", L"PFR", L"PFS", L"PFT", L"PFU", L"PFV", L"PFW", L"PFX", L"PFY", L"PFZ", L"PGA", L"PGB", L"PGC", L"PGD", L"PGE", L"PGF", L"PGG", L"PGH", L"PGI", L"PGJ", L"PGK", L"PGL", L"PGM", L"PGN", L"PGO", L"PGP", L"PGQ", L"PGR", L"PGS", L"PGT", L"PGU", L"PGV", L"PGW", L"PGX", L"PGY", L"PGZ", L"PHA", L"PHB", L"PHC", L"PHD", L"PHE", L"PHF", L"PHG", L"PHH", L"PHI", L"PHJ", L"PHK", L"PHL", L"PHM", L"PHN", L"PHO", L"PHP", L"PHQ", L"PHR", L"PHS", L"PHT", L"PHU", L"PHV", L"PHW", L"PHX", L"PHY", L"PHZ", L"PIA", L"PIB", L"PIC", L"PID", L"PIE", L"PIF", L"PIG", L"PIH", L"PII", L"PIJ", L"PIK", L"PIL", L"PIM", L"PIN", L"PIO", L"PIP", L"PIQ", L"PIR", L"PIS", L"PIT", L"PIU", L"PIV", L"PIW", L"PIX", L"PIY", L"PIZ", L"PJA", L"PJB", L"PJC", L"PJD", L"PJE", L"PJF", L"PJG", L"PJH", L"PJI", L"PJJ", L"PJK", L"PJL", L"PJM", L"PJN", L"PJO", L"PJP", L"PJQ", L"PJR", L"PJS", L"PJT", L"PJU", L"PJV", L"PJW", L"PJX", L"PJY", L"PJZ", L"PKA", L"PKB", L"PKC", L"PKD", L"PKE", L"PKF", L"PKG", L"PKH", L"PKI", L"PKJ", L"PKK", L"PKL", L"PKM", L"PKN", L"PKO", L"PKP", L"PKQ", L"PKR", L"PKS", L"PKT", L"PKU", L"PKV", L"PKW", L"PKX", L"PKY", L"PKZ", L"PLA", L"PLB", L"PLC", L"PLD", L"PLE", L"PLF", L"PLG", L"PLH", L"PLI", L"PLJ", L"PLK", L"PLL", L"PLM", L"PLN", L"PLO", L"PLP", L"PLQ", L"PLR", L"PLS", L"PLT", L"PLU", L"PLV", L"PLW", L"PLX", L"PLY", L"PLZ", L"PMA", L"PMB", L"PMC", L"PMD", L"PME", L"PMF", L"PMG", L"PMH", L"PMI", L"PMJ", L"PMK", L"PML", L"PMM", L"PMN", L"PMO", L"PMP", L"PMQ", L"PMR", L"PMS", L"PMT", L"PMU", L"PMV", L"PMW", L"PMX", L"PMY", L"PMZ", L"PNA", L"PNB", L"PNC", L"PND", L"PNE", L"PNF", L"PNG", L"PNH", L"PNI", L"PNJ", L"PNK", L"PNL", L"PNM", L"PNN", L"PNO", L"PNP", L"PNQ", L"PNR", L"PNS", L"PNT", L"PNU", L"PNV", L"PNW", L"PNX", L"PNY", L"PNZ", L"POA", L"POB", L"POC", L"POD", L"POE", L"POF", L"POG", L"POH", L"POI", L"POJ", L"POK", L"POL", L"POM", L"PON", L"POO", L"POP", L"POQ", L"POR", L"POS", L"POT", L"POU", L"POV", L"POW", L"POX", L"POY", L"POZ", L"PPA", L"PPB", L"PPC", L"PPD", L"PPE", L"PPF", L"PPG", L"PPH", - L"PPI", L"PPJ", L"PPK", L"PPL", L"PPM", L"PPN", L"PPO", L"PPP", L"PPQ", L"PPR", L"PPS", L"PPT", L"PPU", L"PPV", L"PPW", L"PPX", L"PPY", L"PPZ", L"PQA", L"PQB", L"PQC", L"PQD", L"PQE", L"PQF", L"PQG", L"PQH", L"PQI", L"PQJ", L"PQK", L"PQL", L"PQM", L"PQN", L"PQO", L"PQP", L"PQQ", L"PQR", L"PQS", L"PQT", L"PQU", L"PQV", L"PQW", L"PQX", L"PQY", L"PQZ", L"PRA", L"PRB", L"PRC", L"PRD", L"PRE", L"PRF", L"PRG", L"PRH", L"PRI", L"PRJ", L"PRK", L"PRL", L"PRM", L"PRN", L"PRO", L"PRP", L"PRQ", L"PRR", L"PRS", L"PRT", L"PRU", L"PRV", L"PRW", L"PRX", L"PRY", L"PRZ", L"PSA", L"PSB", L"PSC", L"PSD", L"PSE", L"PSF", L"PSG", L"PSH", L"PSI", L"PSJ", L"PSK", L"PSL", L"PSM", L"PSN", L"PSO", L"PSP", L"PSQ", L"PSR", L"PSS", L"PST", L"PSU", L"PSV", L"PSW", L"PSX", L"PSY", L"PSZ", L"PTA", L"PTB", L"PTC", L"PTD", L"PTE", L"PTF", L"PTG", L"PTH", L"PTI", L"PTJ", L"PTK", L"PTL", L"PTM", L"PTN", L"PTO", L"PTP", L"PTQ", L"PTR", L"PTS", L"PTT", L"PTU", L"PTV", L"PTW", L"PTX", L"PTY", L"PTZ", L"PUA", L"PUB", L"PUC", L"PUD", L"PUE", L"PUF", L"PUG", L"PUH", L"PUI", L"PUJ", L"PUK", L"PUL", L"PUM", L"PUN", L"PUO", L"PUP", L"PUQ", L"PUR", L"PUS", L"PUT", L"PUU", L"PUV", L"PUW", L"PUX", L"PUY", L"PUZ", L"PVA", L"PVB", L"PVC", L"PVD", L"PVE", L"PVF", L"PVG", L"PVH", L"PVI", L"PVJ", L"PVK", L"PVL", L"PVM", L"PVN", L"PVO", L"PVP", L"PVQ", L"PVR", L"PVS", L"PVT", L"PVU", L"PVV", L"PVW", L"PVX", L"PVY", L"PVZ", L"PWA", L"PWB", L"PWC", L"PWD", L"PWE", L"PWF", L"PWG", L"PWH", L"PWI", L"PWJ", L"PWK", L"PWL", L"PWM", L"PWN", L"PWO", L"PWP", L"PWQ", L"PWR", L"PWS", L"PWT", L"PWU", L"PWV", L"PWW", L"PWX", L"PWY", L"PWZ", L"PXA", L"PXB", L"PXC", L"PXD", L"PXE", L"PXF", L"PXG", L"PXH", L"PXI", L"PXJ", L"PXK", L"PXL", L"PXM", L"PXN", L"PXO", L"PXP", L"PXQ", L"PXR", L"PXS", L"PXT", L"PXU", L"PXV", L"PXW", L"PXX", L"PXY", L"PXZ", L"PYA", L"PYB", L"PYC", L"PYD", L"PYE", L"PYF", L"PYG", L"PYH", L"PYI", L"PYJ", L"PYK", L"PYL", L"PYM", L"PYN", L"PYO", L"PYP", L"PYQ", L"PYR", L"PYS", L"PYT", L"PYU", L"PYV", L"PYW", L"PYX", L"PYY", L"PYZ", L"PZA", L"PZB", L"PZC", L"PZD", L"PZE", L"PZF", L"PZG", L"PZH", L"PZI", L"PZJ", L"PZK", L"PZL", L"PZM", L"PZN", L"PZO", L"PZP", L"PZQ", L"PZR", L"PZS", L"PZT", L"PZU", + L"PPI", L"PPJ", L"PPK", L"PPL", L"PPM", L"PPN", L"PPO", L"PPP", L"PPQ", L"PPR", L"PPS", L"PPT", L"PPU", L"PPV", L"PPW", L"PPX", L"PPY", L"PPZ", L"PQA", L"PQB", L"PQC", L"PQD", L"PQE", L"PQF", L"PQG", L"PQH", L"PQI", L"PQJ", L"PQK", L"PQL", L"PQM", L"PQN", L"PQO", L"PQP", L"PQQ", L"PQR", L"PQS", L"PQT", L"PQU", L"PQV", L"PQW", L"PQX", L"PQY", L"PQZ", L"PRA", L"PRB", L"PRC", L"PRD", L"PRE", L"PRF", L"PRG", L"PRH", L"PRI", L"PRJ", L"PRK", L"PRL", L"PRM", L"PRN", L"PRO", L"PRP", L"PRQ", L"PRR", L"PRS", L"PRT", L"PRU", L"PRV", L"PRW", L"PRX", L"PRY", L"PRZ", L"PSA", L"PSB", L"PSC", L"PSD", L"PSE", L"PSF", L"PSG", L"PSH", L"PSI", L"PSJ", L"PSK", L"PSL", L"PSM", L"PSN", L"PSO", L"PSP", L"PSQ", L"PSR", L"PSS", L"PST", L"PSU", L"PSV", L"PSW", L"PSX", L"PSY", L"PSZ", L"PTA", L"PTB", L"PTC", L"PTD", L"PTE", L"PTF", L"PTG", L"PTH", L"PTI", L"PTJ", L"PTK", L"PTL", L"PTM", L"PTN", L"PTO", L"PTP", L"PTQ", L"PTR", L"PTS", L"PTT", L"PTU", L"PTV", L"PTW", L"PTX", L"PTY", L"PTZ", L"PUA", L"PUB", L"PUC", L"PUD", L"PUE", L"PUF", L"PUG", L"PUH", L"PUI", L"PUJ", L"PUK", L"PUL", L"PUM", L"PUN", L"PUO", L"PUP", L"PUQ", L"PUR", L"PUS", L"PUT", L"PUU", L"PUV", L"PUW", L"PUX", L"PUY", L"PUZ", L"PVA", L"PVB", L"PVC", L"PVD", L"PVE", L"PVF", L"PVG", L"PVH", L"PVI", L"PVJ", L"PVK", L"PVL", L"PVM", L"PVN", L"PVO", L"PVP", L"PVQ", L"PVR", L"PVS", L"PVT", L"PVU", L"PVV", L"PVW", L"PVX", L"PVY", L"PVZ", L"PWA", L"PWB", L"PWC", L"PWD", L"PWE", L"PWF", L"PWG", L"PWH", L"PWI", L"PWJ", L"PWK", L"PWL", L"PWM", L"PWN", L"PWO", L"PWP", L"PWQ", L"PWR", L"PWS", L"PWT", L"PWU", L"PWV", L"PWW", L"PWX", L"PWY", L"PWZ", L"PXA", L"PXB", L"PXC", L"PXD", L"PXE", L"PXF", L"PXG", L"PXH", L"PXI", L"PXJ", L"PXK", L"PXL", L"PXM", L"PXN", L"PXO", L"PXP", L"PXQ", L"PXR", L"PXS", L"PXT", L"PXU", L"PXV", L"PXW", L"PXX", L"PXY", L"PXZ", L"PYA", L"PYB", L"PYC", L"PYD", L"PYE", L"PYF", L"PYG", L"PYH", L"PYI", L"PYJ", L"PYK", L"PYL", L"PYM", L"PYN", L"PYO", L"PYP", L"PYQ", L"PYR", L"PYS", L"PYT", L"PYU", L"PYV", L"PYW", L"PYX", L"PYY", L"PYZ", L"PZA", L"PZB", L"PZC", L"PZD", L"PZE", L"PZF", L"PZG", L"PZH", L"PZI", L"PZJ", L"PZK", L"PZL", L"PZM", L"PZN", L"PZO", L"PZP", L"PZQ", L"PZR", L"PZS", L"PZT", L"PZU", L"PZV", L"PZW", L"PZX", L"PZY", L"PZZ", L"QAA", L"QAB", L"QAC", L"QAD", L"QAE", L"QAF", L"QAG", L"QAH", L"QAI", L"QAJ", L"QAK", L"QAL", L"QAM", L"QAN", L"QAO", L"QAP", L"QAQ", L"QAR", L"QAS", L"QAT", L"QAU", L"QAV", L"QAW", L"QAX", L"QAY", L"QAZ", L"QBA", L"QBB", L"QBC", L"QBD", L"QBE", L"QBF", L"QBG", L"QBH", L"QBI", L"QBJ", L"QBK", L"QBL", L"QBM", L"QBN", L"QBO", L"QBP", L"QBQ", L"QBR", L"QBS", L"QBT", L"QBU", L"QBV", L"QBW", L"QBX", L"QBY", L"QBZ", L"QCA", L"QCB", L"QCC", L"QCD", L"QCE", L"QCF", L"QCG", L"QCH", L"QCI", L"QCJ", L"QCK", L"QCL", L"QCM", L"QCN", L"QCO", L"QCP", L"QCQ", L"QCR", L"QCS", L"QCT", L"QCU", L"QCV", L"QCW", L"QCX", L"QCY", L"QCZ", L"QDA", L"QDB", L"QDC", L"QDD", L"QDE", L"QDF", L"QDG", L"QDH", L"QDI", L"QDJ", L"QDK", L"QDL", L"QDM", L"QDN", L"QDO", L"QDP", L"QDQ", L"QDR", L"QDS", L"QDT", L"QDU", L"QDV", L"QDW", L"QDX", L"QDY", L"QDZ", L"QEA", L"QEB", L"QEC", L"QED", L"QEE", L"QEF", L"QEG", L"QEH", L"QEI", L"QEJ", L"QEK", L"QEL", L"QEM", L"QEN", L"QEO", L"QEP", L"QEQ", L"QER", L"QES", L"QET", L"QEU", L"QEV", L"QEW", L"QEX", L"QEY", L"QEZ", L"QFA", L"QFB", L"QFC", L"QFD", L"QFE", L"QFF", L"QFG", L"QFH", L"QFI", L"QFJ", L"QFK", L"QFL", L"QFM", L"QFN", L"QFO", L"QFP", L"QFQ", L"QFR", L"QFS", L"QFT", L"QFU", L"QFV", L"QFW", L"QFX", L"QFY", L"QFZ", L"QGA", L"QGB", L"QGC", L"QGD", L"QGE", L"QGF", L"QGG", L"QGH", L"QGI", L"QGJ", L"QGK", L"QGL", L"QGM", L"QGN", L"QGO", L"QGP", L"QGQ", L"QGR", L"QGS", L"QGT", L"QGU", L"QGV", L"QGW", L"QGX", L"QGY", L"QGZ", L"QHA", L"QHB", L"QHC", L"QHD", L"QHE", L"QHF", L"QHG", L"QHH", L"QHI", L"QHJ", L"QHK", L"QHL", L"QHM", L"QHN", L"QHO", L"QHP", L"QHQ", L"QHR", L"QHS", L"QHT", L"QHU", L"QHV", L"QHW", L"QHX", L"QHY", L"QHZ", L"QIA", L"QIB", L"QIC", L"QID", L"QIE", L"QIF", L"QIG", L"QIH", L"QII", L"QIJ", L"QIK", L"QIL", L"QIM", L"QIN", L"QIO", L"QIP", L"QIQ", L"QIR", L"QIS", L"QIT", L"QIU", L"QIV", L"QIW", L"QIX", L"QIY", L"QIZ", L"QJA", L"QJB", L"QJC", L"QJD", L"QJE", L"QJF", L"QJG", L"QJH", L"QJI", L"QJJ", L"QJK", L"QJL", L"QJM", L"QJN", L"QJO", L"QJP", L"QJQ", L"QJR", L"QJS", L"QJT", L"QJU", L"QJV", L"QJW", L"QJX", L"QJY", L"QJZ", L"QKA", L"QKB", L"QKC", L"QKD", L"QKE", L"QKF", L"QKG", L"QKH", - L"QKI", L"QKJ", L"QKK", L"QKL", L"QKM", L"QKN", L"QKO", L"QKP", L"QKQ", L"QKR", L"QKS", L"QKT", L"QKU", L"QKV", L"QKW", L"QKX", L"QKY", L"QKZ", L"QLA", L"QLB", L"QLC", L"QLD", L"QLE", L"QLF", L"QLG", L"QLH", L"QLI", L"QLJ", L"QLK", L"QLL", L"QLM", L"QLN", L"QLO", L"QLP", L"QLQ", L"QLR", L"QLS", L"QLT", L"QLU", L"QLV", L"QLW", L"QLX", L"QLY", L"QLZ", L"QMA", L"QMB", L"QMC", L"QMD", L"QME", L"QMF", L"QMG", L"QMH", L"QMI", L"QMJ", L"QMK", L"QML", L"QMM", L"QMN", L"QMO", L"QMP", L"QMQ", L"QMR", L"QMS", L"QMT", L"QMU", L"QMV", L"QMW", L"QMX", L"QMY", L"QMZ", L"QNA", L"QNB", L"QNC", L"QND", L"QNE", L"QNF", L"QNG", L"QNH", L"QNI", L"QNJ", L"QNK", L"QNL", L"QNM", L"QNN", L"QNO", L"QNP", L"QNQ", L"QNR", L"QNS", L"QNT", L"QNU", L"QNV", L"QNW", L"QNX", L"QNY", L"QNZ", L"QOA", L"QOB", L"QOC", L"QOD", L"QOE", L"QOF", L"QOG", L"QOH", L"QOI", L"QOJ", L"QOK", L"QOL", L"QOM", L"QON", L"QOO", L"QOP", L"QOQ", L"QOR", L"QOS", L"QOT", L"QOU", L"QOV", L"QOW", L"QOX", L"QOY", L"QOZ", L"QPA", L"QPB", L"QPC", L"QPD", L"QPE", L"QPF", L"QPG", L"QPH", L"QPI", L"QPJ", L"QPK", L"QPL", L"QPM", L"QPN", L"QPO", L"QPP", L"QPQ", L"QPR", L"QPS", L"QPT", L"QPU", L"QPV", L"QPW", L"QPX", L"QPY", L"QPZ", L"QQA", L"QQB", L"QQC", L"QQD", L"QQE", L"QQF", L"QQG", L"QQH", L"QQI", L"QQJ", L"QQK", L"QQL", L"QQM", L"QQN", L"QQO", L"QQP", L"QQQ", L"QQR", L"QQS", L"QQT", L"QQU", L"QQV", L"QQW", L"QQX", L"QQY", L"QQZ", L"QRA", L"QRB", L"QRC", L"QRD", L"QRE", L"QRF", L"QRG", L"QRH", L"QRI", L"QRJ", L"QRK", L"QRL", L"QRM", L"QRN", L"QRO", L"QRP", L"QRQ", L"QRR", L"QRS", L"QRT", L"QRU", L"QRV", L"QRW", L"QRX", L"QRY", L"QRZ", L"QSA", L"QSB", L"QSC", L"QSD", L"QSE", L"QSF", L"QSG", L"QSH", L"QSI", L"QSJ", L"QSK", L"QSL", L"QSM", L"QSN", L"QSO", L"QSP", L"QSQ", L"QSR", L"QSS", L"QST", L"QSU", L"QSV", L"QSW", L"QSX", L"QSY", L"QSZ", L"QTA", L"QTB", L"QTC", L"QTD", L"QTE", L"QTF", L"QTG", L"QTH", L"QTI", L"QTJ", L"QTK", L"QTL", L"QTM", L"QTN", L"QTO", L"QTP", L"QTQ", L"QTR", L"QTS", L"QTT", L"QTU", L"QTV", L"QTW", L"QTX", L"QTY", L"QTZ", L"QUA", L"QUB", L"QUC", L"QUD", L"QUE", L"QUF", L"QUG", L"QUH", L"QUI", L"QUJ", L"QUK", L"QUL", L"QUM", L"QUN", L"QUO", L"QUP", L"QUQ", L"QUR", L"QUS", L"QUT", L"QUU", - L"QUV", L"QUW", L"QUX", L"QUY", L"QUZ", L"QVA", L"QVB", L"QVC", L"QVD", L"QVE", L"QVF", L"QVG", L"QVH", L"QVI", L"QVJ", L"QVK", L"QVL", L"QVM", L"QVN", L"QVO", L"QVP", L"QVQ", L"QVR", L"QVS", L"QVT", L"QVU", L"QVV", L"QVW", L"QVX", L"QVY", L"QVZ", L"QWA", L"QWB", L"QWC", L"QWD", L"QWE", L"QWF", L"QWG", L"QWH", L"QWI", L"QWJ", L"QWK", L"QWL", L"QWM", L"QWN", L"QWO", L"QWP", L"QWQ", L"QWR", L"QWS", L"QWT", L"QWU", L"QWV", L"QWW", L"QWX", L"QWY", L"QWZ", L"QXA", L"QXB", L"QXC", L"QXD", L"QXE", L"QXF", L"QXG", L"QXH", L"QXI", L"QXJ", L"QXK", L"QXL", L"QXM", L"QXN", L"QXO", L"QXP", L"QXQ", L"QXR", L"QXS", L"QXT", L"QXU", L"QXV", L"QXW", L"QXX", L"QXY", L"QXZ", L"QYA", L"QYB", L"QYC", L"QYD", L"QYE", L"QYF", L"QYG", L"QYH", L"QYI", L"QYJ", L"QYK", L"QYL", L"QYM", L"QYN", L"QYO", L"QYP", L"QYQ", L"QYR", L"QYS", L"QYT", L"QYU", L"QYV", L"QYW", L"QYX", L"QYY", L"QYZ", L"QZA", L"QZB", L"QZC", L"QZD", L"QZE", L"QZF", L"QZG", L"QZH", L"QZI", L"QZJ", L"QZK", L"QZL", L"QZM", L"QZN", L"QZO", L"QZP", L"QZQ", L"QZR", L"QZS", L"QZT", L"QZU", L"QZV", L"QZW", L"QZX", L"QZY", L"QZZ", L"RAA", L"RAB", L"RAC", L"RAD", L"RAE", L"RAF", L"RAG", L"RAH", L"RAI", L"RAJ", L"RAK", L"RAL", L"RAM", L"RAN", L"RAO", L"RAP", L"RAQ", L"RAR", L"RAS", L"RAT", L"RAU", L"RAV", L"RAW", L"RAX", L"RAY", L"RAZ", L"RBA", L"RBB", L"RBC", L"RBD", L"RBE", L"RBF", L"RBG", L"RBH", L"RBI", L"RBJ", L"RBK", L"RBL", L"RBM", L"RBN", L"RBO", L"RBP", L"RBQ", L"RBR", L"RBS", L"RBT", L"RBU", L"RBV", L"RBW", L"RBX", L"RBY", L"RBZ", L"RCA", L"RCB", L"RCC", L"RCD", L"RCE", L"RCF", L"RCG", L"RCH", L"RCI", L"RCJ", L"RCK", L"RCL", L"RCM", L"RCN", L"RCO", L"RCP", L"RCQ", L"RCR", L"RCS", L"RCT", L"RCU", L"RCV", L"RCW", L"RCX", L"RCY", L"RCZ", L"RDA", L"RDB", L"RDC", L"RDD", L"RDE", L"RDF", L"RDG", L"RDH", L"RDI", L"RDJ", L"RDK", L"RDL", L"RDM", L"RDN", L"RDO", L"RDP", L"RDQ", L"RDR", L"RDS", L"RDT", L"RDU", L"RDV", L"RDW", L"RDX", L"RDY", L"RDZ", L"REA", L"REB", L"REC", L"RED", L"REE", L"REF", L"REG", L"REH", L"REI", L"REJ", L"REK", L"REL", L"REM", L"REN", L"REO", L"REP", L"REQ", L"RER", L"RES", L"RET", L"REU", L"REV", L"REW", L"REX", L"REY", L"REZ", L"RFA", L"RFB", L"RFC", L"RFD", L"RFE", L"RFF", L"RFG", L"RFH", - L"RFI", L"RFJ", L"RFK", L"RFL", L"RFM", L"RFN", L"RFO", L"RFP", L"RFQ", L"RFR", L"RFS", L"RFT", L"RFU", L"RFV", L"RFW", L"RFX", L"RFY", L"RFZ", L"RGA", L"RGB", L"RGC", L"RGD", L"RGE", L"RGF", L"RGG", L"RGH", L"RGI", L"RGJ", L"RGK", L"RGL", L"RGM", L"RGN", L"RGO", L"RGP", L"RGQ", L"RGR", L"RGS", L"RGT", L"RGU", L"RGV", L"RGW", L"RGX", L"RGY", L"RGZ", L"RHA", L"RHB", L"RHC", L"RHD", L"RHE", L"RHF", L"RHG", L"RHH", L"RHI", L"RHJ", L"RHK", L"RHL", L"RHM", L"RHN", L"RHO", L"RHP", L"RHQ", L"RHR", L"RHS", L"RHT", L"RHU", L"RHV", L"RHW", L"RHX", L"RHY", L"RHZ", L"RIA", L"RIB", L"RIC", L"RID", L"RIE", L"RIF", L"RIG", L"RIH", L"RII", L"RIJ", L"RIK", L"RIL", L"RIM", L"RIN", L"RIO", L"RIP", L"RIQ", L"RIR", L"RIS", L"RIT", L"RIU", L"RIV", L"RIW", L"RIX", L"RIY", L"RIZ", L"RJA", L"RJB", L"RJC", L"RJD", L"RJE", L"RJF", L"RJG", L"RJH", L"RJI", L"RJJ", L"RJK", L"RJL", L"RJM", L"RJN", L"RJO", L"RJP", L"RJQ", L"RJR", L"RJS", L"RJT", L"RJU", L"RJV", L"RJW", L"RJX", L"RJY", L"RJZ", L"RKA", L"RKB", L"RKC", L"RKD", L"RKE", L"RKF", L"RKG", L"RKH", L"RKI", L"RKJ", L"RKK", L"RKL", L"RKM", L"RKN", L"RKO", L"RKP", L"RKQ", L"RKR", L"RKS", L"RKT", L"RKU", L"RKV", L"RKW", L"RKX", L"RKY", L"RKZ", L"RLA", L"RLB", L"RLC", L"RLD", L"RLE", L"RLF", L"RLG", L"RLH", L"RLI", L"RLJ", L"RLK", L"RLL", L"RLM", L"RLN", L"RLO", L"RLP", L"RLQ", L"RLR", L"RLS", L"RLT", L"RLU", L"RLV", L"RLW", L"RLX", L"RLY", L"RLZ", L"RMA", L"RMB", L"RMC", L"RMD", L"RME", L"RMF", L"RMG", L"RMH", L"RMI", L"RMJ", L"RMK", L"RML", L"RMM", L"RMN", L"RMO", L"RMP", L"RMQ", L"RMR", L"RMS", L"RMT", L"RMU", L"RMV", L"RMW", L"RMX", L"RMY", L"RMZ", L"RNA", L"RNB", L"RNC", L"RND", L"RNE", L"RNF", L"RNG", L"RNH", L"RNI", L"RNJ", L"RNK", L"RNL", L"RNM", L"RNN", L"RNO", L"RNP", L"RNQ", L"RNR", L"RNS", L"RNT", L"RNU", L"RNV", L"RNW", L"RNX", L"RNY", L"RNZ", L"ROA", L"ROB", L"ROC", L"ROD", L"ROE", L"ROF", L"ROG", L"ROH", L"ROI", L"ROJ", L"ROK", L"ROL", L"ROM", L"RON", L"ROO", L"ROP", L"ROQ", L"ROR", L"ROS", L"ROT", L"ROU", L"ROV", L"ROW", L"ROX", L"ROY", L"ROZ", L"RPA", L"RPB", L"RPC", L"RPD", L"RPE", L"RPF", L"RPG", L"RPH", L"RPI", L"RPJ", L"RPK", L"RPL", L"RPM", L"RPN", L"RPO", L"RPP", L"RPQ", L"RPR", L"RPS", L"RPT", L"RPU", - L"RPV", L"RPW", L"RPX", L"RPY", L"RPZ", L"RQA", L"RQB", L"RQC", L"RQD", L"RQE", L"RQF", L"RQG", L"RQH", L"RQI", L"RQJ", L"RQK", L"RQL", L"RQM", L"RQN", L"RQO", L"RQP", L"RQQ", L"RQR", L"RQS", L"RQT", L"RQU", L"RQV", L"RQW", L"RQX", L"RQY", L"RQZ", L"RRA", L"RRB", L"RRC", L"RRD", L"RRE", L"RRF", L"RRG", L"RRH", L"RRI", L"RRJ", L"RRK", L"RRL", L"RRM", L"RRN", L"RRO", L"RRP", L"RRQ", L"RRR", L"RRS", L"RRT", L"RRU", L"RRV", L"RRW", L"RRX", L"RRY", L"RRZ", L"RSA", L"RSB", L"RSC", L"RSD", L"RSE", L"RSF", L"RSG", L"RSH", L"RSI", L"RSJ", L"RSK", L"RSL", L"RSM", L"RSN", L"RSO", L"RSP", L"RSQ", L"RSR", L"RSS", L"RST", L"RSU", L"RSV", L"RSW", L"RSX", L"RSY", L"RSZ", L"RTA", L"RTB", L"RTC", L"RTD", L"RTE", L"RTF", L"RTG", L"RTH", L"RTI", L"RTJ", L"RTK", L"RTL", L"RTM", L"RTN", L"RTO", L"RTP", L"RTQ", L"RTR", L"RTS", L"RTT", L"RTU", L"RTV", L"RTW", L"RTX", L"RTY", L"RTZ", L"RUA", L"RUB", L"RUC", L"RUD", L"RUE", L"RUF", L"RUG", L"RUH", L"RUI", L"RUJ", L"RUK", L"RUL", L"RUM", L"RUN", L"RUO", L"RUP", L"RUQ", L"RUR", L"RUS", L"RUT", L"RUU", L"RUV", L"RUW", L"RUX", L"RUY", L"RUZ", L"RVA", L"RVB", L"RVC", L"RVD", L"RVE", L"RVF", L"RVG", L"RVH", L"RVI", L"RVJ", L"RVK", L"RVL", L"RVM", L"RVN", L"RVO", L"RVP", L"RVQ", L"RVR", L"RVS", L"RVT", L"RVU", L"RVV", L"RVW", L"RVX", L"RVY", L"RVZ", L"RWA", L"RWB", L"RWC", L"RWD", L"RWE", L"RWF", L"RWG", L"RWH", L"RWI", L"RWJ", L"RWK", L"RWL", L"RWM", L"RWN", L"RWO", L"RWP", L"RWQ", L"RWR", L"RWS", L"RWT", L"RWU", L"RWV", L"RWW", L"RWX", L"RWY", L"RWZ", L"RXA", L"RXB", L"RXC", L"RXD", L"RXE", L"RXF", L"RXG", L"RXH", L"RXI", L"RXJ", L"RXK", L"RXL", L"RXM", L"RXN", L"RXO", L"RXP", L"RXQ", L"RXR", L"RXS", L"RXT", L"RXU", L"RXV", L"RXW", L"RXX", L"RXY", L"RXZ", L"RYA", L"RYB", L"RYC", L"RYD", L"RYE", L"RYF", L"RYG", L"RYH", L"RYI", L"RYJ", L"RYK", L"RYL", L"RYM", L"RYN", L"RYO", L"RYP", L"RYQ", L"RYR", L"RYS", L"RYT", L"RYU", L"RYV", L"RYW", L"RYX", L"RYY", L"RYZ", L"RZA", L"RZB", L"RZC", L"RZD", L"RZE", L"RZF", L"RZG", L"RZH", L"RZI", L"RZJ", L"RZK", L"RZL", L"RZM", L"RZN", L"RZO", L"RZP", L"RZQ", L"RZR", L"RZS", L"RZT", L"RZU", L"RZV", L"RZW", L"RZX", L"RZY", L"RZZ", L"SAA", L"SAB", L"SAC", L"SAD", L"SAE", L"SAF", L"SAG", L"SAH", - L"SAI", L"SAJ", L"SAK", L"SAL", L"SAM", L"SAN", L"SAO", L"SAP", L"SAQ", L"SAR", L"SAS", L"SAT", L"SAU", L"SAV", L"SAW", L"SAX", L"SAY", L"SAZ", L"SBA", L"SBB", L"SBC", L"SBD", L"SBE", L"SBF", L"SBG", L"SBH", L"SBI", L"SBJ", L"SBK", L"SBL", L"SBM", L"SBN", L"SBO", L"SBP", L"SBQ", L"SBR", L"SBS", L"SBT", L"SBU", L"SBV", L"SBW", L"SBX", L"SBY", L"SBZ", L"SCA", L"SCB", L"SCC", L"SCD", L"SCE", L"SCF", L"SCG", L"SCH", L"SCI", L"SCJ", L"SCK", L"SCL", L"SCM", L"SCN", L"SCO", L"SCP", L"SCQ", L"SCR", L"SCS", L"SCT", L"SCU", L"SCV", L"SCW", L"SCX", L"SCY", L"SCZ", L"SDA", L"SDB", L"SDC", L"SDD", L"SDE", L"SDF", L"SDG", L"SDH", L"SDI", L"SDJ", L"SDK", L"SDL", L"SDM", L"SDN", L"SDO", L"SDP", L"SDQ", L"SDR", L"SDS", L"SDT", L"SDU", L"SDV", L"SDW", L"SDX", L"SDY", L"SDZ", L"SEA", L"SEB", L"SEC", L"SED", L"SEE", L"SEF", L"SEG", L"SEH", L"SEI", L"SEJ", L"SEK", L"SEL", L"SEM", L"SEN", L"SEO", L"SEP", L"SEQ", L"SER", L"SES", L"SET", L"SEU", L"SEV", L"SEW", L"SEX", L"SEY", L"SEZ", L"SFA", L"SFB", L"SFC", L"SFD", L"SFE", L"SFF", L"SFG", L"SFH", L"SFI", L"SFJ", L"SFK", L"SFL", L"SFM", L"SFN", L"SFO", L"SFP", L"SFQ", L"SFR", L"SFS", L"SFT", L"SFU", L"SFV", L"SFW", L"SFX", L"SFY", L"SFZ", L"SGA", L"SGB", L"SGC", L"SGD", L"SGE", L"SGF", L"SGG", L"SGH", L"SGI", L"SGJ", L"SGK", L"SGL", L"SGM", L"SGN", L"SGO", L"SGP", L"SGQ", L"SGR", L"SGS", L"SGT", L"SGU", L"SGV", L"SGW", L"SGX", L"SGY", L"SGZ", L"SHA", L"SHB", L"SHC", L"SHD", L"SHE", L"SHF", L"SHG", L"SHH", L"SHI", L"SHJ", L"SHK", L"SHL", L"SHM", L"SHN", L"SHO", L"SHP", L"SHQ", L"SHR", L"SHS", L"SHT", L"SHU", L"SHV", L"SHW", L"SHX", L"SHY", L"SHZ", L"SIA", L"SIB", L"SIC", L"SID", L"SIE", L"SIF", L"SIG", L"SIH", L"SII", L"SIJ", L"SIK", L"SIL", L"SIM", L"SIN", L"SIO", L"SIP", L"SIQ", L"SIR", L"SIS", L"SIT", L"SIU", L"SIV", L"SIW", L"SIX", L"SIY", L"SIZ", L"SJA", L"SJB", L"SJC", L"SJD", L"SJE", L"SJF", L"SJG", L"SJH", L"SJI", L"SJJ", L"SJK", L"SJL", L"SJM", L"SJN", L"SJO", L"SJP", L"SJQ", L"SJR", L"SJS", L"SJT", L"SJU", L"SJV", L"SJW", L"SJX", L"SJY", L"SJZ", L"SKA", L"SKB", L"SKC", L"SKD", L"SKE", L"SKF", L"SKG", L"SKH", L"SKI", L"SKJ", L"SKK", L"SKL", L"SKM", L"SKN", L"SKO", L"SKP", L"SKQ", L"SKR", L"SKS", L"SKT", L"SKU", - L"SKV", L"SKW", L"SKX", L"SKY", L"SKZ", L"SLA", L"SLB", L"SLC", L"SLD", L"SLE", L"SLF", L"SLG", L"SLH", L"SLI", L"SLJ", L"SLK", L"SLL", L"SLM", L"SLN", L"SLO", L"SLP", L"SLQ", L"SLR", L"SLS", L"SLT", L"SLU", L"SLV", L"SLW", L"SLX", L"SLY", L"SLZ", L"SMA", L"SMB", L"SMC", L"SMD", L"SME", L"SMF", L"SMG", L"SMH", L"SMI", L"SMJ", L"SMK", L"SML", L"SMM", L"SMN", L"SMO", L"SMP", L"SMQ", L"SMR", L"SMS", L"SMT", L"SMU", L"SMV", L"SMW", L"SMX", L"SMY", L"SMZ", L"SNA", L"SNB", L"SNC", L"SND", L"SNE", L"SNF", L"SNG", L"SNH", L"SNI", L"SNJ", L"SNK", L"SNL", L"SNM", L"SNN", L"SNO", L"SNP", L"SNQ", L"SNR", L"SNS", L"SNT", L"SNU", L"SNV", L"SNW", L"SNX", L"SNY", L"SNZ", L"SOA", L"SOB", L"SOC", L"SOD", L"SOE", L"SOF", L"SOG", L"SOH", L"SOI", L"SOJ", L"SOK", L"SOL", L"SOM", L"SON", L"SOO", L"SOP", L"SOQ", L"SOR", L"SOS", L"SOT", L"SOU", L"SOV", L"SOW", L"SOX", L"SOY", L"SOZ", L"SPA", L"SPB", L"SPC", L"SPD", L"SPE", L"SPF", L"SPG", L"SPH", L"SPI", L"SPJ", L"SPK", L"SPL", L"SPM", L"SPN", L"SPO", L"SPP", L"SPQ", L"SPR", L"SPS", L"SPT", L"SPU", L"SPV", L"SPW", L"SPX", L"SPY", L"SPZ", L"SQA", L"SQB", L"SQC", L"SQD", L"SQE", L"SQF", L"SQG", L"SQH", L"SQI", L"SQJ", L"SQK", L"SQL", L"SQM", L"SQN", L"SQO", L"SQP", L"SQQ", L"SQR", L"SQS", L"SQT", L"SQU", L"SQV", L"SQW", L"SQX", L"SQY", L"SQZ", L"SRA", L"SRB", L"SRC", L"SRD", L"SRE", L"SRF", L"SRG", L"SRH", L"SRI", L"SRJ", L"SRK", L"SRL", L"SRM", L"SRN", L"SRO", L"SRP", L"SRQ", L"SRR", L"SRS", L"SRT", L"SRU", L"SRV", L"SRW", L"SRX", L"SRY", L"SRZ", L"SSA", L"SSB", L"SSC", L"SSD", L"SSE", L"SSF", L"SSG", L"SSH", L"SSI", L"SSJ", L"SSK", L"SSL", L"SSM", L"SSN", L"SSO", L"SSP", L"SSQ", L"SSR", L"SSS", L"SST", L"SSU", L"SSV", L"SSW", L"SSX", L"SSY", L"SSZ", L"STA", L"STB", L"STC", L"STD", L"STE", L"STF", L"STG", L"STH", L"STI", L"STJ", L"STK", L"STL", L"STM", L"STN", L"STO", L"STP", L"STQ", L"STR", L"STS", L"STT", L"STU", L"STV", L"STW", L"STX", L"STY", L"STZ", L"SUA", L"SUB", L"SUC", L"SUD", L"SUE", L"SUF", L"SUG", L"SUH", L"SUI", L"SUJ", L"SUK", L"SUL", L"SUM", L"SUN", L"SUO", L"SUP", L"SUQ", L"SUR", L"SUS", L"SUT", L"SUU", L"SUV", L"SUW", L"SUX", L"SUY", - L"SUZ", L"SVA", L"SVB", L"SVC", L"SVD", L"SVE", L"SVF", L"SVG", L"SVH", L"SVI", L"SVJ", L"SVK", L"SVL", L"SVM", L"SVN", L"SVO", L"SVP", L"SVQ", L"SVR", L"SVS", L"SVT", L"SVU", L"SVV", L"SVW", L"SVX", L"SVY", L"SVZ", L"SWA", L"SWB", L"SWC", L"SWD", L"SWE", L"SWF", L"SWG", L"SWH", L"SWI", L"SWJ", L"SWK", L"SWL", L"SWM", L"SWN", L"SWO", L"SWP", L"SWQ", L"SWR", L"SWS", L"SWT", L"SWU", L"SWV", L"SWW", L"SWX", L"SWY", L"SWZ", L"SXA", L"SXB", L"SXC", L"SXD", L"SXE", L"SXF", L"SXG", L"SXH", L"SXI", L"SXJ", L"SXK", L"SXL", L"SXM", L"SXN", L"SXO", L"SXP", L"SXQ", L"SXR", L"SXS", L"SXT", L"SXU", L"SXV", L"SXW", L"SXX", L"SXY", L"SXZ", L"SYA", L"SYB", L"SYC", L"SYD", L"SYE", L"SYF", L"SYG", L"SYH", L"SYI", L"SYJ", L"SYK", L"SYL", L"SYM", L"SYN", L"SYO", L"SYP", L"SYQ", L"SYR", L"SYS", L"SYT", L"SYU", L"SYV", L"SYW", L"SYX", L"SYY", L"SYZ", L"SZA", L"SZB", L"SZC", L"SZD", L"SZE", L"SZF", L"SZG", L"SZH", L"SZI", L"SZJ", L"SZK", L"SZL", L"SZM", L"SZN", L"SZO", L"SZP", L"SZQ", L"SZR", L"SZS", L"SZT", L"SZU", L"SZV", L"SZW", L"SZX", L"SZY", L"SZZ", L"TAA", L"TAB", L"TAC", L"TAD", L"TAE", L"TAF", L"TAG", L"TAH", L"TAI", L"TAJ", L"TAK", L"TAL", L"TAM", L"TAN", L"TAO", L"TAP", L"TAQ", L"TAR", L"TAS", L"TAT", L"TAU", L"TAV", L"TAW", L"TAX", L"TAY", L"TAZ", L"TBA", L"TBB", L"TBC", L"TBD", L"TBE", L"TBF", L"TBG", L"TBH", L"TBI", L"TBJ", L"TBK", L"TBL", L"TBM", L"TBN", L"TBO", L"TBP", L"TBQ", L"TBR", L"TBS", L"TBT", L"TBU", L"TBV", L"TBW", L"TBX", L"TBY", L"TBZ", L"TCA", L"TCB", L"TCC", L"TCD", L"TCE", L"TCF", L"TCG", L"TCH", L"TCI", L"TCJ", L"TCK", L"TCL", L"TCM", L"TCN", L"TCO", L"TCP", L"TCQ", L"TCR", L"TCS", L"TCT", L"TCU", L"TCV", L"TCW", L"TCX", L"TCY", L"TCZ", L"TDA", L"TDB", L"TDC", L"TDD", L"TDE", L"TDF", L"TDG", L"TDH", L"TDI", L"TDJ", L"TDK", L"TDL", L"TDM", L"TDN", L"TDO", L"TDP", L"TDQ", L"TDR", L"TDS", L"TDT", L"TDU", L"TDV", L"TDW", L"TDX", L"TDY", L"TDZ", L"TEA", L"TEB", L"TEC", L"TED", L"TEE", L"TEF", L"TEG", L"TEH", L"TEI", L"TEJ", L"TEK", L"TEL", L"TEM", L"TEN", L"TEO", L"TEP", L"TEQ", L"TER", L"TES", L"TET", L"TEU", L"TEV", L"TEW", L"TEX", L"TEY", L"TEZ", L"TFA", L"TFB", L"TFC", L"TFD", L"TFE", L"TFF", L"TFG", L"TFH", L"TFI", L"TFJ", L"TFK", L"TFL", + L"QKI", L"QKJ", L"QKK", L"QKL", L"QKM", L"QKN", L"QKO", L"QKP", L"QKQ", L"QKR", L"QKS", L"QKT", L"QKU", L"QKV", L"QKW", L"QKX", L"QKY", L"QKZ", L"QLA", L"QLB", L"QLC", L"QLD", L"QLE", L"QLF", L"QLG", L"QLH", L"QLI", L"QLJ", L"QLK", L"QLL", L"QLM", L"QLN", L"QLO", L"QLP", L"QLQ", L"QLR", L"QLS", L"QLT", L"QLU", L"QLV", L"QLW", L"QLX", L"QLY", L"QLZ", L"QMA", L"QMB", L"QMC", L"QMD", L"QME", L"QMF", L"QMG", L"QMH", L"QMI", L"QMJ", L"QMK", L"QML", L"QMM", L"QMN", L"QMO", L"QMP", L"QMQ", L"QMR", L"QMS", L"QMT", L"QMU", L"QMV", L"QMW", L"QMX", L"QMY", L"QMZ", L"QNA", L"QNB", L"QNC", L"QND", L"QNE", L"QNF", L"QNG", L"QNH", L"QNI", L"QNJ", L"QNK", L"QNL", L"QNM", L"QNN", L"QNO", L"QNP", L"QNQ", L"QNR", L"QNS", L"QNT", L"QNU", L"QNV", L"QNW", L"QNX", L"QNY", L"QNZ", L"QOA", L"QOB", L"QOC", L"QOD", L"QOE", L"QOF", L"QOG", L"QOH", L"QOI", L"QOJ", L"QOK", L"QOL", L"QOM", L"QON", L"QOO", L"QOP", L"QOQ", L"QOR", L"QOS", L"QOT", L"QOU", L"QOV", L"QOW", L"QOX", L"QOY", L"QOZ", L"QPA", L"QPB", L"QPC", L"QPD", L"QPE", L"QPF", L"QPG", L"QPH", L"QPI", L"QPJ", L"QPK", L"QPL", L"QPM", L"QPN", L"QPO", L"QPP", L"QPQ", L"QPR", L"QPS", L"QPT", L"QPU", L"QPV", L"QPW", L"QPX", L"QPY", L"QPZ", L"QQA", L"QQB", L"QQC", L"QQD", L"QQE", L"QQF", L"QQG", L"QQH", L"QQI", L"QQJ", L"QQK", L"QQL", L"QQM", L"QQN", L"QQO", L"QQP", L"QQQ", L"QQR", L"QQS", L"QQT", L"QQU", L"QQV", L"QQW", L"QQX", L"QQY", L"QQZ", L"QRA", L"QRB", L"QRC", L"QRD", L"QRE", L"QRF", L"QRG", L"QRH", L"QRI", L"QRJ", L"QRK", L"QRL", L"QRM", L"QRN", L"QRO", L"QRP", L"QRQ", L"QRR", L"QRS", L"QRT", L"QRU", L"QRV", L"QRW", L"QRX", L"QRY", L"QRZ", L"QSA", L"QSB", L"QSC", L"QSD", L"QSE", L"QSF", L"QSG", L"QSH", L"QSI", L"QSJ", L"QSK", L"QSL", L"QSM", L"QSN", L"QSO", L"QSP", L"QSQ", L"QSR", L"QSS", L"QST", L"QSU", L"QSV", L"QSW", L"QSX", L"QSY", L"QSZ", L"QTA", L"QTB", L"QTC", L"QTD", L"QTE", L"QTF", L"QTG", L"QTH", L"QTI", L"QTJ", L"QTK", L"QTL", L"QTM", L"QTN", L"QTO", L"QTP", L"QTQ", L"QTR", L"QTS", L"QTT", L"QTU", L"QTV", L"QTW", L"QTX", L"QTY", L"QTZ", L"QUA", L"QUB", L"QUC", L"QUD", L"QUE", L"QUF", L"QUG", L"QUH", L"QUI", L"QUJ", L"QUK", L"QUL", L"QUM", L"QUN", L"QUO", L"QUP", L"QUQ", L"QUR", L"QUS", L"QUT", L"QUU", + L"QUV", L"QUW", L"QUX", L"QUY", L"QUZ", L"QVA", L"QVB", L"QVC", L"QVD", L"QVE", L"QVF", L"QVG", L"QVH", L"QVI", L"QVJ", L"QVK", L"QVL", L"QVM", L"QVN", L"QVO", L"QVP", L"QVQ", L"QVR", L"QVS", L"QVT", L"QVU", L"QVV", L"QVW", L"QVX", L"QVY", L"QVZ", L"QWA", L"QWB", L"QWC", L"QWD", L"QWE", L"QWF", L"QWG", L"QWH", L"QWI", L"QWJ", L"QWK", L"QWL", L"QWM", L"QWN", L"QWO", L"QWP", L"QWQ", L"QWR", L"QWS", L"QWT", L"QWU", L"QWV", L"QWW", L"QWX", L"QWY", L"QWZ", L"QXA", L"QXB", L"QXC", L"QXD", L"QXE", L"QXF", L"QXG", L"QXH", L"QXI", L"QXJ", L"QXK", L"QXL", L"QXM", L"QXN", L"QXO", L"QXP", L"QXQ", L"QXR", L"QXS", L"QXT", L"QXU", L"QXV", L"QXW", L"QXX", L"QXY", L"QXZ", L"QYA", L"QYB", L"QYC", L"QYD", L"QYE", L"QYF", L"QYG", L"QYH", L"QYI", L"QYJ", L"QYK", L"QYL", L"QYM", L"QYN", L"QYO", L"QYP", L"QYQ", L"QYR", L"QYS", L"QYT", L"QYU", L"QYV", L"QYW", L"QYX", L"QYY", L"QYZ", L"QZA", L"QZB", L"QZC", L"QZD", L"QZE", L"QZF", L"QZG", L"QZH", L"QZI", L"QZJ", L"QZK", L"QZL", L"QZM", L"QZN", L"QZO", L"QZP", L"QZQ", L"QZR", L"QZS", L"QZT", L"QZU", L"QZV", L"QZW", L"QZX", L"QZY", L"QZZ", L"RAA", L"RAB", L"RAC", L"RAD", L"RAE", L"RAF", L"RAG", L"RAH", L"RAI", L"RAJ", L"RAK", L"RAL", L"RAM", L"RAN", L"RAO", L"RAP", L"RAQ", L"RAR", L"RAS", L"RAT", L"RAU", L"RAV", L"RAW", L"RAX", L"RAY", L"RAZ", L"RBA", L"RBB", L"RBC", L"RBD", L"RBE", L"RBF", L"RBG", L"RBH", L"RBI", L"RBJ", L"RBK", L"RBL", L"RBM", L"RBN", L"RBO", L"RBP", L"RBQ", L"RBR", L"RBS", L"RBT", L"RBU", L"RBV", L"RBW", L"RBX", L"RBY", L"RBZ", L"RCA", L"RCB", L"RCC", L"RCD", L"RCE", L"RCF", L"RCG", L"RCH", L"RCI", L"RCJ", L"RCK", L"RCL", L"RCM", L"RCN", L"RCO", L"RCP", L"RCQ", L"RCR", L"RCS", L"RCT", L"RCU", L"RCV", L"RCW", L"RCX", L"RCY", L"RCZ", L"RDA", L"RDB", L"RDC", L"RDD", L"RDE", L"RDF", L"RDG", L"RDH", L"RDI", L"RDJ", L"RDK", L"RDL", L"RDM", L"RDN", L"RDO", L"RDP", L"RDQ", L"RDR", L"RDS", L"RDT", L"RDU", L"RDV", L"RDW", L"RDX", L"RDY", L"RDZ", L"REA", L"REB", L"REC", L"RED", L"REE", L"REF", L"REG", L"REH", L"REI", L"REJ", L"REK", L"REL", L"REM", L"REN", L"REO", L"REP", L"REQ", L"RER", L"RES", L"RET", L"REU", L"REV", L"REW", L"REX", L"REY", L"REZ", L"RFA", L"RFB", L"RFC", L"RFD", L"RFE", L"RFF", L"RFG", L"RFH", + L"RFI", L"RFJ", L"RFK", L"RFL", L"RFM", L"RFN", L"RFO", L"RFP", L"RFQ", L"RFR", L"RFS", L"RFT", L"RFU", L"RFV", L"RFW", L"RFX", L"RFY", L"RFZ", L"RGA", L"RGB", L"RGC", L"RGD", L"RGE", L"RGF", L"RGG", L"RGH", L"RGI", L"RGJ", L"RGK", L"RGL", L"RGM", L"RGN", L"RGO", L"RGP", L"RGQ", L"RGR", L"RGS", L"RGT", L"RGU", L"RGV", L"RGW", L"RGX", L"RGY", L"RGZ", L"RHA", L"RHB", L"RHC", L"RHD", L"RHE", L"RHF", L"RHG", L"RHH", L"RHI", L"RHJ", L"RHK", L"RHL", L"RHM", L"RHN", L"RHO", L"RHP", L"RHQ", L"RHR", L"RHS", L"RHT", L"RHU", L"RHV", L"RHW", L"RHX", L"RHY", L"RHZ", L"RIA", L"RIB", L"RIC", L"RID", L"RIE", L"RIF", L"RIG", L"RIH", L"RII", L"RIJ", L"RIK", L"RIL", L"RIM", L"RIN", L"RIO", L"RIP", L"RIQ", L"RIR", L"RIS", L"RIT", L"RIU", L"RIV", L"RIW", L"RIX", L"RIY", L"RIZ", L"RJA", L"RJB", L"RJC", L"RJD", L"RJE", L"RJF", L"RJG", L"RJH", L"RJI", L"RJJ", L"RJK", L"RJL", L"RJM", L"RJN", L"RJO", L"RJP", L"RJQ", L"RJR", L"RJS", L"RJT", L"RJU", L"RJV", L"RJW", L"RJX", L"RJY", L"RJZ", L"RKA", L"RKB", L"RKC", L"RKD", L"RKE", L"RKF", L"RKG", L"RKH", L"RKI", L"RKJ", L"RKK", L"RKL", L"RKM", L"RKN", L"RKO", L"RKP", L"RKQ", L"RKR", L"RKS", L"RKT", L"RKU", L"RKV", L"RKW", L"RKX", L"RKY", L"RKZ", L"RLA", L"RLB", L"RLC", L"RLD", L"RLE", L"RLF", L"RLG", L"RLH", L"RLI", L"RLJ", L"RLK", L"RLL", L"RLM", L"RLN", L"RLO", L"RLP", L"RLQ", L"RLR", L"RLS", L"RLT", L"RLU", L"RLV", L"RLW", L"RLX", L"RLY", L"RLZ", L"RMA", L"RMB", L"RMC", L"RMD", L"RME", L"RMF", L"RMG", L"RMH", L"RMI", L"RMJ", L"RMK", L"RML", L"RMM", L"RMN", L"RMO", L"RMP", L"RMQ", L"RMR", L"RMS", L"RMT", L"RMU", L"RMV", L"RMW", L"RMX", L"RMY", L"RMZ", L"RNA", L"RNB", L"RNC", L"RND", L"RNE", L"RNF", L"RNG", L"RNH", L"RNI", L"RNJ", L"RNK", L"RNL", L"RNM", L"RNN", L"RNO", L"RNP", L"RNQ", L"RNR", L"RNS", L"RNT", L"RNU", L"RNV", L"RNW", L"RNX", L"RNY", L"RNZ", L"ROA", L"ROB", L"ROC", L"ROD", L"ROE", L"ROF", L"ROG", L"ROH", L"ROI", L"ROJ", L"ROK", L"ROL", L"ROM", L"RON", L"ROO", L"ROP", L"ROQ", L"ROR", L"ROS", L"ROT", L"ROU", L"ROV", L"ROW", L"ROX", L"ROY", L"ROZ", L"RPA", L"RPB", L"RPC", L"RPD", L"RPE", L"RPF", L"RPG", L"RPH", L"RPI", L"RPJ", L"RPK", L"RPL", L"RPM", L"RPN", L"RPO", L"RPP", L"RPQ", L"RPR", L"RPS", L"RPT", L"RPU", + L"RPV", L"RPW", L"RPX", L"RPY", L"RPZ", L"RQA", L"RQB", L"RQC", L"RQD", L"RQE", L"RQF", L"RQG", L"RQH", L"RQI", L"RQJ", L"RQK", L"RQL", L"RQM", L"RQN", L"RQO", L"RQP", L"RQQ", L"RQR", L"RQS", L"RQT", L"RQU", L"RQV", L"RQW", L"RQX", L"RQY", L"RQZ", L"RRA", L"RRB", L"RRC", L"RRD", L"RRE", L"RRF", L"RRG", L"RRH", L"RRI", L"RRJ", L"RRK", L"RRL", L"RRM", L"RRN", L"RRO", L"RRP", L"RRQ", L"RRR", L"RRS", L"RRT", L"RRU", L"RRV", L"RRW", L"RRX", L"RRY", L"RRZ", L"RSA", L"RSB", L"RSC", L"RSD", L"RSE", L"RSF", L"RSG", L"RSH", L"RSI", L"RSJ", L"RSK", L"RSL", L"RSM", L"RSN", L"RSO", L"RSP", L"RSQ", L"RSR", L"RSS", L"RST", L"RSU", L"RSV", L"RSW", L"RSX", L"RSY", L"RSZ", L"RTA", L"RTB", L"RTC", L"RTD", L"RTE", L"RTF", L"RTG", L"RTH", L"RTI", L"RTJ", L"RTK", L"RTL", L"RTM", L"RTN", L"RTO", L"RTP", L"RTQ", L"RTR", L"RTS", L"RTT", L"RTU", L"RTV", L"RTW", L"RTX", L"RTY", L"RTZ", L"RUA", L"RUB", L"RUC", L"RUD", L"RUE", L"RUF", L"RUG", L"RUH", L"RUI", L"RUJ", L"RUK", L"RUL", L"RUM", L"RUN", L"RUO", L"RUP", L"RUQ", L"RUR", L"RUS", L"RUT", L"RUU", L"RUV", L"RUW", L"RUX", L"RUY", L"RUZ", L"RVA", L"RVB", L"RVC", L"RVD", L"RVE", L"RVF", L"RVG", L"RVH", L"RVI", L"RVJ", L"RVK", L"RVL", L"RVM", L"RVN", L"RVO", L"RVP", L"RVQ", L"RVR", L"RVS", L"RVT", L"RVU", L"RVV", L"RVW", L"RVX", L"RVY", L"RVZ", L"RWA", L"RWB", L"RWC", L"RWD", L"RWE", L"RWF", L"RWG", L"RWH", L"RWI", L"RWJ", L"RWK", L"RWL", L"RWM", L"RWN", L"RWO", L"RWP", L"RWQ", L"RWR", L"RWS", L"RWT", L"RWU", L"RWV", L"RWW", L"RWX", L"RWY", L"RWZ", L"RXA", L"RXB", L"RXC", L"RXD", L"RXE", L"RXF", L"RXG", L"RXH", L"RXI", L"RXJ", L"RXK", L"RXL", L"RXM", L"RXN", L"RXO", L"RXP", L"RXQ", L"RXR", L"RXS", L"RXT", L"RXU", L"RXV", L"RXW", L"RXX", L"RXY", L"RXZ", L"RYA", L"RYB", L"RYC", L"RYD", L"RYE", L"RYF", L"RYG", L"RYH", L"RYI", L"RYJ", L"RYK", L"RYL", L"RYM", L"RYN", L"RYO", L"RYP", L"RYQ", L"RYR", L"RYS", L"RYT", L"RYU", L"RYV", L"RYW", L"RYX", L"RYY", L"RYZ", L"RZA", L"RZB", L"RZC", L"RZD", L"RZE", L"RZF", L"RZG", L"RZH", L"RZI", L"RZJ", L"RZK", L"RZL", L"RZM", L"RZN", L"RZO", L"RZP", L"RZQ", L"RZR", L"RZS", L"RZT", L"RZU", L"RZV", L"RZW", L"RZX", L"RZY", L"RZZ", L"SAA", L"SAB", L"SAC", L"SAD", L"SAE", L"SAF", L"SAG", L"SAH", + L"SAI", L"SAJ", L"SAK", L"SAL", L"SAM", L"SAN", L"SAO", L"SAP", L"SAQ", L"SAR", L"SAS", L"SAT", L"SAU", L"SAV", L"SAW", L"SAX", L"SAY", L"SAZ", L"SBA", L"SBB", L"SBC", L"SBD", L"SBE", L"SBF", L"SBG", L"SBH", L"SBI", L"SBJ", L"SBK", L"SBL", L"SBM", L"SBN", L"SBO", L"SBP", L"SBQ", L"SBR", L"SBS", L"SBT", L"SBU", L"SBV", L"SBW", L"SBX", L"SBY", L"SBZ", L"SCA", L"SCB", L"SCC", L"SCD", L"SCE", L"SCF", L"SCG", L"SCH", L"SCI", L"SCJ", L"SCK", L"SCL", L"SCM", L"SCN", L"SCO", L"SCP", L"SCQ", L"SCR", L"SCS", L"SCT", L"SCU", L"SCV", L"SCW", L"SCX", L"SCY", L"SCZ", L"SDA", L"SDB", L"SDC", L"SDD", L"SDE", L"SDF", L"SDG", L"SDH", L"SDI", L"SDJ", L"SDK", L"SDL", L"SDM", L"SDN", L"SDO", L"SDP", L"SDQ", L"SDR", L"SDS", L"SDT", L"SDU", L"SDV", L"SDW", L"SDX", L"SDY", L"SDZ", L"SEA", L"SEB", L"SEC", L"SED", L"SEE", L"SEF", L"SEG", L"SEH", L"SEI", L"SEJ", L"SEK", L"SEL", L"SEM", L"SEN", L"SEO", L"SEP", L"SEQ", L"SER", L"SES", L"SET", L"SEU", L"SEV", L"SEW", L"SEX", L"SEY", L"SEZ", L"SFA", L"SFB", L"SFC", L"SFD", L"SFE", L"SFF", L"SFG", L"SFH", L"SFI", L"SFJ", L"SFK", L"SFL", L"SFM", L"SFN", L"SFO", L"SFP", L"SFQ", L"SFR", L"SFS", L"SFT", L"SFU", L"SFV", L"SFW", L"SFX", L"SFY", L"SFZ", L"SGA", L"SGB", L"SGC", L"SGD", L"SGE", L"SGF", L"SGG", L"SGH", L"SGI", L"SGJ", L"SGK", L"SGL", L"SGM", L"SGN", L"SGO", L"SGP", L"SGQ", L"SGR", L"SGS", L"SGT", L"SGU", L"SGV", L"SGW", L"SGX", L"SGY", L"SGZ", L"SHA", L"SHB", L"SHC", L"SHD", L"SHE", L"SHF", L"SHG", L"SHH", L"SHI", L"SHJ", L"SHK", L"SHL", L"SHM", L"SHN", L"SHO", L"SHP", L"SHQ", L"SHR", L"SHS", L"SHT", L"SHU", L"SHV", L"SHW", L"SHX", L"SHY", L"SHZ", L"SIA", L"SIB", L"SIC", L"SID", L"SIE", L"SIF", L"SIG", L"SIH", L"SII", L"SIJ", L"SIK", L"SIL", L"SIM", L"SIN", L"SIO", L"SIP", L"SIQ", L"SIR", L"SIS", L"SIT", L"SIU", L"SIV", L"SIW", L"SIX", L"SIY", L"SIZ", L"SJA", L"SJB", L"SJC", L"SJD", L"SJE", L"SJF", L"SJG", L"SJH", L"SJI", L"SJJ", L"SJK", L"SJL", L"SJM", L"SJN", L"SJO", L"SJP", L"SJQ", L"SJR", L"SJS", L"SJT", L"SJU", L"SJV", L"SJW", L"SJX", L"SJY", L"SJZ", L"SKA", L"SKB", L"SKC", L"SKD", L"SKE", L"SKF", L"SKG", L"SKH", L"SKI", L"SKJ", L"SKK", L"SKL", L"SKM", L"SKN", L"SKO", L"SKP", L"SKQ", L"SKR", L"SKS", L"SKT", L"SKU", + L"SKV", L"SKW", L"SKX", L"SKY", L"SKZ", L"SLA", L"SLB", L"SLC", L"SLD", L"SLE", L"SLF", L"SLG", L"SLH", L"SLI", L"SLJ", L"SLK", L"SLL", L"SLM", L"SLN", L"SLO", L"SLP", L"SLQ", L"SLR", L"SLS", L"SLT", L"SLU", L"SLV", L"SLW", L"SLX", L"SLY", L"SLZ", L"SMA", L"SMB", L"SMC", L"SMD", L"SME", L"SMF", L"SMG", L"SMH", L"SMI", L"SMJ", L"SMK", L"SML", L"SMM", L"SMN", L"SMO", L"SMP", L"SMQ", L"SMR", L"SMS", L"SMT", L"SMU", L"SMV", L"SMW", L"SMX", L"SMY", L"SMZ", L"SNA", L"SNB", L"SNC", L"SND", L"SNE", L"SNF", L"SNG", L"SNH", L"SNI", L"SNJ", L"SNK", L"SNL", L"SNM", L"SNN", L"SNO", L"SNP", L"SNQ", L"SNR", L"SNS", L"SNT", L"SNU", L"SNV", L"SNW", L"SNX", L"SNY", L"SNZ", L"SOA", L"SOB", L"SOC", L"SOD", L"SOE", L"SOF", L"SOG", L"SOH", L"SOI", L"SOJ", L"SOK", L"SOL", L"SOM", L"SON", L"SOO", L"SOP", L"SOQ", L"SOR", L"SOS", L"SOT", L"SOU", L"SOV", L"SOW", L"SOX", L"SOY", L"SOZ", L"SPA", L"SPB", L"SPC", L"SPD", L"SPE", L"SPF", L"SPG", L"SPH", L"SPI", L"SPJ", L"SPK", L"SPL", L"SPM", L"SPN", L"SPO", L"SPP", L"SPQ", L"SPR", L"SPS", L"SPT", L"SPU", L"SPV", L"SPW", L"SPX", L"SPY", L"SPZ", L"SQA", L"SQB", L"SQC", L"SQD", L"SQE", L"SQF", L"SQG", L"SQH", L"SQI", L"SQJ", L"SQK", L"SQL", L"SQM", L"SQN", L"SQO", L"SQP", L"SQQ", L"SQR", L"SQS", L"SQT", L"SQU", L"SQV", L"SQW", L"SQX", L"SQY", L"SQZ", L"SRA", L"SRB", L"SRC", L"SRD", L"SRE", L"SRF", L"SRG", L"SRH", L"SRI", L"SRJ", L"SRK", L"SRL", L"SRM", L"SRN", L"SRO", L"SRP", L"SRQ", L"SRR", L"SRS", L"SRT", L"SRU", L"SRV", L"SRW", L"SRX", L"SRY", L"SRZ", L"SSA", L"SSB", L"SSC", L"SSD", L"SSE", L"SSF", L"SSG", L"SSH", L"SSI", L"SSJ", L"SSK", L"SSL", L"SSM", L"SSN", L"SSO", L"SSP", L"SSQ", L"SSR", L"SSS", L"SST", L"SSU", L"SSV", L"SSW", L"SSX", L"SSY", L"SSZ", L"STA", L"STB", L"STC", L"STD", L"STE", L"STF", L"STG", L"STH", L"STI", L"STJ", L"STK", L"STL", L"STM", L"STN", L"STO", L"STP", L"STQ", L"STR", L"STS", L"STT", L"STU", L"STV", L"STW", L"STX", L"STY", L"STZ", L"SUA", L"SUB", L"SUC", L"SUD", L"SUE", L"SUF", L"SUG", L"SUH", L"SUI", L"SUJ", L"SUK", L"SUL", L"SUM", L"SUN", L"SUO", L"SUP", L"SUQ", L"SUR", L"SUS", L"SUT", L"SUU", L"SUV", L"SUW", L"SUX", L"SUY", + L"SUZ", L"SVA", L"SVB", L"SVC", L"SVD", L"SVE", L"SVF", L"SVG", L"SVH", L"SVI", L"SVJ", L"SVK", L"SVL", L"SVM", L"SVN", L"SVO", L"SVP", L"SVQ", L"SVR", L"SVS", L"SVT", L"SVU", L"SVV", L"SVW", L"SVX", L"SVY", L"SVZ", L"SWA", L"SWB", L"SWC", L"SWD", L"SWE", L"SWF", L"SWG", L"SWH", L"SWI", L"SWJ", L"SWK", L"SWL", L"SWM", L"SWN", L"SWO", L"SWP", L"SWQ", L"SWR", L"SWS", L"SWT", L"SWU", L"SWV", L"SWW", L"SWX", L"SWY", L"SWZ", L"SXA", L"SXB", L"SXC", L"SXD", L"SXE", L"SXF", L"SXG", L"SXH", L"SXI", L"SXJ", L"SXK", L"SXL", L"SXM", L"SXN", L"SXO", L"SXP", L"SXQ", L"SXR", L"SXS", L"SXT", L"SXU", L"SXV", L"SXW", L"SXX", L"SXY", L"SXZ", L"SYA", L"SYB", L"SYC", L"SYD", L"SYE", L"SYF", L"SYG", L"SYH", L"SYI", L"SYJ", L"SYK", L"SYL", L"SYM", L"SYN", L"SYO", L"SYP", L"SYQ", L"SYR", L"SYS", L"SYT", L"SYU", L"SYV", L"SYW", L"SYX", L"SYY", L"SYZ", L"SZA", L"SZB", L"SZC", L"SZD", L"SZE", L"SZF", L"SZG", L"SZH", L"SZI", L"SZJ", L"SZK", L"SZL", L"SZM", L"SZN", L"SZO", L"SZP", L"SZQ", L"SZR", L"SZS", L"SZT", L"SZU", L"SZV", L"SZW", L"SZX", L"SZY", L"SZZ", L"TAA", L"TAB", L"TAC", L"TAD", L"TAE", L"TAF", L"TAG", L"TAH", L"TAI", L"TAJ", L"TAK", L"TAL", L"TAM", L"TAN", L"TAO", L"TAP", L"TAQ", L"TAR", L"TAS", L"TAT", L"TAU", L"TAV", L"TAW", L"TAX", L"TAY", L"TAZ", L"TBA", L"TBB", L"TBC", L"TBD", L"TBE", L"TBF", L"TBG", L"TBH", L"TBI", L"TBJ", L"TBK", L"TBL", L"TBM", L"TBN", L"TBO", L"TBP", L"TBQ", L"TBR", L"TBS", L"TBT", L"TBU", L"TBV", L"TBW", L"TBX", L"TBY", L"TBZ", L"TCA", L"TCB", L"TCC", L"TCD", L"TCE", L"TCF", L"TCG", L"TCH", L"TCI", L"TCJ", L"TCK", L"TCL", L"TCM", L"TCN", L"TCO", L"TCP", L"TCQ", L"TCR", L"TCS", L"TCT", L"TCU", L"TCV", L"TCW", L"TCX", L"TCY", L"TCZ", L"TDA", L"TDB", L"TDC", L"TDD", L"TDE", L"TDF", L"TDG", L"TDH", L"TDI", L"TDJ", L"TDK", L"TDL", L"TDM", L"TDN", L"TDO", L"TDP", L"TDQ", L"TDR", L"TDS", L"TDT", L"TDU", L"TDV", L"TDW", L"TDX", L"TDY", L"TDZ", L"TEA", L"TEB", L"TEC", L"TED", L"TEE", L"TEF", L"TEG", L"TEH", L"TEI", L"TEJ", L"TEK", L"TEL", L"TEM", L"TEN", L"TEO", L"TEP", L"TEQ", L"TER", L"TES", L"TET", L"TEU", L"TEV", L"TEW", L"TEX", L"TEY", L"TEZ", L"TFA", L"TFB", L"TFC", L"TFD", L"TFE", L"TFF", L"TFG", L"TFH", L"TFI", L"TFJ", L"TFK", L"TFL", L"TFM", L"TFN", L"TFO", L"TFP", L"TFQ", L"TFR", L"TFS", L"TFT", L"TFU", L"TFV", L"TFW", L"TFX", L"TFY", L"TFZ", L"TGA", L"TGB", L"TGC", L"TGD", L"TGE", L"TGF", L"TGG", L"TGH", L"TGI", L"TGJ", L"TGK", L"TGL", L"TGM", L"TGN", L"TGO", L"TGP", L"TGQ", L"TGR", L"TGS", L"TGT", L"TGU", L"TGV", L"TGW", L"TGX", L"TGY", L"TGZ", L"THA", L"THB", L"THC", L"THD", L"THE", L"THF", L"THG", L"THH", L"THI", L"THJ", L"THK", L"THL", L"THM", L"THN", L"THO", L"THP", L"THQ", L"THR", L"THS", L"THT", L"THU", L"THV", L"THW", L"THX", L"THY", L"THZ", L"TIA", L"TIB", L"TIC", L"TID", L"TIE", L"TIF", L"TIG", L"TIH", L"TII", L"TIJ", L"TIK", L"TIL", L"TIM", L"TIN", L"TIO", L"TIP", L"TIQ", L"TIR", L"TIS", L"TIT", L"TIU", L"TIV", L"TIW", L"TIX", L"TIY", L"TIZ", L"TJA", L"TJB", L"TJC", L"TJD", L"TJE", L"TJF", L"TJG", L"TJH", L"TJI", L"TJJ", L"TJK", L"TJL", L"TJM", L"TJN", L"TJO", L"TJP", L"TJQ", L"TJR", L"TJS", L"TJT", L"TJU", L"TJV", L"TJW", L"TJX", L"TJY", L"TJZ", L"TKA", L"TKB", L"TKC", L"TKD", L"TKE", L"TKF", L"TKG", L"TKH", L"TKI", L"TKJ", L"TKK", L"TKL", L"TKM", L"TKN", L"TKO", L"TKP", L"TKQ", L"TKR", L"TKS", L"TKT", L"TKU", L"TKV", L"TKW", L"TKX", L"TKY", L"TKZ", L"TLA", L"TLB", L"TLC", L"TLD", L"TLE", L"TLF", L"TLG", L"TLH", L"TLI", L"TLJ", L"TLK", L"TLL", L"TLM", L"TLN", L"TLO", L"TLP", L"TLQ", L"TLR", L"TLS", L"TLT", L"TLU", L"TLV", L"TLW", L"TLX", L"TLY", L"TLZ", L"TMA", L"TMB", L"TMC", L"TMD", L"TME", L"TMF", L"TMG", L"TMH", L"TMI", L"TMJ", L"TMK", L"TML", L"TMM", L"TMN", L"TMO", L"TMP", L"TMQ", L"TMR", L"TMS", L"TMT", L"TMU", L"TMV", L"TMW", L"TMX", L"TMY", L"TMZ", L"TNA", L"TNB", L"TNC", L"TND", L"TNE", L"TNF", L"TNG", L"TNH", L"TNI", L"TNJ", L"TNK", L"TNL", L"TNM", L"TNN", L"TNO", L"TNP", L"TNQ", L"TNR", L"TNS", L"TNT", L"TNU", L"TNV", L"TNW", L"TNX", L"TNY", L"TNZ", L"TOA", L"TOB", L"TOC", L"TOD", L"TOE", L"TOF", L"TOG", L"TOH", L"TOI", L"TOJ", L"TOK", L"TOL", L"TOM", L"TON", L"TOO", L"TOP", L"TOQ", L"TOR", L"TOS", L"TOT", L"TOU", L"TOV", L"TOW", L"TOX", L"TOY", L"TOZ", L"TPA", L"TPB", L"TPC", L"TPD", L"TPE", L"TPF", L"TPG", L"TPH", L"TPI", L"TPJ", L"TPK", L"TPL", L"TPM", L"TPN", L"TPO", L"TPP", L"TPQ", L"TPR", L"TPS", L"TPT", L"TPU", L"TPV", L"TPW", L"TPX", L"TPY", L"TPZ", - L"TQA", L"TQB", L"TQC", L"TQD", L"TQE", L"TQF", L"TQG", L"TQH", L"TQI", L"TQJ", L"TQK", L"TQL", L"TQM", L"TQN", L"TQO", L"TQP", L"TQQ", L"TQR", L"TQS", L"TQT", L"TQU", L"TQV", L"TQW", L"TQX", L"TQY", L"TQZ", L"TRA", L"TRB", L"TRC", L"TRD", L"TRE", L"TRF", L"TRG", L"TRH", L"TRI", L"TRJ", L"TRK", L"TRL", L"TRM", L"TRN", L"TRO", L"TRP", L"TRQ", L"TRR", L"TRS", L"TRT", L"TRU", L"TRV", L"TRW", L"TRX", L"TRY", L"TRZ", L"TSA", L"TSB", L"TSC", L"TSD", L"TSE", L"TSF", L"TSG", L"TSH", L"TSI", L"TSJ", L"TSK", L"TSL", L"TSM", L"TSN", L"TSO", L"TSP", L"TSQ", L"TSR", L"TSS", L"TST", L"TSU", L"TSV", L"TSW", L"TSX", L"TSY", L"TSZ", L"TTA", L"TTB", L"TTC", L"TTD", L"TTE", L"TTF", L"TTG", L"TTH", L"TTI", L"TTJ", L"TTK", L"TTL", L"TTM", L"TTN", L"TTO", L"TTP", L"TTQ", L"TTR", L"TTS", L"TTT", L"TTU", L"TTV", L"TTW", L"TTX", L"TTY", L"TTZ", L"TUA", L"TUB", L"TUC", L"TUD", L"TUE", L"TUF", L"TUG", L"TUH", L"TUI", L"TUJ", L"TUK", L"TUL", L"TUM", L"TUN", L"TUO", L"TUP", L"TUQ", L"TUR", L"TUS", L"TUT", L"TUU", L"TUV", L"TUW", L"TUX", L"TUY", L"TUZ", L"TVA", L"TVB", L"TVC", L"TVD", L"TVE", L"TVF", L"TVG", L"TVH", L"TVI", L"TVJ", L"TVK", L"TVL", L"TVM", L"TVN", L"TVO", L"TVP", L"TVQ", L"TVR", L"TVS", L"TVT", L"TVU", L"TVV", L"TVW", L"TVX", L"TVY", L"TVZ", L"TWA", L"TWB", L"TWC", L"TWD", L"TWE", L"TWF", L"TWG", L"TWH", L"TWI", L"TWJ", L"TWK", L"TWL", L"TWM", L"TWN", L"TWO", L"TWP", L"TWQ", L"TWR", L"TWS", L"TWT", L"TWU", L"TWV", L"TWW", L"TWX", L"TWY", L"TWZ", L"TXA", L"TXB", L"TXC", L"TXD", L"TXE", L"TXF", L"TXG", L"TXH", L"TXI", L"TXJ", L"TXK", L"TXL", L"TXM", L"TXN", L"TXO", L"TXP", L"TXQ", L"TXR", L"TXS", L"TXT", L"TXU", L"TXV", L"TXW", L"TXX", L"TXY", L"TXZ", L"TYA", L"TYB", L"TYC", L"TYD", L"TYE", L"TYF", L"TYG", L"TYH", L"TYI", L"TYJ", L"TYK", L"TYL", L"TYM", L"TYN", L"TYO", L"TYP", L"TYQ", L"TYR", L"TYS", L"TYT", L"TYU", L"TYV", L"TYW", L"TYX", L"TYY", L"TYZ", L"TZA", L"TZB", L"TZC", L"TZD", L"TZE", L"TZF", L"TZG", L"TZH", L"TZI", L"TZJ", L"TZK", L"TZL", L"TZM", L"TZN", L"TZO", L"TZP", L"TZQ", L"TZR", L"TZS", L"TZT", L"TZU", L"TZV", L"TZW", L"TZX", L"TZY", L"TZZ", L"UAA", L"UAB", L"UAC", L"UAD", L"UAE", L"UAF", L"UAG", L"UAH", L"UAI", L"UAJ", L"UAK", L"UAL", L"UAM", - L"UAN", L"UAO", L"UAP", L"UAQ", L"UAR", L"UAS", L"UAT", L"UAU", L"UAV", L"UAW", L"UAX", L"UAY", L"UAZ", L"UBA", L"UBB", L"UBC", L"UBD", L"UBE", L"UBF", L"UBG", L"UBH", L"UBI", L"UBJ", L"UBK", L"UBL", L"UBM", L"UBN", L"UBO", L"UBP", L"UBQ", L"UBR", L"UBS", L"UBT", L"UBU", L"UBV", L"UBW", L"UBX", L"UBY", L"UBZ", L"UCA", L"UCB", L"UCC", L"UCD", L"UCE", L"UCF", L"UCG", L"UCH", L"UCI", L"UCJ", L"UCK", L"UCL", L"UCM", L"UCN", L"UCO", L"UCP", L"UCQ", L"UCR", L"UCS", L"UCT", L"UCU", L"UCV", L"UCW", L"UCX", L"UCY", L"UCZ", L"UDA", L"UDB", L"UDC", L"UDD", L"UDE", L"UDF", L"UDG", L"UDH", L"UDI", L"UDJ", L"UDK", L"UDL", L"UDM", L"UDN", L"UDO", L"UDP", L"UDQ", L"UDR", L"UDS", L"UDT", L"UDU", L"UDV", L"UDW", L"UDX", L"UDY", L"UDZ", L"UEA", L"UEB", L"UEC", L"UED", L"UEE", L"UEF", L"UEG", L"UEH", L"UEI", L"UEJ", L"UEK", L"UEL", L"UEM", L"UEN", L"UEO", L"UEP", L"UEQ", L"UER", L"UES", L"UET", L"UEU", L"UEV", L"UEW", L"UEX", L"UEY", L"UEZ", L"UFA", L"UFB", L"UFC", L"UFD", L"UFE", L"UFF", L"UFG", L"UFH", L"UFI", L"UFJ", L"UFK", L"UFL", L"UFM", L"UFN", L"UFO", L"UFP", L"UFQ", L"UFR", L"UFS", L"UFT", L"UFU", L"UFV", L"UFW", L"UFX", L"UFY", L"UFZ", L"UGA", L"UGB", L"UGC", L"UGD", L"UGE", L"UGF", L"UGG", L"UGH", L"UGI", L"UGJ", L"UGK", L"UGL", L"UGM", L"UGN", L"UGO", L"UGP", L"UGQ", L"UGR", L"UGS", L"UGT", L"UGU", L"UGV", L"UGW", L"UGX", L"UGY", L"UGZ", L"UHA", L"UHB", L"UHC", L"UHD", L"UHE", L"UHF", L"UHG", L"UHH", L"UHI", L"UHJ", L"UHK", L"UHL", L"UHM", L"UHN", L"UHO", L"UHP", L"UHQ", L"UHR", L"UHS", L"UHT", L"UHU", L"UHV", L"UHW", L"UHX", L"UHY", L"UHZ", L"UIA", L"UIB", L"UIC", L"UID", L"UIE", L"UIF", L"UIG", L"UIH", L"UII", L"UIJ", L"UIK", L"UIL", L"UIM", L"UIN", L"UIO", L"UIP", L"UIQ", L"UIR", L"UIS", L"UIT", L"UIU", L"UIV", L"UIW", L"UIX", L"UIY", L"UIZ", L"UJA", L"UJB", L"UJC", L"UJD", L"UJE", L"UJF", L"UJG", L"UJH", L"UJI", L"UJJ", L"UJK", L"UJL", L"UJM", L"UJN", L"UJO", L"UJP", L"UJQ", L"UJR", L"UJS", L"UJT", L"UJU", L"UJV", L"UJW", L"UJX", L"UJY", L"UJZ", L"UKA", L"UKB", L"UKC", L"UKD", L"UKE", L"UKF", L"UKG", L"UKH", L"UKI", L"UKJ", L"UKK", L"UKL", L"UKM", L"UKN", L"UKO", L"UKP", L"UKQ", L"UKR", L"UKS", L"UKT", L"UKU", L"UKV", L"UKW", L"UKX", L"UKY", L"UKZ", - L"ULA", L"ULB", L"ULC", L"ULD", L"ULE", L"ULF", L"ULG", L"ULH", L"ULI", L"ULJ", L"ULK", L"ULL", L"ULM", L"ULN", L"ULO", L"ULP", L"ULQ", L"ULR", L"ULS", L"ULT", L"ULU", L"ULV", L"ULW", L"ULX", L"ULY", L"ULZ", L"UMA", L"UMB", L"UMC", L"UMD", L"UME", L"UMF", L"UMG", L"UMH", L"UMI", L"UMJ", L"UMK", L"UML", L"UMM", L"UMN", L"UMO", L"UMP", L"UMQ", L"UMR", L"UMS", L"UMT", L"UMU", L"UMV", L"UMW", L"UMX", L"UMY", L"UMZ", L"UNA", L"UNB", L"UNC", L"UND", L"UNE", L"UNF", L"UNG", L"UNH", L"UNI", L"UNJ", L"UNK", L"UNL", L"UNM", L"UNN", L"UNO", L"UNP", L"UNQ", L"UNR", L"UNS", L"UNT", L"UNU", L"UNV", L"UNW", L"UNX", L"UNY", L"UNZ", L"UOA", L"UOB", L"UOC", L"UOD", L"UOE", L"UOF", L"UOG", L"UOH", L"UOI", L"UOJ", L"UOK", L"UOL", L"UOM", L"UON", L"UOO", L"UOP", L"UOQ", L"UOR", L"UOS", L"UOT", L"UOU", L"UOV", L"UOW", L"UOX", L"UOY", L"UOZ", L"UPA", L"UPB", L"UPC", L"UPD", L"UPE", L"UPF", L"UPG", L"UPH", L"UPI", L"UPJ", L"UPK", L"UPL", L"UPM", L"UPN", L"UPO", L"UPP", L"UPQ", L"UPR", L"UPS", L"UPT", L"UPU", L"UPV", L"UPW", L"UPX", L"UPY", L"UPZ", L"UQA", L"UQB", L"UQC", L"UQD", L"UQE", L"UQF", L"UQG", L"UQH", L"UQI", L"UQJ", L"UQK", L"UQL", L"UQM", L"UQN", L"UQO", L"UQP", L"UQQ", L"UQR", L"UQS", L"UQT", L"UQU", L"UQV", L"UQW", L"UQX", L"UQY", L"UQZ", L"URA", L"URB", L"URC", L"URD", L"URE", L"URF", L"URG", L"URH", L"URI", L"URJ", L"URK", L"URL", L"URM", L"URN", L"URO", L"URP", L"URQ", L"URR", L"URS", L"URT", L"URU", L"URV", L"URW", L"URX", L"URY", L"URZ", L"USA", L"USB", L"USC", L"USD", L"USE", L"USF", L"USG", L"USH", L"USI", L"USJ", L"USK", L"USL", L"USM", L"USN", L"USO", L"USP", L"USQ", L"USR", L"USS", L"UST", L"USU", L"USV", L"USW", L"USX", L"USY", L"USZ", L"UTA", L"UTB", L"UTC", L"UTD", L"UTE", L"UTF", L"UTG", L"UTH", L"UTI", L"UTJ", L"UTK", L"UTL", L"UTM", L"UTN", L"UTO", L"UTP", L"UTQ", L"UTR", L"UTS", L"UTT", L"UTU", L"UTV", L"UTW", L"UTX", L"UTY", L"UTZ", L"UUA", L"UUB", L"UUC", L"UUD", L"UUE", L"UUF", L"UUG", L"UUH", L"UUI", L"UUJ", L"UUK", L"UUL", L"UUM", L"UUN", L"UUO", L"UUP", L"UUQ", L"UUR", L"UUS", L"UUT", L"UUU", L"UUV", L"UUW", L"UUX", L"UUY", L"UUZ", L"UVA", L"UVB", L"UVC", L"UVD", L"UVE", L"UVF", L"UVG", L"UVH", L"UVI", L"UVJ", L"UVK", L"UVL", L"UVM", - L"UVN", L"UVO", L"UVP", L"UVQ", L"UVR", L"UVS", L"UVT", L"UVU", L"UVV", L"UVW", L"UVX", L"UVY", L"UVZ", L"UWA", L"UWB", L"UWC", L"UWD", L"UWE", L"UWF", L"UWG", L"UWH", L"UWI", L"UWJ", L"UWK", L"UWL", L"UWM", L"UWN", L"UWO", L"UWP", L"UWQ", L"UWR", L"UWS", L"UWT", L"UWU", L"UWV", L"UWW", L"UWX", L"UWY", L"UWZ", L"UXA", L"UXB", L"UXC", L"UXD", L"UXE", L"UXF", L"UXG", L"UXH", L"UXI", L"UXJ", L"UXK", L"UXL", L"UXM", L"UXN", L"UXO", L"UXP", L"UXQ", L"UXR", L"UXS", L"UXT", L"UXU", L"UXV", L"UXW", L"UXX", L"UXY", L"UXZ", L"UYA", L"UYB", L"UYC", L"UYD", L"UYE", L"UYF", L"UYG", L"UYH", L"UYI", L"UYJ", L"UYK", L"UYL", L"UYM", L"UYN", L"UYO", L"UYP", L"UYQ", L"UYR", L"UYS", L"UYT", L"UYU", L"UYV", L"UYW", L"UYX", L"UYY", L"UYZ", L"UZA", L"UZB", L"UZC", L"UZD", L"UZE", L"UZF", L"UZG", L"UZH", L"UZI", L"UZJ", L"UZK", L"UZL", L"UZM", L"UZN", L"UZO", L"UZP", L"UZQ", L"UZR", L"UZS", L"UZT", L"UZU", L"UZV", L"UZW", L"UZX", L"UZY", L"UZZ", L"VAA", L"VAB", L"VAC", L"VAD", L"VAE", L"VAF", L"VAG", L"VAH", L"VAI", L"VAJ", L"VAK", L"VAL", L"VAM", L"VAN", L"VAO", L"VAP", L"VAQ", L"VAR", L"VAS", L"VAT", L"VAU", L"VAV", L"VAW", L"VAX", L"VAY", L"VAZ", L"VBA", L"VBB", L"VBC", L"VBD", L"VBE", L"VBF", L"VBG", L"VBH", L"VBI", L"VBJ", L"VBK", L"VBL", L"VBM", L"VBN", L"VBO", L"VBP", L"VBQ", L"VBR", L"VBS", L"VBT", L"VBU", L"VBV", L"VBW", L"VBX", L"VBY", L"VBZ", L"VCA", L"VCB", L"VCC", L"VCD", L"VCE", L"VCF", L"VCG", L"VCH", L"VCI", L"VCJ", L"VCK", L"VCL", L"VCM", L"VCN", L"VCO", L"VCP", L"VCQ", L"VCR", L"VCS", L"VCT", L"VCU", L"VCV", L"VCW", L"VCX", L"VCY", L"VCZ", L"VDA", L"VDB", L"VDC", L"VDD", L"VDE", L"VDF", L"VDG", L"VDH", L"VDI", L"VDJ", L"VDK", L"VDL", L"VDM", L"VDN", L"VDO", L"VDP", L"VDQ", L"VDR", L"VDS", L"VDT", L"VDU", L"VDV", L"VDW", L"VDX", L"VDY", L"VDZ", L"VEA", L"VEB", L"VEC", L"VED", L"VEE", L"VEF", L"VEG", L"VEH", L"VEI", L"VEJ", L"VEK", L"VEL", L"VEM", L"VEN", L"VEO", L"VEP", L"VEQ", L"VER", L"VES", L"VET", L"VEU", L"VEV", L"VEW", L"VEX", L"VEY", L"VEZ", L"VFA", L"VFB", L"VFC", L"VFD", L"VFE", L"VFF", L"VFG", L"VFH", L"VFI", L"VFJ", L"VFK", L"VFL", L"VFM", L"VFN", L"VFO", L"VFP", L"VFQ", L"VFR", L"VFS", L"VFT", L"VFU", L"VFV", L"VFW", L"VFX", L"VFY", L"VFZ", - L"VGA", L"VGB", L"VGC", L"VGD", L"VGE", L"VGF", L"VGG", L"VGH", L"VGI", L"VGJ", L"VGK", L"VGL", L"VGM", L"VGN", L"VGO", L"VGP", L"VGQ", L"VGR", L"VGS", L"VGT", L"VGU", L"VGV", L"VGW", L"VGX", L"VGY", L"VGZ", L"VHA", L"VHB", L"VHC", L"VHD", L"VHE", L"VHF", L"VHG", L"VHH", L"VHI", L"VHJ", L"VHK", L"VHL", L"VHM", L"VHN", L"VHO", L"VHP", L"VHQ", L"VHR", L"VHS", L"VHT", L"VHU", L"VHV", L"VHW", L"VHX", L"VHY", L"VHZ", L"VIA", L"VIB", L"VIC", L"VID", L"VIE", L"VIF", L"VIG", L"VIH", L"VII", L"VIJ", L"VIK", L"VIL", L"VIM", L"VIN", L"VIO", L"VIP", L"VIQ", L"VIR", L"VIS", L"VIT", L"VIU", L"VIV", L"VIW", L"VIX", L"VIY", L"VIZ", L"VJA", L"VJB", L"VJC", L"VJD", L"VJE", L"VJF", L"VJG", L"VJH", L"VJI", L"VJJ", L"VJK", L"VJL", L"VJM", L"VJN", L"VJO", L"VJP", L"VJQ", L"VJR", L"VJS", L"VJT", L"VJU", L"VJV", L"VJW", L"VJX", L"VJY", L"VJZ", L"VKA", L"VKB", L"VKC", L"VKD", L"VKE", L"VKF", L"VKG", L"VKH", L"VKI", L"VKJ", L"VKK", L"VKL", L"VKM", L"VKN", L"VKO", L"VKP", L"VKQ", L"VKR", L"VKS", L"VKT", L"VKU", L"VKV", L"VKW", L"VKX", L"VKY", L"VKZ", L"VLA", L"VLB", L"VLC", L"VLD", L"VLE", L"VLF", L"VLG", L"VLH", L"VLI", L"VLJ", L"VLK", L"VLL", L"VLM", L"VLN", L"VLO", L"VLP", L"VLQ", L"VLR", L"VLS", L"VLT", L"VLU", L"VLV", L"VLW", L"VLX", L"VLY", L"VLZ", L"VMA", L"VMB", L"VMC", L"VMD", L"VME", L"VMF", L"VMG", L"VMH", L"VMI", L"VMJ", L"VMK", L"VML", L"VMM", L"VMN", L"VMO", L"VMP", L"VMQ", L"VMR", L"VMS", L"VMT", L"VMU", L"VMV", L"VMW", L"VMX", L"VMY", L"VMZ", L"VNA", L"VNB", L"VNC", L"VND", L"VNE", L"VNF", L"VNG", L"VNH", L"VNI", L"VNJ", L"VNK", L"VNL", L"VNM", L"VNN", L"VNO", L"VNP", L"VNQ", L"VNR", L"VNS", L"VNT", L"VNU", L"VNV", L"VNW", L"VNX", L"VNY", L"VNZ", L"VOA", L"VOB", L"VOC", L"VOD", L"VOE", L"VOF", L"VOG", L"VOH", L"VOI", L"VOJ", L"VOK", L"VOL", L"VOM", L"VON", L"VOO", L"VOP", L"VOQ", L"VOR", L"VOS", L"VOT", L"VOU", L"VOV", L"VOW", L"VOX", L"VOY", L"VOZ", L"VPA", L"VPB", L"VPC", L"VPD", L"VPE", L"VPF", L"VPG", L"VPH", L"VPI", L"VPJ", L"VPK", L"VPL", L"VPM", L"VPN", L"VPO", L"VPP", L"VPQ", L"VPR", L"VPS", L"VPT", L"VPU", L"VPV", L"VPW", L"VPX", L"VPY", L"VPZ", L"VQA", L"VQB", L"VQC", L"VQD", L"VQE", L"VQF", L"VQG", L"VQH", L"VQI", L"VQJ", L"VQK", L"VQL", L"VQM", - L"VQN", L"VQO", L"VQP", L"VQQ", L"VQR", L"VQS", L"VQT", L"VQU", L"VQV", L"VQW", L"VQX", L"VQY", L"VQZ", L"VRA", L"VRB", L"VRC", L"VRD", L"VRE", L"VRF", L"VRG", L"VRH", L"VRI", L"VRJ", L"VRK", L"VRL", L"VRM", L"VRN", L"VRO", L"VRP", L"VRQ", L"VRR", L"VRS", L"VRT", L"VRU", L"VRV", L"VRW", L"VRX", L"VRY", L"VRZ", L"VSA", L"VSB", L"VSC", L"VSD", L"VSE", L"VSF", L"VSG", L"VSH", L"VSI", L"VSJ", L"VSK", L"VSL", L"VSM", L"VSN", L"VSO", L"VSP", L"VSQ", L"VSR", L"VSS", L"VST", L"VSU", L"VSV", L"VSW", L"VSX", L"VSY", L"VSZ", L"VTA", L"VTB", L"VTC", L"VTD", L"VTE", L"VTF", L"VTG", L"VTH", L"VTI", L"VTJ", L"VTK", L"VTL", L"VTM", L"VTN", L"VTO", L"VTP", L"VTQ", L"VTR", L"VTS", L"VTT", L"VTU", L"VTV", L"VTW", L"VTX", L"VTY", L"VTZ", L"VUA", L"VUB", L"VUC", L"VUD", L"VUE", L"VUF", L"VUG", L"VUH", L"VUI", L"VUJ", L"VUK", L"VUL", L"VUM", L"VUN", L"VUO", L"VUP", L"VUQ", L"VUR", L"VUS", L"VUT", L"VUU", L"VUV", L"VUW", L"VUX", L"VUY", L"VUZ", L"VVA", L"VVB", L"VVC", L"VVD", L"VVE", L"VVF", L"VVG", L"VVH", L"VVI", L"VVJ", L"VVK", L"VVL", L"VVM", L"VVN", L"VVO", L"VVP", L"VVQ", L"VVR", L"VVS", L"VVT", L"VVU", L"VVV", L"VVW", L"VVX", L"VVY", L"VVZ", L"VWA", L"VWB", L"VWC", L"VWD", L"VWE", L"VWF", L"VWG", L"VWH", L"VWI", L"VWJ", L"VWK", L"VWL", L"VWM", L"VWN", L"VWO", L"VWP", L"VWQ", L"VWR", L"VWS", L"VWT", L"VWU", L"VWV", L"VWW", L"VWX", L"VWY", L"VWZ", L"VXA", L"VXB", L"VXC", L"VXD", L"VXE", L"VXF", L"VXG", L"VXH", L"VXI", L"VXJ", L"VXK", L"VXL", L"VXM", L"VXN", L"VXO", L"VXP", L"VXQ", L"VXR", L"VXS", L"VXT", L"VXU", L"VXV", L"VXW", L"VXX", L"VXY", L"VXZ", L"VYA", L"VYB", L"VYC", L"VYD", L"VYE", L"VYF", L"VYG", L"VYH", L"VYI", L"VYJ", L"VYK", L"VYL", L"VYM", L"VYN", L"VYO", L"VYP", L"VYQ", L"VYR", L"VYS", L"VYT", L"VYU", L"VYV", L"VYW", L"VYX", L"VYY", L"VYZ", L"VZA", L"VZB", L"VZC", L"VZD", L"VZE", L"VZF", L"VZG", L"VZH", L"VZI", L"VZJ", L"VZK", L"VZL", L"VZM", L"VZN", L"VZO", L"VZP", L"VZQ", L"VZR", L"VZS", L"VZT", L"VZU", L"VZV", L"VZW", L"VZX", L"VZY", L"VZZ", L"WAA", L"WAB", L"WAC", L"WAD", L"WAE", L"WAF", L"WAG", L"WAH", L"WAI", L"WAJ", L"WAK", L"WAL", L"WAM", L"WAN", L"WAO", L"WAP", L"WAQ", L"WAR", L"WAS", L"WAT", L"WAU", L"WAV", L"WAW", L"WAX", L"WAY", L"WAZ", - L"WBA", L"WBB", L"WBC", L"WBD", L"WBE", L"WBF", L"WBG", L"WBH", L"WBI", L"WBJ", L"WBK", L"WBL", L"WBM", L"WBN", L"WBO", L"WBP", L"WBQ", L"WBR", L"WBS", L"WBT", L"WBU", L"WBV", L"WBW", L"WBX", L"WBY", L"WBZ", L"WCA", L"WCB", L"WCC", L"WCD", L"WCE", L"WCF", L"WCG", L"WCH", L"WCI", L"WCJ", L"WCK", L"WCL", L"WCM", L"WCN", L"WCO", L"WCP", L"WCQ", L"WCR", L"WCS", L"WCT", L"WCU", L"WCV", L"WCW", L"WCX", L"WCY", L"WCZ", L"WDA", L"WDB", L"WDC", L"WDD", L"WDE", L"WDF", L"WDG", L"WDH", L"WDI", L"WDJ", L"WDK", L"WDL", L"WDM", L"WDN", L"WDO", L"WDP", L"WDQ", L"WDR", L"WDS", L"WDT", L"WDU", L"WDV", L"WDW", L"WDX", L"WDY", L"WDZ", L"WEA", L"WEB", L"WEC", L"WED", L"WEE", L"WEF", L"WEG", L"WEH", L"WEI", L"WEJ", L"WEK", L"WEL", L"WEM", L"WEN", L"WEO", L"WEP", L"WEQ", L"WER", L"WES", L"WET", L"WEU", L"WEV", L"WEW", L"WEX", L"WEY", L"WEZ", L"WFA", L"WFB", L"WFC", L"WFD", L"WFE", L"WFF", L"WFG", L"WFH", L"WFI", L"WFJ", L"WFK", L"WFL", L"WFM", L"WFN", L"WFO", L"WFP", L"WFQ", L"WFR", L"WFS", L"WFT", L"WFU", L"WFV", L"WFW", L"WFX", L"WFY", L"WFZ", L"WGA", L"WGB", L"WGC", L"WGD", L"WGE", L"WGF", L"WGG", L"WGH", L"WGI", L"WGJ", L"WGK", L"WGL", L"WGM", L"WGN", L"WGO", L"WGP", L"WGQ", L"WGR", L"WGS", L"WGT", L"WGU", L"WGV", L"WGW", L"WGX", L"WGY", L"WGZ", L"WHA", L"WHB", L"WHC", L"WHD", L"WHE", L"WHF", L"WHG", L"WHH", L"WHI", L"WHJ", L"WHK", L"WHL", L"WHM", L"WHN", L"WHO", L"WHP", L"WHQ", L"WHR", L"WHS", L"WHT", L"WHU", L"WHV", L"WHW", L"WHX", L"WHY", L"WHZ", L"WIA", L"WIB", L"WIC", L"WID", L"WIE", L"WIF", L"WIG", L"WIH", L"WII", L"WIJ", L"WIK", L"WIL", L"WIM", L"WIN", L"WIO", L"WIP", L"WIQ", L"WIR", L"WIS", L"WIT", L"WIU", L"WIV", L"WIW", L"WIX", L"WIY", L"WIZ", L"WJA", L"WJB", L"WJC", L"WJD", L"WJE", L"WJF", L"WJG", L"WJH", L"WJI", L"WJJ", L"WJK", L"WJL", L"WJM", L"WJN", L"WJO", L"WJP", L"WJQ", L"WJR", L"WJS", L"WJT", L"WJU", L"WJV", L"WJW", L"WJX", L"WJY", L"WJZ", L"WKA", L"WKB", L"WKC", L"WKD", L"WKE", L"WKF", L"WKG", L"WKH", L"WKI", L"WKJ", L"WKK", L"WKL", L"WKM", L"WKN", L"WKO", L"WKP", L"WKQ", L"WKR", L"WKS", L"WKT", L"WKU", L"WKV", L"WKW", L"WKX", L"WKY", L"WKZ", L"WLA", L"WLB", L"WLC", L"WLD", L"WLE", L"WLF", L"WLG", L"WLH", L"WLI", L"WLJ", L"WLK", L"WLL", L"WLM", - L"WLN", L"WLO", L"WLP", L"WLQ", L"WLR", L"WLS", L"WLT", L"WLU", L"WLV", L"WLW", L"WLX", L"WLY", L"WLZ", L"WMA", L"WMB", L"WMC", L"WMD", L"WME", L"WMF", L"WMG", L"WMH", L"WMI", L"WMJ", L"WMK", L"WML", L"WMM", L"WMN", L"WMO", L"WMP", L"WMQ", L"WMR", L"WMS", L"WMT", L"WMU", L"WMV", L"WMW", L"WMX", L"WMY", L"WMZ", L"WNA", L"WNB", L"WNC", L"WND", L"WNE", L"WNF", L"WNG", L"WNH", L"WNI", L"WNJ", L"WNK", L"WNL", L"WNM", L"WNN", L"WNO", L"WNP", L"WNQ", L"WNR", L"WNS", L"WNT", L"WNU", L"WNV", L"WNW", L"WNX", L"WNY", L"WNZ", L"WOA", L"WOB", L"WOC", L"WOD", L"WOE", L"WOF", L"WOG", L"WOH", L"WOI", L"WOJ", L"WOK", L"WOL", L"WOM", L"WON", L"WOO", L"WOP", L"WOQ", L"WOR", L"WOS", L"WOT", L"WOU", L"WOV", L"WOW", L"WOX", L"WOY", L"WOZ", L"WPA", L"WPB", L"WPC", L"WPD", L"WPE", L"WPF", L"WPG", L"WPH", L"WPI", L"WPJ", L"WPK", L"WPL", L"WPM", L"WPN", L"WPO", L"WPP", L"WPQ", L"WPR", L"WPS", L"WPT", L"WPU", L"WPV", L"WPW", L"WPX", L"WPY", L"WPZ", L"WQA", L"WQB", L"WQC", L"WQD", L"WQE", L"WQF", L"WQG", L"WQH", L"WQI", L"WQJ", L"WQK", L"WQL", L"WQM", L"WQN", L"WQO", L"WQP", L"WQQ", L"WQR", L"WQS", L"WQT", L"WQU", L"WQV", L"WQW", L"WQX", L"WQY", L"WQZ", L"WRA", L"WRB", L"WRC", L"WRD", L"WRE", L"WRF", L"WRG", L"WRH", L"WRI", L"WRJ", L"WRK", L"WRL", L"WRM", L"WRN", L"WRO", L"WRP", L"WRQ", L"WRR", L"WRS", L"WRT", L"WRU", L"WRV", L"WRW", L"WRX", L"WRY", L"WRZ", L"WSA", L"WSB", L"WSC", L"WSD", L"WSE", L"WSF", L"WSG", L"WSH", L"WSI", L"WSJ", L"WSK", L"WSL", L"WSM", L"WSN", L"WSO", L"WSP", L"WSQ", L"WSR", L"WSS", L"WST", L"WSU", L"WSV", L"WSW", L"WSX", L"WSY", L"WSZ", L"WTA", L"WTB", L"WTC", L"WTD", L"WTE", L"WTF", L"WTG", L"WTH", L"WTI", L"WTJ", L"WTK", L"WTL", L"WTM", L"WTN", L"WTO", L"WTP", L"WTQ", L"WTR", L"WTS", L"WTT", L"WTU", L"WTV", L"WTW", L"WTX", L"WTY", L"WTZ", L"WUA", L"WUB", L"WUC", L"WUD", L"WUE", L"WUF", L"WUG", L"WUH", L"WUI", L"WUJ", L"WUK", L"WUL", L"WUM", L"WUN", L"WUO", L"WUP", L"WUQ", L"WUR", L"WUS", L"WUT", L"WUU", L"WUV", L"WUW", L"WUX", L"WUY", L"WUZ", L"WVA", L"WVB", L"WVC", L"WVD", L"WVE", L"WVF", L"WVG", L"WVH", L"WVI", L"WVJ", L"WVK", L"WVL", L"WVM", L"WVN", L"WVO", L"WVP", L"WVQ", L"WVR", L"WVS", L"WVT", L"WVU", L"WVV", L"WVW", L"WVX", L"WVY", L"WVZ", + L"TQA", L"TQB", L"TQC", L"TQD", L"TQE", L"TQF", L"TQG", L"TQH", L"TQI", L"TQJ", L"TQK", L"TQL", L"TQM", L"TQN", L"TQO", L"TQP", L"TQQ", L"TQR", L"TQS", L"TQT", L"TQU", L"TQV", L"TQW", L"TQX", L"TQY", L"TQZ", L"TRA", L"TRB", L"TRC", L"TRD", L"TRE", L"TRF", L"TRG", L"TRH", L"TRI", L"TRJ", L"TRK", L"TRL", L"TRM", L"TRN", L"TRO", L"TRP", L"TRQ", L"TRR", L"TRS", L"TRT", L"TRU", L"TRV", L"TRW", L"TRX", L"TRY", L"TRZ", L"TSA", L"TSB", L"TSC", L"TSD", L"TSE", L"TSF", L"TSG", L"TSH", L"TSI", L"TSJ", L"TSK", L"TSL", L"TSM", L"TSN", L"TSO", L"TSP", L"TSQ", L"TSR", L"TSS", L"TST", L"TSU", L"TSV", L"TSW", L"TSX", L"TSY", L"TSZ", L"TTA", L"TTB", L"TTC", L"TTD", L"TTE", L"TTF", L"TTG", L"TTH", L"TTI", L"TTJ", L"TTK", L"TTL", L"TTM", L"TTN", L"TTO", L"TTP", L"TTQ", L"TTR", L"TTS", L"TTT", L"TTU", L"TTV", L"TTW", L"TTX", L"TTY", L"TTZ", L"TUA", L"TUB", L"TUC", L"TUD", L"TUE", L"TUF", L"TUG", L"TUH", L"TUI", L"TUJ", L"TUK", L"TUL", L"TUM", L"TUN", L"TUO", L"TUP", L"TUQ", L"TUR", L"TUS", L"TUT", L"TUU", L"TUV", L"TUW", L"TUX", L"TUY", L"TUZ", L"TVA", L"TVB", L"TVC", L"TVD", L"TVE", L"TVF", L"TVG", L"TVH", L"TVI", L"TVJ", L"TVK", L"TVL", L"TVM", L"TVN", L"TVO", L"TVP", L"TVQ", L"TVR", L"TVS", L"TVT", L"TVU", L"TVV", L"TVW", L"TVX", L"TVY", L"TVZ", L"TWA", L"TWB", L"TWC", L"TWD", L"TWE", L"TWF", L"TWG", L"TWH", L"TWI", L"TWJ", L"TWK", L"TWL", L"TWM", L"TWN", L"TWO", L"TWP", L"TWQ", L"TWR", L"TWS", L"TWT", L"TWU", L"TWV", L"TWW", L"TWX", L"TWY", L"TWZ", L"TXA", L"TXB", L"TXC", L"TXD", L"TXE", L"TXF", L"TXG", L"TXH", L"TXI", L"TXJ", L"TXK", L"TXL", L"TXM", L"TXN", L"TXO", L"TXP", L"TXQ", L"TXR", L"TXS", L"TXT", L"TXU", L"TXV", L"TXW", L"TXX", L"TXY", L"TXZ", L"TYA", L"TYB", L"TYC", L"TYD", L"TYE", L"TYF", L"TYG", L"TYH", L"TYI", L"TYJ", L"TYK", L"TYL", L"TYM", L"TYN", L"TYO", L"TYP", L"TYQ", L"TYR", L"TYS", L"TYT", L"TYU", L"TYV", L"TYW", L"TYX", L"TYY", L"TYZ", L"TZA", L"TZB", L"TZC", L"TZD", L"TZE", L"TZF", L"TZG", L"TZH", L"TZI", L"TZJ", L"TZK", L"TZL", L"TZM", L"TZN", L"TZO", L"TZP", L"TZQ", L"TZR", L"TZS", L"TZT", L"TZU", L"TZV", L"TZW", L"TZX", L"TZY", L"TZZ", L"UAA", L"UAB", L"UAC", L"UAD", L"UAE", L"UAF", L"UAG", L"UAH", L"UAI", L"UAJ", L"UAK", L"UAL", L"UAM", + L"UAN", L"UAO", L"UAP", L"UAQ", L"UAR", L"UAS", L"UAT", L"UAU", L"UAV", L"UAW", L"UAX", L"UAY", L"UAZ", L"UBA", L"UBB", L"UBC", L"UBD", L"UBE", L"UBF", L"UBG", L"UBH", L"UBI", L"UBJ", L"UBK", L"UBL", L"UBM", L"UBN", L"UBO", L"UBP", L"UBQ", L"UBR", L"UBS", L"UBT", L"UBU", L"UBV", L"UBW", L"UBX", L"UBY", L"UBZ", L"UCA", L"UCB", L"UCC", L"UCD", L"UCE", L"UCF", L"UCG", L"UCH", L"UCI", L"UCJ", L"UCK", L"UCL", L"UCM", L"UCN", L"UCO", L"UCP", L"UCQ", L"UCR", L"UCS", L"UCT", L"UCU", L"UCV", L"UCW", L"UCX", L"UCY", L"UCZ", L"UDA", L"UDB", L"UDC", L"UDD", L"UDE", L"UDF", L"UDG", L"UDH", L"UDI", L"UDJ", L"UDK", L"UDL", L"UDM", L"UDN", L"UDO", L"UDP", L"UDQ", L"UDR", L"UDS", L"UDT", L"UDU", L"UDV", L"UDW", L"UDX", L"UDY", L"UDZ", L"UEA", L"UEB", L"UEC", L"UED", L"UEE", L"UEF", L"UEG", L"UEH", L"UEI", L"UEJ", L"UEK", L"UEL", L"UEM", L"UEN", L"UEO", L"UEP", L"UEQ", L"UER", L"UES", L"UET", L"UEU", L"UEV", L"UEW", L"UEX", L"UEY", L"UEZ", L"UFA", L"UFB", L"UFC", L"UFD", L"UFE", L"UFF", L"UFG", L"UFH", L"UFI", L"UFJ", L"UFK", L"UFL", L"UFM", L"UFN", L"UFO", L"UFP", L"UFQ", L"UFR", L"UFS", L"UFT", L"UFU", L"UFV", L"UFW", L"UFX", L"UFY", L"UFZ", L"UGA", L"UGB", L"UGC", L"UGD", L"UGE", L"UGF", L"UGG", L"UGH", L"UGI", L"UGJ", L"UGK", L"UGL", L"UGM", L"UGN", L"UGO", L"UGP", L"UGQ", L"UGR", L"UGS", L"UGT", L"UGU", L"UGV", L"UGW", L"UGX", L"UGY", L"UGZ", L"UHA", L"UHB", L"UHC", L"UHD", L"UHE", L"UHF", L"UHG", L"UHH", L"UHI", L"UHJ", L"UHK", L"UHL", L"UHM", L"UHN", L"UHO", L"UHP", L"UHQ", L"UHR", L"UHS", L"UHT", L"UHU", L"UHV", L"UHW", L"UHX", L"UHY", L"UHZ", L"UIA", L"UIB", L"UIC", L"UID", L"UIE", L"UIF", L"UIG", L"UIH", L"UII", L"UIJ", L"UIK", L"UIL", L"UIM", L"UIN", L"UIO", L"UIP", L"UIQ", L"UIR", L"UIS", L"UIT", L"UIU", L"UIV", L"UIW", L"UIX", L"UIY", L"UIZ", L"UJA", L"UJB", L"UJC", L"UJD", L"UJE", L"UJF", L"UJG", L"UJH", L"UJI", L"UJJ", L"UJK", L"UJL", L"UJM", L"UJN", L"UJO", L"UJP", L"UJQ", L"UJR", L"UJS", L"UJT", L"UJU", L"UJV", L"UJW", L"UJX", L"UJY", L"UJZ", L"UKA", L"UKB", L"UKC", L"UKD", L"UKE", L"UKF", L"UKG", L"UKH", L"UKI", L"UKJ", L"UKK", L"UKL", L"UKM", L"UKN", L"UKO", L"UKP", L"UKQ", L"UKR", L"UKS", L"UKT", L"UKU", L"UKV", L"UKW", L"UKX", L"UKY", L"UKZ", + L"ULA", L"ULB", L"ULC", L"ULD", L"ULE", L"ULF", L"ULG", L"ULH", L"ULI", L"ULJ", L"ULK", L"ULL", L"ULM", L"ULN", L"ULO", L"ULP", L"ULQ", L"ULR", L"ULS", L"ULT", L"ULU", L"ULV", L"ULW", L"ULX", L"ULY", L"ULZ", L"UMA", L"UMB", L"UMC", L"UMD", L"UME", L"UMF", L"UMG", L"UMH", L"UMI", L"UMJ", L"UMK", L"UML", L"UMM", L"UMN", L"UMO", L"UMP", L"UMQ", L"UMR", L"UMS", L"UMT", L"UMU", L"UMV", L"UMW", L"UMX", L"UMY", L"UMZ", L"UNA", L"UNB", L"UNC", L"UND", L"UNE", L"UNF", L"UNG", L"UNH", L"UNI", L"UNJ", L"UNK", L"UNL", L"UNM", L"UNN", L"UNO", L"UNP", L"UNQ", L"UNR", L"UNS", L"UNT", L"UNU", L"UNV", L"UNW", L"UNX", L"UNY", L"UNZ", L"UOA", L"UOB", L"UOC", L"UOD", L"UOE", L"UOF", L"UOG", L"UOH", L"UOI", L"UOJ", L"UOK", L"UOL", L"UOM", L"UON", L"UOO", L"UOP", L"UOQ", L"UOR", L"UOS", L"UOT", L"UOU", L"UOV", L"UOW", L"UOX", L"UOY", L"UOZ", L"UPA", L"UPB", L"UPC", L"UPD", L"UPE", L"UPF", L"UPG", L"UPH", L"UPI", L"UPJ", L"UPK", L"UPL", L"UPM", L"UPN", L"UPO", L"UPP", L"UPQ", L"UPR", L"UPS", L"UPT", L"UPU", L"UPV", L"UPW", L"UPX", L"UPY", L"UPZ", L"UQA", L"UQB", L"UQC", L"UQD", L"UQE", L"UQF", L"UQG", L"UQH", L"UQI", L"UQJ", L"UQK", L"UQL", L"UQM", L"UQN", L"UQO", L"UQP", L"UQQ", L"UQR", L"UQS", L"UQT", L"UQU", L"UQV", L"UQW", L"UQX", L"UQY", L"UQZ", L"URA", L"URB", L"URC", L"URD", L"URE", L"URF", L"URG", L"URH", L"URI", L"URJ", L"URK", L"URL", L"URM", L"URN", L"URO", L"URP", L"URQ", L"URR", L"URS", L"URT", L"URU", L"URV", L"URW", L"URX", L"URY", L"URZ", L"USA", L"USB", L"USC", L"USD", L"USE", L"USF", L"USG", L"USH", L"USI", L"USJ", L"USK", L"USL", L"USM", L"USN", L"USO", L"USP", L"USQ", L"USR", L"USS", L"UST", L"USU", L"USV", L"USW", L"USX", L"USY", L"USZ", L"UTA", L"UTB", L"UTC", L"UTD", L"UTE", L"UTF", L"UTG", L"UTH", L"UTI", L"UTJ", L"UTK", L"UTL", L"UTM", L"UTN", L"UTO", L"UTP", L"UTQ", L"UTR", L"UTS", L"UTT", L"UTU", L"UTV", L"UTW", L"UTX", L"UTY", L"UTZ", L"UUA", L"UUB", L"UUC", L"UUD", L"UUE", L"UUF", L"UUG", L"UUH", L"UUI", L"UUJ", L"UUK", L"UUL", L"UUM", L"UUN", L"UUO", L"UUP", L"UUQ", L"UUR", L"UUS", L"UUT", L"UUU", L"UUV", L"UUW", L"UUX", L"UUY", L"UUZ", L"UVA", L"UVB", L"UVC", L"UVD", L"UVE", L"UVF", L"UVG", L"UVH", L"UVI", L"UVJ", L"UVK", L"UVL", L"UVM", + L"UVN", L"UVO", L"UVP", L"UVQ", L"UVR", L"UVS", L"UVT", L"UVU", L"UVV", L"UVW", L"UVX", L"UVY", L"UVZ", L"UWA", L"UWB", L"UWC", L"UWD", L"UWE", L"UWF", L"UWG", L"UWH", L"UWI", L"UWJ", L"UWK", L"UWL", L"UWM", L"UWN", L"UWO", L"UWP", L"UWQ", L"UWR", L"UWS", L"UWT", L"UWU", L"UWV", L"UWW", L"UWX", L"UWY", L"UWZ", L"UXA", L"UXB", L"UXC", L"UXD", L"UXE", L"UXF", L"UXG", L"UXH", L"UXI", L"UXJ", L"UXK", L"UXL", L"UXM", L"UXN", L"UXO", L"UXP", L"UXQ", L"UXR", L"UXS", L"UXT", L"UXU", L"UXV", L"UXW", L"UXX", L"UXY", L"UXZ", L"UYA", L"UYB", L"UYC", L"UYD", L"UYE", L"UYF", L"UYG", L"UYH", L"UYI", L"UYJ", L"UYK", L"UYL", L"UYM", L"UYN", L"UYO", L"UYP", L"UYQ", L"UYR", L"UYS", L"UYT", L"UYU", L"UYV", L"UYW", L"UYX", L"UYY", L"UYZ", L"UZA", L"UZB", L"UZC", L"UZD", L"UZE", L"UZF", L"UZG", L"UZH", L"UZI", L"UZJ", L"UZK", L"UZL", L"UZM", L"UZN", L"UZO", L"UZP", L"UZQ", L"UZR", L"UZS", L"UZT", L"UZU", L"UZV", L"UZW", L"UZX", L"UZY", L"UZZ", L"VAA", L"VAB", L"VAC", L"VAD", L"VAE", L"VAF", L"VAG", L"VAH", L"VAI", L"VAJ", L"VAK", L"VAL", L"VAM", L"VAN", L"VAO", L"VAP", L"VAQ", L"VAR", L"VAS", L"VAT", L"VAU", L"VAV", L"VAW", L"VAX", L"VAY", L"VAZ", L"VBA", L"VBB", L"VBC", L"VBD", L"VBE", L"VBF", L"VBG", L"VBH", L"VBI", L"VBJ", L"VBK", L"VBL", L"VBM", L"VBN", L"VBO", L"VBP", L"VBQ", L"VBR", L"VBS", L"VBT", L"VBU", L"VBV", L"VBW", L"VBX", L"VBY", L"VBZ", L"VCA", L"VCB", L"VCC", L"VCD", L"VCE", L"VCF", L"VCG", L"VCH", L"VCI", L"VCJ", L"VCK", L"VCL", L"VCM", L"VCN", L"VCO", L"VCP", L"VCQ", L"VCR", L"VCS", L"VCT", L"VCU", L"VCV", L"VCW", L"VCX", L"VCY", L"VCZ", L"VDA", L"VDB", L"VDC", L"VDD", L"VDE", L"VDF", L"VDG", L"VDH", L"VDI", L"VDJ", L"VDK", L"VDL", L"VDM", L"VDN", L"VDO", L"VDP", L"VDQ", L"VDR", L"VDS", L"VDT", L"VDU", L"VDV", L"VDW", L"VDX", L"VDY", L"VDZ", L"VEA", L"VEB", L"VEC", L"VED", L"VEE", L"VEF", L"VEG", L"VEH", L"VEI", L"VEJ", L"VEK", L"VEL", L"VEM", L"VEN", L"VEO", L"VEP", L"VEQ", L"VER", L"VES", L"VET", L"VEU", L"VEV", L"VEW", L"VEX", L"VEY", L"VEZ", L"VFA", L"VFB", L"VFC", L"VFD", L"VFE", L"VFF", L"VFG", L"VFH", L"VFI", L"VFJ", L"VFK", L"VFL", L"VFM", L"VFN", L"VFO", L"VFP", L"VFQ", L"VFR", L"VFS", L"VFT", L"VFU", L"VFV", L"VFW", L"VFX", L"VFY", L"VFZ", + L"VGA", L"VGB", L"VGC", L"VGD", L"VGE", L"VGF", L"VGG", L"VGH", L"VGI", L"VGJ", L"VGK", L"VGL", L"VGM", L"VGN", L"VGO", L"VGP", L"VGQ", L"VGR", L"VGS", L"VGT", L"VGU", L"VGV", L"VGW", L"VGX", L"VGY", L"VGZ", L"VHA", L"VHB", L"VHC", L"VHD", L"VHE", L"VHF", L"VHG", L"VHH", L"VHI", L"VHJ", L"VHK", L"VHL", L"VHM", L"VHN", L"VHO", L"VHP", L"VHQ", L"VHR", L"VHS", L"VHT", L"VHU", L"VHV", L"VHW", L"VHX", L"VHY", L"VHZ", L"VIA", L"VIB", L"VIC", L"VID", L"VIE", L"VIF", L"VIG", L"VIH", L"VII", L"VIJ", L"VIK", L"VIL", L"VIM", L"VIN", L"VIO", L"VIP", L"VIQ", L"VIR", L"VIS", L"VIT", L"VIU", L"VIV", L"VIW", L"VIX", L"VIY", L"VIZ", L"VJA", L"VJB", L"VJC", L"VJD", L"VJE", L"VJF", L"VJG", L"VJH", L"VJI", L"VJJ", L"VJK", L"VJL", L"VJM", L"VJN", L"VJO", L"VJP", L"VJQ", L"VJR", L"VJS", L"VJT", L"VJU", L"VJV", L"VJW", L"VJX", L"VJY", L"VJZ", L"VKA", L"VKB", L"VKC", L"VKD", L"VKE", L"VKF", L"VKG", L"VKH", L"VKI", L"VKJ", L"VKK", L"VKL", L"VKM", L"VKN", L"VKO", L"VKP", L"VKQ", L"VKR", L"VKS", L"VKT", L"VKU", L"VKV", L"VKW", L"VKX", L"VKY", L"VKZ", L"VLA", L"VLB", L"VLC", L"VLD", L"VLE", L"VLF", L"VLG", L"VLH", L"VLI", L"VLJ", L"VLK", L"VLL", L"VLM", L"VLN", L"VLO", L"VLP", L"VLQ", L"VLR", L"VLS", L"VLT", L"VLU", L"VLV", L"VLW", L"VLX", L"VLY", L"VLZ", L"VMA", L"VMB", L"VMC", L"VMD", L"VME", L"VMF", L"VMG", L"VMH", L"VMI", L"VMJ", L"VMK", L"VML", L"VMM", L"VMN", L"VMO", L"VMP", L"VMQ", L"VMR", L"VMS", L"VMT", L"VMU", L"VMV", L"VMW", L"VMX", L"VMY", L"VMZ", L"VNA", L"VNB", L"VNC", L"VND", L"VNE", L"VNF", L"VNG", L"VNH", L"VNI", L"VNJ", L"VNK", L"VNL", L"VNM", L"VNN", L"VNO", L"VNP", L"VNQ", L"VNR", L"VNS", L"VNT", L"VNU", L"VNV", L"VNW", L"VNX", L"VNY", L"VNZ", L"VOA", L"VOB", L"VOC", L"VOD", L"VOE", L"VOF", L"VOG", L"VOH", L"VOI", L"VOJ", L"VOK", L"VOL", L"VOM", L"VON", L"VOO", L"VOP", L"VOQ", L"VOR", L"VOS", L"VOT", L"VOU", L"VOV", L"VOW", L"VOX", L"VOY", L"VOZ", L"VPA", L"VPB", L"VPC", L"VPD", L"VPE", L"VPF", L"VPG", L"VPH", L"VPI", L"VPJ", L"VPK", L"VPL", L"VPM", L"VPN", L"VPO", L"VPP", L"VPQ", L"VPR", L"VPS", L"VPT", L"VPU", L"VPV", L"VPW", L"VPX", L"VPY", L"VPZ", L"VQA", L"VQB", L"VQC", L"VQD", L"VQE", L"VQF", L"VQG", L"VQH", L"VQI", L"VQJ", L"VQK", L"VQL", L"VQM", + L"VQN", L"VQO", L"VQP", L"VQQ", L"VQR", L"VQS", L"VQT", L"VQU", L"VQV", L"VQW", L"VQX", L"VQY", L"VQZ", L"VRA", L"VRB", L"VRC", L"VRD", L"VRE", L"VRF", L"VRG", L"VRH", L"VRI", L"VRJ", L"VRK", L"VRL", L"VRM", L"VRN", L"VRO", L"VRP", L"VRQ", L"VRR", L"VRS", L"VRT", L"VRU", L"VRV", L"VRW", L"VRX", L"VRY", L"VRZ", L"VSA", L"VSB", L"VSC", L"VSD", L"VSE", L"VSF", L"VSG", L"VSH", L"VSI", L"VSJ", L"VSK", L"VSL", L"VSM", L"VSN", L"VSO", L"VSP", L"VSQ", L"VSR", L"VSS", L"VST", L"VSU", L"VSV", L"VSW", L"VSX", L"VSY", L"VSZ", L"VTA", L"VTB", L"VTC", L"VTD", L"VTE", L"VTF", L"VTG", L"VTH", L"VTI", L"VTJ", L"VTK", L"VTL", L"VTM", L"VTN", L"VTO", L"VTP", L"VTQ", L"VTR", L"VTS", L"VTT", L"VTU", L"VTV", L"VTW", L"VTX", L"VTY", L"VTZ", L"VUA", L"VUB", L"VUC", L"VUD", L"VUE", L"VUF", L"VUG", L"VUH", L"VUI", L"VUJ", L"VUK", L"VUL", L"VUM", L"VUN", L"VUO", L"VUP", L"VUQ", L"VUR", L"VUS", L"VUT", L"VUU", L"VUV", L"VUW", L"VUX", L"VUY", L"VUZ", L"VVA", L"VVB", L"VVC", L"VVD", L"VVE", L"VVF", L"VVG", L"VVH", L"VVI", L"VVJ", L"VVK", L"VVL", L"VVM", L"VVN", L"VVO", L"VVP", L"VVQ", L"VVR", L"VVS", L"VVT", L"VVU", L"VVV", L"VVW", L"VVX", L"VVY", L"VVZ", L"VWA", L"VWB", L"VWC", L"VWD", L"VWE", L"VWF", L"VWG", L"VWH", L"VWI", L"VWJ", L"VWK", L"VWL", L"VWM", L"VWN", L"VWO", L"VWP", L"VWQ", L"VWR", L"VWS", L"VWT", L"VWU", L"VWV", L"VWW", L"VWX", L"VWY", L"VWZ", L"VXA", L"VXB", L"VXC", L"VXD", L"VXE", L"VXF", L"VXG", L"VXH", L"VXI", L"VXJ", L"VXK", L"VXL", L"VXM", L"VXN", L"VXO", L"VXP", L"VXQ", L"VXR", L"VXS", L"VXT", L"VXU", L"VXV", L"VXW", L"VXX", L"VXY", L"VXZ", L"VYA", L"VYB", L"VYC", L"VYD", L"VYE", L"VYF", L"VYG", L"VYH", L"VYI", L"VYJ", L"VYK", L"VYL", L"VYM", L"VYN", L"VYO", L"VYP", L"VYQ", L"VYR", L"VYS", L"VYT", L"VYU", L"VYV", L"VYW", L"VYX", L"VYY", L"VYZ", L"VZA", L"VZB", L"VZC", L"VZD", L"VZE", L"VZF", L"VZG", L"VZH", L"VZI", L"VZJ", L"VZK", L"VZL", L"VZM", L"VZN", L"VZO", L"VZP", L"VZQ", L"VZR", L"VZS", L"VZT", L"VZU", L"VZV", L"VZW", L"VZX", L"VZY", L"VZZ", L"WAA", L"WAB", L"WAC", L"WAD", L"WAE", L"WAF", L"WAG", L"WAH", L"WAI", L"WAJ", L"WAK", L"WAL", L"WAM", L"WAN", L"WAO", L"WAP", L"WAQ", L"WAR", L"WAS", L"WAT", L"WAU", L"WAV", L"WAW", L"WAX", L"WAY", L"WAZ", + L"WBA", L"WBB", L"WBC", L"WBD", L"WBE", L"WBF", L"WBG", L"WBH", L"WBI", L"WBJ", L"WBK", L"WBL", L"WBM", L"WBN", L"WBO", L"WBP", L"WBQ", L"WBR", L"WBS", L"WBT", L"WBU", L"WBV", L"WBW", L"WBX", L"WBY", L"WBZ", L"WCA", L"WCB", L"WCC", L"WCD", L"WCE", L"WCF", L"WCG", L"WCH", L"WCI", L"WCJ", L"WCK", L"WCL", L"WCM", L"WCN", L"WCO", L"WCP", L"WCQ", L"WCR", L"WCS", L"WCT", L"WCU", L"WCV", L"WCW", L"WCX", L"WCY", L"WCZ", L"WDA", L"WDB", L"WDC", L"WDD", L"WDE", L"WDF", L"WDG", L"WDH", L"WDI", L"WDJ", L"WDK", L"WDL", L"WDM", L"WDN", L"WDO", L"WDP", L"WDQ", L"WDR", L"WDS", L"WDT", L"WDU", L"WDV", L"WDW", L"WDX", L"WDY", L"WDZ", L"WEA", L"WEB", L"WEC", L"WED", L"WEE", L"WEF", L"WEG", L"WEH", L"WEI", L"WEJ", L"WEK", L"WEL", L"WEM", L"WEN", L"WEO", L"WEP", L"WEQ", L"WER", L"WES", L"WET", L"WEU", L"WEV", L"WEW", L"WEX", L"WEY", L"WEZ", L"WFA", L"WFB", L"WFC", L"WFD", L"WFE", L"WFF", L"WFG", L"WFH", L"WFI", L"WFJ", L"WFK", L"WFL", L"WFM", L"WFN", L"WFO", L"WFP", L"WFQ", L"WFR", L"WFS", L"WFT", L"WFU", L"WFV", L"WFW", L"WFX", L"WFY", L"WFZ", L"WGA", L"WGB", L"WGC", L"WGD", L"WGE", L"WGF", L"WGG", L"WGH", L"WGI", L"WGJ", L"WGK", L"WGL", L"WGM", L"WGN", L"WGO", L"WGP", L"WGQ", L"WGR", L"WGS", L"WGT", L"WGU", L"WGV", L"WGW", L"WGX", L"WGY", L"WGZ", L"WHA", L"WHB", L"WHC", L"WHD", L"WHE", L"WHF", L"WHG", L"WHH", L"WHI", L"WHJ", L"WHK", L"WHL", L"WHM", L"WHN", L"WHO", L"WHP", L"WHQ", L"WHR", L"WHS", L"WHT", L"WHU", L"WHV", L"WHW", L"WHX", L"WHY", L"WHZ", L"WIA", L"WIB", L"WIC", L"WID", L"WIE", L"WIF", L"WIG", L"WIH", L"WII", L"WIJ", L"WIK", L"WIL", L"WIM", L"WIN", L"WIO", L"WIP", L"WIQ", L"WIR", L"WIS", L"WIT", L"WIU", L"WIV", L"WIW", L"WIX", L"WIY", L"WIZ", L"WJA", L"WJB", L"WJC", L"WJD", L"WJE", L"WJF", L"WJG", L"WJH", L"WJI", L"WJJ", L"WJK", L"WJL", L"WJM", L"WJN", L"WJO", L"WJP", L"WJQ", L"WJR", L"WJS", L"WJT", L"WJU", L"WJV", L"WJW", L"WJX", L"WJY", L"WJZ", L"WKA", L"WKB", L"WKC", L"WKD", L"WKE", L"WKF", L"WKG", L"WKH", L"WKI", L"WKJ", L"WKK", L"WKL", L"WKM", L"WKN", L"WKO", L"WKP", L"WKQ", L"WKR", L"WKS", L"WKT", L"WKU", L"WKV", L"WKW", L"WKX", L"WKY", L"WKZ", L"WLA", L"WLB", L"WLC", L"WLD", L"WLE", L"WLF", L"WLG", L"WLH", L"WLI", L"WLJ", L"WLK", L"WLL", L"WLM", + L"WLN", L"WLO", L"WLP", L"WLQ", L"WLR", L"WLS", L"WLT", L"WLU", L"WLV", L"WLW", L"WLX", L"WLY", L"WLZ", L"WMA", L"WMB", L"WMC", L"WMD", L"WME", L"WMF", L"WMG", L"WMH", L"WMI", L"WMJ", L"WMK", L"WML", L"WMM", L"WMN", L"WMO", L"WMP", L"WMQ", L"WMR", L"WMS", L"WMT", L"WMU", L"WMV", L"WMW", L"WMX", L"WMY", L"WMZ", L"WNA", L"WNB", L"WNC", L"WND", L"WNE", L"WNF", L"WNG", L"WNH", L"WNI", L"WNJ", L"WNK", L"WNL", L"WNM", L"WNN", L"WNO", L"WNP", L"WNQ", L"WNR", L"WNS", L"WNT", L"WNU", L"WNV", L"WNW", L"WNX", L"WNY", L"WNZ", L"WOA", L"WOB", L"WOC", L"WOD", L"WOE", L"WOF", L"WOG", L"WOH", L"WOI", L"WOJ", L"WOK", L"WOL", L"WOM", L"WON", L"WOO", L"WOP", L"WOQ", L"WOR", L"WOS", L"WOT", L"WOU", L"WOV", L"WOW", L"WOX", L"WOY", L"WOZ", L"WPA", L"WPB", L"WPC", L"WPD", L"WPE", L"WPF", L"WPG", L"WPH", L"WPI", L"WPJ", L"WPK", L"WPL", L"WPM", L"WPN", L"WPO", L"WPP", L"WPQ", L"WPR", L"WPS", L"WPT", L"WPU", L"WPV", L"WPW", L"WPX", L"WPY", L"WPZ", L"WQA", L"WQB", L"WQC", L"WQD", L"WQE", L"WQF", L"WQG", L"WQH", L"WQI", L"WQJ", L"WQK", L"WQL", L"WQM", L"WQN", L"WQO", L"WQP", L"WQQ", L"WQR", L"WQS", L"WQT", L"WQU", L"WQV", L"WQW", L"WQX", L"WQY", L"WQZ", L"WRA", L"WRB", L"WRC", L"WRD", L"WRE", L"WRF", L"WRG", L"WRH", L"WRI", L"WRJ", L"WRK", L"WRL", L"WRM", L"WRN", L"WRO", L"WRP", L"WRQ", L"WRR", L"WRS", L"WRT", L"WRU", L"WRV", L"WRW", L"WRX", L"WRY", L"WRZ", L"WSA", L"WSB", L"WSC", L"WSD", L"WSE", L"WSF", L"WSG", L"WSH", L"WSI", L"WSJ", L"WSK", L"WSL", L"WSM", L"WSN", L"WSO", L"WSP", L"WSQ", L"WSR", L"WSS", L"WST", L"WSU", L"WSV", L"WSW", L"WSX", L"WSY", L"WSZ", L"WTA", L"WTB", L"WTC", L"WTD", L"WTE", L"WTF", L"WTG", L"WTH", L"WTI", L"WTJ", L"WTK", L"WTL", L"WTM", L"WTN", L"WTO", L"WTP", L"WTQ", L"WTR", L"WTS", L"WTT", L"WTU", L"WTV", L"WTW", L"WTX", L"WTY", L"WTZ", L"WUA", L"WUB", L"WUC", L"WUD", L"WUE", L"WUF", L"WUG", L"WUH", L"WUI", L"WUJ", L"WUK", L"WUL", L"WUM", L"WUN", L"WUO", L"WUP", L"WUQ", L"WUR", L"WUS", L"WUT", L"WUU", L"WUV", L"WUW", L"WUX", L"WUY", L"WUZ", L"WVA", L"WVB", L"WVC", L"WVD", L"WVE", L"WVF", L"WVG", L"WVH", L"WVI", L"WVJ", L"WVK", L"WVL", L"WVM", L"WVN", L"WVO", L"WVP", L"WVQ", L"WVR", L"WVS", L"WVT", L"WVU", L"WVV", L"WVW", L"WVX", L"WVY", L"WVZ", L"WWA", L"WWB", L"WWC", L"WWD", L"WWE", L"WWF", L"WWG", L"WWH", L"WWI", L"WWJ", L"WWK", L"WWL", L"WWM", L"WWN", L"WWO", L"WWP", L"WWQ", L"WWR", L"WWS", L"WWT", L"WWU", L"WWV", L"WWW", L"WWX", L"WWY", L"WWZ", L"WXA", L"WXB", L"WXC", L"WXD", L"WXE", L"WXF", L"WXG", L"WXH", L"WXI", L"WXJ", L"WXK", L"WXL", L"WXM", L"WXN", L"WXO", L"WXP", L"WXQ", L"WXR", L"WXS", L"WXT", L"WXU", L"WXV", L"WXW", L"WXX", L"WXY", L"WXZ", L"WYA", L"WYB", L"WYC", L"WYD", L"WYE", L"WYF", L"WYG", L"WYH", L"WYI", L"WYJ", L"WYK", L"WYL", L"WYM", L"WYN", L"WYO", L"WYP", L"WYQ", L"WYR", L"WYS", L"WYT", L"WYU", L"WYV", L"WYW", L"WYX", L"WYY", L"WYZ", L"WZA", L"WZB", L"WZC", L"WZD", L"WZE", L"WZF", L"WZG", L"WZH", L"WZI", L"WZJ", L"WZK", L"WZL", L"WZM", L"WZN", L"WZO", L"WZP", L"WZQ", L"WZR", L"WZS", L"WZT", L"WZU", L"WZV", L"WZW", L"WZX", L"WZY", L"WZZ", L"XAA", L"XAB", L"XAC", L"XAD", L"XAE", L"XAF", L"XAG", L"XAH", L"XAI", L"XAJ", L"XAK", L"XAL", L"XAM", L"XAN", L"XAO", L"XAP", L"XAQ", L"XAR", L"XAS", L"XAT", L"XAU", L"XAV", L"XAW", L"XAX", L"XAY", L"XAZ", L"XBA", L"XBB", L"XBC", L"XBD", L"XBE", L"XBF", L"XBG", L"XBH", L"XBI", L"XBJ", L"XBK", L"XBL", L"XBM", L"XBN", L"XBO", L"XBP", L"XBQ", L"XBR", L"XBS", L"XBT", L"XBU", L"XBV", L"XBW", L"XBX", L"XBY", L"XBZ", L"XCA", L"XCB", L"XCC", L"XCD", L"XCE", L"XCF", L"XCG", L"XCH", L"XCI", L"XCJ", L"XCK", L"XCL", L"XCM", L"XCN", L"XCO", L"XCP", L"XCQ", L"XCR", L"XCS", L"XCT", L"XCU", L"XCV", L"XCW", L"XCX", L"XCY", L"XCZ", L"XDA", L"XDB", L"XDC", L"XDD", L"XDE", L"XDF", L"XDG", L"XDH", L"XDI", L"XDJ", L"XDK", L"XDL", L"XDM", L"XDN", L"XDO", L"XDP", L"XDQ", L"XDR", L"XDS", L"XDT", L"XDU", L"XDV", L"XDW", L"XDX", L"XDY", L"XDZ", L"XEA", L"XEB", L"XEC", L"XED", L"XEE", L"XEF", L"XEG", L"XEH", L"XEI", L"XEJ", L"XEK", L"XEL", L"XEM", L"XEN", L"XEO", L"XEP", L"XEQ", L"XER", L"XES", L"XET", L"XEU", L"XEV", L"XEW", L"XEX", L"XEY", L"XEZ", L"XFA", L"XFB", L"XFC", L"XFD" }; //------------------------------------------------------------------------------ @@ -191,7 +191,7 @@ namespace OOX { boost::wregex r(L"([\\d]+)-([\\d]+)-([\\d]+)(?:T([\\d]+):([\\d]+):([\\d]+)(?:\\.([\\d]+))?)?"); boost::match_results res; - + if (boost::regex_match(Date, res, r)) { Value = 0; @@ -243,7 +243,7 @@ namespace OOX const boost::uint64_t m1 = t.total_milliseconds(); const boost::uint64_t m2 = day.total_milliseconds(); - Value += 1.0 * m1 / m2; + Value += 1.0 * m1 / m2; } return true; @@ -1021,7 +1021,7 @@ namespace OOX auto formula = dynamic_cast(obj.get()); m_sText = formula->formula.getAssembledFormula(); m_oRef.Init(); - m_oRef = formula->rfx.toString(); + m_oRef = formula->rfx.toString(); } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeArray: @@ -1288,7 +1288,7 @@ namespace OOX { CData data_comment; data_comment.fromXML2(oReader); - + pComment->m_oText = data_comment.m_oRichText.GetPointerEmptyNullable(); } } @@ -1297,9 +1297,9 @@ namespace OOX { CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); if (!xlsx_flat) return; - + CWorksheet* sheet = xlsx_flat->m_arWorksheets.back(); - + std::map>::iterator pFindRow = sheet->m_oSheetData->m_mapStyleMerges2003.find(xlsx_flat->m_nLastReadRow); std::map::iterator pFind; @@ -1309,8 +1309,8 @@ namespace OOX } else { - int newCol = *iColIndex; - + int newCol = *iColIndex; + if (pFindRow != sheet->m_oSheetData->m_mapStyleMerges2003.end()) { CCell *pCurrentCell = sheet->m_oSheetData->m_arrItems.back()->m_arrItems.back(); // == this @@ -1438,7 +1438,7 @@ namespace OOX { std::map mapColsStyle; mapColsStyle.insert(std::make_pair(xlsx_flat->m_nLastReadCol, *m_oStyle)); - + sheet->m_oSheetData->m_mapStyleMerges2003.insert(std::make_pair(xlsx_flat->m_nLastReadRow + i + 1, mapColsStyle)); } else @@ -1450,13 +1450,13 @@ namespace OOX for (int i = 0; i < iAcross.get_value_or(0); ++i) { xlsx_flat->m_nLastReadCol++; - + CCell *pCell = new CCell(this->m_pMainDocument); pCell->m_oRef = getCellAddressA(xlsx_flat->m_nLastReadRow, xlsx_flat->m_nLastReadCol); pCell->m_oStyle = pFindContinues->first; pCell->m_oCol = xlsx_flat->m_nLastReadCol - 1; pCell->m_oRow = xlsx_flat->m_nLastReadRow; - + sheet->m_oSheetData->m_arrItems.back()->m_arrItems.push_back(pCell); } } @@ -1482,10 +1482,10 @@ namespace OOX void CCell::AfterRead() { CSharedStrings *pSharedStrings = NULL; - + CXlsx* xlsx = dynamic_cast(m_pMainDocument); CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); - + if (xlsx) { if (false == xlsx->m_arWorksheets.back()->m_bPrepareForBinaryWriter) return; @@ -1676,9 +1676,49 @@ namespace OOX oStream.Seek(nEnd); } + XLS::BaseObjectPtr CCell::toBin() + { + /* std::vector shared_formulas_locations_ref; + auto ptr(new XLSB::CELL(m_oRow.get(), shared_formulas_locations_ref)); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCellMetadata.IsInit() || m_oValueMetadata.IsInit()) + { + auto pCellMeta(new XLSB::CELLMETA); + ptr->m_CELLMETA = XLS::BaseObjectPtr{pCellMeta}; + if(m_oCellMetadata.IsInit()) + { + auto metadata(new XLSB::CellMeta); + pCellMeta->m_BrtCellMeta = XLS::BaseObjectPtr{metadata}; + metadata->icmb = m_oCellMetadata->GetValue(); + } + + if(m_oValueMetadata.IsInit()) + { + auto metadata(new XLSB::ValueMeta); + pCellMeta->m_BrtValueMeta = XLS::BaseObjectPtr{metadata}; + metadata->ivmb = m_oValueMetadata->GetValue(); + } + } + if(!m_oFormula.IsInit()) + { + auto sourcePtr(new XLSB::DATACELL); + ptr->m_source = XLS::BaseObjectPtr{sourcePtr}; + sourcePtr->m_Col = m_oCol.get(); + auto cellBase(new XLSB::CellBase); + sourcePtr->m_source = XLS::BaseObjectPtr{cellBase}; + XLSB::Cell oCell; + if(m_oShowPhonetic.IsInit()) + oCell.fPhShow = m_oShowPhonetic->GetValue(); + if(oCell.iStyleRef) + oCell.iStyleRef = m_oStyle.get(); + cellBase->cell = oCell; + }*/ + XLS::BaseObjectPtr objectPtr; + return objectPtr; + } void CCell::fromBin(XLS::BaseObjectPtr& obj) { - ReadAttributes(obj); + ReadAttributes(obj); } void CCell::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { @@ -1698,7 +1738,7 @@ namespace OOX WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:Index", iColIndex ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:MergeAcross", iAcross ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:MergeDown", iDown ) - WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:ArrayRange", sArrayRange ) + WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:ArrayRange", sArrayRange ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:StyleID", sStyleId ) WritingElement_ReadAttributes_Read_else_ifChar ( oReader, "ss:HRef", sHyperlink ) @@ -1757,7 +1797,7 @@ namespace OOX BiffRecord* pSource = nullptr; XLSB::Cell oCell; if(pDATACELL != nullptr) - { + { m_oCol = pDATACELL->m_Col; pSource = static_cast(pDATACELL->m_source.get()); if(pSource != nullptr) @@ -1777,7 +1817,7 @@ namespace OOX } else if(pFMLACELL != nullptr) { - m_oCol = pFMLACELL->m_Col; + m_oCol = pFMLACELL->m_Col; pSource = static_cast(pFMLACELL->m_source.get()); if(pSource != nullptr) oCell = dynamic_cast(pSource)->cell; @@ -1905,7 +1945,7 @@ namespace OOX } } } - } + } } EElementType CCell::getType () const { @@ -2263,7 +2303,7 @@ namespace OOX if (xlsx_flat) { CWorksheet* sheet = xlsx_flat->m_arWorksheets.back(); - + std::map>::iterator pFind = sheet->m_oSheetData->m_mapStyleMerges2003.find(xlsx_flat->m_nLastReadRow); if (pFind != sheet->m_oSheetData->m_mapStyleMerges2003.end()) @@ -2296,6 +2336,69 @@ namespace OOX m_arrItems.push_back(pCell); }*/ } + XLS::BaseObjectPtr CRow::toBin() + { + std::vector shared_formulas_locations_ref; + auto ptr(new XLSB::Parenthesis_CELLTABLE(shared_formulas_locations_ref)); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto it = m_arrItems.begin(); it != m_arrItems.end();) + { + ptr->m_arCELL.push_back((*it)->toBin()); + it = m_arrItems.erase(it); + } + + if(m_oCollapsed.IsInit() || m_oCustomFormat.IsInit() || m_oCustomHeight.IsInit() || m_oHidden.IsInit() || m_oHt.IsInit() + || m_oOutlineLevel.IsInit() || m_oPh.IsInit() || m_oR.IsInit() || m_oS.IsInit() || m_oThickBot.IsInit() || m_oThickTop.IsInit()) + { + auto hdrPtr(new XLSB::RowHdr); + ptr->m_BrtRowHdr = XLS::BaseObjectPtr{hdrPtr}; + + if(m_oCollapsed.IsInit()) + hdrPtr->fCollapsed = m_oCollapsed->GetValue(); + + if(m_oCustomFormat.IsInit()) + hdrPtr->fGhostDirty = m_oCustomFormat->GetValue(); + + if(m_oCustomHeight.IsInit()) + hdrPtr->fUnsynced = m_oCustomHeight->GetValue(); + + if(m_oHidden.IsInit()) + hdrPtr->fDyZero = m_oHidden->GetValue(); + + if(m_oHt.IsInit()) + hdrPtr->miyRw = m_oHt->GetValue() * 20.; + + if(m_oOutlineLevel.IsInit()) + hdrPtr->iOutLevel = m_oOutlineLevel->GetValue(); + + if(m_oPh.IsInit()) + hdrPtr->fPhonetic = m_oPh->GetValue(); + + if(m_oR.IsInit()) + hdrPtr->rw = m_oR->GetValue() - 1; + + if(m_oS.IsInit()) + hdrPtr->ixfe_val = m_oS->GetValue(); + + if(m_oThickBot.IsInit()) + hdrPtr->fExDes = m_oThickBot->GetValue(); + + if(m_oThickTop.IsInit()) + hdrPtr->fExAsc = m_oThickTop->GetValue(); + } + + if(m_oDyDescent.IsInit()) + { + auto ptrAccel(new XLSB::ACCELLTABLE); + ptr->m_ACCELLTABLE = XLS::BaseObjectPtr{ptrAccel}; + auto ptrdescent(new XLSB::RwDescent); + ptrAccel->m_BrtRwDescent = XLS::BaseObjectPtr{ptrdescent}; + ptrdescent->dyDescent = m_oDyDescent->GetValue(); + } + + return objectPtr; + } void CRow::fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType) { LONG nEnd = oStream.XlsbReadRecordLength() + oStream.GetPos(); @@ -2397,18 +2500,18 @@ namespace OOX { CRow *pCurrentRow = sheet->m_oSheetData->m_arrItems.back(); // == this sheet->m_oSheetData->m_arrItems.pop_back(); - + while (xlsx_flat->m_nLastReadRow < newRow) { xlsx_flat->m_nLastReadRow++; - + CRow *pRow = new CRow(m_pMainDocument); pRow->m_oR = xlsx_flat->m_nLastReadRow; sheet->m_oSheetData->m_arrItems.push_back(pRow); std::map>::iterator pFind = sheet->m_oSheetData->m_mapStyleMerges2003.find(xlsx_flat->m_nLastReadRow); - + if (pFind != sheet->m_oSheetData->m_mapStyleMerges2003.end()) { sheet->m_oSheetData->StyleFromMapStyleMerges2003(pFind->second); @@ -2417,7 +2520,7 @@ namespace OOX } sheet->m_oSheetData->m_arrItems.push_back(pCurrentRow); pCurrentRow = NULL; - } + } xlsx_flat->m_nLastReadRow = newRow; } xlsx_flat->m_nLastReadCol = -1; @@ -2450,7 +2553,7 @@ namespace OOX { m_oHt.Init(); m_oHt->SetValue(atof(oReader.GetTextChar())); - + m_oCustomHeight.Init(); m_oCustomHeight->SetValue(SimpleTypes::onoffTrue); } @@ -2602,7 +2705,7 @@ namespace OOX return; CXlsx* xlsx = dynamic_cast(m_pMainDocument); CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); - + if(xlsx) { xlsx->m_nLastReadRow = 0; @@ -2671,11 +2774,11 @@ namespace OOX pWorksheet->m_oCols.Init(); } - pWorksheet->m_oCols->m_arrItems.push_back(pColumn); + pWorksheet->m_oCols->m_arrItems.push_back(pColumn); pColumn->m_oMin.Init(); pColumn->m_oMin->SetValue(pWorksheet->m_oCols->m_arrItems.size()); - + pColumn->m_oMax.Init(); pColumn->m_oMax->SetValue(pWorksheet->m_oCols->m_arrItems.size()); } @@ -2687,7 +2790,7 @@ namespace OOX { CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); if (!xlsx_flat) return; - + CWorksheet* pWorksheet = xlsx_flat->m_arWorksheets.back(); pWorksheet->m_oSheetFormatPr.Init(); @@ -2848,6 +2951,19 @@ namespace OOX m_arrItems.push_back(pRow); }*/ } + XLS::BaseObjectPtr CSheetData::toBin() + { + auto ptr(new XLSB::CELLTABLE); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto it = m_arrItems.begin(); it != m_arrItems.end();) + { + ptr->m_arParenthesis_CELLTABLE.push_back((*it)->toBin()); + it = m_arrItems.erase(it); + } + + return objectPtr; + } EElementType CSheetData::getType () const { return et_x_SheetData; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 5bf61bfa7f..45f0edb0bc 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -216,6 +216,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType, _UINT32 nRow); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -237,7 +238,7 @@ namespace OOX void ReadComment(XmlUtils::CXmlLiteReader& oReader, CCommentItem* pComment); void AfterRead(); - //----------- 2003 + //----------- 2003 void After2003Read(); nullable pCommentItem; @@ -260,7 +261,7 @@ namespace OOX nullable m_oFormula; nullable m_oRichText; nullable m_oValue; -//----------------------------- +//----------------------------- nullable_string m_oCacheValue; }; @@ -282,8 +283,9 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromXMLToXLSB(XmlUtils::CXmlLiteReader& oReader, NSBinPptxRW::CXlsbBinaryWriter& oStream, CCellXLSB& oCell); void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType); - void toXLSB (NSBinPptxRW::CXlsbBinaryWriter& oStream) const; + void toXLSB (NSBinPptxRW::CXlsbBinaryWriter& oStream) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -325,11 +327,12 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType, CSVWriter* pCSVWriter, NSFile::CStreamWriter& oStreamWriter); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; - + nullable m_oXlsbPos; - + std::map> m_mapStyleMerges2003; // map(row, map(col, style)) void StyleFromMapStyleMerges2003(std::map &mapStyleMerges); void AfterRead(); From 7aa61809a6a6c19d693ccf1f112c839bc52c6d3b Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Mon, 7 Aug 2023 22:33:23 +0600 Subject: [PATCH 047/221] corrected conversion --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 12 ++++++++++++ X2tConverter/src/ASCConverters.cpp | 1 + 2 files changed, 13 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index d45534798e..5215be725d 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1924,16 +1924,28 @@ namespace OOX if(m_oOddHeader.IsInit()) castedBegin->stHeader = m_oOddHeader->m_sText; + else + castedBegin->stHeader = false; if(m_oOddFooter.IsInit()) castedBegin->stFooter = m_oOddFooter->m_sText; + else + castedBegin->stFooter = false; if(m_oEvenHeader.IsInit()) castedBegin->stHeaderEven = m_oEvenHeader->m_sText; + else + castedBegin->stHeaderEven = false; if(m_oEvenFooter.IsInit()) castedBegin->stFooterEven = m_oEvenFooter->m_sText; + else + castedBegin->stFooterEven = false; if(m_oFirstHeader.IsInit()) castedBegin->stHeaderFirst = m_oFirstHeader->m_sText; + else + castedBegin->stHeaderFirst = false; if(m_oFirstFooter.IsInit()) castedBegin->stFooterFirst = m_oFirstFooter->m_sText; + else + castedBegin->stFooterFirst = false; return objectPtr; } EElementType CHeaderFooter::getType() const diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index e4996a4d3e..50964955d7 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1156,6 +1156,7 @@ namespace NExtractTools const OOX::CPath oox_path(sFrom); OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.m_bWriteToXlsb = true; oXlsb.Read(oox_path); OOX::CContentTypes oContentTypes; From 1f79847c78b1ddd9846d5240989b377c2b5f153d Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Mon, 7 Aug 2023 22:35:15 +0600 Subject: [PATCH 048/221] added xlsb type changing --- OOXML/XlsxFormat/Workbook/Workbook.cpp | 7 +++++++ OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 077845f7fd..56f9386539 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -487,6 +487,13 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"> } const OOX::FileType CWorkbook::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::FileType(L"xl", L"workbook.bin", + L"application/vnd.ms-excel.sheet.binary.macroEnabled.main", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); + } if (m_bMacroEnabled) return OOX::Spreadsheet::FileTypes::WorkbookMacro; else return OOX::Spreadsheet::FileTypes::Workbook; } diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index edffbe2b46..5db748e55f 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -823,6 +823,14 @@ mc:Ignorable=\"x14ac\">"); } const OOX::FileType CWorksheet::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::FileType(L"worksheets", L"sheet.bin", + L"application/vnd.ms-excel.worksheet", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", + L"worksheets/sheet", true); + } return m_bIsChartSheet?OOX::Spreadsheet::FileTypes::Chartsheets:OOX::Spreadsheet::FileTypes::Worksheet; } const CPath CWorksheet::DefaultDirectory() const From fd81de66bfb8769ff035fda1bb98baa92ff21c33 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Tue, 8 Aug 2023 13:55:00 +0600 Subject: [PATCH 049/221] corrected file types --- OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h | 2 +- OOXML/XlsxFormat/Workbook/Workbook.cpp | 6 +++--- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h b/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h index e6e53f35b3..d2a3471bc4 100644 --- a/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h +++ b/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h @@ -31,7 +31,7 @@ */ #pragma once -#include "../DocxFormat/FileType.h" +#include "../../DocxFormat/FileType.h" namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 56f9386539..d98296dce7 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -49,6 +49,8 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -490,9 +492,7 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"> CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - return OOX::FileType(L"xl", L"workbook.bin", - L"application/vnd.ms-excel.sheet.binary.macroEnabled.main", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); + return OOX::SpreadsheetBin::FileTypes::WorkbookBin; } if (m_bMacroEnabled) return OOX::Spreadsheet::FileTypes::WorkbookMacro; else return OOX::Spreadsheet::FileTypes::Workbook; diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 5db748e55f..221a81170d 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -49,6 +49,8 @@ #include "../../XlsbFormat/Biff12_unions/HLINKS.h" #include "../../XlsbFormat/Biff12_unions/MERGECELLS.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -826,10 +828,7 @@ mc:Ignorable=\"x14ac\">"); CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - return OOX::FileType(L"worksheets", L"sheet.bin", - L"application/vnd.ms-excel.worksheet", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet", - L"worksheets/sheet", true); + return OOX::SpreadsheetBin::FileTypes::WorksheetBin; } return m_bIsChartSheet?OOX::Spreadsheet::FileTypes::Chartsheets:OOX::Spreadsheet::FileTypes::Worksheet; } From f7ecbf8ddbcf726e8802366304286e80c280c876 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Thu, 10 Aug 2023 15:42:33 +0600 Subject: [PATCH 050/221] added Ccell conversion --- OOXML/XlsbFormat/Xlsb.cpp | 14 +- OOXML/XlsxFormat/Workbook/Workbook.cpp | 3 + OOXML/XlsxFormat/Worksheets/SheetData.cpp | 260 ++++++++++++++++++++-- 3 files changed, 256 insertions(+), 21 deletions(-) diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 442a9dcdef..4da4dba54d 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -62,12 +62,12 @@ using namespace XLS; OOX::Spreadsheet::CXlsb::~CXlsb() { -} +} void OOX::Spreadsheet::CXlsb::init() { workbook_code_page = XLS::WorkbookStreamObject::DefaultCodePage; xls_global_info = boost::shared_ptr(new XLS::GlobalWorkbookInfo(workbook_code_page, nullptr)); - xls_global_info->Version = 0x0800; + xls_global_info->Version = 0x0800; m_binaryReader = boost::shared_ptr(new NSBinPptxRW::CBinaryFileReader); m_binaryWriter = boost::shared_ptr(new NSBinPptxRW::CXlsbBinaryWriter); m_bWriteToXlsx = false; @@ -101,6 +101,8 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oDirPath, OOX::CContentTypes return false; m_bWriteToXlsb = true; + PrepareWorkbook(); + IFileContainer::Write(oDirPath / L"", OOX::CPath(_T("")), oContentTypes); oContentTypes.Write(oDirPath); @@ -114,7 +116,7 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oFilePath, XLS::BaseObject* XLS::StreamCacheWriterPtr writer(new XLS::BinaryStreamCacheWriter(m_binaryWriter, xls_global_info)); XLS::BinWriterProcessor proc(writer, objStream); proc.mandatory(*objStream); - + m_binaryWriter->WriteFile(m_binaryWriter->GetBuffer(), (static_cast(m_binaryWriter.get()))->GetPosition()); m_binaryWriter->CloseFile(); @@ -181,7 +183,7 @@ void OOX::Spreadsheet::CXlsb::ReadSheetData() if(dataFindPair != m_mapSheetNameSheetData.end()) dataPosition = dataFindPair->second; - else + else continue; NSFile::CFileBinary oFile; @@ -286,10 +288,10 @@ void OOX::Spreadsheet::CXlsb::PrepareTableFormula() for(size_t i = 0, length = oTableColumns->m_arrItems.size(); i < length; ++i) { - auto& oTableColumn = oTableColumns->m_arrItems[i]; + auto& oTableColumn = oTableColumns->m_arrItems[i]; if(oTableColumn->m_oCalculatedColumnFormula.IsInit()) - { + { lambdaFormula(oTableColumn->m_oCalculatedColumnFormula.get()); } if(oTableColumn->m_oTotalsRowFormula.IsInit()) diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index d98296dce7..e5a038513d 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -317,6 +317,9 @@ namespace OOX { auto ptr(new XLSB::FileVersion); ptr->stAppName = m_oAppName.get(); + ptr->stLastEdited = L""; + ptr->stLowestEdited = L""; + ptr->stRupBuild = L""; workBookStream->m_BrtFileVersion = XLS::BaseObjectPtr{ptr}; } diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index e533ec0d15..0db738f9ed 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1678,8 +1678,12 @@ namespace OOX } XLS::BaseObjectPtr CCell::toBin() { - /* std::vector shared_formulas_locations_ref; - auto ptr(new XLSB::CELL(m_oRow.get(), shared_formulas_locations_ref)); + std::vector shared_formulas_locations_ref; + auto ptr(new XLSB::CELL(0, shared_formulas_locations_ref)); + if(m_oRow.IsInit()) + { + ptr->m_Row = m_oRow.get(); + } XLS::BaseObjectPtr objectPtr(ptr); if(m_oCellMetadata.IsInit() || m_oValueMetadata.IsInit()) { @@ -1699,21 +1703,247 @@ namespace OOX metadata->ivmb = m_oValueMetadata->GetValue(); } } + + XLSB::DATACELL* pDATACELL = nullptr; + XLSB::TABLECELL* pTABLECELL = nullptr; + XLSB::FMLACELL* pFMLACELL = nullptr; + XLSB::SHRFMLACELL* pSHRFMLACELL = nullptr; + BiffRecord* pSource = nullptr; + + if(!m_oType.IsInit()) + { + m_oType.Init(); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + } + switch (m_oType->GetValue()) + { + case SimpleTypes::Spreadsheet::celltypeNumber: + { + auto pCellRk = new(XLSB::CellRk); + if( m_oValue->m_sText.find('.') == std::string::npos) + { + pCellRk->value.fInt = 1; + pCellRk->value.fX100 = 0; + pCellRk->value.num = std::stoi(m_oValue->m_sText); + } + else + { + pCellRk->value.fInt = 0; + pCellRk->value.fX100 = 1; + pCellRk->value.num = std::stod(m_oValue->m_sText) * 100; + } + pSource = pCellRk; + } + break; + case SimpleTypes::Spreadsheet::celltypeError: + { + if (m_oValue->m_sText == L"#NULL!") + { if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x00; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x00; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#DIV/0!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x07; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x07; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#REF!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x17; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x17; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#NAME?") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x1D; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x1D; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#NUM!") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x24; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x24; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#N/A") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x2A; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x2A; + pSource = error; + } + } + else if (m_oValue->m_sText == L"#GETTING_DATA") + { + if(m_oFormula.IsInit()) + { + auto error = new XLSB::FmlaError; + error->value = 0x2B; + pSource = error; + } + else + { + auto error = new XLSB::CellError; + error->value = 0x2B; + pSource = error; + } + } + } + break; + case SimpleTypes::Spreadsheet::celltypeBool: + { + if(m_oFormula.IsInit()) + { + auto cellBool(new XLSB::FmlaBool); + pSource = cellBool; + cellBool->value = m_oValue->m_sText == L"1" ? true : false; + } + else + { + auto cellBool(new XLSB::CellBool); + pSource = cellBool; + cellBool->value = m_oValue->m_sText == L"1" ? true : false; + } + } + break; + case SimpleTypes::Spreadsheet::celltypeSharedString: + { + auto pCellIsst(new XLSB::CellIsst); + pCellIsst->value = std::stoi(m_oValue->m_sText); + pSource = pCellIsst; + } + break; + case SimpleTypes::Spreadsheet::celltypeInlineStr: + case SimpleTypes::Spreadsheet::celltypeStr: + { + if(m_oFormula.IsInit()) + { + auto str(new XLSB::FmlaString); + if(m_oValue.IsInit()) + str->value = m_oValue->m_sText; + pSource = str; + + } + else + { + auto str(new XLSB::CellSt); + if(m_oValue.IsInit()) + str->value = m_oValue->m_sText; + pSource = str; + } + } + break; + } + if(!m_oFormula.IsInit()) { - auto sourcePtr(new XLSB::DATACELL); - ptr->m_source = XLS::BaseObjectPtr{sourcePtr}; - sourcePtr->m_Col = m_oCol.get(); - auto cellBase(new XLSB::CellBase); - sourcePtr->m_source = XLS::BaseObjectPtr{cellBase}; - XLSB::Cell oCell; - if(m_oShowPhonetic.IsInit()) - oCell.fPhShow = m_oShowPhonetic->GetValue(); - if(oCell.iStyleRef) - oCell.iStyleRef = m_oStyle.get(); - cellBase->cell = oCell; - }*/ - XLS::BaseObjectPtr objectPtr; + pDATACELL = new(XLSB::DATACELL); + ptr->m_source = XLS::BaseObjectPtr{pDATACELL}; + pDATACELL->m_source = XLS::BaseObjectPtr{pSource}; + } + else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeDataTable) + { + pTABLECELL = new(XLSB::TABLECELL); + ptr->m_source = XLS::BaseObjectPtr{pTABLECELL}; + //pFMLACELL->m_source = m_oFormula->toBin(); + pTABLECELL->m_source = XLS::BaseObjectPtr{pSource}; + } + else + { + std::vector ref; + pFMLACELL = new XLSB::FMLACELL(0, ref); + + if(m_oRef.IsInit()) + { + pSHRFMLACELL = new XLSB::SHRFMLACELL(0,0, ref); + pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; + ptr->m_source = XLS::BaseObjectPtr{pSHRFMLACELL}; + } + if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeShared) + { + + if(!m_oRef.IsInit()) + { + //pFMLACELL->m_source = m_oFormula->toBin(); + if(m_oFormula->m_oSi.IsInit()) + pFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); + pFMLACELL->isShared = true; + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + } + else + { + if(m_oFormula->m_oSi.IsInit()) + pSHRFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); + //pSHRFMLACELL->m_source = m_oFormula->toBin(); + } + } + else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeNormal) + { + std::vector ref; + pFMLACELL = new XLSB::FMLACELL(0, ref); + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + //pFMLACELL->m_source = m_oFormula->toBin(); + } + + else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeArray) + { + //pSHRFMLACELL->m_source = m_oFormula->toBin(); + } + } + return objectPtr; } void CCell::fromBin(XLS::BaseObjectPtr& obj) From 32c86f6debabb49c63766e03d5a6f2da5efacac8 Mon Sep 17 00:00:00 2001 From: RIMINMIR Date: Fri, 11 Aug 2023 19:11:36 +0600 Subject: [PATCH 051/221] added formula conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 98 +++++++++++++++++++++-- OOXML/XlsxFormat/Worksheets/SheetData.h | 1 + 2 files changed, 94 insertions(+), 5 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 0db738f9ed..8334243c6d 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1085,6 +1085,92 @@ namespace OOX } } + XLS::BaseObjectPtr CFormula::toBin() + { + XLS::BaseObjectPtr objectPtr; + switch(m_oT->GetValue()) + { + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeNormal: + { + auto formula(new XLSB::FmlaBase(false)); + formula->formula = m_sText; + objectPtr = XLS::BaseObjectPtr{dynamic_cast(formula)}; + } + break; + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeShared: + { + if(m_oRef.IsInit()) + { + auto formula(new XLSB::ShrFmla(m_oRef.get())); + formula->formula = m_sText; + objectPtr = XLS::BaseObjectPtr{formula}; + } + } + break; + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeArray: + { + if(m_oRef.IsInit()) + { + auto formula(new XLSB::ArrFmla(m_oRef.get())); + + formula->formula = m_sText; + if(m_oAca.IsInit()) + { + formula->fAlwaysCalc = m_oAca->GetValue(); + } + objectPtr = XLS::BaseObjectPtr{formula}; + } + } + break; + case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeDataTable: + { + + auto dataTable(new XLSB::Table); + + if(m_oCa.IsInit()) + { + + dataTable->fAlwaysCalc = m_oCa->GetValue(); + } + if(m_oRef.IsInit()) + { + dataTable->rfx = m_oRef.get(); + } + + if(m_oDtr.IsInit()) + { + dataTable->fRw = m_oDtr->GetValue(); + } + + if(m_oDt2D.IsInit()) + { + dataTable->fTbl2 = m_oDt2D->GetValue(); + } + + if(m_oDel1.IsInit()) + { + dataTable->fDeleted1 = m_oDel1->GetValue(); + } + + if(m_oDel2.IsInit()) + { + dataTable->fDeleted2 = m_oDel2->GetValue(); + } + + if(m_oR1.IsInit()) + { + dataTable->r1 = m_oR1.get(); + } + + if(m_oR2.IsInit()) + { + dataTable->r2 = m_oR2.get(); + } + } + break; + } + return objectPtr; + } EElementType CFormula::getType () const { return et_x_Formula; @@ -1898,7 +1984,7 @@ namespace OOX { pTABLECELL = new(XLSB::TABLECELL); ptr->m_source = XLS::BaseObjectPtr{pTABLECELL}; - //pFMLACELL->m_source = m_oFormula->toBin(); + pFMLACELL->m_source = m_oFormula->toBin(); pTABLECELL->m_source = XLS::BaseObjectPtr{pSource}; } else @@ -1917,7 +2003,7 @@ namespace OOX if(!m_oRef.IsInit()) { - //pFMLACELL->m_source = m_oFormula->toBin(); + pFMLACELL->m_source = m_oFormula->toBin(); if(m_oFormula->m_oSi.IsInit()) pFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); pFMLACELL->isShared = true; @@ -1926,8 +2012,10 @@ namespace OOX else { if(m_oFormula->m_oSi.IsInit()) + { pSHRFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); - //pSHRFMLACELL->m_source = m_oFormula->toBin(); + pSHRFMLACELL->m_source = m_oFormula->toBin(); + } } } else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeNormal) @@ -1935,12 +2023,12 @@ namespace OOX std::vector ref; pFMLACELL = new XLSB::FMLACELL(0, ref); ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; - //pFMLACELL->m_source = m_oFormula->toBin(); + pFMLACELL->m_source = m_oFormula->toBin(); } else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeArray) { - //pSHRFMLACELL->m_source = m_oFormula->toBin(); + pSHRFMLACELL->m_source = m_oFormula->toBin(); } } diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 45f0edb0bc..26d0476fc0 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -142,6 +142,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream); void fromXLSBExt (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nFlags); void fromBin(XLS::BaseObjectPtr& obj, SimpleTypes::Spreadsheet::ECellFormulaType eType); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; From a735af265d57efa7c7bb3043f40ff7b8ace93237 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 11 Aug 2023 21:39:12 +0600 Subject: [PATCH 052/221] fix zero height cells --- .../Worksheets/WorksheetChildOther.cpp | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 5215be725d..f858118df5 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -952,8 +952,13 @@ namespace OOX if(m_oBaseColWidth.IsInit()) ptr->dxGCol = m_oBaseColWidth.get() * 256.; if(m_oDefaultColWidth.IsInit()) + { ptr->cchDefColWidth = m_oDefaultColWidth.get(); - + if(!m_oBaseColWidth.IsInit()) + { + ptr->dxGCol = m_oDefaultColWidth.get(); + } + } if (m_oDefaultRowHeight.IsInit()) ptr->miyDefRwHeight = m_oDefaultRowHeight.get(); else @@ -963,8 +968,11 @@ namespace OOX if (m_oOutlineLevelRow.IsInit()) ptr->iOutLevelRw = m_oOutlineLevelRow.get(); if (m_oThickBottom.IsInit()) ptr->fExDesc = m_oThickBottom.get(); + else ptr->fExDesc = false; if (m_oThickTop.IsInit()) ptr->fExAsc = m_oThickTop.get(); + else ptr->fExAsc = false; if (m_oZeroHeight.IsInit()) ptr->fDyZero = m_oZeroHeight.get(); + else ptr->fDyZero = false; return Castedptr; } EElementType CSheetFormatPr::getType() const @@ -1924,27 +1932,27 @@ namespace OOX if(m_oOddHeader.IsInit()) castedBegin->stHeader = m_oOddHeader->m_sText; - else + else castedBegin->stHeader = false; if(m_oOddFooter.IsInit()) castedBegin->stFooter = m_oOddFooter->m_sText; - else + else castedBegin->stFooter = false; if(m_oEvenHeader.IsInit()) castedBegin->stHeaderEven = m_oEvenHeader->m_sText; - else + else castedBegin->stHeaderEven = false; if(m_oEvenFooter.IsInit()) castedBegin->stFooterEven = m_oEvenFooter->m_sText; - else + else castedBegin->stFooterEven = false; if(m_oFirstHeader.IsInit()) castedBegin->stHeaderFirst = m_oFirstHeader->m_sText; - else + else castedBegin->stHeaderFirst = false; if(m_oFirstFooter.IsInit()) castedBegin->stFooterFirst = m_oFirstFooter->m_sText; - else + else castedBegin->stFooterFirst = false; return objectPtr; } From 38b6a583d2696cbcc5b11f29824ccbb932e1cff8 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 16:06:26 +0600 Subject: [PATCH 053/221] Add fonts conversion --- OOXML/XlsxFormat/Styles/Fonts.cpp | 103 ++++++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/Fonts.h | 2 + 2 files changed, 105 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index 8a0efa5cab..8a82cca9d4 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -35,6 +35,8 @@ #include "../ComplexTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../Biff12_unions/FONTS.h" + namespace OOX { namespace Spreadsheet @@ -179,6 +181,95 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CFont::toBin() + { + auto ptr(new XLSB::Font); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oSz.IsInit()) + ptr->dyHeight = m_oSz->m_oVal->GetValue() * 20; + + if(m_oItalic.IsInit()) + ptr->fItalic = m_oItalic->ToBool(); + + if(m_oStrike.IsInit()) + ptr->fStrikeOut = m_oStrike->ToBool(); + + if(m_oOutline.IsInit()) + ptr->fOutline = m_oOutline->ToBool(); + + if(m_oShadow.IsInit()) + ptr->fShadow = m_oShadow->ToBool(); + + if(m_oCondense.IsInit()) + ptr->fCondense = m_oCondense->ToBool(); + + if(m_oExtend.IsInit()) + ptr->fExtend = m_oExtend->ToBool(); + + if(m_oBold.IsInit()) + { + if(m_oBold->ToBool()) + ptr->bls = 0x02BC; + } + + if(m_oUnderline.IsInit()) + { + if(m_oUnderline->m_oUnderline.IsInit()) + { + if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineNone) + ptr->uls = 0; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineSingle) + ptr->uls = 1; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineDouble) + ptr->uls = 2; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineSingleAccounting) + ptr->uls = 33; + else if(m_oUnderline->m_oUnderline == SimpleTypes::Spreadsheet::EUnderline::underlineDoubleAccounting) + ptr->uls = 34; + } + } + + if(m_oFamily.IsInit()) + ptr->bFamily = m_oFamily->m_oFontFamily->GetValue(); + + if(m_oCharset.IsInit()) + ptr->bCharSet = m_oCharset->m_oCharset->GetValue(); + + if(m_oColor.IsInit()) + ptr->brtColor = m_oColor->toColor(); + + if(m_oScheme.IsInit()) + { + if(m_oScheme->m_oFontScheme.IsInit()) + { + if(m_oScheme->m_oFontScheme == SimpleTypes::Spreadsheet::EFontScheme::fontschemeNone) + ptr->bFontScheme = 0; + else if(m_oScheme->m_oFontScheme == SimpleTypes::Spreadsheet::EFontScheme::fontschemeMajor) + ptr->bFontScheme = 1; + else if(m_oScheme->m_oFontScheme == SimpleTypes::Spreadsheet::EFontScheme::fontschemeMinor) + ptr->bFontScheme = 2; + } + } + + + if(m_oRFont.IsInit()) + ptr->fontName = m_oRFont->m_sVal.get(); + if(m_oVertAlign.IsInit()) + { + if(m_oVertAlign->m_oVerticalAlign.IsInit()) + { + if(m_oVertAlign->m_oVerticalAlign->GetValue() == SimpleTypes::EVerticalAlignRun::verticalalignrunBaseline) + ptr->sss = 0; + else if(m_oVertAlign->m_oVerticalAlign->GetValue() == SimpleTypes::EVerticalAlignRun::verticalalignrunSuperscript) + ptr->sss = 1; + else if(m_oVertAlign->m_oVerticalAlign->GetValue() == SimpleTypes::EVerticalAlignRun::verticalalignrunSubscript) + ptr->sss = 2; + } + } + + return objectPtr; + } EElementType CFont::getType () const { return et_x_Font; @@ -406,6 +497,18 @@ namespace OOX m_mapFonts.insert(std::make_pair(index++, pFont)); } } + XLS::BaseObjectPtr CFonts::toBin() + { + auto ptr(new XLSB::FONTS); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_arrItems) + { + ptr->m_arBrtFont.push_back(i->toBin()); + } + + return objectPtr; + } EElementType CFonts::getType () const { return et_x_Fonts; diff --git a/OOXML/XlsxFormat/Styles/Fonts.h b/OOXML/XlsxFormat/Styles/Fonts.h index f629aee271..1f8050fcb8 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.h +++ b/OOXML/XlsxFormat/Styles/Fonts.h @@ -55,6 +55,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; void AddFont (CFont* pFont); From deb206fad2c099739c8737e97758e8ff3baa99dd Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 16:06:43 +0600 Subject: [PATCH 054/221] Add nubFmts conversion --- OOXML/XlsxFormat/Styles/NumFmts.cpp | 23 +++++++++++++++++++++++ OOXML/XlsxFormat/Styles/NumFmts.h | 2 ++ 2 files changed, 25 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/NumFmts.cpp b/OOXML/XlsxFormat/Styles/NumFmts.cpp index 431f9583d6..e6da90431b 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.cpp +++ b/OOXML/XlsxFormat/Styles/NumFmts.cpp @@ -36,6 +36,7 @@ #include "../../XlsbFormat/Biff12_unions/ACFMT.h" #include "../../Common/SimpleTypes_Shared.h" +#include "../Biff12_unions/FMTS.h" namespace OOX { @@ -83,6 +84,17 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CNumFmt::toBin() + { + auto ptr(new XLSB::Fmt); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oFormatCode.IsInit()) + ptr->stFmtCode = m_oFormatCode.get(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + + return objectPtr; + } EElementType CNumFmt::getType () const { return et_x_NumFmt; @@ -187,6 +199,17 @@ namespace OOX } } + XLS::BaseObjectPtr CNumFmts::toBin() + { + auto fmts(new XLSB::FMTS); + XLS::BaseObjectPtr objectPtr(fmts); + std::vector objectVector; + for(auto i:m_arrItems) + { + fmts->m_arBrtFmt.push_back(i->toBin()) + } + return objectPtr; + } EElementType CNumFmts::getType () const { return et_x_NumFmts; diff --git a/OOXML/XlsxFormat/Styles/NumFmts.h b/OOXML/XlsxFormat/Styles/NumFmts.h index 70974a26b4..fa3bc7371b 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.h +++ b/OOXML/XlsxFormat/Styles/NumFmts.h @@ -61,6 +61,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -90,6 +91,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 44fb83dc3a928b7e519d67b69f63b8536e358328 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 16:07:00 +0600 Subject: [PATCH 055/221] Add Fills conversion --- OOXML/XlsxFormat/Styles/Fills.cpp | 113 ++++++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/Fills.h | 5 ++ 2 files changed, 118 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index 608dba331f..efbb2b3d5b 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -38,6 +38,8 @@ #include "../../XlsbFormat/Biff12_records/Fill.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" +#include "../Biff12_unions/FILLS.h" + namespace OOX { namespace Spreadsheet @@ -110,6 +112,57 @@ namespace OOX { ReadAttributes(obj); } + void CPatternFill::toBin(XLS::BaseObjectPtr obj) + { + auto ptr = static_cast(obj.get()); + if(m_oPatternType.IsInit()) + { + if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeNone) + ptr->fls = 0x00; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeSolid) + ptr->fls = 0x01; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeMediumGray) + ptr->fls = 0x02; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkGray) + ptr->fls = 0x03; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightGray) + ptr->fls = 0x04; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkHorizontal) + ptr->fls = 0x05; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkVertical) + ptr->fls = 0x06; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkDown) + ptr->fls = 0x07; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkUp) + ptr->fls = 0x08; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkGrid) + ptr->fls = 0x09; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeDarkTrellis) + ptr->fls = 0x0A; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightHorizontal) + ptr->fls = 0x0B; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightVertical) + ptr->fls = 0x0C; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightDown) + ptr->fls = 0x0D; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightUp) + ptr->fls = 0x0E; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightGrid) + ptr->fls = 0x0F; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeLightTrellis) + ptr->fls = 0x10; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeGray125) + ptr->fls = 0x11; + else if (m_oPatternType == SimpleTypes::Spreadsheet::EPatternType::patterntypeGray0625) + ptr->fls = 0x12; + } + + if(m_oBgColor.IsInit()) + ptr->brtColorBack = m_oBgColor->toColor(); + + if(m_oFgColor.IsInit()) + ptr->brtColorFore = m_oFgColor->toColor(); + } EElementType CPatternFill::getType () const { return et_x_PatternFill; @@ -230,6 +283,19 @@ namespace OOX m_oColor->fromBin(dynamic_cast(&ptr->brtColor)); } } + void CGradientStop::toBin(XLS::BaseObjectPtr obj) + { + auto ptr = static_cast(obj.get()); + XLSB::GradientStop stop; + if(m_oPosition.IsInit()) + stop.xnumPosition.data.value = m_oPosition->GetValue(); + if(m_oColor.IsInit()) + { + stop.brtColor = m_oColor->toColor(); + } + ptr->xfillGradientStop.push_back(stop); + } + EElementType CGradientStop::getType () const { return et_x_GradientStop; @@ -310,6 +376,28 @@ namespace OOX m_arrItems.push_back(ptrGradStop); } } + } + void CGradientFill::toBin(XLS::BaseObjectPtr obj) + { + auto ptr = static_cast(obj.get()); + + if(m_oType.IsInit()) + ptr->iGradientType = m_oType->GetValue(); + if(m_oDegree.IsInit()) + ptr->xnumDegree.data.value = m_oDegree->GetValue(); + if(m_oLeft.IsInit()) + ptr->xnumFillToLeft.data.value = m_oLeft->GetValue(); + if(m_oRight.IsInit()) + ptr->xnumFillToRight.data.value = m_oRight->GetValue(); + if(m_oTop .IsInit()) + ptr->xnumFillToTop.data.value = m_oTop->GetValue(); + if(m_oBottom.IsInit()) + ptr->xnumFillToBottom.data.value = m_oBottom->GetValue(); + + for(auto i:m_arrItems) + { + i->toBin(obj); + } } @@ -397,6 +485,22 @@ namespace OOX if ((m_oGradientFill.IsInit()) && (false == m_oGradientFill->m_oType.IsInit())) m_oGradientFill.reset(); } + XLS::BaseObjectPtr CFill::toBin() + { + auto ptr(new XLSB::Fill); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oPatternFill.IsInit()) + { + m_oPatternFill->toBin(objectPtr); + } + + if(m_oGradientFill.IsInit()) + { + m_oGradientFill->toBin(objectPtr); + } + return objectPtr; + } EElementType CFill::getType () const { return et_x_Fill; @@ -500,6 +604,15 @@ namespace OOX m_mapFills.insert(std::make_pair(index++, pFill)); } } + XLS::BaseObjectPtr CFills::toBin() + { + auto ptr(new XLSB::FILLS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i : m_arrItems) + ptr->m_arBrtFill.push_back(i->toBin()); + return objectPtr; + + } EElementType CFills::getType () const { return et_x_Fills; diff --git a/OOXML/XlsxFormat/Styles/Fills.h b/OOXML/XlsxFormat/Styles/Fills.h index 7294079c86..278d257681 100644 --- a/OOXML/XlsxFormat/Styles/Fills.h +++ b/OOXML/XlsxFormat/Styles/Fills.h @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr obj); virtual EElementType getType () const; @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure* obj); + void toBin(XLS::BaseObjectPtr obj); virtual EElementType getType () const; @@ -122,6 +124,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr obj); virtual EElementType getType () const; @@ -154,6 +157,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -180,6 +184,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 15cf8de9bf585f7fcaf7b8814a96418a9c7d17bf Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 17:32:25 +0600 Subject: [PATCH 056/221] Add borders conversion --- OOXML/XlsxFormat/Styles/Borders.cpp | 64 +++++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/Borders.h | 3 ++ 2 files changed, 67 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index c3b94bbdf3..609245afdb 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -38,6 +38,8 @@ #include "../../XlsbFormat/Biff12_records/Border.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" +#include "../Biff12_unions/BORDERS.h" + namespace OOX { namespace Spreadsheet @@ -134,6 +136,43 @@ namespace OOX } } + void CBorderProp::toBin(XLS::BiffStructure* obj) + { + auto ptr = static_cast(obj); + if(m_oColor.IsInit()) + ptr->brtColor = m_oColor->toColor(); + if(!m_oStyle.IsInit()) + return; + + if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleNone) + ptr->dg = 0x00; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleThin) + ptr->dg = 0x01; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMedium) + ptr->dg = 0x02; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDashed) + ptr->dg = 0x03; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDotted) + ptr->dg = 0x04; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleThick) + ptr->dg = 0x05; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDouble) + ptr->dg = 0x06; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleHair) + ptr->dg = 0x07; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMediumDashed) + ptr->dg = 0x08; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDashDot) + ptr->dg = 0x09; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMediumDashDot) + ptr->dg = 0x0A; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleDashDotDot) + ptr->dg = 0x0B; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleMediumDashDotDot) + ptr->dg = 0x0C; + else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleSlantDashDot) + ptr->dg = 0x0D; + } bool CBorderProp::IsEmpty() { return !(m_oStyle.IsInit() || m_oColor.IsInit()); @@ -302,6 +341,23 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CBorder::toBin() + { + auto ptr(new XLSB::Border); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBottom.IsInit()) + m_oBottom->toBin(&ptr->blxfBottom); + if(m_oDiagonal.IsInit()) + m_oDiagonal->toBin(&ptr->blxfDiag); + if(m_oTop.IsInit()) + m_oTop->toBin(&ptr->blxfTop); + if(m_oStart.IsInit()) + m_oStart->toBin(&ptr->blxfLeft); + if(m_oEnd.IsInit()) + m_oEnd->toBin(&ptr->blxfRight); + + return objectPtr; + } EElementType CBorder::getType () const { return et_x_Border; @@ -401,6 +457,14 @@ namespace OOX m_mapBorders.insert(std::make_pair(index++, pBorder)); } } + XLS::BaseObjectPtr CBorders::toBin() + { + auto ptr(new XLSB::BORDERS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtBorder.push_back(i->toBin()); + return objectPtr; + } EElementType CBorders::getType () const { return et_x_Borders; diff --git a/OOXML/XlsxFormat/Styles/Borders.h b/OOXML/XlsxFormat/Styles/Borders.h index f8b0ddd017..21f65cc26a 100644 --- a/OOXML/XlsxFormat/Styles/Borders.h +++ b/OOXML/XlsxFormat/Styles/Borders.h @@ -68,6 +68,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(XLS::BiffStructure* obj); + void toBin(XLS::BiffStructure* obj); bool IsEmpty(); private: @@ -98,6 +99,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -135,6 +137,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 48e3f5541140c08f19a09b7809e84dc84a2a6f10 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 18:58:10 +0600 Subject: [PATCH 057/221] Add cell style xfs conversion --- OOXML/XlsxFormat/Styles/Xfs.cpp | 86 +++++++++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/Xfs.h | 6 ++- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index 846a31af9f..c25bcd0ca3 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -36,6 +36,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../Biff12_unions/CELLSTYLEXFS.h" namespace OOX { @@ -84,6 +85,46 @@ namespace OOX { ReadAttributes(obj); } + void CAligment::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + ptr->cIndent = m_oIndent.get(); + ptr->fJustLast = m_oJustifyLastLine->GetValue(); + ptr->iReadOrder = m_oReadingOrder.get(); + ptr->iReadOrder = m_oRelativeIndent.get(); + ptr->fShrinkToFit = m_oShrinkToFit->GetValue(); + ptr->trot = m_oTextRotation.get(); + ptr->fWrap = m_oWrapText->GetValue(); + + if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentGeneral) + ptr->alc = 0; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentLeft) + ptr->alc = 1; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentCenter) + ptr->alc = 2; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentRight) + ptr->alc = 3; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentFill) + ptr->alc = 4; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentJustify) + ptr->alc = 5; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentCenterContinuous) + ptr->alc = 6; + else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentDistributed) + ptr->alc = 7; + + if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentTop) + ptr->alcV = 0; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentCenter) + ptr->alcV = 1; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentBottom) + ptr->alcV = 2; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentJustify) + ptr->alcV = 3; + else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentDistributed) + ptr->alcV = 4; + + } EElementType CAligment::getType () const { return et_x_Aligment; @@ -220,6 +261,14 @@ namespace OOX { ReadAttributes(obj); } + void CProtection::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oHidden.IsInit()) + ptr->fHidden = m_oHidden->GetValue(); + if(m_oLocked.IsInit()) + ptr->fLocked = m_oLocked->GetValue(); + } EElementType CProtection::getType () const { return et_x_Protection; @@ -310,6 +359,35 @@ namespace OOX m_oAligment = obj; m_oProtection = obj; } + XLS::BaseObjectPtr CXfs::toBin() + { + size_t id = 1; + auto ptr(new XLSB::XF(id, id)); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->ixBorder = m_oBorderId->GetValue(); + m_oBorderId = ptr->ixBorder; + ptr->iFill = m_oFillId->GetValue(); + ptr->font_index = m_oFontId->GetValue(); + ptr->ifmt = m_oNumFmtId->GetValue(); + ptr->fsxButton = m_oPivotButton->GetValue(); + ptr->f123Prefix = m_oQuotePrefix->GetValue(); + + if (m_oXfId.IsInit()) + ptr->ixfParent = m_oXfId->GetValue(); + + ptr->fAtrAlc = m_oApplyAlignment->GetValue(); + ptr->fAtrBdr = m_oApplyBorder->GetValue(); + ptr->fAtrPat = m_oApplyFill->GetValue(); + ptr->fAtrFnt = m_oApplyFont->GetValue(); + ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); + ptr->fAtrProt = m_oApplyProtection->GetValue(); + + m_oAligment->toBin(objectPtr); + m_oProtection->toBin(objectPtr); + + return objectPtr; + } void CXfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -491,6 +569,14 @@ namespace OOX m_arrItems.push_back(pXfs); } } + XLS::BaseObjectPtr CCellStyleXfs::toBin() + { + auto ptr(new XLSB::CELLSTYLEXFS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtXF.push_back(i->toBin()); + return objectPtr; + } void CCellStyleXfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) diff --git a/OOXML/XlsxFormat/Styles/Xfs.h b/OOXML/XlsxFormat/Styles/Xfs.h index 7ab94d1308..78d904375f 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.h +++ b/OOXML/XlsxFormat/Styles/Xfs.h @@ -66,6 +66,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -103,6 +104,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -134,6 +136,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -157,7 +160,7 @@ namespace OOX nullable m_oAligment; nullable m_oProtection; - + }; class CCellXfs : public WritingElementWithChilds @@ -202,6 +205,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From a791775acff663028a316b358eba9974c5f948b3 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 19:10:03 +0600 Subject: [PATCH 058/221] Add cell xfs conversion --- OOXML/XlsxFormat/Styles/Xfs.cpp | 16 ++++++++++++++-- OOXML/XlsxFormat/Styles/Xfs.h | 1 + 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index c25bcd0ca3..bd594c116b 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -36,7 +36,9 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" + #include "../Biff12_unions/CELLSTYLEXFS.h" +#include "../Biff12_unions/CELLXFS.h" namespace OOX { @@ -383,8 +385,10 @@ namespace OOX ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); ptr->fAtrProt = m_oApplyProtection->GetValue(); - m_oAligment->toBin(objectPtr); - m_oProtection->toBin(objectPtr); + if(m_oAligment.IsInit()) + m_oAligment->toBin(objectPtr); + if(m_oProtection.IsInit()) + m_oProtection->toBin(objectPtr); return objectPtr; } @@ -488,6 +492,14 @@ namespace OOX m_arrItems.push_back(pXfs); } } + XLS::BaseObjectPtr CCellXfs::toBin() + { + auto ptr(new XLSB::CELLXFS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtXF.push_back(i->toBin()); + return objectPtr; + } EElementType CCellXfs::getType () const { return et_x_CellXfs; diff --git a/OOXML/XlsxFormat/Styles/Xfs.h b/OOXML/XlsxFormat/Styles/Xfs.h index 78d904375f..480f460ca7 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.h +++ b/OOXML/XlsxFormat/Styles/Xfs.h @@ -177,6 +177,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; From 83cb27d12335277091b626326c148219993721f0 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 19:26:41 +0600 Subject: [PATCH 059/221] Add cell styles conversion --- OOXML/XlsxFormat/Styles/CellStyles.cpp | 29 ++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/CellStyles.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/CellStyles.cpp b/OOXML/XlsxFormat/Styles/CellStyles.cpp index b8074e2e25..ea75131393 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.cpp +++ b/OOXML/XlsxFormat/Styles/CellStyles.cpp @@ -35,6 +35,8 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/Style.h" +#include "../Biff12_unions/STYLES.h" + namespace OOX { namespace Spreadsheet @@ -71,6 +73,25 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CCellStyle::toBin() + { + auto ptr(new XLSB::Style); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBuiltinId.IsInit()) + ptr->fBuiltIn = m_oBuiltinId->GetValue(); + if (m_oCustomBuiltin.IsInit()) + ptr->fCustom = m_oCustomBuiltin->GetValue(); + if (m_oHidden.IsInit()) + ptr->fHidden = m_oHidden->GetValue(); + if (m_oILevel.IsInit()) + ptr->iLevel = m_oILevel->GetValue(); + if (m_oName.IsInit()) + ptr->stName = m_oName.get(); + if (m_oXfId.IsInit()) + ptr->ixf = m_oXfId->GetValue(); + + return objectPtr; + } EElementType CCellStyle::getType () const { return et_x_CellStyle; @@ -159,6 +180,14 @@ namespace OOX m_arrItems.push_back(pXfs); } } + XLS::BaseObjectPtr CCellStyles::toBin() + { + auto ptr(new XLSB::STYLES); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtStyle.push_back(i->toBin()); + return objectPtr; + } EElementType CCellStyles::getType () const { return et_x_CellStyles; diff --git a/OOXML/XlsxFormat/Styles/CellStyles.h b/OOXML/XlsxFormat/Styles/CellStyles.h index b62b65c3d5..d69e44c085 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.h +++ b/OOXML/XlsxFormat/Styles/CellStyles.h @@ -60,6 +60,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; @@ -90,6 +91,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(std::vector& obj); virtual EElementType getType () const; From 5b00fc4ad40a94666975b86570919f614139426d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 20:48:13 +0600 Subject: [PATCH 060/221] Add Table styles conversion --- OOXML/XlsxFormat/Styles/TableStyles.cpp | 97 +++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/TableStyles.h | 3 + 2 files changed, 100 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index e65ec23663..9952bfd017 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -80,6 +80,78 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CTableStyleElement::toBin() + { + auto ptr(new XLSB::TableStyleElement); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->index = m_oDxfId->GetValue(); + ptr->size = m_oSize->GetValue(); + + if(m_oType.IsInit()) + { + if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeWholeTable) + ptr->tseType = 0; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeHeaderRow) + ptr->tseType = 1; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeTotalRow) + ptr->tseType = 2; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstColumn) + ptr->tseType = 3; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeLastColumn) + ptr->tseType = 4; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstRowStripe) + ptr->tseType = 5; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondRowStripe) + ptr->tseType = 6; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstColumnStripe) + ptr->tseType = 7; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondColumnStripe) + ptr->tseType = 8; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstHeaderCell) + ptr->tseType = 9; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeLastHeaderCell) + ptr->tseType = 10; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstTotalCell) + ptr->tseType = 11; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeLastTotalCell) + ptr->tseType = 12; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstSubtotalColumn) + ptr->tseType = 13; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondSubtotalColumn) + ptr->tseType = 14; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdSubtotalColumn) + ptr->tseType = 15; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstSubtotalRow) + ptr->tseType = 16; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondSubtotalRow) + ptr->tseType = 17; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdSubtotalRow) + ptr->tseType = 18; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeBlankRow) + ptr->tseType = 19; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstColumnSubheading) + ptr->tseType = 20; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondColumnSubheading) + ptr->tseType = 21; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdColumnSubheading) + ptr->tseType = 22; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeFirstRowSubheading) + ptr->tseType = 23; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeSecondRowSubheading) + ptr->tseType = 24; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypeThirdRowSubheading) + ptr->tseType = 25; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypePageFieldLabels) + ptr->tseType = 26; + else if (m_oType == SimpleTypes::Spreadsheet::ETableStyleType::tablestyletypePageFieldValues) + ptr->tseType = 27; + else + ptr->tseType = 19; + } + + return objectPtr; + } EElementType CTableStyleElement::getType () const { return et_x_TableStyleElement; @@ -236,6 +308,23 @@ namespace OOX } } + XLS::BaseObjectPtr CTableStyle::toBin() + { + auto ptr(new XLSB::TABLESTYLE); + XLS::BaseObjectPtr objectPtr(ptr); + auto beginStyle(new XLSB::BeginTableStyle); + ptr->m_BrtBeginTableStyle = XLS::BaseObjectPtr{beginStyle}; + + beginStyle->ctse = m_oCount->GetValue(); + beginStyle->fIsPivot = m_oPivot->GetValue(); + beginStyle->fIsTable = m_oTable->GetValue(); + beginStyle->rgchName = m_oName.get(); + beginStyle->rgchName = m_oDisplayName.get(); + + for(auto i:m_arrItems) + ptr->m_arBrtTableStyleElement.push_back(i->toBin()); + return objectPtr; + } EElementType CTableStyle::getType () const { return et_x_TableStyle; @@ -333,6 +422,14 @@ namespace OOX } } + XLS::BaseObjectPtr CTableStyles::toBin() + { + auto ptr(new XLSB::TABLESTYLES); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arTABLESTYLE.push_back(i->toBin()); + return objectPtr; + } EElementType CTableStyles::getType () const { return et_x_TableStyles; diff --git a/OOXML/XlsxFormat/Styles/TableStyles.h b/OOXML/XlsxFormat/Styles/TableStyles.h index 6c618606c7..e5d8900b5a 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.h +++ b/OOXML/XlsxFormat/Styles/TableStyles.h @@ -63,6 +63,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -89,6 +90,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -118,6 +120,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From a420375411871751033adef114e1969950f361f5 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 14 Aug 2023 21:13:07 +0600 Subject: [PATCH 061/221] Fix include file paths --- OOXML/XlsxFormat/Styles/Borders.cpp | 2 +- OOXML/XlsxFormat/Styles/CellStyles.cpp | 2 +- OOXML/XlsxFormat/Styles/Fills.cpp | 2 +- OOXML/XlsxFormat/Styles/Fonts.cpp | 2 +- OOXML/XlsxFormat/Styles/NumFmts.cpp | 4 ++-- OOXML/XlsxFormat/Styles/Xfs.cpp | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 609245afdb..383ae94ce7 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -38,7 +38,7 @@ #include "../../XlsbFormat/Biff12_records/Border.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" -#include "../Biff12_unions/BORDERS.h" +#include "../../../XlsbFormat/Biff12_unions/BORDERS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/CellStyles.cpp b/OOXML/XlsxFormat/Styles/CellStyles.cpp index ea75131393..6c9afccd31 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.cpp +++ b/OOXML/XlsxFormat/Styles/CellStyles.cpp @@ -35,7 +35,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/Style.h" -#include "../Biff12_unions/STYLES.h" +#include "../../XlsbFormat/Biff12_unions/STYLES.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index efbb2b3d5b..a78fa208ef 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -38,7 +38,7 @@ #include "../../XlsbFormat/Biff12_records/Fill.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" -#include "../Biff12_unions/FILLS.h" +#include "../../../XlsbFormat/Biff12_unions/FILLS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index 8a82cca9d4..f48586e97e 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -35,7 +35,7 @@ #include "../ComplexTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" -#include "../Biff12_unions/FONTS.h" +#include "../../../XlsbFormat/Biff12_unions/FONTS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/NumFmts.cpp b/OOXML/XlsxFormat/Styles/NumFmts.cpp index e6da90431b..267cc2a10e 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.cpp +++ b/OOXML/XlsxFormat/Styles/NumFmts.cpp @@ -36,7 +36,7 @@ #include "../../XlsbFormat/Biff12_unions/ACFMT.h" #include "../../Common/SimpleTypes_Shared.h" -#include "../Biff12_unions/FMTS.h" +#include "../../../XlsbFormat/Biff12_unions/FMTS.h" namespace OOX { @@ -206,7 +206,7 @@ namespace OOX std::vector objectVector; for(auto i:m_arrItems) { - fmts->m_arBrtFmt.push_back(i->toBin()) + fmts->m_arBrtFmt.push_back(i->toBin()); } return objectPtr; } diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index bd594c116b..68715b4da5 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -37,8 +37,8 @@ #include "../../XlsbFormat/Biff12_records/CommonRecords.h" -#include "../Biff12_unions/CELLSTYLEXFS.h" -#include "../Biff12_unions/CELLXFS.h" +#include "../../../XlsbFormat/Biff12_unions/CELLSTYLEXFS.h" +#include "../../../XlsbFormat/Biff12_unions/CELLXFS.h" namespace OOX { From e180b49191eef1db01a6e83cc72af86c8c57f2e9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 15 Aug 2023 18:51:32 +0600 Subject: [PATCH 062/221] Add style colors conversion --- OOXML/XlsxFormat/Styles/Colors.cpp | 21 +++++++++++++++++++++ OOXML/XlsxFormat/Styles/Colors.h | 1 + OOXML/XlsxFormat/Styles/rPr.cpp | 26 ++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/rPr.h | 3 +++ 4 files changed, 51 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/Colors.cpp b/OOXML/XlsxFormat/Styles/Colors.cpp index 7adcbffdf7..8548290651 100644 --- a/OOXML/XlsxFormat/Styles/Colors.cpp +++ b/OOXML/XlsxFormat/Styles/Colors.cpp @@ -98,6 +98,27 @@ namespace OOX } } } + XLS::BaseObjectPtr CColors::toBin() + { + auto ptr(new XLSB::COLORPALETTE); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oIndexedColors.IsInit()) + { + auto indexСolors(new XLSB::INDEXEDCOLORS); + ptr->m_INDEXEDCOLORS = XLS::BaseObjectPtr{indexСolors}; + indexСolors->m_arIndexedColor = m_oIndexedColors->toBin(); + } + + if(m_oMruColors.IsInit()) + { + auto mruColors(new XLSB::MRUCOLORS); + ptr->m_MRUCOLORS = XLS::BaseObjectPtr{mruColors}; + mruColors->m_arMRUColor = m_oMruColors->toBin() + } + + return objectPtr; + } EElementType CColors::getType () const { return et_x_Colors; diff --git a/OOXML/XlsxFormat/Styles/Colors.h b/OOXML/XlsxFormat/Styles/Colors.h index a8d92c0621..f593ae4fab 100644 --- a/OOXML/XlsxFormat/Styles/Colors.h +++ b/OOXML/XlsxFormat/Styles/Colors.h @@ -52,6 +52,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 24c7ce9755..4828ffb14c 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -68,6 +68,18 @@ namespace OOX m_oRgb = SimpleTypes::Spreadsheet::CHexColor(ptr->bRed, ptr->bGreen, ptr->bBlue); } } + XLS::BaseObjectPtr CRgbColor::toBin() + { + auto ptr(new XLSB::IndexedColor); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRgb.IsInit()) + { + ptr->bRed = m_oRgb->Get_R(); + ptr->bGreen = m_oRgb->Get_G(); + ptr->bBlue = m_oRgb->Get_B(); + } + return objectPtr; + } EElementType CRgbColor::getType () const { return et_x_RgbColor; @@ -136,6 +148,13 @@ namespace OOX m_arrItems.push_back(pRgbColor); } } + std::vector CIndexedColors::toBin() + { + std::vector objectVector; + for(auto i : m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CIndexedColors::getType () const { return et_x_IndexedColors; @@ -635,6 +654,13 @@ namespace OOX m_arrItems.push_back(color); } } + std::vector CMruColors::toBin() + { + std::vector objectVector; + for(auto i:m_arrItems) + objectVector.push_back(i->toBin()); + return objectVector; + } EElementType CMruColors::getType () const { return et_x_MruColors; diff --git a/OOXML/XlsxFormat/Styles/rPr.h b/OOXML/XlsxFormat/Styles/rPr.h index c88feb4b4f..e5f60c05b7 100644 --- a/OOXML/XlsxFormat/Styles/rPr.h +++ b/OOXML/XlsxFormat/Styles/rPr.h @@ -88,6 +88,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -115,6 +116,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; static bool GetDefaultRGBAByIndex(int index, unsigned char& unR, unsigned char& unG, unsigned char& unB, unsigned char& unA); @@ -178,6 +180,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::vector& obj); + std::vector toBin(); virtual EElementType getType () const; private: From 6737ac21227e807ccf529ff9ff97cd2d6196ce0e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 16 Aug 2023 15:21:31 +0600 Subject: [PATCH 063/221] Add dxfs converting --- OOXML/XlsxFormat/Styles/dxf.cpp | 27 +++++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/dxf.h | 2 ++ 2 files changed, 29 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/dxf.cpp b/OOXML/XlsxFormat/Styles/dxf.cpp index 2cdd59878f..f64405901f 100644 --- a/OOXML/XlsxFormat/Styles/dxf.cpp +++ b/OOXML/XlsxFormat/Styles/dxf.cpp @@ -44,6 +44,8 @@ #include "../../Common/SimpleTypes_Shared.h" +#include "../../../XlsbFormat/Biff12_unions/DXFS.h" + namespace OOX { namespace Spreadsheet @@ -188,6 +190,21 @@ namespace OOX } } + XLS::BaseObjectPtr CDxf::toBin() + { + auto ptr(new XLSB::DXF); + XLS::BaseObjectPtr objectPtr(ptr); + NSStringUtils::CStringBuilder writer; + toXML(writer); + XmlUtils::CXmlLiteReader oReader; + auto stringData = writer.GetData(); + + if ( !oReader.FromString(stringData)) + return objectPtr; + ptr->deserialize(oReader); + + return objectPtr; + } EElementType CDxf::getType () const { return et_x_Dxf; @@ -292,6 +309,16 @@ namespace OOX m_arrItems.push_back(new CDxf(dxf)); } } + XLS::BaseObjectPtr CDxfs::toBin() + { + auto ptr(new XLSB::DXFS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + { + ptr->m_aruDXF.push_back(i->toBin()); + } + return objectPtr; + } void CDxfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { // Читаем атрибуты diff --git a/OOXML/XlsxFormat/Styles/dxf.h b/OOXML/XlsxFormat/Styles/dxf.h index 62a9d518f2..79b6679a8f 100644 --- a/OOXML/XlsxFormat/Styles/dxf.h +++ b/OOXML/XlsxFormat/Styles/dxf.h @@ -67,6 +67,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -100,6 +101,7 @@ namespace OOX virtual EElementType getType () const; void fromBin(std::vector& obj); + XLS::BaseObjectPtr toBin(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From a23d7864aa7b1cff5df2da80b3f198e20a0c7df4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 16 Aug 2023 15:23:10 +0600 Subject: [PATCH 064/221] Add drawing ext conversion for styles --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 24 ++++++++ OOXML/DocxFormat/Drawing/DrawingExt.h | 1 + OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 65 ++++++++++++++++++++++ OOXML/XlsxFormat/Slicer/SlicerCacheExt.h | 3 + OOXML/XlsxFormat/Styles/Colors.cpp | 2 +- 5 files changed, 94 insertions(+), 1 deletion(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index c2954917a5..6263ecb149 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -662,6 +662,30 @@ namespace OOX } return objectPtr; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinStyles() + { + auto ptr(new XLSB::FRTSTYLESHEET); + XLS::BaseObjectPtr objectPtr(ptr); + + if (!m_arrExt.empty()) + { + + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{EB79DEF2-80B8-43E5-95BD-54CBDDF9020C}") + { + ptr->m_STYLESHEET14 = i->m_oSlicerStyles->toBin(); + } + else if(i->m_sUri == L"{46F421CA-312F-682F-3DD2-61675219B42D}") + { + ptr->m_DXF14S = i->m_oDxfs->toBin(); + } + } + + } + return objectPtr; + } XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorksheet() { auto ptr(new XLSB::FRTWORKSHEET); diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index cdd426cbe9..ca39bab04a 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -189,6 +189,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBinWorksheet(); XLS::BaseObjectPtr toBinWorkBook(); + XLS::BaseObjectPtr toBinStyles(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 247de917d8..fd569e5852 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -453,6 +453,35 @@ void CSlicerStyleElement::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) } pReader->Seek(_end_rec); } +XLS::BaseObjectPtr CSlicerStyleElement::toBin() +{ + auto ptr(new XLSB::SlicerStyleElement); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDxfId.IsInit()); + ptr->dxfId = m_oDxfId.get(); + if( m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeUnselectedItemWithData) + ptr->tseType = 0x0000001C; + if(m_oType.IsInit()) + { + if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeUnselectedItemWithData) + ptr->tseType = 0x0000001C; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeUnselectedItemWithNoData) + ptr->tseType = 0x0000001D; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeSelectedItemWithData) + ptr->tseType = 0x0000001E; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeSelectedItemWithNoData) + ptr->tseType = 0x0000001F; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredUnselectedItemWithData) + ptr->tseType = 0x00000020; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredSelectedItemWithData) + ptr->tseType = 0x00000021; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredUnselectedItemWithNoData) + ptr->tseType = 0x00000022; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::ESlicerStyleType::cslicerstyletypeHoveredSelectedItemWithNoData) + ptr->tseType = 0x00000023; + } + return objectPtr; +} void CSlicerStyleElement::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -739,6 +768,24 @@ void CSlicerStyle::fromBin(XLS::BaseObjectPtr &obj) } } +XLS::BaseObjectPtr CSlicerStyle::toBin() +{ + auto ptr(new XLSB::SLICERSTYLE); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oName.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerStyle); + ptr->m_BrtBeginSlicerStyle = XLS::BaseObjectPtr{ptr1}; + ptr1->stName = m_oName.get(); + } + for(auto i: m_oSlicerStyleElements) + { + ptr->m_arBrtSlicerStyleElement.push_back(i.toBin()); + } + + + return objectPtr; +} void CSlicerStyle::ReadAttributes(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); @@ -992,6 +1039,24 @@ void CSlicerStyles::fromBin(XLS::BaseObjectPtr &obj) } } } +XLS::BaseObjectPtr CSlicerStyles::toBin() +{ + auto ptr(new XLSB::STYLESHEET14); + XLS::BaseObjectPtr objectPtr(ptr); + auto slicerStyle(new XLSB::SLICERSTYLES); + ptr->m_SLICERSTYLES = XLS::BaseObjectPtr {slicerStyle}; + + auto beginStyles(new XLSB::BeginSlicerStyles); + slicerStyle->m_BrtBeginSlicerStyles = XLS::BaseObjectPtr{beginStyles}; + if(m_oDefaultSlicerStyle.IsInit()) + beginStyles->stDefSlicer = m_oDefaultSlicerStyle.get(); + for(auto i:m_oSlicerStyle) + { + slicerStyle->m_arSLICERSTYLE.push_back(i.toBin()); + } + + return objectPtr; +} void CSlicerStyles::ReadAttributes(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h index e48b569944..3fe7869c64 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h @@ -159,6 +159,7 @@ namespace OOX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const { return et_x_SlicerStyleElement; @@ -237,6 +238,7 @@ namespace OOX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const { return et_x_SlicerStyle; @@ -311,6 +313,7 @@ namespace OOX virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const { return et_x_SlicerStyles; diff --git a/OOXML/XlsxFormat/Styles/Colors.cpp b/OOXML/XlsxFormat/Styles/Colors.cpp index 8548290651..9d8aa3a4a7 100644 --- a/OOXML/XlsxFormat/Styles/Colors.cpp +++ b/OOXML/XlsxFormat/Styles/Colors.cpp @@ -114,7 +114,7 @@ namespace OOX { auto mruColors(new XLSB::MRUCOLORS); ptr->m_MRUCOLORS = XLS::BaseObjectPtr{mruColors}; - mruColors->m_arMRUColor = m_oMruColors->toBin() + mruColors->m_arMRUColor = m_oMruColors->toBin(); } return objectPtr; From 5a52de4b2e3745507392696a2be323289593fdbe Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 16 Aug 2023 16:46:44 +0600 Subject: [PATCH 065/221] Add styles conversion --- OOXML/XlsxFormat/Styles/Styles.h | 1 + OOXML/XlsxFormat/Styles/XlsxStyles.cpp | 70 ++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Styles.h b/OOXML/XlsxFormat/Styles/Styles.h index e9d94ff37a..83ec20520f 100644 --- a/OOXML/XlsxFormat/Styles/Styles.h +++ b/OOXML/XlsxFormat/Styles/Styles.h @@ -105,6 +105,7 @@ namespace OOX virtual ~CStyles(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); diff --git a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp index c4c32202ba..cbc1478bb3 100644 --- a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp +++ b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp @@ -61,6 +61,8 @@ #include "../../XlsbFormat/Biff12_unions/STYLES.h" #include "../../XlsbFormat/Biff12_unions/DXFS.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -210,6 +212,44 @@ namespace OOX } } + XLS::BaseObjectPtr CStyles::WriteBin() const + { + XLSB::StylesStreamPtr stylesStream(new XLSB::StylesStream); + XLS::BaseObjectPtr objectPtr(stylesStream); + if (m_oNumFmts.IsInit()) + stylesStream->m_FMTS = m_oNumFmts->toBin(); + + if (m_oFonts.IsInit()) + stylesStream->m_FONTS = m_oFonts->toBin(); + + if (m_oFills.IsInit()) + stylesStream->m_FILLS = m_oFills->toBin(); + + if (m_oBorders.IsInit()) + stylesStream->m_BORDERS = m_oBorders->toBin(); + + if (m_oCellStyleXfs.IsInit()) + stylesStream->m_CELLSTYLEXFS = m_oCellStyleXfs->toBin(); + + if (m_oCellXfs.IsInit()) + stylesStream->m_CELLXFS = m_oCellXfs->toBin(); + + if (m_oCellStyles.IsInit()) + stylesStream->m_STYLES = m_oCellStyles->toBin(); + + if (m_oDxfs.IsInit()) + stylesStream->m_DXFS = m_oDxfs->toBin(); + + if (m_oTableStyles.IsInit()) + stylesStream->m_TABLESTYLES = m_oTableStyles->toBin(); + + if (m_oColors.IsInit()) + stylesStream->m_COLORPALETTE = m_oColors->toBin(); + + if (m_oExtLst.IsInit()) + stylesStream->m_FRTSTYLESHEET = m_oExtLst->toBinStyles(); + return objectPtr; + } void CStyles::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -324,6 +364,14 @@ namespace OOX } void CStyles::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { NSStringUtils::CStringBuilder sXml; sXml.WriteString(L"\ @@ -341,7 +389,7 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" std::wstring sPath = oPath.GetPath(); NSFile::CFileBinary::SaveToFile(sPath.c_str(), sXml.GetData()); - + } oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); } void CStyles::AfterRead() @@ -395,7 +443,7 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" cell_style->m_oName = L"Normal"; m_oCellStyles->m_arrItems.push_back(cell_style); - + CXfs *cell_xfs = new CXfs(); cell_xfs->m_oXfId = iXfs; @@ -758,6 +806,11 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" } const OOX::FileType CStyles::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::StylesBin; + } return OOX::Spreadsheet::FileTypes::Styles; } const CPath CStyles::DefaultDirectory() const @@ -766,7 +819,18 @@ xmlns:x16r2=\"http://schemas.microsoft.com/office/spreadsheetml/2015/02/main\">" } const CPath CStyles::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } const CPath& CStyles::GetReadPath() { From d93934a2d4d93825551f0255a565a6ca01be9985 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 16 Aug 2023 19:38:18 +0600 Subject: [PATCH 066/221] Fix xfs conversion --- OOXML/XlsxFormat/Styles/Xfs.cpp | 48 ++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index 68715b4da5..98a218804e 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -90,12 +90,19 @@ namespace OOX void CAligment::toBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); - ptr->cIndent = m_oIndent.get(); + if(m_oIndent.IsInit()) + ptr->cIndent = m_oIndent.get(); + if(m_oJustifyLastLine.IsInit()) ptr->fJustLast = m_oJustifyLastLine->GetValue(); + if(m_oReadingOrder.IsInit()) ptr->iReadOrder = m_oReadingOrder.get(); + if(m_oRelativeIndent.IsInit()) ptr->iReadOrder = m_oRelativeIndent.get(); + if(m_oShrinkToFit.IsInit()) ptr->fShrinkToFit = m_oShrinkToFit->GetValue(); + if(m_oTextRotation.IsInit()) ptr->trot = m_oTextRotation.get(); + if(m_oWrapText.IsInit()) ptr->fWrap = m_oWrapText->GetValue(); if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentGeneral) @@ -366,24 +373,33 @@ namespace OOX size_t id = 1; auto ptr(new XLSB::XF(id, id)); XLS::BaseObjectPtr objectPtr(ptr); - - ptr->ixBorder = m_oBorderId->GetValue(); - m_oBorderId = ptr->ixBorder; - ptr->iFill = m_oFillId->GetValue(); - ptr->font_index = m_oFontId->GetValue(); - ptr->ifmt = m_oNumFmtId->GetValue(); - ptr->fsxButton = m_oPivotButton->GetValue(); - ptr->f123Prefix = m_oQuotePrefix->GetValue(); + if(m_oBorderId.IsInit()) + ptr->ixBorder = m_oBorderId->GetValue(); + if(m_oFillId.IsInit()) + ptr->iFill = m_oFillId->GetValue(); + if(m_oFontId.IsInit()) + ptr->font_index = m_oFontId->GetValue(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + if(m_oPivotButton.IsInit()) + ptr->fsxButton = m_oPivotButton->GetValue(); + if(m_oQuotePrefix.IsInit()) + ptr->f123Prefix = m_oQuotePrefix->GetValue(); if (m_oXfId.IsInit()) ptr->ixfParent = m_oXfId->GetValue(); - - ptr->fAtrAlc = m_oApplyAlignment->GetValue(); - ptr->fAtrBdr = m_oApplyBorder->GetValue(); - ptr->fAtrPat = m_oApplyFill->GetValue(); - ptr->fAtrFnt = m_oApplyFont->GetValue(); - ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); - ptr->fAtrProt = m_oApplyProtection->GetValue(); + if(m_oApplyAlignment.IsInit()) + ptr->fAtrAlc = m_oApplyAlignment->GetValue(); + if(m_oApplyBorder.IsInit()) + ptr->fAtrBdr = m_oApplyBorder->GetValue(); + if(m_oApplyFill.IsInit()) + ptr->fAtrPat = m_oApplyFill->GetValue(); + if(m_oApplyFont.IsInit()) + ptr->fAtrFnt = m_oApplyFont->GetValue(); + if(m_oApplyNumberFormat.IsInit()) + ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); + if(m_oApplyProtection.IsInit()) + ptr->fAtrProt = m_oApplyProtection->GetValue(); if(m_oAligment.IsInit()) m_oAligment->toBin(objectPtr); From cc9c219d62ed4ef0a1c2fd83fd8adad0df5378cd Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 17 Aug 2023 13:43:20 +0600 Subject: [PATCH 067/221] Fix fonts conversion defaults --- OOXML/XlsxFormat/Styles/Fonts.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index f48586e97e..4ef9db4f08 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -191,22 +191,33 @@ namespace OOX if(m_oItalic.IsInit()) ptr->fItalic = m_oItalic->ToBool(); + else + ptr->fItalic = false; if(m_oStrike.IsInit()) ptr->fStrikeOut = m_oStrike->ToBool(); + else + ptr->fStrikeOut = false; if(m_oOutline.IsInit()) - ptr->fOutline = m_oOutline->ToBool(); + ptr->fOutline = m_oOutline->ToBool(); + else + ptr->fOutline = false; if(m_oShadow.IsInit()) ptr->fShadow = m_oShadow->ToBool(); + else + ptr->fShadow = false; if(m_oCondense.IsInit()) ptr->fCondense = m_oCondense->ToBool(); + else + ptr->fCondense = false; if(m_oExtend.IsInit()) ptr->fExtend = m_oExtend->ToBool(); - + else + ptr->fExtend = false; if(m_oBold.IsInit()) { if(m_oBold->ToBool()) From e9dc0d4c2c7e2d113e3dd766d8f2c24503940455 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 18 Aug 2023 16:25:17 +0600 Subject: [PATCH 068/221] Fix worksheet conversion --- OOXML/XlsbFormat/Xlsb.cpp | 1 - .../Worksheets/WorksheetChildOther.cpp | 49 +++++++++++++++---- X2tConverter/src/ASCConverters.cpp | 9 ++-- 3 files changed, 44 insertions(+), 15 deletions(-) diff --git a/OOXML/XlsbFormat/Xlsb.cpp b/OOXML/XlsbFormat/Xlsb.cpp index 4da4dba54d..74a9c26ce7 100644 --- a/OOXML/XlsbFormat/Xlsb.cpp +++ b/OOXML/XlsbFormat/Xlsb.cpp @@ -101,7 +101,6 @@ bool OOX::Spreadsheet::CXlsb::WriteBin(const CPath& oDirPath, OOX::CContentTypes return false; m_bWriteToXlsb = true; - PrepareWorkbook(); IFileContainer::Write(oDirPath / L"", OOX::CPath(_T("")), oContentTypes); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index f858118df5..4b746b0ff2 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -964,8 +964,14 @@ namespace OOX else ptr->miyDefRwHeight = 14.4; - if (m_oOutlineLevelCol.IsInit()) ptr->iOutLevelCol = m_oOutlineLevelCol.get(); - if (m_oOutlineLevelRow.IsInit()) ptr->iOutLevelRw = m_oOutlineLevelRow.get(); + if (m_oOutlineLevelCol.IsInit()) + ptr->iOutLevelCol = m_oOutlineLevelCol.get(); + else + ptr->iOutLevelCol = 1; + if (m_oOutlineLevelRow.IsInit()) + ptr->iOutLevelRw = m_oOutlineLevelRow.get(); + else + ptr->iOutLevelRw = 1; if (m_oThickBottom.IsInit()) ptr->fExDesc = m_oThickBottom.get(); else ptr->fExDesc = false; @@ -1258,38 +1264,60 @@ namespace OOX } XLS::BaseObjectPtr CSheetView::toBin() { - if(m_oView.IsInit() || m_oTopLeftCell.IsInit() || m_oTopLeftCell.IsInit()) - { + //if(m_oView.IsInit() || m_oTopLeftCell.IsInit() || m_oTopLeftCell.IsInit()) + //{ auto pWsView(new XLSB::BeginWsView); XLS::BaseObjectPtr castedPtr(pWsView); if (m_oColorId.IsInit()) pWsView->icvHdr = m_oColorId->m_eValue; if (m_oDefaultGridColor.IsInit()) pWsView->fDefaultHdr = m_oDefaultGridColor->m_eValue; + else + pWsView->fDefaultHdr = false; if (m_oRightToLeft.IsInit()) pWsView->fRightToLeft = m_oRightToLeft->m_eValue; + else + pWsView->fRightToLeft = false; if (m_oShowFormulas.IsInit()) pWsView->fDspFmlaRt = m_oShowFormulas->m_eValue; + else + pWsView->fDspFmlaRt = false; if (m_oShowGridLines.IsInit()) pWsView->fDspGridRt = m_oShowGridLines->m_eValue; + else + pWsView->fDspGridRt = false; if (m_oShowOutlineSymbols.IsInit()) pWsView->fDspGuts = m_oShowOutlineSymbols->m_eValue; + else + pWsView->fDspGuts = false; if (m_oShowRowColHeaders.IsInit()) pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; + else + pWsView->fDspRwColRt = false; if (m_oShowRuler.IsInit()) pWsView->fDspRuler = m_oShowRuler->m_eValue; + else + pWsView->fDspRuler = false; if (m_oShowWhiteSpace.IsInit()) pWsView->fWhitespaceHidden = m_oShowWhiteSpace->m_eValue; + else + pWsView->fWhitespaceHidden = false; if (m_oShowZeros.IsInit()) pWsView->fDspZerosRt = m_oShowZeros->m_eValue; + else + pWsView->fDspZerosRt = false; if (m_oTabSelected.IsInit()) pWsView->fSelected = m_oTabSelected->m_eValue; + else + pWsView->fSelected = false; if(m_oTopLeftCell.IsInit()) pWsView->topLeftCell = m_oTopLeftCell.get(); if (m_oView.IsInit()) pWsView->xlView = m_oView->m_eValue; if (m_oWindowProtection.IsInit()) pWsView->fWnProt = m_oWindowProtection->m_eValue; + else + pWsView->fWnProt = false; if (m_oWorkbookViewId.IsInit()) pWsView->iWbkView = m_oWorkbookViewId->m_eValue; if (m_oZoomScale.IsInit()) @@ -1301,7 +1329,7 @@ namespace OOX if (m_oZoomScaleSheetLayoutView.IsInit()) pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; return castedPtr; - } + /*} else { auto pWsView(new XLSB::BeginCsView); @@ -1313,7 +1341,7 @@ namespace OOX if(m_oZoomScale.IsInit()) pWsView->wScale = m_oZoomScale->m_eValue; return castedPtr; - } + }*/ } EElementType CSheetView::getType() const { @@ -1457,14 +1485,15 @@ namespace OOX XLS::BaseObjectPtr CSheetViews::toBin() { auto view = m_arrItems.back(); - if(view->m_oView.IsInit() || view->m_oTopLeftCell.IsInit() || view->m_oTopLeftCell.IsInit()) - { + //if(view->m_oView.IsInit() || view->m_oTopLeftCell.IsInit() || view->m_oTopLeftCell.IsInit()) + //{ auto castedPtr(new XLSB::WSVIEWS2); XLS::BaseObjectPtr ptr(castedPtr); for(auto i:m_arrItems) castedPtr->m_arWSVIEW2.push_back(i->toBin()); return ptr; - } + //} + /* else { auto castedPtr(new XLSB::CSVIEWS); @@ -1472,7 +1501,7 @@ namespace OOX for(auto i:m_arrItems) castedPtr->m_arCSVIEW.push_back(i->toBin()); return ptr; - } + }*/ } EElementType CSheetViews::getType() const { diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 50964955d7..5ef075971f 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1158,7 +1158,8 @@ namespace NExtractTools OOX::Spreadsheet::CXlsb oXlsb; oXlsb.m_bWriteToXlsb = true; oXlsb.Read(oox_path); - + //oXlsb.ReadSheetData(); + OOX::CContentTypes oContentTypes; nRes = oXlsb.WriteBin(sTempUnpackedXLSB, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; @@ -3117,7 +3118,7 @@ namespace NExtractTools NSDirectory::CreateDirectory(sTempUnpackedOox); _UINT32 nRes = odf_flat2oox_dir(sFrom, sTempUnpackedOox, sTemp, params); - + if (SUCCEEDED_X2T(nRes)) { nRes = dir2zipMscrypt(sTempUnpackedOox, sTo, sTemp, params); @@ -3231,9 +3232,9 @@ namespace NExtractTools { std::wstring sTempUnpackedODS = sTemp + FILE_SEPARATOR_STR + L"ods_unpacked"; NSDirectory::CreateDirectory(sTempUnpackedODS); - + Oox2Odf::Converter converter(sXlsxDir, L"spreadsheet", params.getFontPath(), bTemplate, sTemp); - + _UINT32 nRes = 0; std::wstring password = params.getSavePassword(); From 60797121d2da0d383ecbb68751cafba168cc97b4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 21 Aug 2023 22:01:47 +0600 Subject: [PATCH 069/221] Add shared strings conversion --- OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp | 61 +++++++++++++++++++ OOXML/XlsxFormat/SharedStrings/PhoneticPr.h | 2 + OOXML/XlsxFormat/SharedStrings/Run.h | 1 + .../SharedStrings/SharedStrings.cpp | 17 ++++++ .../XlsxFormat/SharedStrings/SharedStrings.h | 1 + OOXML/XlsxFormat/SharedStrings/Si.cpp | 47 ++++++++++++++ OOXML/XlsxFormat/SharedStrings/Si.h | 1 + OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp | 14 +++++ 8 files changed, 144 insertions(+) diff --git a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp index ec4a8136fd..1f0b6bae30 100644 --- a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp +++ b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.cpp @@ -67,6 +67,53 @@ namespace OOX { ReadAttributes(obj); } + void CPhonetic::toBin(XLS::BiffStructure* obj) + { + auto ptr = static_cast(obj); + if(m_oAlignment.IsInit()) + { + if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentNoControl) + { + ptr->alcH = 0; + } + else if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentLeft) + { + ptr->alcH = 1; + } + else if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentCenter) + { + ptr->alcH = 2; + } + else if(m_oAlignment == SimpleTypes::Spreadsheet::phoneticalignmentDistributed) + { + ptr->alcH = 3; + } + } + if(m_oType.IsInit()) + { + if(m_oType == SimpleTypes::Spreadsheet::phonetictypeHalfwidthKatakana) + { + ptr->phType = 0; + } + else if(m_oType == SimpleTypes::Spreadsheet::phonetictypeFullwidthKatakana) + { + ptr->phType = 1; + } + else if(m_oType == SimpleTypes::Spreadsheet::phonetictypeHiragana) + { + ptr->phType = 2; + } + else if(m_oType == SimpleTypes::Spreadsheet::phonetictypeNoConversion) + { + ptr->phType = 3; + } + } + + if(m_oFontId.IsInit()) + { + ptr->ifnt = m_oFontId->GetValue(); + } + } EElementType CPhonetic::getType () const { return et_x_PhoneticPr; @@ -167,6 +214,20 @@ namespace OOX m_arrItems.push_back(ptr); ReadAttributes(obj); } + std::wstring CRPh::toBin(XLS::BiffStructure* obj) + { + auto ptr = static_cast(obj); + std::wstring result; + if(!m_arrItems.empty()) + { + result = m_arrItems.back()->ToString(); + } + if(m_oEb.IsInit()) + ptr->ichMom = m_oEb->GetValue(); + if(m_oSb.IsInit()) + ptr->ichFirst = m_oSb->GetValue(); + return result; + } EElementType CRPh::getType () const { return et_x_rPh; diff --git a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h index 5185461cc1..2c63de3ae1 100644 --- a/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h +++ b/OOXML/XlsxFormat/SharedStrings/PhoneticPr.h @@ -62,6 +62,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); virtual EElementType getType () const; private: @@ -88,6 +89,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj, std::wstring& str); + std::wstring toBin(XLS::BiffStructure* obj); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/SharedStrings/Run.h b/OOXML/XlsxFormat/SharedStrings/Run.h index 3f6e983122..6cd18133c5 100644 --- a/OOXML/XlsxFormat/SharedStrings/Run.h +++ b/OOXML/XlsxFormat/SharedStrings/Run.h @@ -53,6 +53,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(std::wstring& str, unsigned short fontindex); + std::wstring toBin(unsigned short &fontindex); virtual EElementType getType () const; private: diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp index a47ea14445..c761aa81e2 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp @@ -102,6 +102,23 @@ namespace OOX } } + XLS::BaseObjectPtr CSharedStrings::WriteBin() const + { + XLSB::SharedStringsStreamPtr sharedStringsStream(new XLSB::SharedStringsStream); + auto ptr(new XLSB::SHAREDSTRINGS); + XLS::BaseObjectPtr objectPtr(ptr); + + auto atribPtr(new XLSB::BeginSst); + if(m_oCount.IsInit()) + atribPtr->cstTotal = m_oCount->GetValue(); + atribPtr->cstUnique = m_oUniqueCount->GetValue(); + + for(auto i:m_arrItems) + { + ptr->m_BrtBeginSst = i->toBin(); + } + return objectPtr; + } void CSharedStrings::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.h b/OOXML/XlsxFormat/SharedStrings/SharedStrings.h index 19e99b05b7..e8c7b7d513 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.h +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.h @@ -54,6 +54,7 @@ namespace OOX virtual ~CSharedStrings(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; diff --git a/OOXML/XlsxFormat/SharedStrings/Si.cpp b/OOXML/XlsxFormat/SharedStrings/Si.cpp index 16ee76e6d2..d6e87ac772 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.cpp +++ b/OOXML/XlsxFormat/SharedStrings/Si.cpp @@ -130,6 +130,53 @@ namespace OOX m_arrItems.push_back( pItem ); } } + XLS::BaseObjectPtr CSi::toBin() const + { + auto sString(new XLSB::SSTItem); + XLS::BaseObjectPtr objectPtr(sString); + auto ptr = &sString->richStr; + + for(auto i = 0; i < m_arrItems.size(); i++) + { + auto text = static_cast(m_arrItems[i]); + if(text) + { + ptr->str = text->ToString(); + continue; + } + auto crunPtr = static_cast(m_arrItems[i]); + if(crunPtr) + { + USHORT ind = 0; + ptr->str = ptr->str.value() + crunPtr->toBin(ind); + XLSB::StrRun run; + run.ifnt = ind; + run.ich = ptr->str.value().size(); + ptr->rgsStrRun.push_back(run); + } + auto phonPtr = static_cast(m_arrItems[i]); + if(phonPtr) + { + XLSB::PhRun phRun; + phonPtr->toBin(&phRun); + if(i < m_arrItems.size() - 1) + { + auto ph = static_cast(m_arrItems[i+1]); + if(ph) + { + auto phoneticStr = ph->toBin(&phRun); + if(!phoneticStr.empty()) + ptr->phoneticStr = phoneticStr; + } + i++; + } + + ptr->rgsPhRun.push_back(phRun); + } + } + + return objectPtr; + } void CSi::fromBin(XLS::BiffStructure& obj, bool flagIsComment) { auto ptr = static_cast(&obj); diff --git a/OOXML/XlsxFormat/SharedStrings/Si.h b/OOXML/XlsxFormat/SharedStrings/Si.h index d641677d11..efdc78f6ce 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.h +++ b/OOXML/XlsxFormat/SharedStrings/Si.h @@ -63,6 +63,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj, bool flagIsComment = false); + XLS::BaseObjectPtr toBin() const; void fromXLSBExt (NSBinPptxRW::CBinaryFileReader& oStream); void toXLSBExt (NSBinPptxRW::CXlsbBinaryWriter& oStream); diff --git a/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp b/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp index 53509a026a..f9bfb95c11 100644 --- a/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp +++ b/OOXML/XlsxFormat/SharedStrings/XlsxRun.cpp @@ -97,6 +97,20 @@ namespace OOX m_oRPr->m_nFontIndex.Init(); m_oRPr->m_nFontIndex = fontindex; } + std::wstring CRun::toBin(unsigned short &fontindex) + { + if(m_oRPr.IsInit()) + { + if(m_oRPr->m_nFontIndex.IsInit()) + fontindex = m_oRPr->m_nFontIndex->GetValue(); + } + if(!m_arrItems.empty()) + { + auto textPtr = m_arrItems.back(); + return textPtr->ToString(); + } + return L""; + } EElementType CRun::getType () const { return et_x_r; From 14e78b8a93e7e9660c811d10dea281b4f3691577 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 22 Aug 2023 17:37:33 +0600 Subject: [PATCH 070/221] Add shared strings writing --- .../SharedStrings/SharedStrings.cpp | 50 ++++++++++++++----- OOXML/XlsxFormat/SharedStrings/Si.cpp | 5 +- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp index c761aa81e2..a8e3890bfd 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp @@ -38,6 +38,8 @@ #include "../../XlsbFormat/Biff12_unions/SHAREDSTRINGS.h" #include "../../XlsbFormat/Biff12_records/SSTItem.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -178,25 +180,38 @@ namespace OOX } void CSharedStrings::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - NSStringUtils::CStringBuilder writer; - writer.WriteString(_T("GetValue()); - WritingStringNullableAttrInt(L"uniqueCount", m_oUniqueCount, m_oUniqueCount->GetValue()); - writer.WriteString(_T(">")); - - for(size_t i = 0; i < m_arrItems.size(); i++) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - m_arrItems[i]->toXML(writer); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } + else + { + NSStringUtils::CStringBuilder writer; + writer.WriteString(_T("GetValue()); + WritingStringNullableAttrInt(L"uniqueCount", m_oUniqueCount, m_oUniqueCount->GetValue()); + writer.WriteString(_T(">")); - writer.WriteString(_T("")); - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath.c_str(), writer.GetData()); + for(size_t i = 0; i < m_arrItems.size(); i++) + { + m_arrItems[i]->toXML(writer); + } + writer.WriteString(_T("")); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath.c_str(), writer.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); } const OOX::FileType CSharedStrings::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::SharedStringsBin; + } return OOX::Spreadsheet::FileTypes::SharedStrings; } const CPath CSharedStrings::DefaultDirectory() const @@ -205,7 +220,18 @@ namespace OOX } const CPath CSharedStrings::DefaultFileName() const { - return type().DefaultFileName(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + CPath name = type().DefaultFileName(); + + name.SetExtention(L"bin"); + return name; + } + else + { + return type().DefaultFileName(); + } } const CPath& CSharedStrings::GetReadPath() { diff --git a/OOXML/XlsxFormat/SharedStrings/Si.cpp b/OOXML/XlsxFormat/SharedStrings/Si.cpp index d6e87ac772..b9f6e31e61 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.cpp +++ b/OOXML/XlsxFormat/SharedStrings/Si.cpp @@ -135,7 +135,8 @@ namespace OOX auto sString(new XLSB::SSTItem); XLS::BaseObjectPtr objectPtr(sString); auto ptr = &sString->richStr; - + ptr->fExtStr = false; + ptr->fRichStr = false; for(auto i = 0; i < m_arrItems.size(); i++) { auto text = static_cast(m_arrItems[i]); @@ -147,6 +148,7 @@ namespace OOX auto crunPtr = static_cast(m_arrItems[i]); if(crunPtr) { + ptr->fRichStr = true; USHORT ind = 0; ptr->str = ptr->str.value() + crunPtr->toBin(ind); XLSB::StrRun run; @@ -157,6 +159,7 @@ namespace OOX auto phonPtr = static_cast(m_arrItems[i]); if(phonPtr) { + ptr->fExtStr = true; XLSB::PhRun phRun; phonPtr->toBin(&phRun); if(i < m_arrItems.size() - 1) From 60b7fabad96f536e3ef1ef131423f84e2698086c Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 22 Aug 2023 20:24:45 +0600 Subject: [PATCH 071/221] Fix shared strings conversion --- OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp index a8e3890bfd..a9cc1c86ec 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp @@ -111,13 +111,15 @@ namespace OOX XLS::BaseObjectPtr objectPtr(ptr); auto atribPtr(new XLSB::BeginSst); + ptr->m_BrtBeginSst = XLS::BaseObjectPtr{atribPtr}; if(m_oCount.IsInit()) atribPtr->cstTotal = m_oCount->GetValue(); + if(m_oUniqueCount.IsInit()) atribPtr->cstUnique = m_oUniqueCount->GetValue(); for(auto i:m_arrItems) { - ptr->m_BrtBeginSst = i->toBin(); + ptr->m_arBrtSSTItem.push_back(i->toBin()); } return objectPtr; } From 568582f2b5f2ab01d070f8fd37a4909076e02759 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 23 Aug 2023 20:37:30 +0600 Subject: [PATCH 072/221] Add default values for xlsb conversion --- OOXML/XlsxFormat/Styles/Borders.cpp | 7 ++++ OOXML/XlsxFormat/Styles/Fonts.cpp | 6 +++ OOXML/XlsxFormat/Workbook/BookViews.cpp | 10 +++++ OOXML/XlsxFormat/Workbook/CalcPr.cpp | 18 +++++++++ OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 4 +- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 38 +++++++++++++++++-- .../Worksheets/WorksheetChildOther.cpp | 12 +++--- 7 files changed, 85 insertions(+), 10 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 383ae94ce7..23a6006894 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -141,6 +141,13 @@ namespace OOX auto ptr = static_cast(obj); if(m_oColor.IsInit()) ptr->brtColor = m_oColor->toColor(); + else + { + XLSB::Color col; + col.xColorType = 0; + ptr->brtColor = col; + } + if(!m_oStyle.IsInit()) return; diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index 4ef9db4f08..8028fc8957 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -249,6 +249,12 @@ namespace OOX if(m_oColor.IsInit()) ptr->brtColor = m_oColor->toColor(); + else + { + XLSB::Color col; + col.xColorType = 0; + ptr->brtColor = col; + } if(m_oScheme.IsInit()) { diff --git a/OOXML/XlsxFormat/Workbook/BookViews.cpp b/OOXML/XlsxFormat/Workbook/BookViews.cpp index 86bcc02f7a..40a01cf649 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.cpp +++ b/OOXML/XlsxFormat/Workbook/BookViews.cpp @@ -81,6 +81,8 @@ namespace OOX if (m_oActiveTab.IsInit()) ptr->itabCur = m_oActiveTab->GetValue(); + else + ptr->itabCur = 0; if (m_oAutoFilterDateGrouping.IsInit()) ptr->fNoAFDateGroup = m_oAutoFilterDateGrouping->GetValue(); @@ -98,12 +100,20 @@ namespace OOX ptr->wTabRatio = m_oTabRatio->GetValue(); if (m_oWindowHeight.IsInit()) ptr->dyWn = m_oWindowHeight->GetValue(); + else + ptr->dyWn = 12750; if (m_oWindowWidth.IsInit()) ptr->dxWn = m_oWindowWidth->GetValue(); + else + ptr->dxWn = 21240; if (m_oXWindow.IsInit()) ptr->xWn = m_oXWindow->GetValue(); + else + ptr->xWn = 2280; if (m_oYWindow.IsInit()) ptr->yWn = m_oYWindow->GetValue(); + else + ptr->yWn = 1650; if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) { diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.cpp b/OOXML/XlsxFormat/Workbook/CalcPr.cpp index 01c6c8cd80..8e1cdee0c9 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.cpp +++ b/OOXML/XlsxFormat/Workbook/CalcPr.cpp @@ -97,22 +97,40 @@ namespace OOX ptr->fRefA1 = !m_oRefMode->GetValue(); if(m_oIterate.IsInit()) ptr->fIter = m_oIterate->GetValue(); + else + ptr->fIter = 0; if(m_oIterateCount.IsInit()) ptr->cCalcCount = m_oIterateCount->GetValue(); + else + ptr->cCalcCount = 100; if(m_oIterateDelta.IsInit()) ptr->xnumDelta.data.value = m_oIterateDelta->GetValue(); + else + ptr->xnumDelta.data.value = 0.001; if(m_oFullPrecision.IsInit()) ptr->fFullPrec = m_oFullPrecision->GetValue(); + else + ptr->fFullPrec = false; if(m_oCalcCompleted.IsInit()) ptr->fSomeUncalced = m_oCalcCompleted->GetValue(); + else + ptr->fSomeUncalced = false; if(m_oCalcOnSave.IsInit()) ptr->fSaveRecalc = m_oCalcOnSave->GetValue(); + else + ptr->fSaveRecalc = false; if(m_oConcurrentCalc.IsInit()) ptr->fMTREnabled = m_oConcurrentCalc->GetValue(); + else + ptr->fMTREnabled = false; if(m_oConcurrentManualCount.IsInit()) ptr->cUserThreadCount = m_oConcurrentManualCount->GetValue(); + else + ptr->cUserThreadCount = 1; if(m_oForceFullCalc.IsInit()) ptr->fNoDeps = m_oForceFullCalc->GetValue(); + else + ptr->fNoDeps = false; return objectPtr; } diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index b5c8a37e53..896114150c 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -111,7 +111,9 @@ namespace OOX if(m_oDateCompatibility.IsInit()) ptr->fNoSaveSup = m_oDateCompatibility->GetValue(); if(m_oDefaultThemeVersion.IsInit()) - ptr->dwThemeVersion = m_oDefaultThemeVersion->GetValue(); + ptr->dwThemeVersion = m_oDefaultThemeVersion->GetValue(); + else + ptr->dwThemeVersion = 0; if(m_oFilterPrivacy.IsInit()) ptr->fFilterPrivacy = m_oFilterPrivacy->GetValue(); if(m_oHidePivotFieldList.IsInit()) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 8334243c6d..1ab1bc6e35 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1795,6 +1795,7 @@ namespace OOX XLSB::FMLACELL* pFMLACELL = nullptr; XLSB::SHRFMLACELL* pSHRFMLACELL = nullptr; BiffRecord* pSource = nullptr; + XLSB::Cell* oCell; if(!m_oType.IsInit()) { @@ -1818,6 +1819,7 @@ namespace OOX pCellRk->value.fX100 = 1; pCellRk->value.num = std::stod(m_oValue->m_sText) * 100; } + oCell = &pCellRk->cell; pSource = pCellRk; } break; @@ -1828,12 +1830,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x00; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x00; + oCell = &error->cell; pSource = error; } } @@ -1843,12 +1847,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x07; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x07; + oCell = &error->cell; pSource = error; } } @@ -1858,12 +1864,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x17; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x17; + oCell = &error->cell; pSource = error; } } @@ -1873,12 +1881,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x1D; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x1D; + oCell = &error->cell; pSource = error; } } @@ -1888,12 +1898,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x24; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x24; + oCell = &error->cell; pSource = error; } } @@ -1903,12 +1915,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x2A; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x2A; + oCell = &error->cell; pSource = error; } } @@ -1918,12 +1932,14 @@ namespace OOX { auto error = new XLSB::FmlaError; error->value = 0x2B; + oCell = &error->cell; pSource = error; } else { auto error = new XLSB::CellError; error->value = 0x2B; + oCell = &error->cell; pSource = error; } } @@ -1934,14 +1950,16 @@ namespace OOX if(m_oFormula.IsInit()) { auto cellBool(new XLSB::FmlaBool); - pSource = cellBool; cellBool->value = m_oValue->m_sText == L"1" ? true : false; + oCell = &cellBool->cell; + pSource = cellBool; } else { auto cellBool(new XLSB::CellBool); - pSource = cellBool; cellBool->value = m_oValue->m_sText == L"1" ? true : false; + oCell = &cellBool->cell; + pSource = cellBool; } } break; @@ -1949,6 +1967,7 @@ namespace OOX { auto pCellIsst(new XLSB::CellIsst); pCellIsst->value = std::stoi(m_oValue->m_sText); + oCell = &pCellIsst->cell; pSource = pCellIsst; } break; @@ -1960,6 +1979,8 @@ namespace OOX auto str(new XLSB::FmlaString); if(m_oValue.IsInit()) str->value = m_oValue->m_sText; + oCell = &str->cell; + pSource = str; } @@ -1968,6 +1989,7 @@ namespace OOX auto str(new XLSB::CellSt); if(m_oValue.IsInit()) str->value = m_oValue->m_sText; + oCell = &str->cell; pSource = str; } } @@ -2031,7 +2053,15 @@ namespace OOX pSHRFMLACELL->m_source = m_oFormula->toBin(); } } - + oCell->column = m_oCol.get(); + if(m_oShowPhonetic.IsInit()) + oCell->fPhShow = m_oShowPhonetic->GetValue(); + else + oCell->fPhShow = false; + if(m_oStyle.IsInit()) + oCell->iStyleRef = m_oStyle.get(); + else + oCell->iStyleRef = 0; return objectPtr; } void CCell::fromBin(XLS::BaseObjectPtr& obj) @@ -2686,6 +2716,8 @@ namespace OOX if(m_oHt.IsInit()) hdrPtr->miyRw = m_oHt->GetValue() * 20.; + else + hdrPtr->miyRw = 240; if(m_oOutlineLevel.IsInit()) hdrPtr->iOutLevel = m_oOutlineLevel->GetValue(); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 4b746b0ff2..f8783ea6d5 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -444,22 +444,22 @@ namespace OOX XLS::BaseObjectPtr objPtr(ptr); if(m_oLeft.IsInit()) - ptr->xnumLeft.data.value = m_oLeft->GetValue(); + ptr->xnumLeft.data.value = std::round(m_oLeft->GetValue() * 100) / 100; if(m_oTop.IsInit()) - ptr->xnumTop.data.value = m_oTop->GetValue(); + ptr->xnumTop.data.value = std::round(m_oTop->GetValue() * 100) / 100; if(m_oRight.IsInit()) - ptr->xnumRight.data.value = m_oRight->GetValue(); + ptr->xnumRight.data.value = std::round(m_oRight->GetValue() * 100) / 100; if(m_oBottom.IsInit()) - ptr->xnumBottom.data.value = m_oBottom->GetValue(); + ptr->xnumBottom.data.value = std::round(m_oBottom->GetValue() * 100) / 100; if(m_oHeader.IsInit()) - ptr->xnumHeader.data.value = m_oHeader->GetValue(); + ptr->xnumHeader.data.value = std::round(m_oHeader->GetValue() * 100) / 100; if(m_oFooter.IsInit()) - ptr->xnumFooter.data.value = m_oFooter->GetValue(); + ptr->xnumFooter.data.value = std::round(m_oFooter->GetValue() * 100) / 100; return objPtr; } From a38a0c302d3e3f248d2a332d847afb7207252858 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 24 Aug 2023 20:06:32 +0600 Subject: [PATCH 073/221] Fix sheet view conversion --- .../Worksheets/WorksheetChildOther.cpp | 89 ++++++++++++++++++- .../Worksheets/WorksheetChildOther.h | 2 + 2 files changed, 87 insertions(+), 4 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index f8783ea6d5..c9a2dc7e2e 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1057,6 +1057,43 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CPane::toBin() + { + auto ptr(new XLSB::Pane); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oActivePane.IsInit()) + { + if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomRight) + ptr->pnnAcct_xlsb = 0; + else if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopRight) + ptr->pnnAcct_xlsb = 1; + else if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomLeft) + ptr->pnnAcct_xlsb = 2; + else if(m_oActivePane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopLeft) + ptr->pnnAcct_xlsb = 3; + } + + if(m_oState.IsInit()) + { + if(m_oState == SimpleTypes::Spreadsheet::EPaneState::panestateFrozenSplit) + ptr->fFrozen = true; + else if(m_oState == SimpleTypes::Spreadsheet::EPaneState::panestateFrozen) + ptr->fFrozenNoSplit = true; + } + if(m_oTopLeftCell.IsInit()) + ptr->topLeftCell = m_oTopLeftCell.get(); + if(m_oXSplit.IsInit()) + ptr->xnumXSplit.data.value = m_oXSplit->GetValue(); + else + ptr->xnumXSplit.data.value = 0; + if(m_oYSplit.IsInit()) + ptr->xnumYSplit.data.value = m_oYSplit->GetValue(); + else + ptr->xnumYSplit.data.value = 0; + + return objectPtr; + } EElementType CPane::getType() const { return et_x_Pane; @@ -1130,6 +1167,30 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CSelection::toBin() + { + auto ptr(new XLSB::Sel); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oActiveCell.IsInit()) + ptr->activeCell = m_oActiveCell.get(); + if(m_oActiveCellId.IsInit()) + ptr->irefAct = m_oActiveCellId->GetValue(); + if(m_oSqref.IsInit()) + ptr->sqref = m_oSqref.get(); + if(m_oPane.IsInit()) + { + if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomRight) + ptr->pnn_xlsb = 0; + else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopRight) + ptr->pnn_xlsb = 1; + else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomLeft) + ptr->pnn_xlsb = 2; + else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopLeft) + ptr->pnn_xlsb = 3; + } + + return objectPtr; + } EElementType CSelection::getType() const { return et_x_Selection; @@ -1266,14 +1327,19 @@ namespace OOX { //if(m_oView.IsInit() || m_oTopLeftCell.IsInit() || m_oTopLeftCell.IsInit()) //{ + auto ptr(new XLSB::WSVIEW2); + XLS::BaseObjectPtr castedPtr(ptr); auto pWsView(new XLSB::BeginWsView); - XLS::BaseObjectPtr castedPtr(pWsView); + ptr->m_BrtBeginWsView = XLS::BaseObjectPtr{pWsView}; + if (m_oColorId.IsInit()) pWsView->icvHdr = m_oColorId->m_eValue; + else + pWsView->icvHdr = 64; if (m_oDefaultGridColor.IsInit()) pWsView->fDefaultHdr = m_oDefaultGridColor->m_eValue; else - pWsView->fDefaultHdr = false; + pWsView->fDefaultHdr = true; if (m_oRightToLeft.IsInit()) pWsView->fRightToLeft = m_oRightToLeft->m_eValue; else @@ -1285,11 +1351,11 @@ namespace OOX if (m_oShowGridLines.IsInit()) pWsView->fDspGridRt = m_oShowGridLines->m_eValue; else - pWsView->fDspGridRt = false; + pWsView->fDspGridRt = true; if (m_oShowOutlineSymbols.IsInit()) pWsView->fDspGuts = m_oShowOutlineSymbols->m_eValue; else - pWsView->fDspGuts = false; + pWsView->fDspGuts = true; if (m_oShowRowColHeaders.IsInit()) pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; else @@ -1322,12 +1388,27 @@ namespace OOX pWsView->iWbkView = m_oWorkbookViewId->m_eValue; if (m_oZoomScale.IsInit()) pWsView->wScale = m_oZoomScale->m_eValue; + else + pWsView->wScale = 100; if (m_oZoomScaleNormal.IsInit()) pWsView->wScaleNormal = m_oZoomScaleNormal->m_eValue; + else + pWsView->wScaleNormal = 0; if (m_oZoomScalePageLayoutView.IsInit()) pWsView->wScalePLV = m_oZoomScalePageLayoutView->m_eValue; + else + pWsView->wScalePLV = 0; if (m_oZoomScaleSheetLayoutView.IsInit()) pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; + else + pWsView->wScaleSLV = 0; + if(m_oPane.IsInit()) + ptr->m_BrtPane = m_oPane->toBin(); + + for(auto i:m_arrItems) + { + ptr->m_arBrtSel.push_back(i->toBin()); + } return castedPtr; /*} else diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index c744b9073a..34c2a93806 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -335,6 +335,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: @@ -364,6 +365,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; private: From 8a02c684f426d57d3a861a25480acee38a869a79 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 25 Aug 2023 14:11:18 +0600 Subject: [PATCH 074/221] Fix characters --- OOXML/XlsxFormat/Styles/Colors.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Colors.cpp b/OOXML/XlsxFormat/Styles/Colors.cpp index 9d8aa3a4a7..5b9d98cfe0 100644 --- a/OOXML/XlsxFormat/Styles/Colors.cpp +++ b/OOXML/XlsxFormat/Styles/Colors.cpp @@ -105,9 +105,9 @@ namespace OOX if(m_oIndexedColors.IsInit()) { - auto indexСolors(new XLSB::INDEXEDCOLORS); - ptr->m_INDEXEDCOLORS = XLS::BaseObjectPtr{indexСolors}; - indexСolors->m_arIndexedColor = m_oIndexedColors->toBin(); + auto indexColors(new XLSB::INDEXEDCOLORS); + ptr->m_INDEXEDCOLORS = XLS::BaseObjectPtr{indexColors}; + indexColors->m_arIndexedColor = m_oIndexedColors->toBin(); } if(m_oMruColors.IsInit()) From e2143e170a03f4130af4b2f46f5c89c828f50ff0 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 25 Aug 2023 20:30:42 +0600 Subject: [PATCH 075/221] Fix sheet format pr conversion --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index c9a2dc7e2e..1c5044c963 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -956,22 +956,22 @@ namespace OOX ptr->cchDefColWidth = m_oDefaultColWidth.get(); if(!m_oBaseColWidth.IsInit()) { - ptr->dxGCol = m_oDefaultColWidth.get(); + ptr->dxGCol = m_oDefaultColWidth.get() * 256; } } if (m_oDefaultRowHeight.IsInit()) - ptr->miyDefRwHeight = m_oDefaultRowHeight.get(); + ptr->miyDefRwHeight = m_oDefaultRowHeight.get() * 20; else - ptr->miyDefRwHeight = 14.4; + ptr->miyDefRwHeight = 290; if (m_oOutlineLevelCol.IsInit()) ptr->iOutLevelCol = m_oOutlineLevelCol.get(); else - ptr->iOutLevelCol = 1; + ptr->iOutLevelCol = 0; if (m_oOutlineLevelRow.IsInit()) ptr->iOutLevelRw = m_oOutlineLevelRow.get(); else - ptr->iOutLevelRw = 1; + ptr->iOutLevelRw = 0; if (m_oThickBottom.IsInit()) ptr->fExDesc = m_oThickBottom.get(); else ptr->fExDesc = false; @@ -979,6 +979,7 @@ namespace OOX else ptr->fExAsc = false; if (m_oZeroHeight.IsInit()) ptr->fDyZero = m_oZeroHeight.get(); else ptr->fDyZero = false; + ptr->fUnsynced = false; return Castedptr; } EElementType CSheetFormatPr::getType() const @@ -1359,7 +1360,7 @@ namespace OOX if (m_oShowRowColHeaders.IsInit()) pWsView->fDspRwColRt = m_oShowRowColHeaders->m_eValue; else - pWsView->fDspRwColRt = false; + pWsView->fDspRwColRt = true; if (m_oShowRuler.IsInit()) pWsView->fDspRuler = m_oShowRuler->m_eValue; else From 6a1897d342867b20964954ac02112d0539af67d5 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 29 Aug 2023 18:19:30 +0600 Subject: [PATCH 076/221] Fix book views conversion --- OOXML/XlsxFormat/Workbook/BookViews.cpp | 112 +++++++++++++----------- 1 file changed, 62 insertions(+), 50 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/BookViews.cpp b/OOXML/XlsxFormat/Workbook/BookViews.cpp index 40a01cf649..cc2cc8a740 100644 --- a/OOXML/XlsxFormat/Workbook/BookViews.cpp +++ b/OOXML/XlsxFormat/Workbook/BookViews.cpp @@ -76,60 +76,72 @@ namespace OOX } XLS::BaseObjectPtr CWorkbookView::toBin() { - auto ptr(new XLSB::BookView); + auto ptr(new XLS::Window1); XLS::BaseObjectPtr objectPtr(ptr); - if (m_oActiveTab.IsInit()) - ptr->itabCur = m_oActiveTab->GetValue(); - else - ptr->itabCur = 0; + if (m_oActiveTab.IsInit()) + { + ptr->itabCur = m_oActiveTab->GetValue(); + ptr->ctabSel = m_oActiveTab->GetValue(); + } + else + { + ptr->itabCur = 0; + ptr->ctabSel = 0; + } - if (m_oAutoFilterDateGrouping.IsInit()) - ptr->fNoAFDateGroup = m_oAutoFilterDateGrouping->GetValue(); - if (m_oFirstSheet.IsInit()) - ptr->itabFirst = m_oFirstSheet->GetValue(); - if (m_oMinimized.IsInit()) - ptr->fIconic = m_oMinimized->GetValue(); - if (m_oShowHorizontalScroll.IsInit()) - ptr->fDspHScroll = m_oShowHorizontalScroll->GetValue(); - if (m_oShowSheetTabs.IsInit()) - ptr->fBotAdornment = m_oShowSheetTabs->GetValue(); - if (m_oShowVerticalScroll.IsInit()) - ptr->fDspVScroll = m_oShowVerticalScroll->GetValue(); - if (m_oTabRatio.IsInit()) - ptr->wTabRatio = m_oTabRatio->GetValue(); - if (m_oWindowHeight.IsInit()) - ptr->dyWn = m_oWindowHeight->GetValue(); - else - ptr->dyWn = 12750; - if (m_oWindowWidth.IsInit()) - ptr->dxWn = m_oWindowWidth->GetValue(); - else - ptr->dxWn = 21240; - if (m_oXWindow.IsInit()) - ptr->xWn = m_oXWindow->GetValue(); - else - ptr->xWn = 2280; - if (m_oYWindow.IsInit()) - ptr->yWn = m_oYWindow->GetValue(); - else - ptr->yWn = 1650; + if (m_oAutoFilterDateGrouping.IsInit()) + ptr->fNoAFDateGroup = m_oAutoFilterDateGrouping->GetValue(); + if (m_oFirstSheet.IsInit()) + ptr->itabFirst = m_oFirstSheet->GetValue(); + else + ptr->itabFirst = 0; + if (m_oMinimized.IsInit()) + ptr->fIconic = m_oMinimized->GetValue(); + else + ptr->fIconic = false; + if (m_oShowHorizontalScroll.IsInit()) + ptr->fDspHScroll = m_oShowHorizontalScroll->GetValue(); + if (m_oShowSheetTabs.IsInit()) + ptr->fBotAdornment = m_oShowSheetTabs->GetValue(); + if (m_oShowVerticalScroll.IsInit()) + ptr->fDspVScroll = m_oShowVerticalScroll->GetValue(); + if (m_oTabRatio.IsInit()) + ptr->wTabRatio = m_oTabRatio->GetValue(); + else + ptr->wTabRatio = 600; + if (m_oWindowHeight.IsInit()) + ptr->dyWn = m_oWindowHeight->GetValue(); + else + ptr->dyWn = 12750; + if (m_oWindowWidth.IsInit()) + ptr->dxWn = m_oWindowWidth->GetValue(); + else + ptr->dxWn = 21240; + if (m_oXWindow.IsInit()) + ptr->xWn = m_oXWindow->GetValue() * 6; + else + ptr->xWn = 2280; + if (m_oYWindow.IsInit()) + ptr->yWn = m_oYWindow->GetValue() * 110; + else + ptr->yWn = 1650; - if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) - { - ptr->fHidden = true; - ptr->fVeryHidden = false; - } - else if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) - { - ptr->fHidden = false; - ptr->fVeryHidden = true; - } - else - { - ptr->fHidden = false; - ptr->fVeryHidden = false; - } + if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleHidden) + { + ptr->fHidden = true; + ptr->fVeryHidden = false; + } + else if (m_oVisibility == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) + { + ptr->fHidden = false; + ptr->fVeryHidden = true; + } + else + { + ptr->fHidden = false; + ptr->fVeryHidden = false; + } return objectPtr; } From dd532eb8236939c28900c930ebe44beccd33e657 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 31 Aug 2023 17:21:58 +0600 Subject: [PATCH 077/221] Add table conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 20 ++++ OOXML/DocxFormat/Drawing/DrawingExt.h | 1 + OOXML/XlsxFormat/Table/Table.h | 6 ++ OOXML/XlsxFormat/Table/Tables.cpp | 130 ++++++++++++++++++++++++ 4 files changed, 157 insertions(+) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 6263ecb149..687746ca59 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -683,6 +683,26 @@ namespace OOX } } + } + return objectPtr; + } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinTable() + { + auto ptr(new XLSB::FRTTABLE); + XLS::BaseObjectPtr objectPtr(ptr); + if (!m_arrExt.empty()) + { + + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{504A1905-F514-4f6f-8877-14C23A59335A}") + { + ptr->m_BrtList14 = i->m_oAltTextTable->toBin(); + } + + } + } return objectPtr; } diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index ca39bab04a..0a0206890c 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -190,6 +190,7 @@ namespace OOX XLS::BaseObjectPtr toBinWorksheet(); XLS::BaseObjectPtr toBinWorkBook(); XLS::BaseObjectPtr toBinStyles(); + XLS::BaseObjectPtr toBinTable(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Table/Table.h b/OOXML/XlsxFormat/Table/Table.h index c8b9db642b..8829aa89ff 100644 --- a/OOXML/XlsxFormat/Table/Table.h +++ b/OOXML/XlsxFormat/Table/Table.h @@ -74,6 +74,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { @@ -111,6 +112,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_TableStyleInfo; @@ -149,6 +151,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_TableColumn; @@ -201,6 +204,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { @@ -238,6 +242,7 @@ namespace OOX virtual void toXML2(NSStringUtils::CStringBuilder& writer, int nIndex); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_Table; @@ -368,6 +373,7 @@ namespace OOX { } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 1643f0d820..cfd4484170 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -82,6 +82,16 @@ namespace Spreadsheet { ReadAttributes(obj); } + XLS::BaseObjectPtr CAltTextTable::toBin() + { + auto ptr(new XLSB::List14); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oAltText.IsInit()) + ptr->stAltText = m_oAltText.get(); + if(m_oAltTextSummary.IsInit()) + ptr->stAltTextSummary = m_oAltTextSummary.get(); + return objectPtr; + } void CAltTextTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -133,6 +143,22 @@ namespace Spreadsheet { ReadAttributes(obj); } + XLS::BaseObjectPtr CTableStyleInfo::toBin() + { + auto ptr(new XLSB::TableStyleClient); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oName.IsInit()) + ptr->stStyleName = m_oName.get(); + if(m_oShowColumnStripes.IsInit()) + ptr->fColumnStripes = m_oShowColumnStripes->GetValue(); + if(m_oShowFirstColumn.IsInit()) + ptr->fFirstColumn = m_oShowFirstColumn->GetValue(); + if(m_oShowLastColumn.IsInit()) + ptr->fLastColumn = m_oShowLastColumn->GetValue(); + if(m_oShowRowStripes.IsInit()) + ptr->fRowStripes = m_oShowRowStripes->GetValue(); + return objectPtr; + } void CTableStyleInfo::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -239,6 +265,76 @@ namespace Spreadsheet } } } + XLS::BaseObjectPtr CTableColumn::toBin() + { + auto ptr(new XLSB::LISTCOL); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDataCellStyle.IsInit() || m_oTotalsRowDxfId.IsInit() || m_oHeaderRowCellStyle.IsInit() || m_oHeaderRowDxfId.IsInit() + || m_oTotalsRowCellStyle.IsInit()|| m_oDataDxfId.IsInit() || m_oId.IsInit() || m_oName.IsInit() || m_oQueryTableFieldId.IsInit() + || m_oTotalsRowLabel.IsInit() || m_oUniqueName.IsInit() || m_oTotalsRowFunction.IsInit() ) + { + auto ptr1(new XLSB::BeginListCol); + ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleInsertRow = m_oDataCellStyle.get(); + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); + if(m_oHeaderRowDxfId.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + if(m_oDataDxfId.IsInit()) + ptr1->nDxfAgg = m_oDataDxfId->GetValue(); + if(m_oId.IsInit()) + ptr1->idField = m_oId.IsInit(); + + if(m_oName.IsInit()) + ptr1->stCaption = m_oName.get(); + if(m_oQueryTableFieldId.IsInit()) + ptr1->idqsif = m_oQueryTableFieldId->GetValue(); + + if(m_oTotalsRowLabel.IsInit()) + ptr1->stTotal = m_oTotalsRowLabel.get(); + + if(m_oUniqueName.IsInit()) + ptr1->stName = m_oUniqueName.get(); + if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_AVERAGE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCount) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNT; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCountNums) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNTNUMS; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMax) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MAX; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMin) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MIN; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionSum) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_SUM; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionStdDev) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_STDDEV; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionVar) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; + } + if(m_oCalculatedColumnFormula.IsInit()) + { + auto fmla(new XLSB::ListCCFmla); + fmla->formula = m_oCalculatedColumnFormula.get(); + ptr->m_BrtListCCFmla = XLS::BaseObjectPtr{fmla}; + } + if(m_oTotalsRowFormula.IsInit()) + { + auto fmla(new XLSB::ListTrFmla); + fmla->formula = m_oTotalsRowFormula.get(); + ptr->m_BrtListTrFmla = XLS::BaseObjectPtr{fmla}; + } + return objectPtr; + } void CTableColumn::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -368,6 +464,14 @@ namespace Spreadsheet m_arrItems.push_back(new CTableColumn(listcol)); } } + XLS::BaseObjectPtr CTableColumns::toBin() + { + auto ptr(new XLSB::LISTCOLS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arLISTCOL.push_back(i->toBin()); + return objectPtr; + } void CTableColumns::ReadAttributes(std::vector& obj) { if(!obj.empty()) @@ -496,6 +600,23 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_oExtLst = ptr->m_FRTTABLE; } } + XLS::BaseObjectPtr CTable::toBin() + { + auto ptr(new XLSB::TABLE); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oAutoFilter.IsInit()) + ptr->m_AUTOFILTER = m_oAutoFilter->toBin(); + if(m_oSortState.IsInit()) + ptr->m_SORTSTATE = m_oSortState->toBin(); + if(m_oTableColumns.IsInit()) + ptr->m_LISTCOLS = m_oTableColumns->toBin(); + if(m_oTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oTableStyleInfo->toBin(); + + if(m_oExtLst.IsInit()) + ptr->m_FRTTABLE = m_oExtLst->toBinTable(); + return objectPtr; + } void CTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -746,6 +867,15 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } + XLS::BaseObjectPtr CTableFile::WriteBin() const + { + XLSB::TableStreamPtr tableStream(new XLSB::TableStream); + XLS::BaseObjectPtr objectPtr(tableStream); + + tableStream->m_TABLE = m_oTable->toBin(); + + return objectPtr; + } void CTableFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; From b6f11208c983379d403ce73cb2a1124dba05fdd6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 1 Sep 2023 21:24:56 +0600 Subject: [PATCH 078/221] Add table writing --- OOXML/XlsxFormat/Table/Autofilter.cpp | 2 +- OOXML/XlsxFormat/Table/Table.h | 5 +- OOXML/XlsxFormat/Table/Tables.cpp | 190 ++++++++++++++++++++++++-- 3 files changed, 181 insertions(+), 16 deletions(-) diff --git a/OOXML/XlsxFormat/Table/Autofilter.cpp b/OOXML/XlsxFormat/Table/Autofilter.cpp index 6c4733e315..990559617f 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.cpp +++ b/OOXML/XlsxFormat/Table/Autofilter.cpp @@ -1509,8 +1509,8 @@ namespace OOX if(m_oRef.IsInit()) { auto beginFilter(new XLSB::BeginAFilter); + beginFilter->rfx = m_oRef->GetValue(); ptr->m_BrtBeginAFilter = XLS::BaseObjectPtr{beginFilter}; - beginFilter->rfx = m_oRef->GetValue(); } if(m_oSortState.IsInit()) ptr->m_SORTSTATE = m_oSortState->toBin(); diff --git a/OOXML/XlsxFormat/Table/Table.h b/OOXML/XlsxFormat/Table/Table.h index 8829aa89ff..585eb7dcad 100644 --- a/OOXML/XlsxFormat/Table/Table.h +++ b/OOXML/XlsxFormat/Table/Table.h @@ -382,10 +382,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::Table; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index cfd4484170..62047a2065 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -42,6 +42,7 @@ #include "../../XlsbFormat/Biff12_unions/LISTCOLS.h" #include "../../XlsbFormat/Biff12_unions/LISTCOL.h" #include "../../XlsbFormat/Biff12_records/BeginListCol.h" +#include "../../XlsbFormat/Biff12_records/BeginListCols.h" #include "../../XlsbFormat/Biff12_records/ListCCFmla.h" #include "../../XlsbFormat/Biff12_records/ListTrFmla.h" #include "../../XlsbFormat/Biff12_records/List14.h" @@ -60,6 +61,8 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -274,32 +277,56 @@ namespace Spreadsheet || m_oTotalsRowLabel.IsInit() || m_oUniqueName.IsInit() || m_oTotalsRowFunction.IsInit() ) { auto ptr1(new XLSB::BeginListCol); - ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; + ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; if(m_oDataCellStyle.IsInit()) ptr1->stStyleInsertRow = m_oDataCellStyle.get(); + else + ptr1->stStyleInsertRow = false; if(m_oTotalsRowDxfId.IsInit()) ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfInsertRow = 0; if(m_oHeaderRowDxfId.IsInit()) ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader = false; if(m_oHeaderRowDxfId.IsInit()) ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHdr = 0; if(m_oTotalsRowCellStyle.IsInit()) ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg = false; if(m_oDataDxfId.IsInit()) ptr1->nDxfAgg = m_oDataDxfId->GetValue(); + else + ptr1->nDxfAgg = 0; if(m_oId.IsInit()) - ptr1->idField = m_oId.IsInit(); + ptr1->idField = m_oId->GetValue(); + else + ptr1->idField = 0; - if(m_oName.IsInit()) + if(m_oName.IsInit()) ptr1->stCaption = m_oName.get(); + else + ptr1->stCaption = false; if(m_oQueryTableFieldId.IsInit()) ptr1->idqsif = m_oQueryTableFieldId->GetValue(); + else + ptr1->idqsif = 0; if(m_oTotalsRowLabel.IsInit()) ptr1->stTotal = m_oTotalsRowLabel.get(); + else + ptr1->stTotal = false; if(m_oUniqueName.IsInit()) ptr1->stName = m_oUniqueName.get(); + else if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + else + ptr1->stName = false; if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) @@ -320,6 +347,8 @@ namespace Spreadsheet ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; + else + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; } if(m_oCalculatedColumnFormula.IsInit()) { @@ -468,6 +497,10 @@ namespace Spreadsheet { auto ptr(new XLSB::LISTCOLS); XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginListCols); + ptr1->nCols = m_arrItems.size(); + ptr->m_BrtBeginListCols = XLS::BaseObjectPtr{ptr1}; + ptr->indexList = 1; for(auto i:m_arrItems) ptr->m_arLISTCOL.push_back(i->toBin()); return objectPtr; @@ -603,7 +636,125 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") XLS::BaseObjectPtr CTable::toBin() { auto ptr(new XLSB::TABLE); + auto ptr1(new XLSB::BeginList); + ptr->m_BrtBeginList = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oRef.IsInit()) + { + ptr1->rfxList = m_oRef->GetValue(); + ptr1->rfxList.to_string_cache = m_oRef->GetValue(); + } + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + else if(m_oDisplayName.IsInit()) + ptr1->stName = m_oDisplayName.get(); + else + ptr1->stName = false; + if(m_oTotalsRowCount.IsInit()) + ptr1->crwTotals = m_oTotalsRowCount->GetValue(); + else + ptr1->crwTotals = 0; + + if(m_oHeaderRowCount.IsInit()) + ptr1->crwHeader = m_oHeaderRowCount->GetValue(); + else + ptr1->crwHeader = 0; + + if(m_oDisplayName.IsInit()) + ptr1->stDisplayName = m_oDisplayName.get(); + else + ptr1->stDisplayName = false; + + if(m_oTableBorderDxfId.IsInit()) + ptr1->nDxfBorder = m_oTableBorderDxfId->GetValue(); + else + ptr1->nDxfBorder = 0; + + if(m_oComment.IsInit()) + ptr1->stComment = m_oComment.get(); + else + ptr1->stComment = false; + + if(m_oConnectionId.IsInit()) + ptr1->dwConnID = m_oConnectionId->GetValue(); + else + ptr1->dwConnID = 0; + + if(m_oDataDxfId.IsInit()) + ptr1->nDxfData = m_oDataDxfId->GetValue(); + else + ptr1->nDxfData = 0; + + + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleData = m_oDataCellStyle.get(); + else + ptr1->stStyleData = false; + + if(m_oHeaderRowBorderDxfId.IsInit()) + ptr1->nDxfHeaderBorder = m_oHeaderRowBorderDxfId->GetValue(); + else + ptr1->nDxfHeaderBorder = 0; + if(m_oHeaderRowCellStyle.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader = false; + + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHeader = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHeader = 0; + + if(m_oInsertRow.IsInit()) + ptr1->fForceInsertToBeVisible = m_oInsertRow.get(); + else + ptr1->fForceInsertToBeVisible = false; + if(m_oInsertRowShift.IsInit()) + ptr1->fInsertRowInsCells = m_oInsertRowShift.get(); + else + ptr1->fInsertRowInsCells = false; + if(m_oPublished.IsInit()) + ptr1->fPublished = m_oPublished.get(); + else + ptr1->fPublished = false; + if(m_oId.IsInit()) + ptr1->idList = m_oId->GetValue(); + else + ptr1->idList = 1; + if(m_oTableType.IsInit()) + { + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeWorksheet) + ptr1->lt = XLSB::ListType::LTRANGE; + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeXml) + ptr1->lt = XLSB::ListType::LTXML; + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeQueryTable) + ptr1->lt = XLSB::ListType::LTEXTDATA; + } + else + { + ptr1->lt = 0; + } + + if(m_oTotalsRowBorderDxfId.IsInit()) + ptr1->nDxfAggBorder = m_oTotalsRowBorderDxfId->GetValue(); + else + ptr1->nDxfAggBorder = 0; + + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg = false; + + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfAgg = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfAgg = 0; + + if(m_oTotalsRowShown.IsInit()) + ptr1->fShownTotalRow = m_oTotalsRowShown.get(); + else + ptr1->fShownTotalRow = true; if(m_oAutoFilter.IsInit()) ptr->m_AUTOFILTER = m_oAutoFilter->toBin(); if(m_oSortState.IsInit()) @@ -614,7 +765,7 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") ptr->m_BrtTableStyleClient = m_oTableStyleInfo->toBin(); if(m_oExtLst.IsInit()) - ptr->m_FRTTABLE = m_oExtLst->toBinTable(); + ptr->m_FRTTABLE = m_oExtLst->toBinTable(); return objectPtr; } void CTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -901,18 +1052,35 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") { if(false == m_oTable.IsInit()) return; - NSStringUtils::CStringBuilder sXml; - int nGlobalNumber = OOX::FileGlobalEnumerated::GetGlobalNumber(); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; + int nGlobalNumber = OOX::FileGlobalEnumerated::GetGlobalNumber(); - sXml.WriteString(L""); - m_oTable->toXML2(sXml, nGlobalNumber); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oTable->toXML2(sXml, nGlobalNumber); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } + const OOX::FileType CTableFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::TableBin; + } + return OOX::Spreadsheet::FileTypes::Table; + } //--------------------------------------------------------------------------------------------------------------------- From 4498c5a60f056960e14587cb7ce52905a9c4b533 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 5 Sep 2023 22:19:51 +0600 Subject: [PATCH 079/221] Remove double binary file writing --- OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp index 62d2cf9c7b..1f05dfa8d4 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp @@ -1288,7 +1288,7 @@ namespace NSBinPptxRW { if (m_lPosition > 0) { - CFileBinary::WriteFile(m_pStreamData, m_lPosition); + //CFileBinary::WriteFile(m_pStreamData, m_lPosition); } m_lPositionFlushed += m_lPosition; m_lPosition = 0; From b4b4596657b113f69ba61994fab1b3602a5c90dd Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Sep 2023 16:05:26 +0600 Subject: [PATCH 080/221] Fix table conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 13 +- OOXML/XlsxFormat/Table/Tables.cpp | 356 ++++++++++++------------ 2 files changed, 183 insertions(+), 186 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 687746ca59..5a5a714986 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -67,6 +67,7 @@ #include "../../XlsbFormat/Biff12_unions/TABLESLICERSEX.h" #include "../../XlsbFormat/Biff12_unions/FRTWORKBOOK.h" #include "../../XlsbFormat/Biff12_unions/FRTPIVOTCACHEDEF.h" +#include "../../XlsbFormat/Biff12_records/FRTBegin.h" namespace OOX { @@ -688,11 +689,12 @@ namespace OOX } XLS::BaseObjectPtr COfficeArtExtensionList::toBinTable() { - auto ptr(new XLSB::FRTTABLE); - XLS::BaseObjectPtr objectPtr(ptr); - if (!m_arrExt.empty()) - { - + auto ptr(new XLSB::FRTTABLE); + XLS::BaseObjectPtr objectPtr(ptr); + auto frtBegin(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{frtBegin}; + if (!m_arrExt.empty()) + { for(auto i:m_arrExt) { @@ -702,7 +704,6 @@ namespace OOX } } - } return objectPtr; } diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 62047a2065..a0b49257ca 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -46,6 +46,7 @@ #include "../../XlsbFormat/Biff12_records/ListCCFmla.h" #include "../../XlsbFormat/Biff12_records/ListTrFmla.h" #include "../../XlsbFormat/Biff12_records/List14.h" +#include "../../XlsbFormat/Biff12_records/BeginDeletedName.h" #include "../../XlsbFormat/QueryTableStream.h" #include "../../XlsbFormat/Biff12_unions/QSI.h" @@ -55,7 +56,7 @@ #include "../../XlsbFormat/Biff12_unions/QSIF.h" #include "../../XlsbFormat/Biff12_unions/DELETEDNAMES.h" #include "../../XlsbFormat/Biff12_unions/DELETEDNAME.h" -#include "../../XlsbFormat/Biff12_records/BeginDeletedName.h" +#include "../../XlsbFormat/Biff12_unions/FRTTABLE.h" #include "../../Common/SimpleTypes_Shared.h" #include "../../Common/SimpleTypes_Spreadsheet.h" @@ -278,92 +279,92 @@ namespace Spreadsheet { auto ptr1(new XLSB::BeginListCol); ptr->m_BrtBeginListCol = XLS::BaseObjectPtr{ptr1}; - if(m_oDataCellStyle.IsInit()) - ptr1->stStyleInsertRow = m_oDataCellStyle.get(); - else - ptr1->stStyleInsertRow = false; - if(m_oTotalsRowDxfId.IsInit()) - ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); - else - ptr1->nDxfInsertRow = 0; - if(m_oHeaderRowDxfId.IsInit()) - ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); - else - ptr1->stStyleHeader = false; - if(m_oHeaderRowDxfId.IsInit()) - ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); - else - ptr1->nDxfHdr = 0; - if(m_oTotalsRowCellStyle.IsInit()) - ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); - else - ptr1->stStyleAgg = false; - if(m_oDataDxfId.IsInit()) - ptr1->nDxfAgg = m_oDataDxfId->GetValue(); - else - ptr1->nDxfAgg = 0; - if(m_oId.IsInit()) - ptr1->idField = m_oId->GetValue(); - else - ptr1->idField = 0; + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleInsertRow = m_oDataCellStyle.get(); + else + ptr1->stStyleInsertRow = 0xFFFFFFFF; + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfInsertRow = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfInsertRow = 0xFFFFFFFF; - if(m_oName.IsInit()) + if(m_oHeaderRowDxfId.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader = 0xFFFFFFFF; + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHdr = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHdr = 0xFFFFFFFF; + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg = 0xFFFFFFFF; + + if(m_oDataDxfId.IsInit()) + ptr1->nDxfAgg = m_oDataDxfId->GetValue(); + else + ptr1->nDxfAgg = 0xFFFFFFFF; + if(m_oId.IsInit()) + ptr1->idField = m_oId->GetValue(); + else + ptr1->idField = 0; + + if(m_oName.IsInit()) ptr1->stCaption = m_oName.get(); - else - ptr1->stCaption = false; - if(m_oQueryTableFieldId.IsInit()) - ptr1->idqsif = m_oQueryTableFieldId->GetValue(); - else - ptr1->idqsif = 0; + else + ptr1->stCaption = 0xFFFFFFFF; + if(m_oQueryTableFieldId.IsInit()) + ptr1->idqsif = m_oQueryTableFieldId->GetValue(); + else + ptr1->idqsif = 0xFFFFFFFF; if(m_oTotalsRowLabel.IsInit()) ptr1->stTotal = m_oTotalsRowLabel.get(); - else - ptr1->stTotal = false; + else + ptr1->stTotal = 0xFFFFFFFF; if(m_oUniqueName.IsInit()) ptr1->stName = m_oUniqueName.get(); - else if(m_oName.IsInit()) - ptr1->stName = m_oName.get(); - else - ptr1->stName = false; - if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_AVERAGE; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCount) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNT; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCountNums) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNTNUMS; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMax) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MAX; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMin) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MIN; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionSum) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_SUM; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionStdDev) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_STDDEV; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionVar) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; - else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; - else - ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; - } - if(m_oCalculatedColumnFormula.IsInit()) - { - auto fmla(new XLSB::ListCCFmla); - fmla->formula = m_oCalculatedColumnFormula.get(); - ptr->m_BrtListCCFmla = XLS::BaseObjectPtr{fmla}; - } - if(m_oTotalsRowFormula.IsInit()) - { - auto fmla(new XLSB::ListTrFmla); - fmla->formula = m_oTotalsRowFormula.get(); - ptr->m_BrtListTrFmla = XLS::BaseObjectPtr{fmla}; - } - return objectPtr; - } + else + ptr1->stName = 0xFFFFFFFF; + if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionNone) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionAverage) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_AVERAGE; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCount) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNT; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCountNums) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_COUNTNUMS; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMax) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MAX; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionMin) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_MIN; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionSum) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_SUM; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionStdDev) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_STDDEV; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionVar) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_VAR; + else if (m_oTotalsRowFunction == SimpleTypes::Spreadsheet::ETotalsRowFunction::totalrowfunctionCustom) + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_CUSTOM; + else + ptr1->ilta = XLSB::ListTotalRowFunction::ILTA_NONE; + } + if(m_oCalculatedColumnFormula.IsInit()) + { + auto fmla(new XLSB::ListCCFmla); + fmla->formula = m_oCalculatedColumnFormula.get(); + ptr->m_BrtListCCFmla = XLS::BaseObjectPtr{fmla}; + } + if(m_oTotalsRowFormula.IsInit()) + { + auto fmla(new XLSB::ListTrFmla); + fmla->formula = m_oTotalsRowFormula.get(); + ptr->m_BrtListTrFmla = XLS::BaseObjectPtr{fmla}; + } + return objectPtr; + } void CTableColumn::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -500,7 +501,6 @@ namespace Spreadsheet auto ptr1(new XLSB::BeginListCols); ptr1->nCols = m_arrItems.size(); ptr->m_BrtBeginListCols = XLS::BaseObjectPtr{ptr1}; - ptr->indexList = 1; for(auto i:m_arrItems) ptr->m_arLISTCOL.push_back(i->toBin()); return objectPtr; @@ -642,129 +642,125 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if(m_oRef.IsInit()) { - ptr1->rfxList = m_oRef->GetValue(); - ptr1->rfxList.to_string_cache = m_oRef->GetValue(); + ptr1->rfxList = m_oRef->GetValue(); } - if(m_oName.IsInit()) - ptr1->stName = m_oName.get(); - else if(m_oDisplayName.IsInit()) - ptr1->stName = m_oDisplayName.get(); - else - ptr1->stName = false; - if(m_oTotalsRowCount.IsInit()) - ptr1->crwTotals = m_oTotalsRowCount->GetValue(); - else - ptr1->crwTotals = 0; + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + else if(m_oDisplayName.IsInit()) + ptr1->stName = m_oDisplayName.get(); + else + ptr1->stName = 0xFFFFFFFF; + if(m_oTotalsRowCount.IsInit()) + ptr1->crwTotals = m_oTotalsRowCount->GetValue(); + else + ptr1->crwTotals = false; - if(m_oHeaderRowCount.IsInit()) - ptr1->crwHeader = m_oHeaderRowCount->GetValue(); - else - ptr1->crwHeader = 0; + if(m_oHeaderRowCount.IsInit()) + ptr1->crwHeader = m_oHeaderRowCount->GetValue(); + else + ptr1->crwHeader = true; - if(m_oDisplayName.IsInit()) - ptr1->stDisplayName = m_oDisplayName.get(); - else - ptr1->stDisplayName = false; + if(m_oDisplayName.IsInit()) + ptr1->stDisplayName = m_oDisplayName.get(); + else + ptr1->stDisplayName = 0xFFFFFFFF; - if(m_oTableBorderDxfId.IsInit()) - ptr1->nDxfBorder = m_oTableBorderDxfId->GetValue(); - else - ptr1->nDxfBorder = 0; + if(m_oTableBorderDxfId.IsInit()) + ptr1->nDxfBorder = m_oTableBorderDxfId->GetValue(); + else + ptr1->nDxfBorder = 0xFFFFFFFF; - if(m_oComment.IsInit()) - ptr1->stComment = m_oComment.get(); - else - ptr1->stComment = false; + if(m_oComment.IsInit()) + ptr1->stComment = m_oComment.get(); + else + ptr1->stComment = 0xFFFFFFFF; - if(m_oConnectionId.IsInit()) - ptr1->dwConnID = m_oConnectionId->GetValue(); - else - ptr1->dwConnID = 0; + if(m_oConnectionId.IsInit()) + ptr1->dwConnID = m_oConnectionId->GetValue(); + else + ptr1->dwConnID = 0; - if(m_oDataDxfId.IsInit()) - ptr1->nDxfData = m_oDataDxfId->GetValue(); - else - ptr1->nDxfData = 0; + if(m_oDataDxfId.IsInit()) + ptr1->nDxfData = m_oDataDxfId->GetValue(); + else + ptr1->nDxfData = 0xFFFFFFFF; + if(m_oDataCellStyle.IsInit()) + ptr1->stStyleData = m_oDataCellStyle.get(); + else + ptr1->stStyleData = 0xFFFFFFFF; - if(m_oDataCellStyle.IsInit()) - ptr1->stStyleData = m_oDataCellStyle.get(); - else - ptr1->stStyleData = false; + if(m_oHeaderRowBorderDxfId.IsInit()) + ptr1->nDxfHeaderBorder = m_oHeaderRowBorderDxfId->GetValue(); + else + ptr1->nDxfHeaderBorder = 0xFFFFFFFF; - if(m_oHeaderRowBorderDxfId.IsInit()) - ptr1->nDxfHeaderBorder = m_oHeaderRowBorderDxfId->GetValue(); - else - ptr1->nDxfHeaderBorder = 0; - if(m_oHeaderRowCellStyle.IsInit()) - ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); - else - ptr1->stStyleHeader = false; + if(m_oHeaderRowCellStyle.IsInit()) + ptr1->stStyleHeader = m_oHeaderRowCellStyle.get(); + else + ptr1->stStyleHeader = 0xFFFFFFFF; - if(m_oHeaderRowDxfId.IsInit()) - ptr1->nDxfHeader = m_oHeaderRowDxfId->GetValue(); - else - ptr1->nDxfHeader = 0; - - if(m_oInsertRow.IsInit()) - ptr1->fForceInsertToBeVisible = m_oInsertRow.get(); + if(m_oHeaderRowDxfId.IsInit()) + ptr1->nDxfHeader = m_oHeaderRowDxfId->GetValue(); + else + ptr1->nDxfHeader = 0xFFFFFFFF; + if(m_oInsertRow.IsInit()) + ptr1->fForceInsertToBeVisible = m_oInsertRow.get(); else ptr1->fForceInsertToBeVisible = false; - if(m_oInsertRowShift.IsInit()) - ptr1->fInsertRowInsCells = m_oInsertRowShift.get(); + if(m_oInsertRowShift.IsInit()) + ptr1->fInsertRowInsCells = m_oInsertRowShift.get(); else ptr1->fInsertRowInsCells = false; - if(m_oPublished.IsInit()) - ptr1->fPublished = m_oPublished.get(); + if(m_oPublished.IsInit()) + ptr1->fPublished = m_oPublished.get(); else ptr1->fPublished = false; - if(m_oId.IsInit()) - ptr1->idList = m_oId->GetValue(); - else - ptr1->idList = 1; - if(m_oTableType.IsInit()) - { - if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeWorksheet) - ptr1->lt = XLSB::ListType::LTRANGE; - if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeXml) - ptr1->lt = XLSB::ListType::LTXML; - if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeQueryTable) - ptr1->lt = XLSB::ListType::LTEXTDATA; - } + if(m_oId.IsInit()) + ptr1->idList = m_oId->GetValue(); + + if(m_oTableType.IsInit()) + { + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeWorksheet) + ptr1->lt = XLSB::ListType::LTRANGE; + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeXml) + ptr1->lt = XLSB::ListType::LTXML; + if(m_oTableType == SimpleTypes::Spreadsheet::ETableType::typeQueryTable) + ptr1->lt = XLSB::ListType::LTEXTDATA; + } else { - ptr1->lt = 0; + ptr1->lt = XLSB::ListType::LTRANGE; } - if(m_oTotalsRowBorderDxfId.IsInit()) - ptr1->nDxfAggBorder = m_oTotalsRowBorderDxfId->GetValue(); - else - ptr1->nDxfAggBorder = 0; + if(m_oTotalsRowBorderDxfId.IsInit()) + ptr1->nDxfAggBorder = m_oTotalsRowBorderDxfId->GetValue(); + else + ptr1->nDxfAggBorder = 0xFFFFFFFF; + if(m_oTotalsRowCellStyle.IsInit()) + ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); + else + ptr1->stStyleAgg = 0xFFFFFFFF; - if(m_oTotalsRowCellStyle.IsInit()) - ptr1->stStyleAgg = m_oTotalsRowCellStyle.get(); - else - ptr1->stStyleAgg = false; + if(m_oTotalsRowDxfId.IsInit()) + ptr1->nDxfAgg = m_oTotalsRowDxfId->GetValue(); + else + ptr1->nDxfAgg = 0xFFFFFFFF; - if(m_oTotalsRowDxfId.IsInit()) - ptr1->nDxfAgg = m_oTotalsRowDxfId->GetValue(); - else - ptr1->nDxfAgg = 0; - - if(m_oTotalsRowShown.IsInit()) - ptr1->fShownTotalRow = m_oTotalsRowShown.get(); - else - ptr1->fShownTotalRow = true; - if(m_oAutoFilter.IsInit()) - ptr->m_AUTOFILTER = m_oAutoFilter->toBin(); - if(m_oSortState.IsInit()) - ptr->m_SORTSTATE = m_oSortState->toBin(); - if(m_oTableColumns.IsInit()) - ptr->m_LISTCOLS = m_oTableColumns->toBin(); - if(m_oTableStyleInfo.IsInit()) - ptr->m_BrtTableStyleClient = m_oTableStyleInfo->toBin(); - - if(m_oExtLst.IsInit()) + if(m_oTotalsRowShown.IsInit()) + ptr1->fShownTotalRow = m_oTotalsRowShown.get(); + else + ptr1->fShownTotalRow = false; + ptr1->fSingleCell = false; + if(m_oAutoFilter.IsInit()) + ptr->m_AUTOFILTER = m_oAutoFilter->toBin(); + if(m_oSortState.IsInit()) + ptr->m_SORTSTATE = m_oSortState->toBin(); + if(m_oTableColumns.IsInit()) + ptr->m_LISTCOLS = m_oTableColumns->toBin(); + if(m_oTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oTableStyleInfo->toBin(); + if(m_oExtLst.IsInit()) ptr->m_FRTTABLE = m_oExtLst->toBinTable(); return objectPtr; } From bfaca9d414225e8b0321554334ca54975204d0c8 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 7 Sep 2023 19:27:47 +0600 Subject: [PATCH 081/221] Fix wokkbook binary type --- OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h b/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h index d2a3471bc4..f52d79a2ec 100644 --- a/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h +++ b/OOXML/Binary/XlsbFormat/FileTypes_SpreadsheetBin.h @@ -39,10 +39,10 @@ namespace OOX namespace SpreadsheetBin { namespace FileTypes - { + { const FileType WorkbookBin (L"xl", L"workbook.bin", - L"application/vnd.ms-excel.main", + L"application/vnd.ms-excel.sheet.binary.macroEnabled.main", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"); const FileType SharedStringsBin (L"", L"sharedStrings.bin", From 9ae35fe594dca21527823847870a0450ab504b5a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 7 Sep 2023 19:30:45 +0600 Subject: [PATCH 082/221] Add default values for workbook records --- OOXML/XlsxFormat/Workbook/CalcPr.cpp | 16 ++++--- OOXML/XlsxFormat/Workbook/Workbook.cpp | 11 +++-- OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 56 ++++++++++++++++++------ 3 files changed, 58 insertions(+), 25 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/CalcPr.cpp b/OOXML/XlsxFormat/Workbook/CalcPr.cpp index 8e1cdee0c9..739b5cb9dd 100644 --- a/OOXML/XlsxFormat/Workbook/CalcPr.cpp +++ b/OOXML/XlsxFormat/Workbook/CalcPr.cpp @@ -89,10 +89,16 @@ namespace OOX if(m_oCalcId.IsInit()) ptr->recalcID = m_oCalcId->GetValue(); + else + ptr->recalcID = 0; if(m_oCalcMode.IsInit()) ptr->fAutoRecalc = m_oCalcMode->GetValue(); + else + ptr->fAutoRecalc = 1; if(m_oFullCalcOnLoad.IsInit()) ptr->fFullCalcOnLoad = m_oFullCalcOnLoad->GetValue(); + else + ptr->fFullCalcOnLoad = false; if(m_oRefMode.IsInit()) ptr->fRefA1 = !m_oRefMode->GetValue(); if(m_oIterate.IsInit()) @@ -102,15 +108,15 @@ namespace OOX if(m_oIterateCount.IsInit()) ptr->cCalcCount = m_oIterateCount->GetValue(); else - ptr->cCalcCount = 100; + ptr->cCalcCount = 0; if(m_oIterateDelta.IsInit()) ptr->xnumDelta.data.value = m_oIterateDelta->GetValue(); else - ptr->xnumDelta.data.value = 0.001; + ptr->xnumDelta.data.value = 0; if(m_oFullPrecision.IsInit()) ptr->fFullPrec = m_oFullPrecision->GetValue(); else - ptr->fFullPrec = false; + ptr->fFullPrec = true; if(m_oCalcCompleted.IsInit()) ptr->fSomeUncalced = m_oCalcCompleted->GetValue(); else @@ -118,11 +124,11 @@ namespace OOX if(m_oCalcOnSave.IsInit()) ptr->fSaveRecalc = m_oCalcOnSave->GetValue(); else - ptr->fSaveRecalc = false; + ptr->fSaveRecalc = true; if(m_oConcurrentCalc.IsInit()) ptr->fMTREnabled = m_oConcurrentCalc->GetValue(); else - ptr->fMTREnabled = false; + ptr->fMTREnabled = true; if(m_oConcurrentManualCount.IsInit()) ptr->cUserThreadCount = m_oConcurrentManualCount->GetValue(); else diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index e5a038513d..7ff74a9712 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -280,11 +280,11 @@ namespace OOX { XLSB::WorkBookStreamPtr workBookStream(new XLSB::WorkBookStream); - if (m_oBookViews.IsInit()) - { auto viewPtr(new XLSB::BOOKVIEWS); + if (m_oBookViews.IsInit()) + { + auto viewPtr(new XLSB::BOOKVIEWS); + viewPtr->m_arBrtBookView = m_oBookViews->toBin(); workBookStream->m_BOOKVIEWS = XLS::BaseObjectPtr{viewPtr}; - - viewPtr->m_arBrtBookView = m_oBookViews->toBin(); } if (m_oCalcPr.IsInit()) workBookStream->m_BrtCalcProp = m_oCalcPr->toBin(); @@ -295,9 +295,8 @@ namespace OOX if (m_oSheets.IsInit()) { auto ptr(new XLSB::BUNDLESHS); - XLS::BaseObjectPtr objectPtr(ptr); ptr->m_arBrtBundleSh = m_oSheets->toBin(); - workBookStream->m_BUNDLESHS = objectPtr; + workBookStream->m_BUNDLESHS = XLS::BaseObjectPtr{ptr}; } if (m_oWorkbookPr.IsInit()) workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index 896114150c..c80f937e37 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -96,44 +96,72 @@ namespace OOX if(m_oAllowRefreshQuery.IsInit()) ptr->fNoSaveSup = m_oAllowRefreshQuery->GetValue(); + else + ptr->fNoSaveSup = false; if(m_oAutoCompressPictures.IsInit()) - ptr->fAutoCompressPictures = m_oAutoCompressPictures->GetValue(); + ptr->fAutoCompressPictures = m_oAutoCompressPictures->GetValue(); if(m_oBackupFile.IsInit()) - ptr->fBackup = m_oBackupFile->GetValue(); + ptr->fBackup = m_oBackupFile->GetValue(); + else + ptr->fBackup = false; if(m_oCheckCompatibility.IsInit()) - ptr->fCheckCompat = m_oCheckCompatibility->GetValue(); + ptr->fCheckCompat = m_oCheckCompatibility->GetValue(); + else + ptr->fCheckCompat = false; if(m_oCodeName.IsInit()) ptr->strName.value = m_oCodeName->GetValue(); else ptr->strName.value = false; if(m_oDate1904.IsInit()) - ptr->f1904 = m_oDate1904->GetValue(); + ptr->f1904 = m_oDate1904->GetValue(); + else + ptr->f1904 = false; if(m_oDateCompatibility.IsInit()) - ptr->fNoSaveSup = m_oDateCompatibility->GetValue(); + ptr->fNoSaveSup = m_oDateCompatibility->GetValue(); + else + ptr->fNoSaveSup = false; if(m_oDefaultThemeVersion.IsInit()) ptr->dwThemeVersion = m_oDefaultThemeVersion->GetValue(); else ptr->dwThemeVersion = 0; if(m_oFilterPrivacy.IsInit()) - ptr->fFilterPrivacy = m_oFilterPrivacy->GetValue(); + ptr->fFilterPrivacy = m_oFilterPrivacy->GetValue(); + else + ptr->fFilterPrivacy = false; if(m_oHidePivotFieldList.IsInit()) - ptr->fHidePivotTableFList = m_oHidePivotFieldList->GetValue(); + ptr->fHidePivotTableFList = m_oHidePivotFieldList->GetValue(); + else + ptr->fHidePivotTableFList = false; if(m_oPromptedSolutions.IsInit()) - ptr->fBuggedUserAboutSolution = m_oPromptedSolutions->GetValue(); + ptr->fBuggedUserAboutSolution = m_oPromptedSolutions->GetValue(); + else + ptr->fBuggedUserAboutSolution = false; if(m_oPublishItems.IsInit()) - ptr->fPublishedBookItems = m_oPublishItems->GetValue(); + ptr->fPublishedBookItems = m_oPublishItems->GetValue(); + else + ptr->fPublishedBookItems = false; if(m_oRefreshAllConnections.IsInit()) - ptr->fRefreshAll = m_oRefreshAllConnections->GetValue(); + ptr->fRefreshAll = m_oRefreshAllConnections->GetValue(); + else + ptr->fRefreshAll = false; if(m_oShowBorderUnselectedTables.IsInit()) - ptr->fHideBorderUnselLists = m_oShowBorderUnselectedTables->GetValue(); + ptr->fHideBorderUnselLists = m_oShowBorderUnselectedTables->GetValue(); + else + ptr->fHideBorderUnselLists = false; if(m_oShowInkAnnotation.IsInit()) - ptr->fShowInkAnnotation = m_oShowInkAnnotation->GetValue(); + ptr->fShowInkAnnotation = m_oShowInkAnnotation->GetValue(); if(m_oShowObjects.IsInit()) ptr->mdDspObj = m_oShowObjects->GetValue() ? 1 : 2; + else + ptr->mdDspObj = 0; if(m_oShowPivotChartFilter.IsInit()) - ptr->fShowPivotChartFilter = m_oShowPivotChartFilter->GetValue(); + ptr->fShowPivotChartFilter = m_oShowPivotChartFilter->GetValue(); + else + ptr->fShowPivotChartFilter = false; if(m_oUpdateLinks.IsInit()) - ptr->grbitUpdateLinks = m_oUpdateLinks->GetValue(); + ptr->grbitUpdateLinks = m_oUpdateLinks->GetValue(); + else + ptr->grbitUpdateLinks = 0; return objectPtr; } From daba15e14252b552b4ad8321c7b8fd430eeafd6b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 8 Sep 2023 16:14:24 +0600 Subject: [PATCH 083/221] Fix workbook names conversion --- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 47 ++++++++++++++++------ 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 123b50a443..90c9eb256a 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -78,37 +78,58 @@ namespace OOX XLS::BaseObjectPtr objectPtr(ptr); if(m_oComment.IsInit()) - ptr->comment = m_oComment.get(); + ptr->comment = m_oComment.get(); + else + ptr->comment = 0xFFFFFFFF; if(m_oDescription.IsInit()) - ptr->description = m_oDescription.get(); + ptr->description = m_oDescription.get(); + else + ptr->description = 0xFFFFFFFF; if(m_oFunction.IsInit()) - ptr->fFunc = m_oFunction->GetValue(); + ptr->fFunc = m_oFunction->GetValue(); + else + ptr->fFunc = 0xFFFFFFFF; if(m_oFunctionGroupId.IsInit()) - ptr->fGrp = m_oFunctionGroupId->GetValue(); + ptr->fGrp = m_oFunctionGroupId->GetValue(); + if(m_oHelp.IsInit()) - ptr->helpTopic = m_oHelp.get(); + ptr->helpTopic = m_oHelp.get(); + else + ptr->helpTopic = 0xFFFFFFFF; if(m_oHidden.IsInit()) - ptr->fHidden = m_oHidden->GetValue(); + ptr->fHidden = m_oHidden->GetValue(); if (m_oLocalSheetId.IsInit()) ptr->itab = m_oLocalSheetId->GetValue(); if (m_oName.IsInit()) - ptr->name = m_oName.get(); + ptr->name = m_oName.get(); + else + ptr->name = 0xFFFFFFFF; if (m_oPublishToServer.IsInit()) - ptr->fPublished = m_oPublishToServer->GetValue(); + ptr->fPublished = m_oPublishToServer->GetValue(); if (m_oShortcutKey.IsInit()) - ptr->chKey = std::stoi(m_oShortcutKey.get()); + ptr->chKey = std::stoi(m_oShortcutKey.get()); if (m_oVbProcedure.IsInit()) - ptr->fOB = m_oVbProcedure->GetValue(); + ptr->fOB = m_oVbProcedure->GetValue(); + else + ptr->fOB = false; + if(!ptr->fOB) + ptr->fProc = false; + if(!ptr->fProc) + { + ptr->unusedstring1 = 0xFFFFFFFF; + ptr->unusedstring2 = 0xFFFFFFFF; + } + if (m_oWorkbookParameter.IsInit()) - ptr->fWorkbookParam = m_oWorkbookParameter->GetValue(); + ptr->fWorkbookParam = m_oWorkbookParameter->GetValue(); if (m_oXlm.IsInit()) - ptr->fFutureFunction = m_oXlm->GetValue(); + ptr->fFutureFunction = m_oXlm->GetValue(); if (m_oRef.IsInit()) - ptr->rgce = m_oRef.get(); + ptr->rgce = m_oRef.get(); return objectPtr; } From 6743757a9418853f03b2531547bc92493aedf46b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 8 Sep 2023 16:35:45 +0600 Subject: [PATCH 084/221] Add slicer conversion --- OOXML/XlsxFormat/Slicer/Slicer.cpp | 99 +++++++++++++++++++++++++++--- OOXML/XlsxFormat/Slicer/Slicer.h | 8 +-- 2 files changed, 96 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Slicer/Slicer.cpp b/OOXML/XlsxFormat/Slicer/Slicer.cpp index 4ffeb31420..a187f302c6 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.cpp +++ b/OOXML/XlsxFormat/Slicer/Slicer.cpp @@ -38,6 +38,8 @@ #include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -72,6 +74,14 @@ void CSlicers::fromBin(XLS::BaseObjectPtr& obj) m_oSlicer.push_back(CSlicer(slicer)); } } +XLS::BaseObjectPtr CSlicers::toBin() +{ + auto ptr(new XLSB::SLICERS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSlicer) + ptr->m_arSLICER.push_back(i.toBin()); + return objectPtr; +} void CSlicers::toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const { writer.StartNode(sName); @@ -170,6 +180,55 @@ void CSlicer::fromBin(XLS::BaseObjectPtr& obj) ReadAttributes(ptr->m_BrtBeginSlicer); } } +XLS::BaseObjectPtr CSlicer::toBin() +{ + auto ptr1(new XLSB::SLICER); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSlicer); + ptr1->m_BrtBeginSlicer = XLS::BaseObjectPtr{ptr}; + + if(m_oStartItem.IsInit()) + ptr->dwStartSlicerItem = m_oStartItem.get(); + if(m_oColumnCount.IsInit()) + ptr->dwColumnCount = m_oColumnCount.get(); + if(m_oShowCaption.IsInit()) + ptr->fCaptionVisible = m_oShowCaption.get(); + if(m_oLevel.IsInit()) + ptr->dwLevel = m_oLevel.get(); + if(m_oLockedPosition.IsInit()) + ptr->fLockedPosition = m_oLockedPosition.get(); + if(m_oRowHeight.IsInit()) + ptr->dxRowHeight = m_oRowHeight.get(); + + if(m_oName.IsInit()) + ptr->stName = m_oName.get(); + else if(m_oUid.IsInit()) + ptr->stName = m_oUid.get(); + else + ptr->stName = 0xFFFFFFFF; + + if(m_oCache.IsInit()) + ptr->stSlicerCacheName = m_oCache.get(); + else + ptr->stSlicerCacheName = 0xFFFFFFFF; + if(m_oCaption.IsInit()) + ptr->stCaption = m_oCaption.get(); + else + { + ptr->stCaption = 0xFFFFFFFF; + ptr->fCaptionVisible = false; + ptr->fHasCaption = false; + } + + if(m_oStyle.IsInit()) + ptr->stStyle = m_oStyle.get(); + else + { + ptr->stStyle = 0xFFFFFFFF; + ptr->fHasStyle = false; + } + return objectPtr; +} void CSlicer::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -345,6 +404,15 @@ void CSlicerFile::readBin(const CPath& oPath) } } +XLS::BaseObjectPtr CSlicerFile::WriteBin() const +{ + XLSB::SlicersStreamPtr slicersStream(new XLSB::SlicersStream); + XLS::BaseObjectPtr objectPtr(slicersStream); + if(m_oSlicers.IsInit()) + slicersStream->m_SLICERS = m_oSlicers->toBin(); + return objectPtr; +} + void CSlicerFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -370,18 +438,35 @@ void CSlicerFile::write(const CPath& oPath, const CPath& oDirectory, CContentTyp { if(!m_oSlicers.IsInit()) return; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oSlicers->toXML(sXml, L"slicers"); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oSlicers->toXML(sXml, L"slicers"); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } +const OOX::FileType CSlicerFile::type() const +{ + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::SlicerBin; + } + return OOX::Spreadsheet::FileTypes::Slicer; +} + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Slicer/Slicer.h b/OOXML/XlsxFormat/Slicer/Slicer.h index ad66ce73e0..b605fd4e60 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.h +++ b/OOXML/XlsxFormat/Slicer/Slicer.h @@ -59,6 +59,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -96,6 +97,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -121,6 +123,7 @@ namespace OOX read( oRootPath, oPath ); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -129,10 +132,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::Slicer; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); From e70589f943a43857e281331a0d2004a1d8dfca23 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 11 Sep 2023 18:24:48 +0600 Subject: [PATCH 085/221] Fix default values for workbook definde names --- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 90c9eb256a..688cf789db 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -102,6 +102,8 @@ namespace OOX if (m_oLocalSheetId.IsInit()) ptr->itab = m_oLocalSheetId->GetValue(); + else + ptr->itab = 0xFFFFFFFF; if (m_oName.IsInit()) ptr->name = m_oName.get(); From 8a203f4851cac18babf1fa1c783ebaf23ca9dc30 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 11 Sep 2023 21:30:12 +0600 Subject: [PATCH 086/221] Add slicer Cache conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 37 ++++ OOXML/DocxFormat/Drawing/DrawingExt.h | 1 + OOXML/XlsxFormat/Slicer/SlicerCache.cpp | 243 ++++++++++++++++++++- OOXML/XlsxFormat/Slicer/SlicerCache.h | 19 +- OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 40 ++++ OOXML/XlsxFormat/Slicer/SlicerCacheExt.h | 3 + 6 files changed, 329 insertions(+), 14 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 5a5a714986..8da2a02216 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -687,6 +687,43 @@ namespace OOX } return objectPtr; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinSlicerCache() + { + auto ptr(new XLSB::FRTSLICERCACHE); + XLS::BaseObjectPtr objectPtr(ptr); + if (!m_arrExt.empty()) + { + for(auto i:m_arrExt) + { + if(i->m_sUri == L"{03082B11-2C62-411c-B77F-237D8FCFBE4C}") + { + auto ptr1(new XLSB::SLICERCACHEBOOKPIVOTTABLES); + ptr->m_SLICERCACHEBOOKPIVOTTABLES = XLS::BaseObjectPtr{ptr1}; + auto ptr2(new XLSB::SlicerCacheBookPivotTables); + ptr1->m_BrtSlicerCacheBookPivotTables = XLS::BaseObjectPtr{ptr2}; + for(auto j:i->m_oSlicerCachePivotTables) + { + XLSB::SlicerCachePivotTable table; + j->toBin(&table); + ptr2->pivotTables.push_back(table); + } + } + if(i->m_sUri == L"{2F2917AC-EB37-4324-AD4E-5DD8C200BD13}") + { + auto ptr1(new XLSB::TABLESLICERCACHE); + ptr->m_TABLESLICERCACHE = XLS::BaseObjectPtr{ptr1}; + ptr1->m_BrtBeginTableSlicerCache = i->m_oTableSlicerCache->toBin(); + } + if(i->m_sUri == L"{470722E0-AACD-4C17-9CDC-17EF765DBC7E}") + { + auto ptr1(new XLSB::SLICERCACHECROSSFILTEREXT); + ptr->m_SLICERCACHECROSSFILTEREXT = XLS::BaseObjectPtr{ptr1}; + ptr1->m_BrtSlicerCacheHideItemsWithNoData = i->m_oSlicerCacheHideItemsWithNoData->toBin(); + } + } + } + return objectPtr; + } XLS::BaseObjectPtr COfficeArtExtensionList::toBinTable() { auto ptr(new XLSB::FRTTABLE); diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index 0a0206890c..2ca7f126c2 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -191,6 +191,7 @@ namespace OOX XLS::BaseObjectPtr toBinWorkBook(); XLS::BaseObjectPtr toBinStyles(); XLS::BaseObjectPtr toBinTable(); + XLS::BaseObjectPtr toBinSlicerCache(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Slicer/SlicerCache.cpp b/OOXML/XlsxFormat/Slicer/SlicerCache.cpp index 092ffb02e9..2f437cfa67 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCache.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCache.cpp @@ -59,6 +59,7 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { namespace Spreadsheet @@ -77,6 +78,23 @@ void COlapSlicerCacheItem::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr COlapSlicerCacheItem::toBin() +{ + auto ptr(new XLSB::SlicerCacheOlapItem); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oNd.IsInit()) + ptr->fNoData = m_oNd.get(); + if(m_oN.IsInit()) + ptr->stName = m_oN.get(); + else + ptr->stName = 0xFFFFFFFF; + if(m_oC.IsInit()) + ptr->stTitle = m_oC.get(); + for(auto i:m_oP) + if(i.m_oN.IsInit()) + ptr->parents.push_back(i.m_oN.get()); + return objectPtr; +} void COlapSlicerCacheItem::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -256,6 +274,19 @@ void COlapSlicerCacheItemParent::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReade } pReader->Seek(_end_rec); } +XLS::BaseObjectPtr COlapSlicerCacheRange::toBin() +{ + auto ptr(new XLSB::SLICERCACHESIRANGE); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oStartItem.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerCacheSiRange); + ptr1->iitemstart = m_oStartItem.get(); + } + for(auto i:m_oI) + ptr->m_arBrtSlicerCacheOlapItem.push_back(i.toBin()); + return objectPtr; +} void COlapSlicerCacheRange::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -372,6 +403,17 @@ void CTabularSlicerCacheItem::fromBin(XLS::BiffStructure& obj) { ReadAttributes(obj); } +void CTabularSlicerCacheItem::toBin(XLS::BiffStructure *obj) +{ + auto ptr = static_cast(obj); + + if(m_oX.IsInit()) + ptr->iCache = m_oX.get(); + if(m_oS.IsInit()) + ptr->fSelected = m_oS.get(); + if(m_oNd.IsInit()) + ptr->fNoData = m_oNd.get(); +} void CTabularSlicerCacheItem::ReadAttributes(XLS::BiffStructure& obj) { auto ptr = static_cast(&obj); @@ -473,6 +515,13 @@ void COlapSlicerCacheSelection::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr COlapSlicerCacheSelection::toBin() +{ + auto ptr(new XLSB::SlicerCacheSelection); + XLS::BaseObjectPtr objectPtr(ptr); + + return objectPtr; +} void COlapSlicerCacheSelection::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -590,6 +639,38 @@ void COlapSlicerCacheLevelData::fromBin(XLS::BaseObjectPtr& obj) } } } +XLS::BaseObjectPtr COlapSlicerCacheLevelData::toBin() +{ + auto ptr(new XLSB::SLICERCACHELEVELDATA); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerCacheLevelData); + ptr->m_BrtBeginSlicerCacheLevelData = XLS::BaseObjectPtr{ptr1}; + + if(m_oCount.IsInit()) + ptr1->citem = m_oCount.get(); + if(m_oSortOrder.IsInit()) + ptr1->fSortOrder = m_oSortOrder->GetValue(); + if(m_oUniqueName.IsInit()) + ptr1->stUniqueName = m_oUniqueName.get(); + else + ptr1->stUniqueName = 0xFFFFFFFF; + if(m_oSourceCaption.IsInit()) + ptr1->stSourceCaption = m_oSourceCaption.get(); + else + ptr1->stSourceCaption = 0xFFFFFFFF; + if(m_oCrossFilter.IsInit()) + ptr1->fCrossFilter = m_oCrossFilter->GetValue(); + if(!m_oRanges.empty()) + { + auto ptr2(new XLSB::SLICERCACHESIRANGES); + ptr->m_SLICERCACHESIRANGES = XLS::BaseObjectPtr{ptr2}; + for(auto i:m_oRanges) + { + ptr2->m_arSLICERCACHESIRANGE.push_back(i.toBin()); + } + } + return objectPtr; +} void COlapSlicerCacheLevelData::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -763,7 +844,20 @@ void CTabularSlicerCacheItems::fromBin(XLS::BaseObjectPtr& obj) } } } - +XLS::BaseObjectPtr CTabularSlicerCacheItems::toBin() +{ + auto ptr(new XLSB::SlicerCacheNativeItem); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCount.IsInit()) + ptr->cItems = m_oCount.get(); + for(auto i:m_oI) + { + XLSB::SlicerCacheNativeItemStruct object; + i.toBin(&object); + ptr->rgItems.push_back(object); + } + return objectPtr; +} void CTabularSlicerCacheItems::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -853,7 +947,14 @@ void CTabularSlicerCacheItems::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) } pReader->Seek(_end_rec); } - +XLS::BaseObjectPtr COlapSlicerCacheSelections::toBin() +{ + auto ptr(new XLSB::SLICERCACHESELECTIONS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSelection) + ptr->m_arBrtSlicerCacheSelection.push_back(i.toBin()); + return objectPtr; +} void COlapSlicerCacheSelections::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -975,6 +1076,17 @@ void COlapSlicerCacheLevelsData::fromBin(XLS::BaseObjectPtr& obj) } } +XLS::BaseObjectPtr COlapSlicerCacheLevelsData::toBin() +{ + auto ptr(new XLSB::SLICERCACHELEVELSDATA); + XLS::BaseObjectPtr objectPtr(ptr); + if(!m_oLevel.empty()) + { + for(auto i:m_oLevel) + ptr->m_arSLICERCACHELEVELDATA.push_back(i.toBin()); + } + return objectPtr; +} void COlapSlicerCacheLevelsData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -1075,6 +1187,26 @@ void CTabularSlicerCache::fromBin(XLS::BaseObjectPtr& obj) m_oItems = ptr->m_BrtSlicerCacheNativeItem; } } +XLS::BaseObjectPtr CTabularSlicerCache::toBin() +{ + auto ptr(new XLSB::SLICERCACHENATIVEITEMS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerCacheNative); + ptr->m_BrtSlicerCacheNativeItem = XLS::BaseObjectPtr{ptr1}; + if(m_oPivotCacheId.IsInit()) + ptr1->dwcacheId = m_oPivotCacheId.get(); + if(m_oSortOrder.IsInit()) + ptr1->fSortOrder = m_oSortOrder->GetValue() + 1; + if(m_oCustomListSort.IsInit()) + ptr1->fSortUsingCustomLists = m_oCustomListSort.get(); + if(m_oShowMissing.IsInit()) + ptr1->fShowAllItems = m_oShowMissing.get(); + if(m_oCrossFilter.IsInit()) + ptr1->fCrossFilter = m_oCrossFilter->GetValue(); + + ptr->m_BrtSlicerCacheNativeItem = m_oItems->toBin(); + return objectPtr; +} void CTabularSlicerCache::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1227,6 +1359,22 @@ void COlapSlicerCache::fromBin(XLS::BaseObjectPtr& obj) m_oSelections = ptr->m_SLICERCACHESELECTIONS; } } +XLS::BaseObjectPtr COlapSlicerCache::toBin() +{ + auto ptr(new XLSB::SLICERCACHEOLAPIMPL); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oPivotCacheId.IsInit()) + { + auto ptr1(new XLSB::BeginSlicerCacheOlapImpl); + ptr->m_BrtBeginSlicerCacheOlapImpl = XLS::BaseObjectPtr{ptr1}; + ptr1->ipivotcacheid = m_oPivotCacheId.get(); + } + if(m_oLevels.IsInit()) + ptr->m_SLICERCACHELEVELSDATA = m_oLevels->toBin(); + if(m_oSelections.IsInit()) + ptr->m_SLICERCACHESELECTIONS = m_oSelections->toBin(); + return objectPtr; +} void COlapSlicerCache::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1343,6 +1491,15 @@ void CSlicerCacheData::fromBin(XLS::BaseObjectPtr& obj) m_oTabular = obj; } } +XLS::BaseObjectPtr CSlicerCacheData::toBin() +{ + XLS::BaseObjectPtr objectPtr; + if(m_oOlap.IsInit()) + objectPtr = m_oOlap->toBin(); + else if(m_oTabular.IsInit()) + objectPtr = m_oTabular->toBin(); + return objectPtr; +} void CSlicerCacheData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -1435,7 +1592,16 @@ void CSlicerCachePivotTable::ReadAttributes(XLS::BiffStructure& obj) m_oName = ptr->stPivotTable.value(); } } - +void CSlicerCachePivotTable::toBin(XLS::BiffStructure* obj) +{ + auto ptr = static_cast(obj); + if(m_oTabId.IsInit()) + ptr->iTabId = m_oTabId.get(); + if(m_oName.IsInit()) + ptr->stPivotTable = m_oName.get(); + else + ptr->stPivotTable = 0xFFFFFFFF; +} void CSlicerCachePivotTable::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -1529,6 +1695,38 @@ void CSlicerCacheDefinition::fromBin(XLS::BaseObjectPtr& obj) m_oExtLst = ptr->m_FRTSLICERCACHE; } } +XLS::BaseObjectPtr CSlicerCacheDefinition::toBin() +{ + auto ptr(new XLSB::SLICERCACHE); + auto ptr1(new XLSB::BeginSlicerCacheDef); + ptr->m_BrtBeginSlicerCacheDef = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + else + ptr1->stName = 0xFFFFFFFF; + if(m_oSourceName.IsInit()) + ptr1->stHierarchy = m_oSourceName.get(); + else + ptr1->stHierarchy = 0xFFFFFFFF; + if(!m_oPivotTables.empty()) + { + auto ptr2(new XLSB::SlicerCachePivotTables); + ptr->m_BrtSlicerCachePivotTables = XLS::BaseObjectPtr{ptr2}; + for(auto i:m_oPivotTables) + { + XLSB::SlicerCachePivotTable table; + i.toBin(&table); + ptr2->pivotTables.push_back(table); + } + } + if(m_oData.IsInit()) + ptr->m_slicerCacheData = m_oData->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTSLICERCACHE = m_oExtLst->toBinSlicerCache(); + + return objectPtr; +} void CSlicerCacheDefinition::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1769,7 +1967,15 @@ void CSlicerCacheFile::readBin(const CPath& oPath) //slicerCachesStream.reset(); } } +XLS::BaseObjectPtr CSlicerCacheFile::WriteBin() const +{ + XLSB::SlicerCachesStreamPtr slicerCachesStream(new XLSB::SlicerCachesStream); + XLS::BaseObjectPtr objectPtr(slicerCachesStream); + if(m_oSlicerCacheDefinition.IsInit()) + slicerCachesStream->m_SLICERCACHE = m_oSlicerCacheDefinition->toBin(); + return objectPtr; +} void CSlicerCacheFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -1796,18 +2002,35 @@ void CSlicerCacheFile::write(const CPath& oPath, const CPath& oDirectory, CConte { if(!m_oSlicerCacheDefinition.IsInit()) return; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { + NSStringUtils::CStringBuilder sXml; - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oSlicerCacheDefinition->toXML(sXml, L"slicerCacheDefinition"); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oSlicerCacheDefinition->toXML(sXml, L"slicerCacheDefinition"); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } +const OOX::FileType CSlicerCacheFile::type() const +{ + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::SlicerCacheBin; + } + return OOX::Spreadsheet::FileTypes::SlicerCache; +} + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Slicer/SlicerCache.h b/OOXML/XlsxFormat/Slicer/SlicerCache.h index b44b6ceb29..595e0e39cc 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCache.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCache.h @@ -97,6 +97,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -125,6 +126,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -151,6 +153,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); void ReadAttributes(XLS::BiffStructure& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -177,6 +180,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -203,6 +207,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -234,6 +239,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -260,6 +266,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -285,6 +292,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const{} virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -312,6 +320,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -344,6 +353,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -373,6 +383,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -397,6 +408,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); void ReadAttributes(XLS::BiffStructure& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -423,6 +435,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -455,6 +468,7 @@ namespace OOX read( oRootPath, oPath ); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -463,10 +477,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::SlicerCache; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index fd569e5852..0318146d80 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -66,6 +66,16 @@ void CSlicerCacheOlapLevelName::fromBin(XLS::BiffStructure& obj) { ReadAttributes(obj); } +void CSlicerCacheOlapLevelName::toBin(XLS::BiffStructure* obj) +{ + auto ptr = static_cast(obj); + if(m_oCount.IsInit()) + ptr->cHiddenItems = m_oCount.get(); + if(m_oUniqueName.IsInit()) + ptr->stUniqueName = m_oUniqueName.get(); + else + ptr->stUniqueName = 0xFFFFFFFF; +} void CSlicerCacheOlapLevelName::ReadAttributes(XLS::BiffStructure& obj) { auto ptr = static_cast(&obj); @@ -161,6 +171,20 @@ void CSlicerCacheHideNoData::fromBin(XLS::BaseObjectPtr &obj) } } +XLS::BaseObjectPtr CSlicerCacheHideNoData::toBin() +{ + auto ptr(new XLSB::SlicerCacheHideItemsWithNoData); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCount.IsInit()) + ptr->cHideItemLevelsCount = m_oCount.get(); + for(auto i:m_oSlicerCacheOlapLevelName) + { + XLSB::SlicerCacheLevelData levelData; + i.toBin(&levelData); + ptr->rgLevels.push_back(levelData); + } + return objectPtr; +} void CSlicerCacheHideNoData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_StartChar_No_NS(oReader) @@ -254,6 +278,22 @@ void CTableSlicerCache::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); } +XLS::BaseObjectPtr CTableSlicerCache::toBin() +{ + auto ptr(new XLSB::BeginTableSlicerCache); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oTableId.IsInit()) + ptr->dwLstd = m_oTableId.get(); + if(m_oColumn.IsInit()) + ptr->dwColumn = m_oColumn.get(); + if(m_oSortOrder.IsInit()) + ptr->fSortOrder = m_oSortOrder->GetValue() + 1; + if(m_oCustomListSort.IsInit()) + ptr->fSortUsingCustomLists = m_oCustomListSort.get(); + if(m_oCrossFilter.IsInit()) + ptr->iCrossFilter = m_oCrossFilter->GetValue(); + return objectPtr; +} void CTableSlicerCache::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h index 3fe7869c64..a56af42276 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h @@ -72,6 +72,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BiffStructure& obj); + void toBin(XLS::BiffStructure* obj); void ReadAttributes(XLS::BiffStructure& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -98,6 +99,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; virtual void fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader); @@ -124,6 +126,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; From 7cee2951e8e22996df5874e471c5b182ab8c91a9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 12 Sep 2023 19:23:31 +0600 Subject: [PATCH 087/221] Fix slicers conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 5 +++++ OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 8da2a02216..986cae641d 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -773,6 +773,11 @@ namespace OOX { ptr->m_SLICERSEX = i->m_oSlicerList->toBin(); } + else if(i->m_sUri == L"{3A4CF648-6AED-40f4-86FF-DC5316D8AED3}") + { + if(i->m_oSlicerListExt.IsInit()) + ptr->m_SLICERSEX = i->m_oSlicerListExt->toBin(); + } } return objectPtr; } diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 0318146d80..46faf77b86 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -627,7 +627,7 @@ XLS::BaseObjectPtr CSlicerRef::toBin() XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::BeginSlicerEx); ptr1->FRTheader.relID.relId = m_oRId->GetValue(); - + ptr->m_BrtBeginSlicerEx = XLS::BaseObjectPtr{ptr1}; return objectPtr; } From adcfe318323933a99f7afcf07dc3f28a6cd7c3fe Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 15 Sep 2023 19:26:02 +0600 Subject: [PATCH 088/221] Add pivot tables conversion --- OOXML/XlsxFormat/Pivot/PivotTable.h | 107 +-- OOXML/XlsxFormat/Pivot/Pivots.cpp | 965 ++++++++++++++++++++++++++-- 2 files changed, 960 insertions(+), 112 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/PivotTable.h b/OOXML/XlsxFormat/Pivot/PivotTable.h index 8c0c732877..52b26642f9 100644 --- a/OOXML/XlsxFormat/Pivot/PivotTable.h +++ b/OOXML/XlsxFormat/Pivot/PivotTable.h @@ -101,6 +101,7 @@ namespace OOX WritingStringNullableAttrInt(L"v", m_oV, m_oV->GetValue()); writer.WriteString(L"/>"); } + XLS::BaseObjectPtr toBinPrfItem(); void fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -176,7 +177,7 @@ namespace OOX CField(){} virtual ~CField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -204,7 +205,7 @@ namespace OOX WritingElement_ReadAttributes_ReadSingle ( oReader, L"x", m_oX ) WritingElement_ReadAttributes_End( oReader ) } - + nullable_int m_oX; }; class CColumnRowFields : public WritingElementWithChilds @@ -214,7 +215,7 @@ namespace OOX WritingElement_XlsbConstructors(CColumnRowFields) CColumnRowFields(){} virtual ~CColumnRowFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -226,6 +227,8 @@ namespace OOX void toXML2(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinRows(); + XLS::BaseObjectPtr toBinCols(); virtual EElementType getType () const { return et_x_ColumnRowFields; @@ -241,7 +244,7 @@ namespace OOX WritingElement_XlsbConstructors(CDataField) CDataField(){} virtual ~CDataField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -252,13 +255,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_DataField; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_int m_oBaseField; nullable m_oBaseItem; nullable m_oFld; @@ -276,7 +280,7 @@ namespace OOX WritingElement_XlsbConstructors(CDataFields) CDataFields(){} virtual ~CDataFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -287,6 +291,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_DataFields; @@ -302,7 +307,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageField) CPageField(){} virtual ~CPageField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -313,13 +318,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageField; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_int m_oFld; nullable_int m_oHier; nullable m_oItem; @@ -335,7 +341,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageFields) CPageFields(){} virtual ~CPageFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -346,6 +352,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageFields; @@ -361,7 +368,7 @@ namespace OOX WritingElement_XlsbConstructors(CFieldItem) CFieldItem(){} virtual ~CFieldItem() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -372,13 +379,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_FieldItem; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_bool m_oChild; nullable_bool m_oExpanded; nullable_bool m_oDrillAcross; @@ -399,7 +407,7 @@ namespace OOX WritingElement_XlsbConstructors(CFieldItems) CFieldItems(){} virtual ~CFieldItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -410,12 +418,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_FieldItems; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oCount; }; class CReference : public WritingElement @@ -425,7 +434,7 @@ namespace OOX WritingElement_XlsbConstructors(CReference) CReference(){} virtual ~CReference() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -436,13 +445,15 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_Reference; } + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_bool m_oAvgSubtotal; nullable_bool m_oByPosition; nullable_bool m_oCountASubtotal; @@ -471,7 +482,7 @@ namespace OOX WritingElement_XlsbConstructors(CReferences) CReferences(){} virtual ~CReferences() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -482,12 +493,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_References; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oCount; }; class CPivotArea : public WritingElement @@ -497,7 +509,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotArea) CPivotArea(){} virtual ~CPivotArea() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -508,10 +520,12 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotArea; } + XLS::BaseObjectPtr writeAttribures(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -538,7 +552,7 @@ namespace OOX WritingElement_XlsbConstructors(CAutoSortScope) CAutoSortScope(){} virtual ~CAutoSortScope() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -549,12 +563,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_AutoSortScope; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader){} - + nullable m_oPivotArea; }; class CPivotField : public WritingElement @@ -564,7 +579,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotField) CPivotField(){} virtual ~CPivotField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -575,13 +590,15 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotField; } void ReadAttributes(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable_bool m_oAllDrilled; nullable_bool m_oAutoShow; nullable_bool m_oAvgSubtotal; @@ -630,7 +647,7 @@ namespace OOX nullable_string m_oUniqueMemberProperty; nullable_bool m_oVarPSubtotal; nullable_bool m_oVarSubtotal; - + nullable m_oAutoSortScope; nullable m_oItems; nullable m_oExtLst; @@ -642,7 +659,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotFields) CPivotFields(){} virtual ~CPivotFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -653,6 +670,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotFields; @@ -668,7 +686,7 @@ namespace OOX WritingElement_XlsbConstructors(CColumnRowItem) CColumnRowItem(){} virtual ~CColumnRowItem() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -679,17 +697,18 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_ColumnRowItem; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - + nullable m_oI; nullable m_oR; nullable m_oT; - }; + }; class CColumnRowItems : public WritingElementWithChilds { public: @@ -697,7 +716,7 @@ namespace OOX WritingElement_XlsbConstructors(CColumnRowItems) CColumnRowItems(){} virtual ~CColumnRowItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -709,6 +728,8 @@ namespace OOX void toXML2(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBinRows(); + XLS::BaseObjectPtr toBinCols(); virtual EElementType getType () const { return et_x_ColumnRowItems; @@ -724,7 +745,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableFormat) CPivotTableFormat(){} virtual ~CPivotTableFormat() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -735,6 +756,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableFormat; @@ -744,7 +766,7 @@ namespace OOX nullable m_oAction; nullable m_oDxfId; - + nullable m_oPivotArea; nullable m_oExtLst; }; @@ -755,7 +777,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableFormats) CPivotTableFormats(){} virtual ~CPivotTableFormats() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -766,6 +788,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableFormats; @@ -781,7 +804,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableStyleInfo) CPivotTableStyleInfo(){} virtual ~CPivotTableStyleInfo() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -797,6 +820,7 @@ namespace OOX if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -823,7 +847,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotTableLocation) CPivotTableLocation(){} virtual ~CPivotTableLocation() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -840,6 +864,7 @@ namespace OOX return; } void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableLocation; @@ -876,12 +901,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotTableDefinition; } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr writeAttributes(); //---------- nullable m_oColFields; nullable m_oColItems; @@ -961,11 +988,11 @@ namespace OOX nullable_bool m_oUseAutoFormatting; nullable_string m_oVacatedStyle; nullable_bool m_oVisualTotals; - + nullable m_oCreatedVersion; nullable m_oMinRefreshableVersion; nullable m_oUpdatedVersion; - + nullable m_oDataPosition; nullable m_oAutoFormatId; nullable m_oCacheId; @@ -980,7 +1007,7 @@ namespace OOX CPivotTableFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) { m_bSpreadsheets = true; - + m_pData = NULL; m_nDataLength = 0; } @@ -1011,12 +1038,10 @@ namespace OOX memcpy(m_pData, pData, length); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::PivotTable; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 892ed777ee..309b086bbe 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -131,6 +131,8 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../ComplexTypes_Spreadsheet.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -148,7 +150,7 @@ namespace Spreadsheet xlsb->ReadBin(oPath, pivotTableStream.get()); if (pivotTableStream != nullptr) - { + { //XLS::BaseObjectPtr ptr(static_cast(pivotTableStream.get()), NullDeleter()); //XLS::BaseObjectPtr ptr = boost::make_shared(static_cast(pivotTableStream.get())); m_oPivotTableDefinition = pivotTableStream; @@ -157,6 +159,10 @@ namespace Spreadsheet //pivotTableStream.reset(); } } + XLS::BaseObjectPtr CPivotTableFile::WriteBin() const + { + return m_oPivotTableDefinition->toBin(); + } void CPivotTableFile::read(const CPath& oRootPath, const CPath& oPath) { @@ -181,30 +187,44 @@ namespace Spreadsheet } void CPivotTableFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - if(m_oPivotTableDefinition.IsInit()) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oPivotTableDefinition->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } - else if(m_nDataLength > 0 && m_pData) + else { - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(m_pData, m_nDataLength); - oFile.CloseFile(); + if(m_oPivotTableDefinition.IsInit()) + { + NSStringUtils::CStringBuilder sXml; - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + sXml.WriteString(L""); + m_oPivotTableDefinition->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } + else if(m_nDataLength > 0 && m_pData) + { + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); + oFile.WriteFile(m_pData, m_nDataLength); + oFile.CloseFile(); + } } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); } + const OOX::FileType CPivotTableFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::PivotTableBin; + } + return OOX::Spreadsheet::FileTypes::PivotTable; + } //------------------------------------ void CPivotTableDefinition::toXML(NSStringUtils::CStringBuilder& writer) const { @@ -284,7 +304,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"updatedVersion", m_oUpdatedVersion, m_oUpdatedVersion->GetValue()); WritingStringNullableAttrBool2(L"useAutoFormatting", m_oUseAutoFormatting); WritingStringNullableAttrBool2(L"visualTotals", m_oVisualTotals); - + writer.WriteString(L">"); if(m_oLocation.IsInit()) @@ -293,7 +313,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oPivotFields.IsInit()) m_oPivotFields->toXML(writer); if(m_oRowFields.IsInit()) - m_oRowFields->toXML2(writer, L"rowFields"); + m_oRowFields->toXML2(writer, L"rowFields"); if(m_oRowItems.IsInit()) m_oRowItems->toXML2(writer, L"rowItems"); if(m_oColFields.IsInit()) @@ -304,7 +324,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oPageFields->toXML(writer); if(m_oDataFields.IsInit()) m_oDataFields->toXML(writer); - + if(m_oFormats.IsInit()) m_oFormats->toXML(writer); //if(m_oConditionalFormats.IsInit()) @@ -322,7 +342,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" // m_oRowHierarchiesUsage->toXML(writer); //if(m_oColHierarchiesUsage.IsInit()) // m_oColHierarchiesUsage->toXML(writer); - + if(m_oExtLst.IsInit()) { writer.WriteString(m_oExtLst->toXMLWithNS(_T(""))); @@ -361,6 +381,149 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (L"extLst" == sName) m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotTableDefinition::toBin() + { + auto ptr(new XLSB::PivotTableStream); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginSXView = writeAttributes(); + if(m_oLocation.IsInit()) + ptr->m_SXLOCATION = m_oLocation->toBin(); + if(m_oPivotFields.IsInit()) + ptr->m_SXVDS = m_oPivotFields->toBin(); + if(m_oRowFields.IsInit()) + ptr->m_ISXVDRWS = m_oRowFields->toBinRows(); + if(m_oColFields.IsInit()) + ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); + if(m_oRowItems.IsInit()) + ptr->m_SXLIRWS = m_oRowItems->toBinRows(); + if(m_oColItems.IsInit()) + ptr->m_SXLICOLS = m_oColItems->toBinCols(); + + if(m_oDataFields.IsInit()) + ptr->m_SXDIS = m_oDataFields->toBin(); + if(m_oFormats.IsInit()) + ptr->m_SXFORMATS = m_oFormats->toBin(); + if(m_oPivotTableStyleInfo.IsInit()) + ptr->m_BrtTableStyleClient = m_oPivotTableStyleInfo->toBin(); + if(m_oPageFields.IsInit()) + ptr->m_SXPIS = m_oPageFields->toBin(); + + return objectPtr; + } + XLS::BaseObjectPtr CPivotTableDefinition::writeAttributes() + { + auto ptr(new XLSB::BeginSXView); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oApplyAlignmentFormats.IsInit()) + ptr->ibitAtrAlc = m_oApplyAlignmentFormats.get(); + if (m_oApplyBorderFormats.IsInit()) + ptr->ibitAtrBdr = m_oApplyBorderFormats.get(); + if (m_oApplyFontFormats.IsInit()) + ptr->ibitAtrFnt = m_oApplyFontFormats.get(); + if (m_oApplyNumberFormats.IsInit()) + ptr->ibitAtrNum = m_oApplyNumberFormats.get(); + if (m_oApplyPatternFormats.IsInit()) + ptr->ibitAtrPat = m_oApplyPatternFormats.get(); + if (m_oApplyWidthHeightFormats.IsInit()) + ptr->ibitAtrProt = m_oApplyWidthHeightFormats.get(); + if (m_oApplyAlignmentFormats.IsInit()) + ptr->ibitAtrAlc = m_oApplyAlignmentFormats.get(); + + if (m_oAsteriskTotals.IsInit()) + ptr->fHideTotAnnotation = m_oAsteriskTotals.get(); + if (m_oVisualTotals.IsInit()) + ptr->fNotVisualTotals = m_oVisualTotals.get(); + if (m_oAutoFormatId.IsInit()) + ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + if (m_oCacheId.IsInit()) + ptr->idCache = m_oCacheId->GetValue(); + if (m_oChartFormat.IsInit()) + ptr->dwCrtFmtId = m_oChartFormat->GetValue(); + if (m_oColGrandTotals.IsInit()) + ptr->fColGrand = m_oColGrandTotals.get(); + + if (m_oColHeaderCaption.IsInit()) ptr->irstColHdrName = m_oColHeaderCaption.get(); + else + ptr->fUseColHdrName = false; + if (m_oCompact.IsInit()) ptr->fDefaultCompact = m_oCompact.get(); + if (m_oCompactData.IsInit()) ptr->fCompactData = m_oCompactData.get(); + if (m_oCreatedVersion.IsInit()) ptr->bVerSxMacro = m_oCreatedVersion->GetValue(); + if (m_oCustomListSort.IsInit()) ptr->fDontUseCustomLists = !m_oCustomListSort.get(); + if (m_oDataCaption.IsInit()) ptr->irstData = m_oDataCaption.get(); + else + ptr->irstData = 0xFFFFFFFF; + if (m_oDataOnRows.IsInit()) ptr->fDefaultCompact = m_oDataOnRows.get(); + if (m_oDataPosition.IsInit()) ptr->ipos4Data = m_oDataPosition->GetValue(); + if (m_oDisableFieldList.IsInit()) ptr->fDisableFList = m_oDisableFieldList.get(); + if (m_oEditData.IsInit()) ptr->fEnableDataEd = m_oEditData.get(); + if (m_oEnableDrill.IsInit()) ptr->fEnableDrilldown = m_oEnableDrill.get(); + if (m_oEnableFieldProperties.IsInit()) ptr->fEnableFieldDialog = m_oEnableFieldProperties.get(); + if (m_oEnableWizard.IsInit()) ptr->fEnableWizard = m_oEnableWizard.get(); + if (m_oErrorCaption.IsInit()) ptr->irstErrorString = m_oErrorCaption.get(); + else + ptr->fEmptyDisplayErrorString = true; + if (m_oFieldListSortAscending.IsInit()) ptr->fNonDefaultSortInFlist = m_oFieldListSortAscending.get(); + if (m_oFieldPrintTitles.IsInit()) ptr->fPrintTitles = m_oFieldPrintTitles.get(); + if (m_oGrandTotalCaption.IsInit()) ptr->irstGrand = m_oGrandTotalCaption.get(); + else + ptr->fDisplayGrand = false; + if (m_oGridDropZones.IsInit()) ptr->fNewDropZones = !m_oGridDropZones.get(); + if (m_oImmersive.IsInit()) ptr->fTurnOffImmersive = m_oImmersive.get(); + if (m_oIndent.IsInit()) ptr->cIndentInc = m_oIndent->GetValue(); + if (m_oItemPrintTitles.IsInit()) ptr->fRepeatItemsOnEachPrintedPage = m_oItemPrintTitles.get(); + if (m_oMdxSubqueries.IsInit()) ptr->fDefaultCompact = m_oMdxSubqueries.get(); + if (m_oMergeItem.IsInit()) ptr->fMergeLabels = m_oMergeItem.get(); + if (m_oMinRefreshableVersion.IsInit()) ptr->bVerSxUpdateableMin = m_oMinRefreshableVersion->GetValue(); + if (m_oMissingCaption.IsInit()) ptr->irstNullString = m_oMissingCaption.get(); + else + ptr->fEmptyDisplayNullString = true; + if (m_oMultipleFieldFilters.IsInit()) ptr->fSingleFilterPerField = !m_oMultipleFieldFilters.get(); + if (m_oName.IsInit()) ptr->irstName = m_oName.get(); + else + ptr->irstName = 0xFFFFFFFF; + if (m_oOutline.IsInit()) ptr->fDefaultOutline = m_oOutline.get(); + if (m_oOutlineData.IsInit()) ptr->fOutlineData = m_oOutlineData.get(); + if (m_oPageOverThenDown.IsInit()) ptr->fAcrossPageLay = m_oPageOverThenDown.get(); + if (m_oPageStyle.IsInit()) ptr->irstPageFieldStyle = m_oPageStyle.get(); + else + ptr->fDisplayPageFieldStyle = false; + if (m_oPageWrap.IsInit()) ptr->cWrapPage = m_oPageWrap->GetValue(); + if (m_oPivotTableStyle.IsInit()) ptr->irstTableStyle = m_oPivotTableStyle.get(); + else + ptr->fDisplayTableStyle = false; + if (m_oPreserveFormatting.IsInit()) ptr->fPreserveFormatting = m_oPreserveFormatting.get(); + if (m_oPrintDrill.IsInit()) ptr->fPrintDrillIndicators = m_oPrintDrill.get(); + if (m_oPublished.IsInit()) ptr->fPublished = m_oPublished.get(); + if (m_oRowGrandTotals.IsInit()) ptr->fRwGrand = m_oRowGrandTotals.get(); + if (m_oRowHeaderCaption.IsInit()) ptr->irstRwHdrName = m_oRowHeaderCaption.get(); + else + ptr->fUseRwHdrName = false; + if (m_oShowCalcMbrs.IsInit()) ptr->fNotViewCalculatedMembers = !m_oShowCalcMbrs.get(); + if (m_oShowDataDropDown.IsInit()) ptr->fHideDDData = !m_oShowDataDropDown.get(); + if (m_oShowDataTips.IsInit()) ptr->fNoPivotTips = !m_oShowDataTips.get(); + if (m_oShowDrill.IsInit()) ptr->fHideDrillIndicators = !m_oShowDrill.get(); + if (m_oShowDropZones.IsInit()) ptr->fNoStencil = !m_oShowDropZones.get(); + if (m_oShowEmptyCol.IsInit()) ptr->fIncludeEmptyCol = m_oShowEmptyCol.get(); + if (m_oShowEmptyRow.IsInit()) ptr->fIncludeEmptyRw = m_oShowEmptyRow.get(); + if (m_oShowError.IsInit()) ptr->fDisplayErrorString = m_oShowError.get(); + if (m_oShowHeaders.IsInit()) ptr->fNoHeaders = !m_oShowHeaders.get(); + if (m_oShowItems.IsInit()) ptr->fDisplayImmediateItems = m_oShowItems.get(); + if (m_oShowMemberPropertyTips.IsInit()) ptr->fMemPropsInTips = m_oShowMemberPropertyTips.get(); + if (m_oShowMissing.IsInit()) ptr->fDisplayNullString = m_oShowMissing.get(); + if (m_oShowMultipleLabel.IsInit()) ptr->fPageMultipleItemLabel = m_oShowMultipleLabel.get(); + if (m_oSubtotalHiddenItems.IsInit()) ptr->fSubtotalHiddenPageItems = m_oSubtotalHiddenItems.get(); + if (m_oTag.IsInit()) ptr->irstTag = m_oTag.get(); + else + ptr->fDisplayTag = false; + if (m_oUpdatedVersion.IsInit()) ptr->bVerSxLastUpdated = m_oUpdatedVersion->GetValue(); + if (m_oUseAutoFormatting.IsInit()) ptr->fAutoFormat = m_oUseAutoFormatting.get(); + if (m_oVacatedStyle.IsInit()) ptr->irstVacateStyle = m_oVacatedStyle.get(); + else + ptr->fDisplayVacateStyle = false; + + return objectPtr; + } void CPivotTableDefinition::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -398,6 +561,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(ptr->m_SXPIS != nullptr) m_oPageFields = ptr->m_SXPIS; + + } } void CPivotTableDefinition::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -677,7 +842,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L"<" + sName); WritingStringAttrInt(L"count", (int)m_arrItems.size()); writer.WriteString(L">"); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -685,7 +850,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CColumnRowFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -751,6 +916,30 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CColumnRowFields::toBinRows() + { + auto ptr(new XLSB::ISXVDRWS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginISXVDRws); + ptr->m_BrtBeginISXVDRws = XLS::BaseObjectPtr{ptr1}; + if(m_oCount.IsInit()) + ptr1->cisxvd = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr1->rgisxvdrws.push_back(i->m_oX.get()); + return objectPtr; + } + XLS::BaseObjectPtr CColumnRowFields::toBinCols() + { + auto ptr(new XLSB::ISXVDCOLS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginISXVDCols); + ptr->m_BrtBeginISXVDCols = XLS::BaseObjectPtr{ptr1}; + if(m_oCount.IsInit()) + ptr1->cisxvd = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr1->rgisxvdcols.push_back(i->m_oX.get()); + return objectPtr; + } void CColumnRowFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -765,7 +954,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L"<" + sName); WritingStringAttrInt(L"count", (int)m_arrItems.size()); writer.WriteString(L">"); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -773,7 +962,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CColumnRowItems::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -796,6 +985,22 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CColumnRowItems::toBinRows() + { + auto ptr(new XLSB::SXLIRWS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXLI.push_back(i->toBin()); + return objectPtr; + } + XLS::BaseObjectPtr CColumnRowItems::toBinCols() + { + auto ptr(new XLSB::SXLICOLS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXLI.push_back(i->toBin()); + return objectPtr; + } void CColumnRowItems::fromBin(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typeSXLIRWS) @@ -831,7 +1036,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"r", m_oR, m_oR->GetValue()); WritingStringNullableAttrString(L"t", m_oT, m_oT->ToString()); writer.WriteString(L">"); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -857,6 +1062,62 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CColumnRowItem::toBin() + { + auto ptr(new XLSB::SXLI); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSXLI); + ptr->m_BrtBeginSXLI = XLS::BaseObjectPtr{ptr1}; + if(m_oI.IsInit()) + ptr1->iData = m_oI->GetValue(); + if(m_oR.IsInit()) + ptr1->cSic = m_oR->GetValue(); + if(m_oT.IsInit()) + { + if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeData) + ptr1->itmtype = XLSB::PivotItemType::PITDATA; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeDefault) + ptr1->itmtype = XLSB::PivotItemType::PITDEFAULT; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeSum) + ptr1->itmtype = XLSB::PivotItemType::PITSUM; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeCountA) + ptr1->itmtype = XLSB::PivotItemType::PITCOUNTA; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeAverage) + ptr1->itmtype = XLSB::PivotItemType::PITAVG; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeMax) + ptr1->itmtype = XLSB::PivotItemType::PITMAX; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeMin) + ptr1->itmtype = XLSB::PivotItemType::PITMIN; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeProduct) + ptr1->itmtype = XLSB::PivotItemType::PITPRODUCT; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeCount) + ptr1->itmtype = XLSB::PivotItemType::PITCOUNT; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDev) + ptr1->itmtype = XLSB::PivotItemType::PITSTDDEV; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDevP) + ptr1->itmtype = XLSB::PivotItemType::PITSTDDEVP; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeVar) + ptr1->itmtype = XLSB::PivotItemType::PITVAR; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeVarP) + ptr1->itmtype = XLSB::PivotItemType::PITVARP; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeGrandTotalt) + ptr1->itmtype = XLSB::PivotItemType::PITGRAND; + else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) + ptr1->itmtype = XLSB::PivotItemType::PITBLANK; + } + if(m_arrItems.empty()) + return objectPtr; + + auto ptr2(new XLSB::ISXVIS(m_arrItems.size())); + ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; + auto ptr3(new XLSB::BeginISXVIs(m_arrItems.size())); + ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; + + for(auto i:m_arrItems) + if(i->m_oV.IsInit()) + ptr3->rgisxvis.push_back(i->m_oV->GetValue()); + return objectPtr; + } void CColumnRowItem::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -959,7 +1220,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -967,7 +1228,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CDataFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -1004,6 +1265,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CDataFields::toBin() + { + auto ptr(new XLSB::SXDIS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXDI.push_back(i->toBin()); + return objectPtr; + } void CDataFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1039,6 +1308,76 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CDataField::toBin() + { + auto ptr1(new XLSB::SXDI); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSXDI); + ptr1->m_BrtBeginSXDI = XLS::BaseObjectPtr{ptr}; + + if(m_oBaseField.IsInit()) + ptr->isxvd = m_oBaseField.get(); + if(m_oBaseItem.IsInit()) + ptr->isxvi = m_oBaseItem->GetValue(); + if(m_oFld.IsInit()) + ptr->isxvdData = m_oFld->GetValue(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt.ifmt = m_oNumFmtId->GetValue(); + if(m_oName.IsInit()) + { + ptr->stDisplayName = m_oName.get(); + ptr->fLoadDisplayName = true; + } + else + ptr->fLoadDisplayName = false; + if(m_oShowDataAs.IsInit()) + { + if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsNormal) + ptr->df = XLSB::ShowDataAs::NORMAL; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsDifference) + ptr->df = XLSB::ShowDataAs::DIFFERENCE_; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOff) + ptr->df = XLSB::ShowDataAs::PERCENT; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentDiff) + ptr->df = XLSB::ShowDataAs::PERCENTDIFF; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsIndex) + ptr->df = XLSB::ShowDataAs::INDEX; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOfTotal) + ptr->df = XLSB::ShowDataAs::PERCENTOFTOTAL; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOfCol) + ptr->df = XLSB::ShowDataAs::PERCENTOFCOL; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsPercentOfRow) + ptr->df = XLSB::ShowDataAs::PERCENTOFROW; + else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsRunTotal) + ptr->df = XLSB::ShowDataAs::PERCENTOFRUNTOTAL; + } + if(m_oSubtotal.IsInit()) + { + if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionSum) + ptr->iiftab = XLSB::DataConsolidationFunction::SUM; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionCount) + ptr->iiftab = XLSB::DataConsolidationFunction::COUNT; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionAverage) + ptr->iiftab = XLSB::DataConsolidationFunction::AVERAGE; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionMaximum) + ptr->iiftab = XLSB::DataConsolidationFunction::MAX; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionMinimum) + ptr->iiftab = XLSB::DataConsolidationFunction::MIN; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionProduct) + ptr->iiftab = XLSB::DataConsolidationFunction::PRODUCT; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionCountNums) + ptr->iiftab = XLSB::DataConsolidationFunction::COUNTNUM; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionStdDev) + ptr->iiftab = XLSB::DataConsolidationFunction::STDDEV; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionStdDevP) + ptr->iiftab = XLSB::DataConsolidationFunction::STDDEVP; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionVariance) + ptr->iiftab = XLSB::DataConsolidationFunction::STDVAR; + else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionVarP) + ptr->iiftab = XLSB::DataConsolidationFunction::STDVARP; + } + return objectPtr; + } void CDataField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1155,7 +1494,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -1163,7 +1502,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CPageFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -1200,6 +1539,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPageFields::toBin() + { + auto ptr(new XLSB::SXPIS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXPI.push_back(i->toBin()); + return objectPtr; + } void CPageFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1233,6 +1580,29 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPageField::toBin() + { + auto ptr1(new XLSB::SXPI); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSXPI); + ptr1->m_BrtBeginSXPI = XLS::BaseObjectPtr{ptr}; + + if(m_oFld.IsInit()) + ptr->isxvd = m_oFld.get(); + if(m_oItem.IsInit()) + ptr->isxvi = m_oItem->GetValue(); + if(m_oHier.IsInit()) + ptr->isxth = m_oHier.get(); + if(m_oName.IsInit()) + ptr->irstUnique = m_oName.get(); + else + ptr->irstUnique = 0xFFFFFFFF; + if(m_oCap.IsInit()) + ptr->irstDisplay = m_oCap.get(); + else + ptr->irstDisplay = 0xFFFFFFFF; + return objectPtr; + } void CPageField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1280,7 +1650,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -1288,7 +1658,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CFieldItems::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -1325,6 +1695,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CFieldItems::toBin() + { + auto ptr(new XLSB::SXVIS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXVI.push_back(i->toBin()); + return objectPtr; + } void CFieldItems::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1355,6 +1733,69 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CFieldItem::toBin() + { + auto ptr1(new XLSB::SXVI); + XLS::BaseObjectPtr objectPtr(ptr1); + + auto ptr(new XLSB::BeginSXVI); + ptr1->m_BrtBeginSXVI = XLS::BaseObjectPtr{ptr}; + + if(m_oChild.IsInit()) + ptr->fHasChildrenEst = m_oChild.get(); + if(m_oExpanded.IsInit()) + ptr->fDrilledMember = m_oExpanded.get(); + if(m_oDrillAcross.IsInit()) + ptr->fCollapsedMember = m_oDrillAcross.get(); + if(m_oCalculated.IsInit()) + ptr->fFormula = m_oCalculated.get(); + if(m_oHidden.IsInit()) + ptr->fHidden = m_oHidden.get(); + if(m_oMissing.IsInit()) + ptr->fMissing = m_oMissing.get(); + if(m_oUserCaption.IsInit()) + ptr->displayName = m_oUserCaption.get(); + if(m_oCharacter.IsInit()) + ptr->fOlapFilterSelected = m_oCharacter.get(); + if(m_oHideDetails.IsInit()) + ptr->fHideDetail = m_oHideDetails.get(); + if(m_oItemIndex.IsInit()) + ptr->iCache = m_oItemIndex->GetValue(); + if(m_oItemType.IsInit()) + { + if(m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeData) + ptr->itmtype = XLSB::PivotItemType::PITDATA; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeDefault) + ptr->itmtype = XLSB::PivotItemType::PITDEFAULT; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeSum) + ptr->itmtype = XLSB::PivotItemType::PITSUM; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeCountA) + ptr->itmtype = XLSB::PivotItemType::PITCOUNTA; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeAverage) + ptr->itmtype = XLSB::PivotItemType::PITAVG; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeMax) + ptr->itmtype = XLSB::PivotItemType::PITMAX; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeMin) + ptr->itmtype = XLSB::PivotItemType::PITMIN; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeProduct) + ptr->itmtype = XLSB::PivotItemType::PITPRODUCT; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeCount) + ptr->itmtype = XLSB::PivotItemType::PITCOUNT; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDev) + ptr->itmtype = XLSB::PivotItemType::PITSTDDEV; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeStdDevP) + ptr->itmtype = XLSB::PivotItemType::PITSTDDEVP; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeVar) + ptr->itmtype = XLSB::PivotItemType::PITVAR; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeVarP) + ptr->itmtype = XLSB::PivotItemType::PITVARP; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeGrandTotalt) + ptr->itmtype = XLSB::PivotItemType::PITGRAND; + else if (m_oItemType == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) + ptr->itmtype = XLSB::PivotItemType::PITBLANK; + } + return objectPtr; + } void CFieldItem::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1474,7 +1915,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -1482,7 +1923,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CPivotFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -1517,7 +1958,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(new CPivotField(item)); } } - + XLS::BaseObjectPtr CPivotFields::toBin() + { + auto ptr(new XLSB::SXVDS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXVD.push_back(i->toBin()); + return objectPtr; + } void CPivotFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -1577,7 +2025,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrString(L"itemPageCount",m_oItemPageCount, m_oItemPageCount->ToString()); WritingStringNullableAttrString(L"numFmtId", m_oNumFmtId, m_oNumFmtId->ToString()); writer.WriteString(L">"); - + if(m_oAutoSortScope.IsInit()) m_oAutoSortScope->toXML(writer); @@ -1623,6 +2071,167 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" //m_oExtLst = ptr->m_FRTSXVD; } } + XLS::BaseObjectPtr CPivotField::toBin() + { + auto ptr(new XLSB::SXVD); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginSXVD = writeAttributes(); + if(m_oItems.IsInit()) + ptr->m_SXVIS = m_oItems->toBin(); + if(m_oAutoSortScope.IsInit()) + ptr->m_AUTOSORTSCOPE = m_oAutoSortScope->toBin(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotField::writeAttributes() + { + auto ptr(new XLSB::BeginSXVD); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oAllDrilled.IsInit()) + ptr->fDrilledLevel = m_oAllDrilled.get(); + + if(m_oAutoShow.IsInit()) + ptr->fAutoShow = m_oAutoShow.get(); + + if(m_oAvgSubtotal.IsInit()) + ptr->fAverage = m_oAvgSubtotal.get(); + + if(m_oAxis.IsInit()) + { + if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) + ptr->sxaxis.bCol = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisPage) + ptr->sxaxis.bPage = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) + ptr->sxaxis.bRw = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) + ptr->sxaxis.bData = true; + } + if(m_oCompact.IsInit()) + ptr->fCompact = m_oCompact.get(); + + if(m_oCountASubtotal.IsInit()) + ptr->fCounta = m_oCountASubtotal.get(); + + if(m_oCountSubtotal.IsInit()) + ptr->fCount = m_oCountSubtotal.get(); + if(m_oDataField.IsInit()) + ptr->fDrilledLevel = m_oDataField.get(); + if(m_oDataSourceSort.IsInit()) + ptr->fTensorSort = m_oDataSourceSort.get(); + if(m_oDefaultAttributeDrillState.IsInit()) + ptr->fItemsDrilledByDefault = m_oDefaultAttributeDrillState.get(); + if(m_oDefaultSubtotal.IsInit()) + ptr->fDefault = m_oDefaultSubtotal.get(); + if(m_oDragOff.IsInit()) + ptr->fDragToHide = m_oDragOff.get(); + + if (m_oDragToCol.IsInit()) ptr->fDragToColumn = m_oDragToCol.get(); + if (m_oDragToData.IsInit()) ptr->fDragToData = m_oDragToData.get(); + if (m_oDragToPage.IsInit()) ptr->fDragToPage = m_oDragToPage.get(); + if (m_oDragToRow.IsInit()) ptr->fDragToRow = m_oDragToRow.get(); + if (m_oHiddenLevel.IsInit()) ptr->fHiddenLvl = m_oHiddenLevel.get(); + if (m_oHideNewItems.IsInit()) ptr->fHideNewItems = m_oHideNewItems.get(); + if (m_oIncludeNewItemsInFilter.IsInit()) ptr->fFilterInclusive = m_oIncludeNewItemsInFilter.get(); + if (m_oInsertBlankRow.IsInit()) ptr->fInsertBlankRow = m_oInsertBlankRow.get(); + if (m_oInsertPageBreak.IsInit()) ptr->fPageBreaksBetweenItems = m_oInsertPageBreak.get(); + + if(m_oItemPageCount.IsInit()) + ptr->citmAutoShow = m_oItemPageCount->GetValue(); + + if(m_oMaxSubtotal.IsInit()) + ptr->fMax = m_oMaxSubtotal.get(); + + if(m_oMeasureFilter.IsInit()) + ptr->fHasAdvFilter = m_oMeasureFilter.get(); + + if(m_oMinSubtotal.IsInit()) + ptr->fMin = m_oMinSubtotal.get(); + + if(m_oMultipleItemSelectionAllowed.IsInit()) + ptr->fEnableMultiplePageItems = m_oMultipleItemSelectionAllowed.get(); + + if(m_oName.IsInit()) + ptr->irstName = m_oName.get(); + else + ptr->fDisplayName = false; + + + if (m_oNonAutoSortDefault.IsInit()) + ptr->fNotAutoSortDft = m_oNonAutoSortDefault.get(); + + if (m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + + if (m_oOutline.IsInit()) + ptr->fOutline = m_oOutline.get(); + + if (m_oProductSubtotal.IsInit()) + ptr->fProduct = m_oProductSubtotal.get(); + + if (m_oRankBy.IsInit()) + ptr->isxdiAutoShow = m_oRankBy->GetValue(); + + if (m_oServerField.IsInit()) + ptr->fServerBased = m_oServerField.get(); + + if (m_oShowAll.IsInit()) + ptr->fShowAllItems = m_oShowAll.get(); + + if (m_oShowDropDowns.IsInit()) + ptr->fHideDD = !m_oShowDropDowns.get(); + + if (m_oShowPropAsCaption.IsInit()) + ptr->fMemPropDisplayInCaption = m_oShowPropAsCaption.get(); + + if (m_oShowPropCell.IsInit()) + ptr->fMemPropDisplayInReport = m_oShowPropCell.get(); + + if (m_oShowPropTip.IsInit()) + ptr->fMemPropDisplayInTip = m_oShowPropTip.get(); + if(m_oSortType.IsInit()) + { + if(m_oSortType->GetValue() != SimpleTypes::Spreadsheet::EFieldSortType::sortManual) + ptr->fAutoSort = true; + if(m_oSortType->GetValue() == SimpleTypes::Spreadsheet::EFieldSortType::sortAscending) + ptr->fAscendSort = true; + else + ptr->fAscendSort = false; + } + + if (m_oStdDevPSubtotal.IsInit()) + ptr->fStdevp = m_oStdDevPSubtotal.get(); + + if (m_oStdDevSubtotal.IsInit()) + ptr->fStdev = m_oStdDevSubtotal.get(); + + if (m_oSubtotalCaption.IsInit()) + ptr->irstSub.value() = m_oSubtotalCaption.get(); + else + ptr->fDisplaySub = false; + + if (m_oSubtotalTop.IsInit()) + ptr->fSubtotalAtTop = !m_oSubtotalTop.get(); + + if (m_oSumSubtotal.IsInit()) + ptr->fSum = m_oSumSubtotal.get(); + + if (m_oTopAutoShow.IsInit()) + ptr->fTopAutoShow = !m_oTopAutoShow.get(); + + if (m_oUniqueMemberProperty.IsInit()) + ptr->irstMemberPropertyCaption = m_oUniqueMemberProperty.get(); + else + ptr->fUseMemPropCaption = false; + + if (m_oVarPSubtotal.IsInit()) + ptr->fVarp = m_oVarPSubtotal.get(); + + if (m_oVarSubtotal.IsInit()) + ptr->fVar = m_oVarSubtotal.get(); + + return objectPtr; + } void CPivotField::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1751,7 +2360,6 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else m_oSortType = SimpleTypes::Spreadsheet::EFieldSortType::sortAscending; - if(ptr->fStdevp) m_oStdDevPSubtotal = ptr->fStdevp; @@ -1830,7 +2438,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_else_if ( oReader, L"varPSubtotal", m_oVarPSubtotal ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"varSubtotal", m_oVarSubtotal ) WritingElement_ReadAttributes_End( oReader ) - } + } //------------------------------------ void CReferences::toXML(NSStringUtils::CStringBuilder& writer) const @@ -1840,7 +2448,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -1848,7 +2456,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CReferences::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -1871,6 +2479,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CReferences::toBin() + { + auto ptr(new XLSB::PRFILTERS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPRFILTER.push_back(i->toBin()); + return objectPtr; + } void CReferences::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1912,7 +2528,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrBool2(L"varPSubtotal", m_oVarPSubtotal); WritingStringNullableAttrBool2(L"varSubtotal", m_oVarSubtotal); writer.WriteString(L">"); - + if(m_oX.IsInit()) { m_oX->toXML(writer); @@ -1956,7 +2572,71 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CReference::toBin() + { + auto ptr(new XLSB::PRFILTER); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPRFilter = writeAttributes(); + ///@todo дописать конветрацию + ptr->m_arPRFITEM.push_back(m_oX->toBinPrfItem()); + return objectPtr; + } + XLS::BaseObjectPtr CReference::writeAttributes() + { + auto ptr(new XLSB::BeginPRFilter); + XLS::BaseObjectPtr objectPtr(ptr); + if (m_oAvgSubtotal.IsInit()) + ptr->prFilter.itmtypeAVERAGE = m_oAvgSubtotal.get(); + if (m_oByPosition.IsInit()) + ptr->prFilter.itmtypeAVERAGE = m_oByPosition.get(); + + if (m_oCountASubtotal.IsInit()) + ptr->prFilter.itmtypeCOUNTA = m_oCountASubtotal.get(); + + if (m_oCountSubtotal.IsInit()) + ptr->prFilter.itmtypeCOUNT = m_oCountSubtotal.get(); + + if (m_oDefaultSubtotal.IsInit()) + ptr->prFilter.itmtypeDEFAULT = m_oDefaultSubtotal.get(); + + if (m_oMaxSubtotal.IsInit()) + ptr->prFilter.itmtypeMAX = m_oMaxSubtotal.get(); + + if (m_oMinSubtotal.IsInit()) + ptr->prFilter.itmtypeMIN = m_oMinSubtotal.get(); + + if (m_oProductSubtotal.IsInit()) + ptr->prFilter.itmtypePRODUCT = m_oProductSubtotal.get(); + + if (m_oRelative.IsInit()) + ptr->prFilter.itmtypeAVERAGE = m_oRelative.get(); + + if (m_oSelected.IsInit()) + ptr->prFilter.fSelected = m_oSelected.get(); + + if (m_oStdDevPSubtotal.IsInit()) + ptr->prFilter.itmtypeSTDEVP = m_oStdDevPSubtotal.get(); + + if (m_oStdDevSubtotal.IsInit()) + ptr->prFilter.itmtypeSTDEV = m_oStdDevSubtotal.get(); + + if (m_oSumSubtotal.IsInit()) + ptr->prFilter.itmtypeSUM = m_oSumSubtotal.get(); + + if (m_oVarPSubtotal.IsInit()) + ptr->prFilter.itmtypeVARP = m_oVarPSubtotal.get(); + + if (m_oVarSubtotal.IsInit()) + ptr->prFilter.itmtypeVAR = m_oVarSubtotal.get(); + + if (m_oField.IsInit()) + ptr->prFilter.isxvd = m_oField->GetValue(); + + if (m_oCount.IsInit()) + ptr->prFilter.cItems = m_oCount->GetValue(); + return objectPtr; + } void CReference::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2012,7 +2692,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -2020,7 +2700,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CPivotTableFormats::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -2057,6 +2737,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPivotTableFormats::toBin() + { + auto ptr(new XLSB::SXFORMATS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arSXFORMAT.push_back(i->toBin()); + return objectPtr; + } void CPivotTableFormats::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -2070,7 +2758,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrString(L"action", m_oAction, m_oAction->ToString()); WritingStringNullableAttrString(L"dxfId", m_oDxfId, m_oDxfId->ToString()); writer.WriteString(L">"); - + if(m_oPivotArea.IsInit()) { m_oPivotArea->toXML(writer); @@ -2095,6 +2783,22 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotTableFormat::toBin() + { + auto ptr(new XLSB::SXFORMAT); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oDxfId.IsInit()) + { + auto ptr1(new XLSB::BeginSXFormat); + ptr->m_BrtBeginSXFormat = XLS::BaseObjectPtr{ptr1}; + ptr1->dxfid = m_oDxfId->GetValue(); + if(m_oAction.IsInit()) + ptr1->rlType = m_oAction->GetValue(); + } + if(m_oPivotArea.IsInit()) + ptr->m_PIVOTRULE = m_oPivotArea->toBin(); + return objectPtr; + } void CPivotTableFormat::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2123,12 +2827,12 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_if ( oReader, L"action", m_oAction ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"dxfId", m_oDxfId ) WritingElement_ReadAttributes_End( oReader ) - } + } //------------------------------------ void CAutoSortScope::toXML(NSStringUtils::CStringBuilder& writer) const { writer.WriteString(L""); - + if(m_oPivotArea.IsInit()) { m_oPivotArea->toXML(writer); @@ -2161,6 +2865,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oPivotArea = ptr->m_PIVOTRULE; } } + XLS::BaseObjectPtr CAutoSortScope::toBin() + { + auto ptr(new XLSB::AUTOSORTSCOPE); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_PIVOTRULE = m_oPivotArea->toBin(); + return objectPtr; + } //------------------------------------ void CPivotArea::toXML(NSStringUtils::CStringBuilder& writer) const { @@ -2178,7 +2889,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrBool2(L"outline", m_oOutline); WritingStringNullableAttrString(L"offsetRef", m_oOffsetRef, *m_oOffsetRef); writer.WriteString(L">"); - + if(m_oReferences.IsInit()) { m_oReferences->toXML(writer); @@ -2202,6 +2913,69 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotArea::toBin() + { + auto ptr(new XLSB::PIVOTRULE); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPRule = writeAttribures(); + if(m_oReferences.IsInit()) + ptr->m_PRFILTERS = m_oReferences->toBin(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotArea::writeAttribures() + { + auto ptr(new XLSB::BeginPRule); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oAxis.IsInit()) + { + if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) + ptr->pruleheaderdata.sxaxis.bCol = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisPage) + ptr->pruleheaderdata.sxaxis.bPage = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) + ptr->pruleheaderdata.sxaxis.bRw = true; + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) + ptr->pruleheaderdata.sxaxis.bData = true; + } + if(m_oCacheIndex.IsInit()) + ptr->pruleheaderdata.fCacheBased = m_oCacheIndex.get(); + if(m_oCollapsedLevelsAreSubtotals.IsInit()) + ptr->pruleheaderdata.fFuzzy = m_oCollapsedLevelsAreSubtotals.get(); + if(m_oDataOnly.IsInit()) + ptr->pruleheaderdata.fDataOnly = m_oDataOnly.get(); + if(m_oField.IsInit()) + ptr->pruleheaderdata.isxvd = m_oField.get(); + if(m_oFieldPosition.IsInit()) + ptr->pruleheaderdata.iDim = m_oFieldPosition->GetValue(); + if(m_oGrandCol.IsInit()) + ptr->pruleheaderdata.fGrandCol = m_oGrandCol.get(); + if(m_oGrandRow.IsInit()) + ptr->pruleheaderdata.fGrandRw = m_oGrandRow.get(); + if(m_oLabelOnly.IsInit()) + ptr->pruleheaderdata.fLabelOnly = m_oLabelOnly.get(); + if(m_oOffsetRef.IsInit()) + ptr->pruleheaderdata.rfxLoc = m_oOffsetRef.get(); + if(m_oOutline.IsInit()) + ptr->pruleheaderdata.fLineMode = m_oOutline.get(); + if(m_oType.IsInit()) + { + if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaNone) + ptr->pruleheaderdata.isxrtype = 0x00; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaNormal) + ptr->pruleheaderdata.isxrtype = 0x01; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaData) + ptr->pruleheaderdata.isxrtype = 0x02; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaAll) + ptr->pruleheaderdata.isxrtype = 0x03; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaOrigin) + ptr->pruleheaderdata.isxrtype = 0x04; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaFieldButton) + ptr->pruleheaderdata.isxrtype = 0x05; + else if (m_oType == SimpleTypes::Spreadsheet::EPivotAreaType::areaTopEnd) + ptr->pruleheaderdata.isxrtype = 0x06; + } + return objectPtr; + } void CPivotArea::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2310,7 +3084,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"rowPageCount", m_oRowPageCount, m_oRowPageCount->GetValue()); writer.WriteString(L"/>"); } - + void CPivotTableLocation::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -2333,6 +3107,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } + XLS::BaseObjectPtr CPivotTableLocation::toBin() + { + auto ptr1(new XLSB::SXLOCATION); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginSXLocation); + ptr1->m_BrtBeginSXLocation = XLS::BaseObjectPtr{ptr}; + + if(m_oColPageCount.IsInit()) + ptr->ccolPage = m_oColPageCount->GetValue(); + if(m_oFirstDataCol.IsInit()) + ptr->colFirstData = m_oFirstDataCol->GetValue(); + if(m_oFirstDataRow.IsInit()) + ptr->rwFirstData = m_oFirstDataRow->GetValue(); + if(m_oFirstHeaderRow.IsInit()) + ptr->rwFirstHead = m_oFirstHeaderRow->GetValue(); + if(m_oRowPageCount.IsInit()) + ptr->crwPage = m_oRowPageCount->GetValue(); + if(m_oRef.IsInit()) + ptr->rfxGeom = m_oRef.get(); + return objectPtr; + } + void CPivotTableLocation::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -2377,6 +3173,24 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oName = ptr->stStyleName.value(); } } + XLS::BaseObjectPtr CPivotTableStyleInfo::toBin() + { + auto ptr(new XLSB::TableStyleClient); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oShowColHeaders.IsInit()) + ptr->fColumnHeaders = m_oShowColHeaders.get(); + if(m_oShowRowHeaders.IsInit()) + ptr->fRowHeaders = m_oShowRowHeaders.get(); + if(m_oShowColStripes.IsInit()) + ptr->fRowStripes = m_oShowColStripes.get(); + if(m_oShowLastColumn.IsInit()) + ptr->fLastColumn = m_oShowLastColumn.get(); + if(m_oName.IsInit()) + ptr->stStyleName = m_oName.get(); + else + ptr->stStyleName = 0xFFFFFFFF; + return objectPtr; + } void CPivotTableStyleInfo::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -2493,8 +3307,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oCacheSource.IsInit()) m_oCacheSource->toXML(writer); if(m_oCacheFields.IsInit()) - m_oCacheFields->toXML(writer); - + m_oCacheFields->toXML(writer); + if(m_oExtLst.IsInit()) { writer.WriteString(m_oExtLst->toXMLWithNS(_T(""))); @@ -2625,7 +3439,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -2633,7 +3447,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CPivotCacheFields::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -2694,7 +3508,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"mappingCount", m_oMappingCount, m_oMappingCount->GetValue()); WritingStringNullableAttrInt(L"numFmtId", m_oNumFmtId, m_oNumFmtId->GetValue()); writer.WriteString(L">"); - + if(m_oSharedItems.IsInit()) { m_oSharedItems->toXML(writer); @@ -2805,7 +3619,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_else_if ( oReader, L"mappingCount", m_oMappingCount ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"uniqueList", m_oNumFmtId ) WritingElement_ReadAttributes_End( oReader ) - } + } //------------------------------------ void CSharedItems::toXML(NSStringUtils::CStringBuilder& writer) const { @@ -2833,7 +3647,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CSharedItems::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -3070,7 +3884,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -3122,7 +3936,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -3379,7 +4193,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oEndNum", m_oEndNum ) WritingElement_ReadAttributes_Read_else_if ( oReader, L"m_oGroupInterval", m_oGroupInterval ) WritingElement_ReadAttributes_End( oReader ) - } + } //------------------------------------ void CPivotCharacterValue::toXML(NSStringUtils::CStringBuilder& writer) const { @@ -3546,7 +4360,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( L"x" == sName ) m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } - } + } void CPivotErrorValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -4060,7 +4874,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"connectionId", m_oConnectionId, m_oConnectionId->GetValue()); WritingStringNullableAttrString(L"type", m_oType, m_oType->ToString()); writer.WriteString(L">"); - + if(m_oWorksheetSource.IsInit()) { m_oWorksheetSource->toXML(writer); @@ -4198,7 +5012,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -4254,7 +5068,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -4349,7 +5163,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + for ( size_t i = 0; i < m_arrItems.size(); ++i) { if ( m_arrItems[i] ) @@ -4472,7 +5286,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.WriteString(L""); - + if(m_oPages.IsInit()) { m_oPages->toXML(writer); @@ -4538,7 +5352,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"base", m_oBase, m_oBase->GetValue()); WritingStringNullableAttrInt(L"par", m_oPar, m_oPar->GetValue()); writer.WriteString(L">"); - + if(m_oDiscretePr.IsInit()) { m_oDiscretePr->toXML(writer); @@ -4637,7 +5451,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" return; } NSFile::CFileBinary::ReadAllBytes(oPath.GetPath(), &m_pData, m_nDataLength); - + return; //XmlUtils::CXmlLiteReader oReader; @@ -4729,7 +5543,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" auto ptr = static_cast(obj.get()); if(ptr != nullptr) - { + { NSStringUtils::CStringBuilder writer; writer.WriteString(L""); writer.WriteString(L"m_arPIVOTCACHERECORD.empty()) { //m_arrItems.push_back(new CPivotCacheRecord(item)); - + CPivotCacheRecord xmlItem(ptr->m_arPIVOTCACHERECORD.front()); xmlItem.toXML(writer); ptr->m_arPIVOTCACHERECORD.erase(ptr->m_arPIVOTCACHERECORD.begin()); @@ -4777,7 +5591,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems[i]->toXML(writer); } } - + writer.WriteString(L""); } void CPivotCacheRecord::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -4943,5 +5757,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + + XLS::BaseObjectPtr CSharedItemsIndex::toBinPrfItem() + { + auto ptr(new XLSB::BeginPRFItem); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oV.IsInit()) + ptr->iitem = m_oV->GetValue(); + return objectPtr; + } } //Spreadsheet } // namespace OOX From 4ab4f7416639da22197a90ceaeec67387572bd19 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 19 Sep 2023 20:37:28 +0600 Subject: [PATCH 089/221] Add pivot cache definition conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 19 + OOXML/DocxFormat/Drawing/DrawingExt.h | 1 + OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h | 129 +-- .../Pivot/PivotCacheDefinitionExt.cpp | 10 + .../Pivot/PivotCacheDefinitionExt.h | 1 + OOXML/XlsxFormat/Pivot/PivotTable.h | 1 + OOXML/XlsxFormat/Pivot/Pivots.cpp | 797 +++++++++++++++++- 7 files changed, 887 insertions(+), 71 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 986cae641d..1b6855a834 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -687,6 +687,25 @@ namespace OOX } return objectPtr; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinPivotCache() + { + auto ptr(new XLSB::FRTPIVOTCACHEDEF); + XLS::BaseObjectPtr objectPtr(ptr); + + if (!m_arrExt.empty()) + { + for(auto i:m_arrExt) + { + + if(i->m_sUri == L"{725AE2AE-9491-48be-B2B4-4EB974FC3084}") + { + ptr->m_PCD14 = i->m_oPivotCacheDefinitionExt->toBin(); + } + + } + } + return objectPtr; + } XLS::BaseObjectPtr COfficeArtExtensionList::toBinSlicerCache() { auto ptr(new XLSB::FRTSLICERCACHE); diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index 2ca7f126c2..48cfb8d7ba 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -192,6 +192,7 @@ namespace OOX XLS::BaseObjectPtr toBinStyles(); XLS::BaseObjectPtr toBinTable(); XLS::BaseObjectPtr toBinSlicerCache(); + XLS::BaseObjectPtr toBinPivotCache(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h b/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h index 4bd71ff717..9111c18973 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h @@ -57,7 +57,7 @@ namespace OOX WritingElement_XlsbConstructors(CSharedItems) CSharedItems(){} virtual ~CSharedItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -68,12 +68,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_SharedItems; } void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr writeAttributes(); nullable_bool m_oContainsBlank; nullable_bool m_oContainsDate; @@ -83,13 +85,15 @@ namespace OOX nullable_bool m_oContainsNumber; nullable_bool m_oContainsSemiMixedTypes; nullable_bool m_oContainsString; - + nullable_bool m_oLongText; nullable_double m_oMinValue; nullable_double m_oMaxValue; nullable m_oMinDate; nullable m_oMaxDate; nullable m_oCount; + private: + XLS::BaseObjectPtr parsePCDI(XLS::BaseObjectPtr object); }; class COLAPGroupItems : public WritingElementWithChilds { @@ -98,7 +102,7 @@ namespace OOX WritingElement_XlsbConstructors(COLAPGroupItems) COLAPGroupItems(){} virtual ~COLAPGroupItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -109,6 +113,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_OLAPGroupItems; @@ -124,7 +129,7 @@ namespace OOX WritingElement_XlsbConstructors(CDiscreteGroupingProperties) CDiscreteGroupingProperties(){} virtual ~CDiscreteGroupingProperties() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -135,6 +140,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_DiscreteGroupingProperties; @@ -150,7 +156,7 @@ namespace OOX WritingElement_XlsbConstructors(CRangeGroupingProperties) CRangeGroupingProperties(){} virtual ~CRangeGroupingProperties() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -161,6 +167,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_RangeGroupingProperties; @@ -177,9 +184,9 @@ namespace OOX nullable m_oEndDate; nullable_double m_oStartNum; - nullable_double m_oEndNum; + nullable_double m_oEndNum; nullable_double m_oGroupInterval; - + }; class CFieldGroupProperties : public WritingElement { @@ -188,7 +195,7 @@ namespace OOX WritingElement_XlsbConstructors(CFieldGroupProperties) CFieldGroupProperties(){} virtual ~CFieldGroupProperties() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -199,6 +206,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_FieldGroupProperties; @@ -208,7 +216,7 @@ namespace OOX nullable m_oBase; nullable m_oPar; - + nullable m_oDiscretePr; nullable m_oRangePr; nullable m_oGroupItems; @@ -220,7 +228,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCacheField) CPivotCacheField(){} virtual ~CPivotCacheField() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -230,11 +238,13 @@ namespace OOX } virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + XLS::BaseObjectPtr toBin(); void fromBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const { return et_x_PivotCacheField; } + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -252,7 +262,7 @@ namespace OOX nullable m_oLevel; nullable m_oMappingCount; nullable m_oNumFmtId; - + nullable m_oSharedItems; //nullable m_oMpMap; nullable m_oFieldGroup; @@ -265,7 +275,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCacheFields) CPivotCacheFields(){} virtual ~CPivotCacheFields() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -276,6 +286,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheFields; @@ -291,7 +302,7 @@ namespace OOX WritingElement_XlsbConstructors(CRangeSet) CRangeSet(){} virtual ~CRangeSet() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -302,6 +313,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_RangeSet; @@ -325,7 +337,7 @@ namespace OOX WritingElement_XlsbConstructors(CRangeSets) CRangeSets(){} virtual ~CRangeSets() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -336,6 +348,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_RangeSets; @@ -351,7 +364,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageItem) CPageItem(){} virtual ~CPageItem() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -362,6 +375,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageItem; @@ -378,7 +392,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageItems) CPageItems(){} virtual ~CPageItems() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -389,6 +403,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageItems; @@ -404,7 +419,7 @@ namespace OOX WritingElement_XlsbConstructors(CPageItemValues) CPageItemValues(){} virtual ~CPageItemValues() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -415,6 +430,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PageItemValues; @@ -447,12 +463,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_ConsolidationSource; } void ReadAttributes(XLS::BaseObjectPtr& obj); - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); //---------- nullable_bool m_oAutoPage; @@ -466,7 +483,7 @@ namespace OOX WritingElement_XlsbConstructors(CWorksheetSource) CWorksheetSource(){} virtual ~CWorksheetSource() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -477,6 +494,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_WorksheetSource; @@ -511,12 +529,13 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheSource; } void ReadAttributes(XLS::BaseObjectPtr& obj); - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); //---------- nullable m_oConnectionId; nullable m_oType; @@ -524,7 +543,7 @@ namespace OOX nullable m_oConsolidation; nullable m_oWorksheetSource; nullable m_oExtLst; - }; + }; class CPivotCacheDefinition : public WritingElement { public: @@ -547,12 +566,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheDefinition; } + XLS::BaseObjectPtr writeAttributes(); void ReadAttributes(XLS::BaseObjectPtr& obj); - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); //---------- nullable_bool m_oBackgroundQuery; nullable_bool m_oEnableRefresh; @@ -591,10 +612,10 @@ namespace OOX CPivotCacheDefinitionFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) { m_bSpreadsheets = true; - + m_pData = NULL; m_nDataLength = 0; - + bIsWritten = false; } CPivotCacheDefinitionFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) @@ -626,9 +647,9 @@ namespace OOX const std::string srIdRecordsA( srIdRecords.begin(), srIdRecords.end() ); std::string rIdAttr = " r:id=\""+ srIdRecordsA +"\""; m_nDataLength = length + (long)rIdAttr.length(); - + m_pData = new BYTE[m_nDataLength]; - + long nTreshold = 220; memcpy(m_pData, pData, nTreshold); memcpy(m_pData + nTreshold, rIdAttr.c_str(), rIdAttr.length()); @@ -642,12 +663,10 @@ namespace OOX } } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::PivotCacheDefinition; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); @@ -664,7 +683,7 @@ namespace OOX nullable m_oPivotCashDefinition; private: CPath m_oReadPath; - + BYTE *m_pData; long m_nDataLength; @@ -678,7 +697,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCharacterValue) CPivotCharacterValue(){} virtual ~CPivotCharacterValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -689,19 +708,20 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCharacterValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_string m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -711,7 +731,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; + }; class CPivotBooleanValue : public WritingElementWithChilds { public: @@ -719,7 +739,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotBooleanValue) CPivotBooleanValue(){} virtual ~CPivotBooleanValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -730,6 +750,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotBooleanValue; @@ -742,7 +763,7 @@ namespace OOX nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - }; + }; class CPivotNumericValue : public WritingElementWithChilds { public: @@ -750,7 +771,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotNumericValue) CPivotNumericValue(){} virtual ~CPivotNumericValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -761,19 +782,20 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotNumericValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_double m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -783,7 +805,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; + }; class CPivotDateTimeValue : public WritingElementWithChilds { public: @@ -791,7 +813,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotDateTimeValue) CPivotDateTimeValue(){} virtual ~CPivotDateTimeValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -802,13 +824,14 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotBooleanValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; @@ -822,7 +845,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotErrorValue) CPivotErrorValue(){} virtual ~CPivotErrorValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -833,19 +856,20 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotErrorValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_string m_oValue; nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -855,7 +879,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; + }; class CPivotNoValue : public WritingElementWithChilds { public: @@ -863,7 +887,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotNoValue) CPivotNoValue(){} virtual ~CPivotNoValue() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -874,18 +898,19 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotNoValue; } void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - + nullable_string m_oCaption; nullable_bool m_oCalculated; nullable_bool m_oUnused; nullable m_oCount; - + nullable_bool m_oBold; nullable_bool m_oItalic; nullable_bool m_oStrike; @@ -895,7 +920,7 @@ namespace OOX nullable m_oFormatIndex; //tpls - }; - + }; + } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp index 6312d219d5..22d57d25a4 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.cpp @@ -54,6 +54,16 @@ void CPivotCacheDefinitionExt::fromXML(XmlUtils::CXmlLiteReader& oReader) return; oReader.ReadTillEnd(); } +XLS::BaseObjectPtr CPivotCacheDefinitionExt::toBin() +{ + auto ptr(new XLSB::PCD14); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCD14); + ptr->m_BrtBeginPCD14 = XLS::BaseObjectPtr{ptr1}; + if(m_oPivotCacheId.IsInit()) + ptr1->icacheId = m_oPivotCacheId.get(); + return objectPtr; +} void CPivotCacheDefinitionExt::fromBin(XLS::BaseObjectPtr& obj) { if(obj->get_type() == XLS::typePCD14) diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h index 2f1c35cdb9..8a3cefbcea 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinitionExt.h @@ -61,6 +61,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheDefinitionExt; diff --git a/OOXML/XlsxFormat/Pivot/PivotTable.h b/OOXML/XlsxFormat/Pivot/PivotTable.h index 52b26642f9..f3b94ce4b0 100644 --- a/OOXML/XlsxFormat/Pivot/PivotTable.h +++ b/OOXML/XlsxFormat/Pivot/PivotTable.h @@ -102,6 +102,7 @@ namespace OOX writer.WriteString(L"/>"); } XLS::BaseObjectPtr toBinPrfItem(); + XLS::BaseObjectPtr toBinItemIndex(); void fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 309b086bbe..54e60a15dc 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -3222,7 +3222,12 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" //pivotCacheDefStream.reset(); } } + XLS::BaseObjectPtr CPivotCacheDefinitionFile::WriteBin() const + { + auto pivotCacheDefStream = m_oPivotCashDefinition->toBin(); + return pivotCacheDefStream; + } void CPivotCacheDefinitionFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -3251,29 +3256,43 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (bIsWritten) return; bIsWritten = true; - if(m_oPivotCashDefinition.IsInit()) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - NSStringUtils::CStringBuilder sXml; - - sXml.WriteString(L""); - m_oPivotCashDefinition->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } - else if(m_nDataLength > 0 && m_pData) + else { - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(m_pData, m_nDataLength); - oFile.CloseFile(); + if(m_oPivotCashDefinition.IsInit()) + { + NSStringUtils::CStringBuilder sXml; - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + sXml.WriteString(L""); + m_oPivotCashDefinition->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } + else if(m_nDataLength > 0 && m_pData) + { + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); + oFile.WriteFile(m_pData, m_nDataLength); + oFile.CloseFile(); + } } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); + } + const OOX::FileType CPivotCacheDefinitionFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::PivotCacheDefinitionBin; + } + return OOX::Spreadsheet::FileTypes::PivotCacheDefinition; } //------------------------------------ void CPivotCacheDefinition::toXML(NSStringUtils::CStringBuilder& writer) const @@ -3333,6 +3352,83 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (L"extLst" == sName) m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotCacheDefinition::toBin() + { + auto ptr(new XLSB::PivotCacheDefStream); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPivotCacheDef = writeAttributes(); + if(m_oCacheFields.IsInit()) + ptr->m_PCDFIELDS = m_oCacheFields->toBin(); + if(m_oCacheSource.IsInit()) + ptr->m_PCDSOURCE = m_oCacheSource->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTPIVOTCACHEDEF = m_oExtLst->toBinPivotCache(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotCacheDefinition::writeAttributes() + { + auto ptr(new XLSB::BeginPivotCacheDef); + XLS::BaseObjectPtr objectPtr(ptr); + if (m_oBackgroundQuery.IsInit()) + ptr->fBackgroundQuery = m_oBackgroundQuery.get(); + + if (m_oEnableRefresh.IsInit()) + ptr->fEnableRefresh = !m_oEnableRefresh.get(); + + if (m_oRid.IsInit()) + ptr->stRelIDRecords.value = m_oRid->GetValue(); + else + ptr->fLoadRelIDRecords = false; + + if (m_oInvalid.IsInit()) + ptr->fInvalid = m_oInvalid.get(); + + if (m_oCreatedVersion.IsInit()) + ptr->bVerCacheCreated = m_oCreatedVersion->GetValue(); + + if (m_oMinRefreshableVersion.IsInit()) + ptr->bVerCacheRefreshableMin = m_oMinRefreshableVersion->GetValue(); + + if (m_oMissingItemsLimit.IsInit()) + ptr->citmGhostMax = m_oMissingItemsLimit->GetValue(); + + if (m_oOptimizeMemory.IsInit()) + ptr->fOptimizeCache = m_oOptimizeMemory.get(); + + if (m_oRecordCount.IsInit()) + ptr->cRecords = m_oRecordCount->GetValue(); + + if (m_oRefreshedBy.IsInit()) + ptr->stRefreshedWho = m_oRefreshedBy.get(); + else + ptr->fLoadRefreshedWho = false; + + if (m_oRefreshedDateIso.IsInit()) + ptr->xnumRefreshedDate.data.value = std::stod(m_oRefreshedDateIso->GetValue()); + + if (m_oRefreshedVersion.IsInit()) + ptr->bVerCacheLastRefresh = m_oRefreshedVersion->GetValue(); + + if (m_oRefreshOnLoad.IsInit()) + ptr->fRefreshOnLoad = m_oRefreshOnLoad.get(); + + if (m_oSaveData.IsInit()) + ptr->fSaveData = m_oSaveData.get(); + + if (m_oSupportAdvancedDrill.IsInit()) + ptr->fSupportAttribDrill = m_oSupportAdvancedDrill.get(); + + if (m_oSupportSubquery.IsInit()) + ptr->fSupportSubquery = m_oSupportSubquery.get(); + + if (m_oTupleCache.IsInit()) + ptr->fSheetData = m_oTupleCache.get(); + + if (m_oUpgradeOnRefresh.IsInit()) + ptr->fUpgradeOnRefresh = m_oUpgradeOnRefresh.get(); + + return objectPtr; + } void CPivotCacheDefinition::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3470,6 +3566,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPivotCacheFields::toBin() + { + auto ptr(new XLSB::PCDFIELDS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDFIELD.push_back(i->toBin()); + return objectPtr; + } void CPivotCacheFields::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3544,6 +3648,62 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CPivotCacheField::toBin() + { + auto ptr(new XLSB::PCDFIELD); + XLS::BaseObjectPtr objectPtr(ptr); + + ptr->m_BrtBeginPCDField = writeAttributes(); + if(m_oSharedItems.IsInit()) + ptr->m_PCDFATBL = m_oSharedItems->toBin(); + if(m_oFieldGroup.IsInit()) + ptr->m_PCDFGROUP = m_oFieldGroup->toBin(); + return objectPtr; + } + XLS::BaseObjectPtr CPivotCacheField::writeAttributes() + { + auto ptr(new XLSB::BeginPCDField); + XLS::BaseObjectPtr objectPtr(ptr); + + if (m_oName.IsInit()) + ptr->stFldName.value() = m_oName.get(); + + if (m_oCaption.IsInit()) + ptr->stFldCaption.value() = m_oCaption.get(); + + if (m_oDatabaseField.IsInit()) + ptr->fSrcField = m_oDatabaseField.get(); + + if (m_oServerField.IsInit()) + ptr->fServerBased = m_oServerField.get(); + + if (m_oFormula.IsInit()) + ptr->fldFmla = m_oFormula.get(); + + if (m_oHierarchy.IsInit()) + ptr->ihdb = m_oHierarchy.get(); + + if (m_oMemberPropertyField.IsInit()) + ptr->fOlapMemPropField = m_oMemberPropertyField.get(); + + if (m_oPropertyName.IsInit()) + ptr->stMemPropName.value() = m_oPropertyName.get(); + + if (m_oSqlType.IsInit()) + ptr->wTypeSql = m_oSqlType.get(); + + if (m_oUniqueList.IsInit()) + ptr->fCantGetUniqueItems = !m_oUniqueList.get(); + + if (m_oLevel.IsInit()) + ptr->isxtl = m_oLevel->GetValue(); + if(m_oMappingCount.IsInit()) + ptr->cIsxtmps = m_oMappingCount->GetValue(); + if(m_oNumFmtId.IsInit()) + ptr->ifmt = m_oNumFmtId->GetValue(); + + return objectPtr; + } void CPivotCacheField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3700,6 +3860,114 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CSharedItems::toBin() + { + auto ptr(new XLSB::PCDFATBL); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_BrtBeginPCDFAtbl = writeAttributes(); + for(auto i:m_arrItems) + { + auto valueBool = static_cast(i); + if(valueBool) + { + XLS::BaseObjectPtr element= valueBool->toBin(); + ptr->m_arSource.push_back(parsePCDI(element)); + continue; + } + auto noVal = static_cast(i); + if(noVal) + { + XLS::BaseObjectPtr element = noVal->toBin(); + ptr->m_arSource.push_back(parsePCDI(element)); + continue; + } + auto numVal = static_cast(i); + if(numVal) + { + XLS::BaseObjectPtr element = numVal->toBin(); + ptr->m_arSource.push_back(parsePCDI(element)); + continue; + } + auto charVal = static_cast(i); + if(charVal) + { + XLS::BaseObjectPtr element = charVal->toBin(); + ptr->m_arSource.push_back(parsePCDI(element)); + continue; + } + auto dateValue = static_cast(i); + if(dateValue) + { + XLS::BaseObjectPtr element = dateValue->toBin(); + ptr->m_arSource.push_back(parsePCDI(element)); + continue; + } + auto errorVal = static_cast(i); + if(errorVal) + { + XLS::BaseObjectPtr element = errorVal->toBin(); + ptr->m_arSource.push_back(parsePCDI(element)); + continue; + } + } + return objectPtr; + } + XLS::BaseObjectPtr CSharedItems::parsePCDI(XLS::BaseObjectPtr object) + { + if(object->get_type() == XLS::typePCDI) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = object; + return XLS::BaseObjectPtr{ptr1}; + } + else if(object->get_type() == XLS::typePCDIA) + { + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = object; + return XLS::BaseObjectPtr{ptr1}; + } + } + XLS::BaseObjectPtr CSharedItems::writeAttributes() + { + auto ptr(new XLSB::BeginPCDFAtbl); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oContainsBlank.IsInit()) + ptr->fHasBlankItem = m_oContainsBlank.get(); + if(m_oContainsDate.IsInit()) + ptr->fDateInField = m_oContainsDate.get(); + if(m_oContainsInteger.IsInit()) + ptr->fIntField = m_oContainsInteger.get(); + if(m_oContainsMixedTypes.IsInit()) + ptr->fMixedTypesIgnoringBlanks = m_oContainsMixedTypes.get(); + if(m_oContainsNonDate.IsInit()) + ptr->fNonDates = m_oContainsNonDate.get(); + if(m_oContainsNumber.IsInit()) + ptr->fNumField = m_oContainsNumber.get(); + if(m_oContainsSemiMixedTypes.IsInit()) + ptr->fTextEtcField = m_oContainsSemiMixedTypes.get(); + + if(m_oContainsString.IsInit()) + ptr->fHasTextItem = m_oContainsString.get(); + if(m_oLongText.IsInit()) + ptr->fHasLongTextItem = m_oLongText.get(); + if(m_oCount.IsInit()) + ptr->citems = m_oCount->GetValue(); + if(m_oMinDate.IsInit() && m_oMaxDate.IsInit()) + { + ptr->xnumMin.data.value = std::stod(m_oMinDate->GetValue()); + ptr->xnumMax.data.value =std::stod(m_oMaxDate->GetValue()); + } + else + { + if(m_oMinValue.IsInit()) + ptr->xnumMin.data.value = m_oMinValue.get(); + if(m_oMaxValue.IsInit()) + ptr->xnumMax.data.value = m_oMaxValue.get(); + } + + return objectPtr; + } void CSharedItems::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3910,6 +4178,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CDiscreteGroupingProperties::toBin() + { + auto ptr(new XLSB::PCDFGDISCRETE); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arBrtPCDIIndex.push_back(i->toBinItemIndex()); + return objectPtr; + } void CDiscreteGroupingProperties::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -3996,6 +4272,63 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr COLAPGroupItems::toBin() + { + auto ptr(new XLSB::PCDFGITEMS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + { + auto boolVal = static_cast(i); + if(boolVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = boolVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto dataValue = static_cast(i); + if(dataValue) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = dataValue->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto errorValue = static_cast(i); + if(errorValue) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = errorValue->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto noVal = static_cast(i); + if(noVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = noVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto numericVal = static_cast(i); + if(numericVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = numericVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + auto charVal = static_cast(i); + if(charVal) + { + auto ptr1(new XLSB::PCDI); + ptr1->m_source = charVal->toBin(); + ptr->m_arPCDI.push_back(XLS::BaseObjectPtr{ptr1}); + continue; + } + } + return objectPtr; + } void COLAPGroupItems::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4123,6 +4456,44 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CRangeGroupingProperties::toBin() + { + auto ptr1(new XLSB::PCDFGRANGE); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginPCDFGRange); + ptr1->m_BrtBeginPCDFGRange = XLS::BaseObjectPtr{ptr}; + + if(m_oAutoStart.IsInit()) + ptr->fAutoStart = m_oAutoStart.get(); + if(m_oAutoEnd.IsInit()) + ptr->fAutoEnd = m_oAutoEnd.get(); + if(m_oGroupInterval.IsInit()) + ptr->xnumBy.data.value = m_oGroupInterval.get(); + if(m_oStartDate.IsInit() && m_oEndDate.IsInit()) + { + ptr->xnumStart.data.value = std::stod(m_oStartDate->GetValue()); + ptr->xnumEnd.data.value = std::stod(m_oEndDate->GetValue()); + } + else + { + if(m_oStartNum.IsInit()) + ptr->xnumStart.data.value = m_oStartNum.get(); + if(m_oEndNum.IsInit()) + ptr->xnumEnd.data.value = m_oEndNum.get(); + } + if(m_oGroupBy.IsInit()) + { + if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByNumericRanges) ptr->iByType = 0x00; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupBySeconds) ptr->iByType = 0x01; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByMinutes) ptr->iByType = 0x02; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByHours) ptr->iByType = 0x03; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByDays) ptr->iByType = 0x04; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByMonths) ptr->iByType = 0x05; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByQuarters) ptr->iByType = 0x06; + else if (m_oGroupBy == SimpleTypes::Spreadsheet::EValuesGroupBy::groupByYears) ptr->iByType = 0x07; + } + return objectPtr; + } void CRangeGroupingProperties::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4241,6 +4612,47 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotCharacterValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIAString); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIString); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + ptr->st = m_oValue.get(); + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + } void CPivotCharacterValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -4361,6 +4773,67 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotErrorValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIAError); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + { + if (m_oValue == L"#NULL!") ptr->err = 0x00; + else if (m_oValue == L"#DIV/0!") ptr->err = 0x07; + else if (m_oValue == L"#VALUE!") ptr->err = 0x0F; + else if (m_oValue == L"#REF!") ptr->err = 0x17; + else if (m_oValue == L"#NAME?") ptr->err = 0x1D; + else if (m_oValue == L"#NUM!") ptr->err = 0x24; + else if (m_oValue == L"#N/A") ptr->err = 0x2A; + else if (m_oValue == L"#GETTING_DATA") ptr->err = 0x2B; + } + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIError); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + { + if (m_oValue == L"#NULL!") ptr->err = 0x00; + else if (m_oValue == L"#DIV/0!") ptr->err = 0x07; + else if (m_oValue == L"#VALUE!") ptr->err = 0x0F; + else if (m_oValue == L"#REF!") ptr->err = 0x17; + else if (m_oValue == L"#NAME?") ptr->err = 0x1D; + else if (m_oValue == L"#NUM!") ptr->err = 0x24; + else if (m_oValue == L"#N/A") ptr->err = 0x2A; + else if (m_oValue == L"#GETTING_DATA") ptr->err = 0x2B; + } + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + } void CPivotErrorValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -4505,6 +4978,47 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { ReadAttributes(obj); } + XLS::BaseObjectPtr CPivotNumericValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIANumber); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDINumber); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + ptr->xnum.data.value = m_oValue.get(); + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + } void CPivotNumericValue::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -4614,6 +5128,34 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotDateTimeValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIADatetime); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIDatetime); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + ptr->datetime.fromString(m_oValue->GetValue()); + + return objectPtr; + } + } void CPivotDateTimeValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -4702,6 +5244,35 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotBooleanValue::toBin() + { + if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) + { + auto ptr(new XLSB::PCDIABoolean); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + ptr->f = m_oValue.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIBoolean); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oValue.IsInit()) + ptr->f = m_oValue.get(); + return objectPtr; + } + } void CPivotBooleanValue::fromBin(XLS::BaseObjectPtr& obj) { ReadAttributes(obj); @@ -4801,7 +5372,46 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { ReadAttributes(obj); } - + XLS::BaseObjectPtr CPivotNoValue::toBin() + { + if(m_arrItems.empty() || m_oBold.IsInit() || m_oItalic.IsInit() || m_oStrike.IsInit() || m_oUnderline.IsInit() || m_oFormatIndex.IsInit() + || m_oBackColor.IsInit() || m_oForeColor.IsInit()) + { + auto ptr(new XLSB::PCDIMissing); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBold.IsInit()) + ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); + if(m_oItalic.IsInit()) + ptr->sxvcellextra->fSrvFmtItalic = m_oItalic.get(); + if(m_oStrike.IsInit()) + ptr->sxvcellextra->fSrvFmtStrikethrough = m_oStrike.get(); + if(m_oUnderline.IsInit()) + ptr->sxvcellextra->fSrvFmtUnderline = m_oUnderline.get(); + if(m_oFormatIndex.IsInit()) + ptr->sxvcellextra->isfci = m_oFormatIndex->GetValue(); + if(m_oBackColor.IsInit()) + ptr->sxvcellextra->cvBack.fromHex(m_oBackColor->GetValue()); + if(m_oForeColor.IsInit()) + ptr->sxvcellextra->cvFore.fromHex(m_oForeColor->GetValue()); + return objectPtr; + } + else + { + auto ptr(new XLSB::PCDIAMissing); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCaption.IsInit()) + ptr->info.stCaption = m_oCaption.get(); + if(m_oCalculated.IsInit()) + ptr->info.fFmla = m_oCalculated.get(); + if(m_oUnused.IsInit()) + ptr->info.fGhost = m_oUnused.get(); + if(m_oCount.IsInit()) + ptr->info.cIMemProps = m_oCount->GetValue(); + for(auto i:m_arrItems) + ptr->info.rgIMemProps.push_back(i->m_oV.get()); + return objectPtr; + } + } void CPivotNoValue::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -4919,6 +5529,32 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oConsolidation = ptr->m_PCDSCONSOL; } } + XLS::BaseObjectPtr CPivotCacheSource::toBin() + { + auto ptr(new XLSB::PCDSOURCE); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDSource); + ptr->m_BrtBeginPCDSource = XLS::BaseObjectPtr{ptr1}; + if(m_oType.IsInit()) + { + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceWorksheet) + ptr1->iSrcType = 0x00000000; + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceExternal) + ptr1->iSrcType = 0x00000001; + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceConsolidation) + ptr1->iSrcType = 0x00000002; + if(m_oType == SimpleTypes::Spreadsheet::ESourceCacheType::typeSourceScenario) + ptr1->iSrcType = 0x00000003; + } + if(m_oConnectionId.IsInit()) + ptr1->dwConnID = m_oConnectionId->GetValue(); + + if(m_oWorksheetSource.IsInit()) + ptr->m_PCDSRANGE = m_oWorksheetSource->toBin(); + if(m_oConsolidation.IsInit()) + ptr->m_PCDSCONSOL = m_oConsolidation->toBin(); + return objectPtr; + } void CPivotCacheSource::ReadAttributes(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -4969,6 +5605,29 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CWorksheetSource::toBin() + { + auto ptr1(new XLSB::PCDSRANGE); + XLS::BaseObjectPtr objectPtr(ptr1); + auto ptr(new XLSB::BeginPCDSRange); + ptr1->m_BrtBeginPCDSRange = XLS::BaseObjectPtr{ptr}; + + if(m_oSheet.IsInit()) + ptr->sheetName = m_oSheet.get(); + else + ptr->fLoadSheet = false; + if(m_oRef.IsInit()) + ptr->range.fromString(m_oRef.get()); + if(m_oName.IsInit()) + ptr->namedRange = m_oName.get(); + else + ptr->fName = false; + if(m_oRid.IsInit()) + ptr->relId.value = m_oRid->GetValue(); + else + ptr->fLoadRelId = false; + return objectPtr; + } void CWorksheetSource::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5042,6 +5701,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPageItemValues::toBin() + { + auto ptr(new XLSB::PCDSCPAGES); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDSCPAGE.push_back(i->toBin()); + return objectPtr; + } void CPageItemValues::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5098,6 +5765,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CPageItems::toBin() + { + auto ptr(new XLSB::PCDSCPAGE); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDSCPITEM.push_back(i->toBin()); + return objectPtr; + } void CPageItems::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5132,6 +5807,17 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CPageItem::toBin() + { + auto ptr(new XLSB::PCDSCPITEM); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDSCPItem); + ptr->m_BrtBeginPCDSCPItem = XLS::BaseObjectPtr{ptr1}; + if(m_oName.IsInit()) + ptr1->stName = m_oName.get(); + + return objectPtr; + } void CPageItem::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5193,6 +5879,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + XLS::BaseObjectPtr CRangeSets::toBin() + { + auto ptr(new XLSB::PCDSCSETS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arPCDSCSET.push_back(i->toBin()); + return objectPtr; + } void CRangeSets::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5234,6 +5928,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } + XLS::BaseObjectPtr CRangeSet::toBin() + { + auto ptr(new XLSB::BeginPCDSCSet); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oSheet.IsInit()) + ptr->irstSheet = m_oSheet.get(); + if(m_oRef.IsInit()) + ptr->rfx = m_oRef.get(); + if(m_oName.IsInit()) + ptr->irstName = m_oName.get(); + if(m_oRid.IsInit()) + ptr->irstRelId.value = m_oRid->GetValue(); + if(m_oI1.IsInit()) + ptr->rgiItem[0] = m_oI1->GetValue(); + if(m_oI2.IsInit()) + ptr->rgiItem[1] = m_oI2->GetValue(); + if(m_oI3.IsInit()) + ptr->rgiItem[2] = m_oI3->GetValue(); + if(m_oI4.IsInit()) + ptr->rgiItem[3] = m_oI4->GetValue(); + return objectPtr; + } void CRangeSet::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5314,6 +6030,20 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oRangeSets = oReader; } } + XLS::BaseObjectPtr CConsolidationSource::toBin() + { + auto ptr(new XLSB::PCDSCONSOL); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDSConsol); + ptr->m_BrtBeginPCDSConsol = XLS::BaseObjectPtr{ptr1}; + if(m_oAutoPage.IsInit()) + ptr1->fAutoPage = m_oAutoPage.get(); + if(m_oPages.IsInit()) + ptr->m_PCDSCPAGES = m_oPages->toBin(); + if(m_oRangeSets.IsInit()) + ptr->m_PCDSCSETS = m_oRangeSets->toBin(); + return objectPtr; + } void CConsolidationSource::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5386,6 +6116,26 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oGroupItems = oReader; } } + XLS::BaseObjectPtr CFieldGroupProperties::toBin() + { + auto ptr(new XLSB::PCDFGROUP); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oPar.IsInit() || m_oBase.IsInit()) + { + auto ptr1(new XLSB::BeginPCDFGroup); + if(m_oPar.IsInit()) + ptr1->ifdbParent = m_oPar->GetValue(); + if(m_oBase.IsInit()) + ptr1->ifdbBase = m_oBase->GetValue(); + } + if(m_oDiscretePr.IsInit()) + ptr->m_PCDFGDISCRETE = m_oDiscretePr->toBin(); + if(m_oRangePr.IsInit()) + ptr->m_PCDFGRANGE = m_oRangePr->toBin(); + if(m_oGroupItems.IsInit()) + ptr->m_PCDFGITEMS = m_oGroupItems->toBin(); + return objectPtr; + } void CFieldGroupProperties::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -5758,6 +6508,15 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } + XLS::BaseObjectPtr CSharedItemsIndex::toBinItemIndex() + { + auto ptr(new XLSB::PCDIIndex); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oV.IsInit()) + ptr->iitem = m_oV->GetValue(); + return objectPtr; + } + XLS::BaseObjectPtr CSharedItemsIndex::toBinPrfItem() { auto ptr(new XLSB::BeginPRFItem); From 85c420d501f0abc5f69f20b4d0832156285c7211 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 21 Sep 2023 22:05:22 +0600 Subject: [PATCH 090/221] Add pivot cache records conversion --- OOXML/XlsxFormat/Pivot/PivotCacheRecords.h | 19 +-- OOXML/XlsxFormat/Pivot/Pivots.cpp | 175 ++++++++++++++++++--- 2 files changed, 162 insertions(+), 32 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h b/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h index 8f00b1f924..354d07ff75 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheRecords.h @@ -57,7 +57,7 @@ namespace OOX WritingElement_XlsbConstructors(CPivotCacheRecord) CPivotCacheRecord(){} virtual ~CPivotCacheRecord() {} - + virtual void fromXML(XmlUtils::CXmlNode& node) { } @@ -68,6 +68,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheRecord; @@ -96,11 +97,12 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_PivotCacheRecords; } - void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); nullable m_oCount; nullable m_oExtLst; @@ -114,7 +116,7 @@ namespace OOX CPivotCacheRecordsFile(OOX::Document* pMain) : OOX::FileGlobalEnumerated(pMain), OOX::IFileContainer(pMain) { m_bSpreadsheets = true; - + m_pData = NULL; m_nDataLength = 0; } @@ -145,12 +147,10 @@ namespace OOX memcpy(m_pData, pData, length); } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::PivotCacheRecords; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); @@ -165,11 +165,12 @@ namespace OOX } //--------------------------------------------------------------------- nullable m_oPivotCacheRecords; - //--------- + //--------- BYTE *m_pData = NULL; DWORD m_nDataLength = 0; private: - CPath m_oReadPath; + CPath m_oReadPath; + std::wstring prepareData() const; }; } //Spreadsheet } // namespace OOX diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 54e60a15dc..4e207bb88f 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -38,6 +38,7 @@ #include "../../XlsbFormat/PivotTableStream.h" #include "../../XlsbFormat/PivotCacheDefStream.h" #include "../../XlsbFormat/Biff12_unions/PIVOTCACHERECORDS.h" +#include "../../XlsbFormat/Biff12_records/BeginPivotCacheRecords.h" #include "../../XlsbFormat/Biff12_unions/PIVOTCACHERECORD.h" #include "../../XlsbFormat/Biff12_unions/PIVOTCACHERECORDDT.h" #include "../../XlsbFormat/Biff12_unions/PCDIDT.h" @@ -133,6 +134,7 @@ #include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include namespace OOX { namespace Spreadsheet @@ -6190,6 +6192,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" //pivotCacheRecordsStream.reset(); } } + XLS::BaseObjectPtr CPivotCacheRecordsFile::WriteBin() const + { + auto pivotCacheRecordsStream(new XLSB::PivotCacheRecordsStream); + if(m_oPivotCacheRecords.IsInit()) + pivotCacheRecordsStream->m_PIVOTCACHERECORDS = m_oPivotCacheRecords->toBin(); + else if(m_nDataLength > 0 && m_pData) + { + CPivotCacheRecords records; + XmlUtils::CXmlLiteReader reader; + auto wstringData = prepareData(); + reader.FromString(wstringData); + reader.ReadNextNode(); + records.fromXML(reader); + pivotCacheRecordsStream->m_PIVOTCACHERECORDS = records.toBin(); + } + return XLS::BaseObjectPtr{pivotCacheRecordsStream}; + } void CPivotCacheRecordsFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -6216,34 +6235,70 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } void CPivotCacheRecordsFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { - if(m_oPivotCacheRecords.IsInit()) - { - std::wstring sPath = oPath.GetPath(); - - if (false == m_oPivotCacheRecords->m_strOutputXml.empty()) + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) { - NSFile::CFileBinary::SaveToFile(sPath, m_oPivotCacheRecords->m_strOutputXml); + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); } - else - { - NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); - m_oPivotCacheRecords->toXML(sXml); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - } - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); - } - else if(m_nDataLength > 0 && m_pData) + else { - NSFile::CFileBinary oFile; - oFile.CreateFileW(oPath.GetPath()); - oFile.WriteFile(m_pData, m_nDataLength); - oFile.CloseFile(); + if(m_oPivotCacheRecords.IsInit()) + { + std::wstring sPath = oPath.GetPath(); - oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); - IFileContainer::Write( oPath, oDirectory, oContent ); + if (false == m_oPivotCacheRecords->m_strOutputXml.empty()) + { + NSFile::CFileBinary::SaveToFile(sPath, m_oPivotCacheRecords->m_strOutputXml); + } + else + { + NSStringUtils::CStringBuilder sXml; + sXml.WriteString(L""); + m_oPivotCacheRecords->toXML(sXml); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } + + } + else if(m_nDataLength > 0 && m_pData) + { + NSFile::CFileBinary oFile; + oFile.CreateFileW(oPath.GetPath()); + oFile.WriteFile(m_pData, m_nDataLength); + oFile.CloseFile(); + + } } + oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); + IFileContainer::Write( oPath, oDirectory, oContent ); + } + const OOX::FileType CPivotCacheRecordsFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::PivotCacheRecordsBin; + } + return OOX::Spreadsheet::FileTypes::PivotCacheRecords; + } + std::wstring CPivotCacheRecordsFile::prepareData() const + { + std::vector dataChars; + std::string rawStringData{reinterpret_cast(m_pData)}; + //std::string stringData(reinterpret_cast(m_pData)); + std::wstring_convert> converter; + std::wstring result; + for (char i : rawStringData) + { + try { + // Попытка конвертировать каждый символ + result += converter.from_bytes(std::string(1, i)); + } catch (const std::range_error&) { + // Пропускаем невалидные символы + } + } + + return result; } //------------------------------------ void CPivotCacheRecords::toXML(NSStringUtils::CStringBuilder& writer) const @@ -6323,6 +6378,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" writer.Clear(); } } + XLS::BaseObjectPtr CPivotCacheRecords::toBin() + { + auto ptr(new XLSB::PIVOTCACHERECORDS); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPivotCacheRecords); + ptr1->crecords = m_arrItems.size(); + ptr->m_BrtBeginPivotCacheRecords = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arPIVOTCACHERECORD.push_back(i->toBin()); + + return objectPtr; + } void CPivotCacheRecords::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start( oReader ) @@ -6396,6 +6463,68 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(PPTX::CreatePtrXmlContent(oReader)); } } + XLS::BaseObjectPtr CPivotCacheRecord::toBin() + { + auto ptr(new XLSB::PIVOTCACHERECORD); + auto ptr1(new XLSB::PIVOTCACHERECORDDT); + XLS::BaseObjectPtr objectPtr(ptr); + ptr->m_source = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + { + auto ptrPCDIDT(new XLSB::PCDIDT); + + auto boolValue = static_cast(i); + if(boolValue) + { + ptrPCDIDT->m_source = boolValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + auto dataValue = static_cast(i); + if(dataValue) + { + ptrPCDIDT->m_source = dataValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + auto errorValue = static_cast(i); + if(errorValue) + { + ptrPCDIDT->m_source = errorValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + auto noValue = static_cast(i); + if(noValue) + { + ptrPCDIDT->m_source = noValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + auto numValue = static_cast(i); + if(numValue) + { + ptrPCDIDT->m_source = numValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + auto charValue = static_cast(i); + if(charValue) + { + ptrPCDIDT->m_source = charValue->toBin(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + auto itemIndex = static_cast(i); + if(charValue) + { + ptrPCDIDT->m_source = itemIndex->toBinItemIndex(); + ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); + continue; + } + } + return objectPtr; + } void CPivotCacheRecord::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); From 23c93145b17a15ebb69c71a35703b8a519c7a581 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 28 Sep 2023 13:32:10 +0600 Subject: [PATCH 091/221] Fix pivot table stream writing --- OOXML/XlsbFormat/PivotTableStream.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsbFormat/PivotTableStream.cpp b/OOXML/XlsbFormat/PivotTableStream.cpp index 59a7b082e6..98b716a6ce 100644 --- a/OOXML/XlsbFormat/PivotTableStream.cpp +++ b/OOXML/XlsbFormat/PivotTableStream.cpp @@ -74,7 +74,7 @@ BaseObjectPtr PivotTableStream::clone() } const bool PivotTableStream::loadContent(BinProcessor& proc) -{ +{ while (true) { CFRecordType::TypeId type = proc.getNextRecordType(); @@ -331,6 +331,7 @@ const bool PivotTableStream::saveContent(XLS::BinProcessor & proc) if (m_FRTSXVIEW != nullptr) proc.mandatory(*m_FRTSXVIEW); + proc.mandatory(); return true; } From 2193366443dda65f6fd67af9180cbb75ad01d153 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 29 Sep 2023 20:12:31 +0600 Subject: [PATCH 092/221] Fix pivot tables conversion --- OOXML/XlsxFormat/Pivot/Pivots.cpp | 209 +++++++++++++++++++++---- OOXML/XlsxFormat/Workbook/Workbook.cpp | 3 +- 2 files changed, 177 insertions(+), 35 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 4e207bb88f..0a54fce59b 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -60,6 +60,7 @@ #include "../../XlsbFormat/Biff12_records/BeginSXLocation.h" #include "../../XlsbFormat/Biff12_unions/SXVDS.h" #include "../../XlsbFormat/Biff12_unions/SXVD.h" +#include "../../XlsbFormat/Biff12_records/BeginSXVDs.h" #include "../../XlsbFormat/Biff12_records/BeginSXVD.h" #include "../../XlsbFormat/Biff12_unions/SXVIS.h" #include "../../XlsbFormat/Biff12_unions/SXVI.h" @@ -77,7 +78,9 @@ #include "../../XlsbFormat/Biff12_records/BeginISXVDRws.h" #include "../../XlsbFormat/Biff12_records/BeginISXVDCols.h" #include "../../XlsbFormat/Biff12_unions/SXLIRWS.h" +#include "../../XlsbFormat/Biff12_records/BeginSXLIRws.h" #include "../../XlsbFormat/Biff12_unions/SXLICOLS.h" +#include "../../XlsbFormat/Biff12_records/BeginSXLICols.h" #include "../../XlsbFormat/Biff12_unions/SXLI.h" #include "../../XlsbFormat/Biff12_unions/ISXVIS.h" #include "../../XlsbFormat/Biff12_records/BeginSXLI.h" @@ -85,6 +88,7 @@ #include "../../XlsbFormat/Biff12_unions/SXDIS.h" #include "../../XlsbFormat/Biff12_unions/SXDI.h" #include "../../XlsbFormat/Biff12_records/BeginSXDI.h" +#include "../../XlsbFormat/Biff12_records/BeginSXDIs.h" #include "../../XlsbFormat/Biff12_unions/SXFORMATS.h" #include "../../XlsbFormat/Biff12_unions/SXFORMAT.h" #include "../../XlsbFormat/Biff12_records/BeginSXFormat.h" @@ -94,6 +98,7 @@ #include "../../XlsbFormat/Biff12_records/BeginSXPI.h" #include "../../XlsbFormat/Biff12_records/BeginPivotCacheDef.h" #include "../../XlsbFormat/Biff12_unions/PCDFIELDS.h" +#include "../../XlsbFormat/Biff12_records/BeginPCDFields.h" #include "../../XlsbFormat/Biff12_unions/PCDFIELD.h" #include "../../XlsbFormat/Biff12_records/BeginPCDField.h" #include "../../XlsbFormat/Biff12_unions/PCDFATBL.h" @@ -122,6 +127,9 @@ #include "../../XlsbFormat/Biff12_unions/PCDSCSET.h" #include "../../XlsbFormat/Biff12_records/BeginPCDSCSet.h" #include "../../XlsbFormat/Biff12_records/PCRRecord.h" +#include "../../XlsbFormat/Biff12_unions/FRTSXVIEW.h" +#include "../../XlsbFormat/Biff12_unions/SXVIEW14.h" +#include "../../XlsbFormat/Biff12_records/BeginSXView14.h" #include @@ -396,10 +404,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->m_ISXVDRWS = m_oRowFields->toBinRows(); if(m_oColFields.IsInit()) ptr->m_ISXVDCOLS = m_oColFields->toBinCols(); - if(m_oRowItems.IsInit()) - ptr->m_SXLIRWS = m_oRowItems->toBinRows(); - if(m_oColItems.IsInit()) - ptr->m_SXLICOLS = m_oColItems->toBinCols(); + if(m_oRowItems.IsInit()) + ptr->m_SXLIRWS = m_oRowItems->toBinRows(); + if(m_oColItems.IsInit()) + ptr->m_SXLICOLS = m_oColItems->toBinCols(); if(m_oDataFields.IsInit()) ptr->m_SXDIS = m_oDataFields->toBin(); @@ -410,6 +418,22 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oPageFields.IsInit()) ptr->m_SXPIS = m_oPageFields->toBin(); + /*auto frt(new XLSB::FRTSXVIEW); + auto sxview14(new XLSB::SXVIEW14); + auto beginsxview(new XLSB::BeginSXView14); + ptr->m_FRTSXVIEW = XLS::BaseObjectPtr{frt}; + frt->m_SXVIEW14 = XLS::BaseObjectPtr{sxview14}; + sxview14->m_BrtBeginSXView14 = XLS::BaseObjectPtr{beginsxview}; + beginsxview->fAutoApply = false; + beginsxview->fCalcMembersInAdvFilters = false; + beginsxview->fEnableWB = false; + beginsxview->fFillDownLabelsDefault = false; + beginsxview->fShowValuesRow = false; + beginsxview->sxma.value() = 0; + beginsxview->irstAltText = 0xFFFFFFFF; + beginsxview->irstAltTextSummary = 0xFFFFFFFF; + beginsxview->irstWeight = 0xFFFFFFFF;*/ + return objectPtr; } XLS::BaseObjectPtr CPivotTableDefinition::writeAttributes() @@ -417,8 +441,6 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" auto ptr(new XLSB::BeginSXView); XLS::BaseObjectPtr objectPtr(ptr); - if (m_oApplyAlignmentFormats.IsInit()) - ptr->ibitAtrAlc = m_oApplyAlignmentFormats.get(); if (m_oApplyBorderFormats.IsInit()) ptr->ibitAtrBdr = m_oApplyBorderFormats.get(); if (m_oApplyFontFormats.IsInit()) @@ -434,14 +456,22 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oAsteriskTotals.IsInit()) ptr->fHideTotAnnotation = m_oAsteriskTotals.get(); + else + ptr->fHideTotAnnotation = false; if (m_oVisualTotals.IsInit()) ptr->fNotVisualTotals = m_oVisualTotals.get(); + else + ptr->fNotVisualTotals = false; if (m_oAutoFormatId.IsInit()) ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + else + ptr->itblAutoFmt = 0; if (m_oCacheId.IsInit()) ptr->idCache = m_oCacheId->GetValue(); if (m_oChartFormat.IsInit()) ptr->dwCrtFmtId = m_oChartFormat->GetValue(); + else + ptr->dwCrtFmtId = 0; if (m_oColGrandTotals.IsInit()) ptr->fColGrand = m_oColGrandTotals.get(); @@ -452,30 +482,42 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oCompactData.IsInit()) ptr->fCompactData = m_oCompactData.get(); if (m_oCreatedVersion.IsInit()) ptr->bVerSxMacro = m_oCreatedVersion->GetValue(); if (m_oCustomListSort.IsInit()) ptr->fDontUseCustomLists = !m_oCustomListSort.get(); + else ptr->fDontUseCustomLists = false; if (m_oDataCaption.IsInit()) ptr->irstData = m_oDataCaption.get(); else ptr->irstData = 0xFFFFFFFF; if (m_oDataOnRows.IsInit()) ptr->fDefaultCompact = m_oDataOnRows.get(); if (m_oDataPosition.IsInit()) ptr->ipos4Data = m_oDataPosition->GetValue(); + else ptr->ipos4Data = -1; if (m_oDisableFieldList.IsInit()) ptr->fDisableFList = m_oDisableFieldList.get(); + else ptr->fDisableFList = false; if (m_oEditData.IsInit()) ptr->fEnableDataEd = m_oEditData.get(); + else + ptr->fEnableDataEd = false; if (m_oEnableDrill.IsInit()) ptr->fEnableDrilldown = m_oEnableDrill.get(); if (m_oEnableFieldProperties.IsInit()) ptr->fEnableFieldDialog = m_oEnableFieldProperties.get(); if (m_oEnableWizard.IsInit()) ptr->fEnableWizard = m_oEnableWizard.get(); if (m_oErrorCaption.IsInit()) ptr->irstErrorString = m_oErrorCaption.get(); else + { ptr->fEmptyDisplayErrorString = true; + ptr->fDisplayErrorString = false; + } if (m_oFieldListSortAscending.IsInit()) ptr->fNonDefaultSortInFlist = m_oFieldListSortAscending.get(); + else ptr->fNonDefaultSortInFlist = false; if (m_oFieldPrintTitles.IsInit()) ptr->fPrintTitles = m_oFieldPrintTitles.get(); + else ptr->fPrintTitles = false; if (m_oGrandTotalCaption.IsInit()) ptr->irstGrand = m_oGrandTotalCaption.get(); else ptr->fDisplayGrand = false; if (m_oGridDropZones.IsInit()) ptr->fNewDropZones = !m_oGridDropZones.get(); if (m_oImmersive.IsInit()) ptr->fTurnOffImmersive = m_oImmersive.get(); + else ptr->fTurnOffImmersive = false; if (m_oIndent.IsInit()) ptr->cIndentInc = m_oIndent->GetValue(); if (m_oItemPrintTitles.IsInit()) ptr->fRepeatItemsOnEachPrintedPage = m_oItemPrintTitles.get(); if (m_oMdxSubqueries.IsInit()) ptr->fDefaultCompact = m_oMdxSubqueries.get(); if (m_oMergeItem.IsInit()) ptr->fMergeLabels = m_oMergeItem.get(); + else ptr->fMergeLabels = false; if (m_oMinRefreshableVersion.IsInit()) ptr->bVerSxUpdateableMin = m_oMinRefreshableVersion->GetValue(); if (m_oMissingCaption.IsInit()) ptr->irstNullString = m_oMissingCaption.get(); else @@ -487,6 +529,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oOutline.IsInit()) ptr->fDefaultOutline = m_oOutline.get(); if (m_oOutlineData.IsInit()) ptr->fOutlineData = m_oOutlineData.get(); if (m_oPageOverThenDown.IsInit()) ptr->fAcrossPageLay = m_oPageOverThenDown.get(); + else ptr->fAcrossPageLay = false; if (m_oPageStyle.IsInit()) ptr->irstPageFieldStyle = m_oPageStyle.get(); else ptr->fDisplayPageFieldStyle = false; @@ -496,25 +539,36 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->fDisplayTableStyle = false; if (m_oPreserveFormatting.IsInit()) ptr->fPreserveFormatting = m_oPreserveFormatting.get(); if (m_oPrintDrill.IsInit()) ptr->fPrintDrillIndicators = m_oPrintDrill.get(); + else ptr->fPrintDrillIndicators = false; if (m_oPublished.IsInit()) ptr->fPublished = m_oPublished.get(); + else ptr->fPublished = false; if (m_oRowGrandTotals.IsInit()) ptr->fRwGrand = m_oRowGrandTotals.get(); if (m_oRowHeaderCaption.IsInit()) ptr->irstRwHdrName = m_oRowHeaderCaption.get(); else ptr->fUseRwHdrName = false; if (m_oShowCalcMbrs.IsInit()) ptr->fNotViewCalculatedMembers = !m_oShowCalcMbrs.get(); + else ptr->fNotViewCalculatedMembers = false; if (m_oShowDataDropDown.IsInit()) ptr->fHideDDData = !m_oShowDataDropDown.get(); + else ptr->fHideDDData = false; if (m_oShowDataTips.IsInit()) ptr->fNoPivotTips = !m_oShowDataTips.get(); + else ptr->fNoPivotTips = false; if (m_oShowDrill.IsInit()) ptr->fHideDrillIndicators = !m_oShowDrill.get(); + else ptr->fHideDrillIndicators = false; if (m_oShowDropZones.IsInit()) ptr->fNoStencil = !m_oShowDropZones.get(); + else ptr->fNoStencil = false; if (m_oShowEmptyCol.IsInit()) ptr->fIncludeEmptyCol = m_oShowEmptyCol.get(); + else ptr->fIncludeEmptyCol = false; if (m_oShowEmptyRow.IsInit()) ptr->fIncludeEmptyRw = m_oShowEmptyRow.get(); + else ptr->fIncludeEmptyRw = false; if (m_oShowError.IsInit()) ptr->fDisplayErrorString = m_oShowError.get(); if (m_oShowHeaders.IsInit()) ptr->fNoHeaders = !m_oShowHeaders.get(); + else ptr->fNoHeaders = false; if (m_oShowItems.IsInit()) ptr->fDisplayImmediateItems = m_oShowItems.get(); if (m_oShowMemberPropertyTips.IsInit()) ptr->fMemPropsInTips = m_oShowMemberPropertyTips.get(); if (m_oShowMissing.IsInit()) ptr->fDisplayNullString = m_oShowMissing.get(); if (m_oShowMultipleLabel.IsInit()) ptr->fPageMultipleItemLabel = m_oShowMultipleLabel.get(); if (m_oSubtotalHiddenItems.IsInit()) ptr->fSubtotalHiddenPageItems = m_oSubtotalHiddenItems.get(); + else ptr->fSubtotalHiddenPageItems = false; if (m_oTag.IsInit()) ptr->irstTag = m_oTag.get(); else ptr->fDisplayTag = false; @@ -563,8 +617,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(ptr->m_SXPIS != nullptr) m_oPageFields = ptr->m_SXPIS; - - + if(ptr->m_FRTSXVIEW) + { + auto result = static_cast(ptr->m_FRTSXVIEW.get()); + auto result2 = static_cast(result->m_SXVIEW14.get()); + auto result3 = static_cast(result2->m_BrtBeginSXView14.get()); + auto result4 = result3; + } } } void CPivotTableDefinition::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -926,6 +985,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->m_BrtBeginISXVDRws = XLS::BaseObjectPtr{ptr1}; if(m_oCount.IsInit()) ptr1->cisxvd = m_oCount->GetValue(); + else + ptr1->cisxvd = m_arrItems.size(); for(auto i:m_arrItems) ptr1->rgisxvdrws.push_back(i->m_oX.get()); return objectPtr; @@ -938,6 +999,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->m_BrtBeginISXVDCols = XLS::BaseObjectPtr{ptr1}; if(m_oCount.IsInit()) ptr1->cisxvd = m_oCount->GetValue(); + else + ptr1->cisxvd = m_arrItems.size(); for(auto i:m_arrItems) ptr1->rgisxvdcols.push_back(i->m_oX.get()); return objectPtr; @@ -990,6 +1053,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CColumnRowItems::toBinRows() { auto ptr(new XLSB::SXLIRWS); + auto ptr1(new XLSB::BeginSXLIRws); + ptr1->csxlis = m_arrItems.size(); + ptr->m_BrtBeginSXLIRws = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) ptr->m_arSXLI.push_back(i->toBin()); @@ -998,6 +1064,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CColumnRowItems::toBinCols() { auto ptr(new XLSB::SXLICOLS); + auto ptr1(new XLSB::BeginSXLICols); + ptr1->csxlis = m_arrItems.size(); + ptr->m_BrtBeginSXLICols = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) ptr->m_arSXLI.push_back(i->toBin()); @@ -1067,13 +1136,27 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CColumnRowItem::toBin() { auto ptr(new XLSB::SXLI); + auto size = 0; + + for(auto i:m_arrItems) + { + if(i->m_oV.IsInit()) + size++; + + } + XLS::BaseObjectPtr objectPtr(ptr); auto ptr1(new XLSB::BeginSXLI); + ptr1->cisxvis = size; ptr->m_BrtBeginSXLI = XLS::BaseObjectPtr{ptr1}; if(m_oI.IsInit()) ptr1->iData = m_oI->GetValue(); + else + ptr1->iData = 0; if(m_oR.IsInit()) ptr1->cSic = m_oR->GetValue(); + else + ptr1->cSic = 0; if(m_oT.IsInit()) { if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeData) @@ -1107,17 +1190,24 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oT == SimpleTypes::Spreadsheet::EPivotItemType::typeBlank) ptr1->itmtype = XLSB::PivotItemType::PITBLANK; } - if(m_arrItems.empty()) - return objectPtr; + else + { + ptr1->itmtype = XLSB::PivotItemType::PITDATA; + } + + auto ptr2(new XLSB::ISXVIS(size)); + ptr2->_cisxvis = size; - auto ptr2(new XLSB::ISXVIS(m_arrItems.size())); ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; - auto ptr3(new XLSB::BeginISXVIs(m_arrItems.size())); + auto ptr3(new XLSB::BeginISXVIs(size)); + ptr3->_cisxvis = size; ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; for(auto i:m_arrItems) if(i->m_oV.IsInit()) ptr3->rgisxvis.push_back(i->m_oV->GetValue()); + else + ptr3->rgisxvis.push_back(0); return objectPtr; } void CColumnRowItem::fromBin(XLS::BaseObjectPtr& obj) @@ -1270,6 +1360,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CDataFields::toBin() { auto ptr(new XLSB::SXDIS); + auto ptr1(new XLSB::BeginSXDIs); + ptr->m_BrtBeginSXDIs = XLS::BaseObjectPtr{ptr1}; + ptr1->csxdis = m_arrItems.size(); XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) ptr->m_arSXDI.push_back(i->toBin()); @@ -1325,6 +1418,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->isxvdData = m_oFld->GetValue(); if(m_oNumFmtId.IsInit()) ptr->ifmt.ifmt = m_oNumFmtId->GetValue(); + else + ptr->ifmt.ifmt = 0; if(m_oName.IsInit()) { ptr->stDisplayName = m_oName.get(); @@ -1353,6 +1448,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oShowDataAs == SimpleTypes::Spreadsheet::EShowDataAs::dataAsRunTotal) ptr->df = XLSB::ShowDataAs::PERCENTOFRUNTOTAL; } + else + { + ptr->df = XLSB::ShowDataAs::NORMAL; + } if(m_oSubtotal.IsInit()) { if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionSum) @@ -1378,6 +1477,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if (m_oSubtotal == SimpleTypes::Spreadsheet::EDataConsolidateFunction::functionVarP) ptr->iiftab = XLSB::DataConsolidationFunction::STDVARP; } + else + { + ptr->iiftab = XLSB::DataConsolidationFunction::SUM; + } return objectPtr; } void CDataField::fromBin(XLS::BaseObjectPtr& obj) @@ -1963,6 +2066,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr CPivotFields::toBin() { auto ptr(new XLSB::SXVDS); + auto ptr1(new XLSB::BeginSXVDs); + ptr1->csxvds = m_arrItems.size(); + ptr->m_BrtBeginSXVDs = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) ptr->m_arSXVD.push_back(i->toBin()); @@ -2140,6 +2246,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oItemPageCount.IsInit()) ptr->citmAutoShow = m_oItemPageCount->GetValue(); + else + ptr->citmAutoShow = 0; if(m_oMaxSubtotal.IsInit()) ptr->fMax = m_oMaxSubtotal.get(); @@ -2164,6 +2272,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oNumFmtId.IsInit()) ptr->ifmt = m_oNumFmtId->GetValue(); + else + ptr->ifmt = 0; if (m_oOutline.IsInit()) ptr->fOutline = m_oOutline.get(); @@ -2173,6 +2283,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oRankBy.IsInit()) ptr->isxdiAutoShow = m_oRankBy->GetValue(); + else + ptr->isxdiAutoShow = 0; if (m_oServerField.IsInit()) ptr->fServerBased = m_oServerField.get(); @@ -3118,6 +3230,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oColPageCount.IsInit()) ptr->ccolPage = m_oColPageCount->GetValue(); + else + ptr->ccolPage = 0; if(m_oFirstDataCol.IsInit()) ptr->colFirstData = m_oFirstDataCol->GetValue(); if(m_oFirstDataRow.IsInit()) @@ -3126,6 +3240,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->rwFirstHead = m_oFirstHeaderRow->GetValue(); if(m_oRowPageCount.IsInit()) ptr->crwPage = m_oRowPageCount->GetValue(); + else + ptr->crwPage = 0; if(m_oRef.IsInit()) ptr->rfxGeom = m_oRef.get(); return objectPtr; @@ -3184,13 +3300,20 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oShowRowHeaders.IsInit()) ptr->fRowHeaders = m_oShowRowHeaders.get(); if(m_oShowColStripes.IsInit()) - ptr->fRowStripes = m_oShowColStripes.get(); + ptr->fColumnStripes = m_oShowColStripes.get(); + else + ptr->fColumnStripes = false; + if(m_oShowRowStripes.IsInit()) + ptr->fRowStripes = m_oShowRowStripes.get(); + else + ptr->fRowStripes = false; if(m_oShowLastColumn.IsInit()) ptr->fLastColumn = m_oShowLastColumn.get(); if(m_oName.IsInit()) ptr->stStyleName = m_oName.get(); else ptr->stStyleName = 0xFFFFFFFF; + return objectPtr; } void CPivotTableStyleInfo::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -3373,6 +3496,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" XLS::BaseObjectPtr objectPtr(ptr); if (m_oBackgroundQuery.IsInit()) ptr->fBackgroundQuery = m_oBackgroundQuery.get(); + else + ptr->fBackgroundQuery = false; if (m_oEnableRefresh.IsInit()) ptr->fEnableRefresh = !m_oEnableRefresh.get(); @@ -3384,6 +3509,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oInvalid.IsInit()) ptr->fInvalid = m_oInvalid.get(); + else + ptr->fInvalid = false; if (m_oCreatedVersion.IsInit()) ptr->bVerCacheCreated = m_oCreatedVersion->GetValue(); @@ -3393,9 +3520,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oMissingItemsLimit.IsInit()) ptr->citmGhostMax = m_oMissingItemsLimit->GetValue(); + else + ptr->citmGhostMax = -1; if (m_oOptimizeMemory.IsInit()) ptr->fOptimizeCache = m_oOptimizeMemory.get(); + else + ptr->fOptimizeCache = false; if (m_oRecordCount.IsInit()) ptr->cRecords = m_oRecordCount->GetValue(); @@ -3403,7 +3534,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oRefreshedBy.IsInit()) ptr->stRefreshedWho = m_oRefreshedBy.get(); else - ptr->fLoadRefreshedWho = false; + ptr->stRefreshedWho = L"Aspose"; if (m_oRefreshedDateIso.IsInit()) ptr->xnumRefreshedDate.data.value = std::stod(m_oRefreshedDateIso->GetValue()); @@ -3413,21 +3544,31 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oRefreshOnLoad.IsInit()) ptr->fRefreshOnLoad = m_oRefreshOnLoad.get(); + else + ptr->fRefreshOnLoad = false; if (m_oSaveData.IsInit()) ptr->fSaveData = m_oSaveData.get(); if (m_oSupportAdvancedDrill.IsInit()) ptr->fSupportAttribDrill = m_oSupportAdvancedDrill.get(); + else + ptr->fSupportAttribDrill = false; if (m_oSupportSubquery.IsInit()) ptr->fSupportSubquery = m_oSupportSubquery.get(); + else + ptr->fSupportSubquery = false; if (m_oTupleCache.IsInit()) ptr->fSheetData = m_oTupleCache.get(); + else + ptr->fSheetData = false; if (m_oUpgradeOnRefresh.IsInit()) ptr->fUpgradeOnRefresh = m_oUpgradeOnRefresh.get(); + else + ptr->fUpgradeOnRefresh = false; return objectPtr; } @@ -3560,7 +3701,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if ( L"cacheFields" == sName ) + if ( L"cacheField" == sName ) { CPivotCacheField* pPivotCacheField = new CPivotCacheField(); *pPivotCacheField = oReader; @@ -3572,6 +3713,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptr(new XLSB::PCDFIELDS); XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginPCDFields); + ptr1->cFields = m_arrItems.size(); + ptr->m_BrtBeginPCDFields = XLS::BaseObjectPtr{ptr1}; for(auto i:m_arrItems) ptr->m_arPCDFIELD.push_back(i->toBin()); return objectPtr; @@ -3667,29 +3811,39 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" auto ptr(new XLSB::BeginPCDField); XLS::BaseObjectPtr objectPtr(ptr); - if (m_oName.IsInit()) - ptr->stFldName.value() = m_oName.get(); + if (m_oName.IsInit()) + ptr->stFldName = m_oName.get(); if (m_oCaption.IsInit()) - ptr->stFldCaption.value() = m_oCaption.get(); + ptr->stFldCaption = m_oCaption.get(); + else + ptr->fCaption = false; if (m_oDatabaseField.IsInit()) ptr->fSrcField = m_oDatabaseField.get(); + else + ptr->fSrcField = false; if (m_oServerField.IsInit()) ptr->fServerBased = m_oServerField.get(); if (m_oFormula.IsInit()) ptr->fldFmla = m_oFormula.get(); + else + ptr->fLoadFmla = false; if (m_oHierarchy.IsInit()) ptr->ihdb = m_oHierarchy.get(); if (m_oMemberPropertyField.IsInit()) ptr->fOlapMemPropField = m_oMemberPropertyField.get(); + else + ptr->fOlapMemPropField = false; if (m_oPropertyName.IsInit()) ptr->stMemPropName.value() = m_oPropertyName.get(); + else + ptr->fLoadPropName = false; if (m_oSqlType.IsInit()) ptr->wTypeSql = m_oSqlType.get(); @@ -6283,22 +6437,11 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } std::wstring CPivotCacheRecordsFile::prepareData() const { - std::vector dataChars; - std::string rawStringData{reinterpret_cast(m_pData)}; - //std::string stringData(reinterpret_cast(m_pData)); - std::wstring_convert> converter; - std::wstring result; - for (char i : rawStringData) - { - try { - // Попытка конвертировать каждый символ - result += converter.from_bytes(std::string(1, i)); - } catch (const std::range_error&) { - // Пропускаем невалидные символы - } - } - return result; + std::string stringData(reinterpret_cast(m_pData), m_nDataLength); + std::wstring_convert> converter; + + return converter.from_bytes(stringData); } //------------------------------------ void CPivotCacheRecords::toXML(NSStringUtils::CStringBuilder& writer) const diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 7ff74a9712..5354977701 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -157,13 +157,12 @@ namespace OOX { if (oReader.IsEmptyNode()) return; - int nCurDepth = oReader.GetDepth(); while (oReader.ReadNextSiblingNode(nCurDepth)) { std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); - if (L"pivotCaches" == sName) + if (L"pivotCache" == sName) { CWorkbookPivotCache *pPivotCache = new CWorkbookPivotCache(); m_arrItems.push_back(pPivotCache); From 004af5b9cc9893c2818fc1dffadc64d964d8516b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 29 Sep 2023 21:04:18 +0600 Subject: [PATCH 093/221] add default column width --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 1c5044c963..c0af350688 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -951,6 +951,8 @@ namespace OOX XLS::BaseObjectPtr Castedptr(ptr); if(m_oBaseColWidth.IsInit()) ptr->dxGCol = m_oBaseColWidth.get() * 256.; + else + ptr->dxGCol = 2304; if(m_oDefaultColWidth.IsInit()) { ptr->cchDefColWidth = m_oDefaultColWidth.get(); @@ -959,6 +961,10 @@ namespace OOX ptr->dxGCol = m_oDefaultColWidth.get() * 256; } } + else + { + ptr->cchDefColWidth = 9; + } if (m_oDefaultRowHeight.IsInit()) ptr->miyDefRwHeight = m_oDefaultRowHeight.get() * 20; else From 416ef9c03c2994ec0b792dae5bbafe028836fbfa Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 2 Oct 2023 20:57:53 +0600 Subject: [PATCH 094/221] Add table slicer conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 5 +- OOXML/XlsxFormat/Slicer/Slicer.cpp | 5 +- OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 59 +++++++++++++++++++--- OOXML/XlsxFormat/Slicer/SlicerCacheExt.h | 4 ++ 4 files changed, 62 insertions(+), 11 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 1b6855a834..7f4194e949 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -654,7 +654,7 @@ namespace OOX if(i->m_sUri == L"{46BE6895-7355-4a93-B00E-2C351335B9C9}") { - ptr->m_TABLESLICERCACHEIDS = i->m_oSlicerCachesExt->toBin(); + ptr->m_TABLESLICERCACHEIDS = i->m_oSlicerCachesExt->toBinTable(); } else if(i->m_sUri == L"{BBE1A952-AA13-448e-AADC-164F8A28A991}") { @@ -795,7 +795,7 @@ namespace OOX else if(i->m_sUri == L"{3A4CF648-6AED-40f4-86FF-DC5316D8AED3}") { if(i->m_oSlicerListExt.IsInit()) - ptr->m_SLICERSEX = i->m_oSlicerListExt->toBin(); + ptr->m_TABLESLICERSEX = i->m_oSlicerListExt->toBinTable(); } } return objectPtr; @@ -813,6 +813,7 @@ namespace OOX OOX::Drawing::COfficeArtExtension *oExt = new OOX::Drawing::COfficeArtExtension(); oExt->m_sUri = L"{46BE6895-7355-4a93-B00E-2C351335B9C9}"; oExt->m_oSlicerCachesExt = ptr->m_TABLESLICERCACHEIDS; + oExt->m_sAdditionalNamespace = L"xmlns:x15=\"http://schemas.microsoft.com/office/spreadsheetml/2010/11/main\""; if (oExt) m_arrExt.push_back( oExt ); diff --git a/OOXML/XlsxFormat/Slicer/Slicer.cpp b/OOXML/XlsxFormat/Slicer/Slicer.cpp index a187f302c6..54bc570237 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.cpp +++ b/OOXML/XlsxFormat/Slicer/Slicer.cpp @@ -200,13 +200,12 @@ XLS::BaseObjectPtr CSlicer::toBin() if(m_oRowHeight.IsInit()) ptr->dxRowHeight = m_oRowHeight.get(); - if(m_oName.IsInit()) + if(m_oName.IsInit()) ptr->stName = m_oName.get(); else if(m_oUid.IsInit()) ptr->stName = m_oUid.get(); else - ptr->stName = 0xFFFFFFFF; - + ptr->stName = 0xFFFFFFFF; if(m_oCache.IsInit()) ptr->stSlicerCacheName = m_oCache.get(); else diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 46faf77b86..c23219d961 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -47,6 +47,9 @@ #include "../../XlsbFormat/Biff12_unions/SLICERCACHEIDS.h" #include "../../XlsbFormat/Biff12_unions/SLICERCACHEID.h" #include "../../XlsbFormat/Biff12_records/BeginSlicerCacheID.h" +#include "../../XlsbFormat/Biff12_unions/TABLESLICERCACHEIDS.h" +#include "../../XlsbFormat/Biff12_unions/TABLESLICERCACHEID.h" +#include "../../XlsbFormat/Biff12_records/TableSlicerCacheID.h" #include "../../Binary/Presentation/XmlWriter.h" #include "../../Binary/Presentation/BinReaderWriterDefines.h" @@ -574,6 +577,18 @@ XLS::BaseObjectPtr CSlicerCache::toBin() } return objectPtr; } +XLS::BaseObjectPtr CSlicerCache::toBinTable() +{ + auto ptr(new XLSB::TABLESLICERCACHEID); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oRId.IsInit()) + { + auto ptr1(new XLSB::TableSlicerCacheID); + ptr->m_BrtTableSlicerCacheID = XLS::BaseObjectPtr{ptr1}; + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + } + return objectPtr; +} void CSlicerCache::fromBin(XLS::BaseObjectPtr &obj) { ReadAttributes(obj); @@ -623,13 +638,23 @@ void CSlicerCache::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) } XLS::BaseObjectPtr CSlicerRef::toBin() { - auto ptr(new XLSB::SLICEREX); - XLS::BaseObjectPtr objectPtr(ptr); - auto ptr1(new XLSB::BeginSlicerEx); - ptr1->FRTheader.relID.relId = m_oRId->GetValue(); - ptr->m_BrtBeginSlicerEx = XLS::BaseObjectPtr{ptr1}; + auto ptr(new XLSB::SLICEREX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerEx); + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + ptr->m_BrtBeginSlicerEx = XLS::BaseObjectPtr{ptr1}; - return objectPtr; + return objectPtr; +} +XLS::BaseObjectPtr CSlicerRef::toBinTable() +{ + auto ptr(new XLSB::TABLESLICEREX); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginSlicerEx); + ptr1->FRTheader.relID.relId = m_oRId->GetValue(); + ptr->m_BrtBeginSlicerEx = XLS::BaseObjectPtr{ptr1}; + + return objectPtr; } void CSlicerRef::fromBin(XLS::BaseObjectPtr &obj) { @@ -844,6 +869,17 @@ XLS::BaseObjectPtr CSlicerCaches::toBin() return objectPtr; } +XLS::BaseObjectPtr CSlicerCaches::toBinTable() +{ + auto ptr(new XLSB::TABLESLICERCACHEIDS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_oSlicerCache) + { + ptr->m_arTABLESLICERCACHEID.push_back(i.toBinTable()); + } + return objectPtr; +} + void CSlicerCaches::fromBin(XLS::BaseObjectPtr &obj) { auto ptr = static_cast(obj.get()); @@ -908,6 +944,17 @@ XLS::BaseObjectPtr CSlicerRefs::toBin() } return objectPtr; } +XLS::BaseObjectPtr CSlicerRefs::toBinTable() +{ + auto ptr(new XLSB::TABLESLICERSEX); + XLS::BaseObjectPtr objectPtr(ptr); + + for(auto i:m_oSlicer) + { + ptr->m_arTABLESLICEREX.push_back(i.toBinTable()); + } + return objectPtr; +} void CSlicerRefs::fromBin(XLS::BaseObjectPtr &obj) { if(obj->get_type() == XLS::typeSLICERSEX) diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h index a56af42276..e2992f220c 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.h @@ -186,6 +186,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -212,6 +213,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual void toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const; @@ -265,6 +267,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer, const std::wstring& sName, const std::wstring& sPrefix) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void fromBin(XLS::BaseObjectPtr& obj); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -290,6 +293,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinTable(); void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); virtual EElementType getType() const { From dc09bd4e0137518de8fd15fd360660b906ecb9cd Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 11 Oct 2023 19:30:01 +0600 Subject: [PATCH 095/221] Add external links binary writing --- .../ExternalLinks/ExternalLinks.cpp | 19 ++++++++++++++++--- .../XlsxFormat/ExternalLinks/ExternalLinks.h | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp index 12dccca9c1..e7e4f7c4a8 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -65,7 +65,7 @@ #include "../../XlsbFormat/Biff12_records/SupName.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" - +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" #include namespace OOX @@ -1685,7 +1685,7 @@ namespace Spreadsheet CExternalLink::~CExternalLink() { } - XLS::BaseObjectPtr CExternalLink::writeBin() + XLS::BaseObjectPtr CExternalLink::writeBin() const { XLSB::ExternalLinkStreamPtr externalLinkStreamStream(new XLSB::ExternalLinkStream); @@ -1812,6 +1812,14 @@ namespace Spreadsheet } void CExternalLink::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = writeBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { NSStringUtils::CStringBuilder sXml; sXml.WriteString(L""); sXml.WriteString(L"(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::ExternalLinksBin; + } return OOX::Spreadsheet::FileTypes::ExternalLinks; } const CPath CExternalLink::DefaultDirectory() const diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h index 355359effe..cfb69a2ac5 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.h @@ -464,7 +464,7 @@ namespace OOX CExternalLink(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath, const std::wstring & rId); virtual ~CExternalLink(); - XLS::BaseObjectPtr writeBin(); + XLS::BaseObjectPtr writeBin() const; void readBin(const CPath& oPath); virtual void read(const CPath& oPath); From 832a57bed10c8844e86456cb28a5118d06a27f58 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 13 Oct 2023 20:47:35 +0600 Subject: [PATCH 096/221] Add comments conversion --- OOXML/XlsxFormat/Comments/Comments.h | 4 + OOXML/XlsxFormat/Comments/XlsxComments.cpp | 91 +++++++++++++++++++++- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 4 +- 3 files changed, 97 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Comments/Comments.h b/OOXML/XlsxFormat/Comments/Comments.h index 4aa90a91a7..679287e201 100644 --- a/OOXML/XlsxFormat/Comments/Comments.h +++ b/OOXML/XlsxFormat/Comments/Comments.h @@ -88,6 +88,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -112,6 +113,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -141,6 +143,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const; @@ -156,6 +159,7 @@ namespace OOX virtual ~CComments(); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath); virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; diff --git a/OOXML/XlsxFormat/Comments/XlsxComments.cpp b/OOXML/XlsxFormat/Comments/XlsxComments.cpp index babca8545e..9a3682e79c 100644 --- a/OOXML/XlsxFormat/Comments/XlsxComments.cpp +++ b/OOXML/XlsxFormat/Comments/XlsxComments.cpp @@ -49,6 +49,8 @@ #include "../SharedStrings/Si.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -122,6 +124,18 @@ namespace OOX } } } + XLS::BaseObjectPtr CAuthors::toBin() + { + auto ptr(new XLSB::COMMENTAUTHORS); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + { + auto author(new XLSB::CommentAuthor); + author->author = i; + ptr->m_arBrtCommentAuthor.push_back(XLS::BaseObjectPtr{author}); + } + return objectPtr; + } EElementType CAuthors::getType () const { return et_x_Authors; @@ -194,6 +208,46 @@ namespace OOX } } } + XLS::BaseObjectPtr CComment::toBin() + { + auto ptr(new XLSB::COMMENT); + XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginComment); + ptr->m_BrtBeginComment = XLS::BaseObjectPtr{ptr1}; + + if(m_oRef.IsInit()) + ptr1->rfx = m_oRef->GetValue(); + if(m_oAuthorId.IsInit()) + ptr1->iauthor = m_oAuthorId->GetValue(); + if(m_oUid.IsInit()) + ptr1->guid = m_oUid->ToString(); + if(m_oText.IsInit()) + { + auto type = m_oText->getType(); + auto text(new XLSB::CommentText); + if(type == OOX::et_x_Si) + { + text->text.fExtStr = false; + text->text.fRichStr = false; + text->text.str = m_oText->ToString(); + } + else if(type == OOX::et_x_rPh) + { + text->text.fExtStr = true; + text->text.fRichStr = false; + text->text.phoneticStr = m_oText->ToString(); + } + else if(type == OOX::et_x_rPr) + { + text->text.fExtStr = false; + text->text.fRichStr = true; + } + text->text.str = m_oText->ToString(); + ptr->m_BrtCommentText = XLS::BaseObjectPtr{text}; + } + + return objectPtr; + } EElementType CComment::getType () const { return et_x_Comment; @@ -275,6 +329,14 @@ namespace OOX } } } + XLS::BaseObjectPtr CCommentList::toBin() + { + auto ptr(new XLSB::COMMENTLIST); + XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) + ptr->m_arCOMMENT.push_back(i->toBin()); + return objectPtr; + } EElementType CCommentList::getType () const { return et_x_CommentList; @@ -332,6 +394,20 @@ namespace OOX //commentsStream.reset(); } } + XLS::BaseObjectPtr CComments::WriteBin() const + { + XLSB::CommentsStreamPtr commentsStream(new XLSB::CommentsStream); + auto ptr(new XLSB::COMMENTS); + commentsStream->m_COMMENTS = XLS::BaseObjectPtr{ptr}; + + if(m_oAuthors.IsInit()) + ptr->m_COMMENTAUTHORS = m_oAuthors->toBin(); + + if(m_oCommentList.IsInit()) + ptr->m_COMMENTLIST = m_oCommentList->toBin(); + + return XLS::BaseObjectPtr{commentsStream}; + } void CComments::read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -379,6 +455,14 @@ namespace OOX } void CComments::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + else + { NSStringUtils::CStringBuilder sXml; sXml.WriteString(L"\ "); std::wstring sPath = oPath.GetPath(); NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); - + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write(oPath, oDirectory, oContent); } const OOX::FileType CComments::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::CommentsBin; + } return OOX::Spreadsheet::FileTypes::Comments; } const CPath CComments::DefaultDirectory() const diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 221a81170d..5203cd010d 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -350,7 +350,9 @@ namespace OOX } void CWorksheet::PrepareAfterRead() { - PrepareComments(m_pComments, m_pThreadedComments, m_oLegacyDrawing.GetPointer()); + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if (!(xlsb) && (xlsb->m_bWriteToXlsb)) + PrepareComments(m_pComments, m_pThreadedComments, m_oLegacyDrawing.GetPointer()); PrepareConditionalFormatting(); PrepareDataValidations(); } From c343625e6f2996efaefc8c9cb5caec9f7fe77fd4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 13 Oct 2023 21:14:26 +0600 Subject: [PATCH 097/221] Add connections conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 14 +- OOXML/DocxFormat/Drawing/DrawingExt.h | 1 + OOXML/XlsxFormat/Table/Connections.cpp | 250 +++++++++++++++++++++++- OOXML/XlsxFormat/Table/Connections.h | 10 + 4 files changed, 268 insertions(+), 7 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 3cd31942a5..f1c4573a14 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -249,7 +249,7 @@ namespace OOX OOX::Spreadsheet::CConditionalFormatting* pConditionalFormatting = new OOX::Spreadsheet::CConditionalFormatting(); *pConditionalFormatting = oReader; m_arrConditionalFormatting.push_back(pConditionalFormatting); - } + } } else if (sName == L"dataValidations") { @@ -646,6 +646,18 @@ namespace OOX return sResult; } + XLS::BaseObjectPtr COfficeArtExtensionList::toBinConnections() + { + auto ptr(new XLSB::FRTEXTCONNECTIONS); + for(auto i:m_arrExt) + { + if(i->m_sUri == L"{DE250136-89BD-433C-8126-D09CA5730AF9}") + { + ptr->m_EXTCONN15 = i->m_oConnection->toBin(); + } + } + return XLS::BaseObjectPtr{ptr}; + } XLS::BaseObjectPtr COfficeArtExtensionList::toBinWorkBook() { auto ptr(new XLSB::FRTWORKBOOK); diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index 48cfb8d7ba..40659fd327 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -193,6 +193,7 @@ namespace OOX XLS::BaseObjectPtr toBinTable(); XLS::BaseObjectPtr toBinSlicerCache(); XLS::BaseObjectPtr toBinPivotCache(); + XLS::BaseObjectPtr toBinConnections(); virtual EElementType getType() const; std::vector m_arrExt; diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index bcf807f5d2..ec86aeb199 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -55,6 +55,8 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../Common/SimpleTypes_Spreadsheet.h" +#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" + namespace OOX { namespace Spreadsheet @@ -85,6 +87,15 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CTextField::toBin() + { + auto ptr(new XLSB::BeginECTwFldInfo); + if(m_oPosition.IsInit()) + ptr->data.fieldStart = m_oPosition.get(); + if(m_oType.IsInit()) + ptr->data.fieldType = m_oType->GetValue(); + return XLS::BaseObjectPtr{ptr}; + } EElementType CTextField::getType() const { return et_x_textField; @@ -158,6 +169,14 @@ namespace OOX m_arrItems.push_back(new CTextField(textField)); } } + XLS::BaseObjectPtr CTextFields::toBin() + { + auto ptr(new XLSB::ECTWFLDINFOLST); + for(auto i:m_arrItems) + ptr->m_arBrtBeginECTwFldInfo.push_back(i->toBin()); + + return XLS::BaseObjectPtr{ptr}; + } EElementType CTextFields::getType() const { return et_x_textFields; @@ -295,6 +314,13 @@ namespace OOX { ReadAttributes(obj); } + XLS::BaseObjectPtr CRangePr::toBin() + { + auto ptr(new XLSB::RangePr15); + if(m_oSourceName.IsInit()) + ptr->irstSourceName = m_oSourceName.get(); + return XLS::BaseObjectPtr{ptr}; + } EElementType CRangePr::getType() const { return et_x_rangePr; @@ -348,6 +374,20 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginECDbProps); } } + XLS::BaseObjectPtr CDbPr::toBin() + { + auto ptr1(new XLSB::ECDBPROPS); + auto ptr(new XLSB::BeginECDbProps); + if(m_oConnection.IsInit()) + ptr->stConn = m_oConnection.get(); + if(m_oCommand.IsInit()) + ptr->stCmd = m_oCommand.get(); + if(m_oServerCommand.IsInit()) + ptr->stCmdSvr = m_oServerCommand.get(); + if(m_oCommandType.IsInit()) + ptr->icmdtype = m_oCommandType.get(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType CDbPr::getType() const { return et_x_dbPr; @@ -416,6 +456,30 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginECOlapProps); } } + XLS::BaseObjectPtr COlapPr::toBin() + { + auto ptr1(new XLSB::ECOLAPPROPS); + auto ptr(new XLSB::BeginECOlapProps); + ptr1->m_BrtBeginECOlapProps = XLS::BaseObjectPtr{ptr}; + + if(m_oLocalConnection.IsInit()) + ptr->stConnLocal = m_oLocalConnection.get(); + if(m_oRowDrillCount.IsInit()) + ptr->nDrillthroughRows = m_oRowDrillCount.get(); + if(m_oLocal.IsInit()) + ptr->fLocalConn = m_oLocal.get(); + if(m_oLocalRefresh.IsInit()) + ptr->fNoRefreshCube = m_oLocalRefresh.get(); + if(m_oSendLocale.IsInit()) + ptr->fUseOfficeLcid = m_oSendLocale.get(); + if(m_oServerNumberFormat.IsInit()) + ptr->fSrvFmtNum = m_oServerNumberFormat.get(); + if(m_oServerFont.IsInit()) + ptr->fSrvFmtFlags = m_oServerFont.get(); + if(m_oServerFontColor.IsInit()) + ptr->fSrvFmtFore = m_oServerFontColor.get(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType COlapPr::getType() const { return et_x_olapPr; @@ -510,6 +574,38 @@ namespace OOX ReadAttributes(ptr->m_BrtBeginECWebProps); } } + XLS::BaseObjectPtr CWebPr::toBin() + { + auto ptr1(new XLSB::ECWEBPROPS); + auto ptr(new XLSB::BeginECWebProps); + ptr1->m_BrtBeginECWebProps = XLS::BaseObjectPtr{ptr}; + + if(m_oUrl.IsInit()) + ptr->stURL = m_oUrl.get(); + if(m_oPost.IsInit()) + ptr->stWebPost = m_oPost.get(); + if(m_oEditPage.IsInit()) + ptr->stEditWebPage = m_oEditPage.get(); + if(m_oXml.IsInit()) + ptr->fSrcIsXML = m_oXml.get(); + if(m_oSourceData.IsInit()) + ptr->fImportSourceData = m_oSourceData.get(); + if(m_oConsecutive.IsInit()) + ptr->fConsecDelim = m_oConsecutive.get(); + if(m_oFirstRow.IsInit()) + ptr->fSameSettings = m_oFirstRow.get(); + if(m_oXl97.IsInit()) + ptr->fXL97Format = m_oXl97.get(); + if(m_oTextDates.IsInit()) + ptr->fNoDateRecog = m_oTextDates.get(); + if(m_oXl2000.IsInit()) + ptr->fRefreshedInXL9 = m_oXl2000.get(); + if(m_oHtmlTables.IsInit()) + ptr->fTablesOnlyHTML = m_oHtmlTables.get(); + if(m_oHtmlFormat.IsInit()) + ptr->wHTMLFmt = m_oHtmlFormat->GetValue(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType CWebPr::getType() const { return et_x_webPr; @@ -623,6 +719,47 @@ namespace OOX m_oTextFields = ptr->m_ECTWFLDINFOLST; } } + XLS::BaseObjectPtr CTextPr::toBin() + { + auto ptr1(new XLSB::ECTXTWIZ); + auto ptr(new XLSB::BeginECTxtWiz); + + if(m_oSourceFile.IsInit()) + ptr->stFile = m_oSourceFile.get(); + if(m_oFileType.IsInit()) + { + ptr->data.iCpid = m_oFileType->m_eValue; + ptr->data.iCpidNew = m_oFileType->m_eValue; + } + if(m_oDecimal.IsInit()) + ptr->data.chDecimal = std::stoi(m_oDecimal.get()); + if(m_oDelimiter.IsInit()) + ptr->data.chCustom = std::stoi(m_oDelimiter.get()); + if(m_oThousands.IsInit()) + ptr->data.chThousSep = std::stoi(m_oThousands.get()); + if(m_oFirstRow.IsInit()) + ptr->data.rowStartAt = m_oFirstRow.get(); + if(m_oQualifier.IsInit()) + ptr->data.fTextDelim = m_oQualifier->GetValue(); + if(m_oPrompt.IsInit()) + ptr->data.fPromptForFile = m_oPrompt.get(); + if(m_oDelimited.IsInit()) + ptr->data.fDelimited = m_oDelimited.get(); + if(m_oTab.IsInit()) + ptr->data.fTab = m_oTab.get(); + if(m_oSpace.IsInit()) + ptr->data.fSpace = m_oSpace.get(); + if(m_oComma.IsInit()) + ptr->data.fComma = m_oComma.get(); + if(m_oSemicolon.IsInit()) + ptr->data.fSemiColon = m_oSemicolon.get(); + if(m_oConsecutive.IsInit()) + ptr->data.fConsecutive = m_oConsecutive.get(); + + if(m_oTextFields.IsInit()) + ptr1->m_ECTWFLDINFOLST = m_oTextFields->toBin(); + return XLS::BaseObjectPtr{ptr1}; + } EElementType CTextPr::getType() const { return et_x_textPr; @@ -798,6 +935,81 @@ namespace OOX } } } + XLS::BaseObjectPtr CConnection::toBin() + { + XLS::BaseObjectPtr objectPtr; + if(m_oRangePr.IsInit()) + { + auto ptr(new XLSB::EXTCONN15); + objectPtr = XLS::BaseObjectPtr{ptr}; + auto ptr1(new XLSB::BeginExtConn15); + ptr->m_BrtBeginExtConn15 = XLS::BaseObjectPtr{ptr1}; + ptr->m_source = m_oRangePr->toBin(); + } + else + { + auto ptr(new XLSB::EXTCONNECTION); + objectPtr = XLS::BaseObjectPtr{ptr}; + auto ptr1(new XLSB::BeginExtConnection); + ptr->m_BrtBeginExtConnection = XLS::BaseObjectPtr{ptr1}; + + if(m_oDbPr.IsInit()) + ptr->m_ECDBPROPS = m_oDbPr->toBin(); + if(m_oOlapPr.IsInit()) + ptr->m_ECOLAPPROPS = m_oOlapPr->toBin(); + if(m_oTextPr.IsInit()) + ptr->m_ECTXTWIZ = m_oTextPr->toBin(); + if(m_oWebPr.IsInit()) + ptr->m_ECWEBPROPS = m_oWebPr->toBin(); + if(m_oExtLst.IsInit()) + ptr->m_FRTEXTCONNECTIONS = m_oExtLst->toBinConnections(); + + if(m_oType.IsInit()) + ptr1->idbtype = m_oType.get(); + if(m_oName.IsInit()) + ptr1->stConnName = m_oName.get(); + if(m_oId.IsInit()) + ptr1->dwConnID = m_oId->GetValue(); + if(m_oCredentials.IsInit()) + ptr1->iCredMethod = m_oCredentials->GetValue(); + if(m_oBackground.IsInit()) + ptr1->fBackgroundQuery = m_oBackground.get(); + if(m_oDeleted.IsInit()) + ptr1->fDeleted = m_oDeleted.get(); + if(m_oDescription.IsInit()) + ptr1->stConnDesc = m_oDescription.get(); + if(m_oInterval.IsInit()) + ptr1->wInterval = m_oInterval.get(); + if(m_oKeepAlive.IsInit()) + ptr1->fMaintain = m_oKeepAlive.get(); + if(m_oMinRefreshableVersion.IsInit()) + ptr1->bVerRefreshableMin = m_oMinRefreshableVersion.get(); + if(m_oNew.IsInit()) + ptr1->fNewQuery = m_oNew.get(); + if(m_oOdcFile.IsInit()) + ptr1->stConnectionFile = m_oOdcFile.get(); + if(m_oOnlyUseConnectionFile.IsInit()) + ptr1->fAlwaysUseConnectionFile = m_oOnlyUseConnectionFile.get(); + if(m_oReconnectionMethod.IsInit()) + ptr1->irecontype = m_oReconnectionMethod.get(); + if(m_oRefreshedVersion.IsInit()) + ptr1->bVerRefreshed = m_oRefreshedVersion.get(); + if(m_oRefreshOnLoad.IsInit()) + ptr1->fRefreshOnLoad = m_oRefreshOnLoad.get(); + if(m_oSaveData.IsInit()) + ptr1->fSaveData = m_oSaveData.get(); + if(m_oSavePassword.IsInit()) + { + ptr1->pc = m_oSavePassword.get(); + } + if(m_oSingleSignOnId.IsInit()) + ptr1->stSso = m_oSingleSignOnId.get(); + if(m_oSourceFile.IsInit()) + ptr1->stDataFile = m_oSourceFile.get(); + } + + return objectPtr; + } EElementType CConnection::getType() const { return et_x_Connection; @@ -945,6 +1157,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_arrItems.push_back(new CConnection(connection)); } } + XLS::BaseObjectPtr CConnections::toBin() + { + auto ptr(new XLSB::EXTCONNECTIONS); + for(auto i:m_arrItems) + ptr->m_arEXTCONNECTION.push_back(i->toBin()); + return XLS::BaseObjectPtr{ptr}; + } EElementType CConnections::getType() const { return et_x_Connections; @@ -974,6 +1193,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" CPath oRootPath; read(oRootPath, oPath); } + XLS::BaseObjectPtr CConnectionsFile::WriteBin() const + { + XLSB::ConnectionsStreamPtr connectionsStream(new XLSB::ConnectionsStream); + if(m_oConnections.IsInit()) + connectionsStream->m_EXTCONNECTIONS = m_oConnections->toBin(); + return XLS::BaseObjectPtr{connectionsStream}; + } void CConnectionsFile::readBin(const CPath& oPath) { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); @@ -1016,19 +1242,31 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { if (false == m_oConnections.IsInit()) return; - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + { + NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); - m_oConnections->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oConnections->toXML(sXml); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); IFileContainer::Write(oPath, oDirectory, oContent); } const OOX::FileType CConnectionsFile::type() const { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::ConnectionsBin; + } return OOX::Spreadsheet::FileTypes::Connections; } const CPath CConnectionsFile::DefaultDirectory() const diff --git a/OOXML/XlsxFormat/Table/Connections.h b/OOXML/XlsxFormat/Table/Connections.h index 6fa2dc9f04..00107d26f2 100644 --- a/OOXML/XlsxFormat/Table/Connections.h +++ b/OOXML/XlsxFormat/Table/Connections.h @@ -73,6 +73,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -95,6 +96,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -161,6 +163,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -184,6 +187,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -212,6 +216,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; void ReadAttributes(XLS::BaseObjectPtr& obj); @@ -241,6 +246,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -277,6 +283,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -320,6 +327,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -372,6 +380,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType() const; @@ -389,6 +398,7 @@ namespace OOX virtual void read(const CPath& oPath); void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; From c4085ed69844f07bbfbbafd6d8b863ec89e23ecd Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 10 Nov 2023 17:21:44 +0600 Subject: [PATCH 098/221] Fix xlsx 2 xlsb conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 2 +- OOXML/XlsxFormat/Pivot/Pivots.cpp | 13 +++++- OOXML/XlsxFormat/Styles/CellStyles.cpp | 10 +++++ OOXML/XlsxFormat/Styles/Fills.cpp | 45 ++++++++++++++++++- OOXML/XlsxFormat/Styles/Fonts.cpp | 5 ++- OOXML/XlsxFormat/Styles/TableStyles.cpp | 4 +- OOXML/XlsxFormat/Styles/Xfs.cpp | 21 ++++++++- OOXML/XlsxFormat/Styles/XlsxStyles.cpp | 8 ++-- .../Worksheets/WorksheetChildOther.cpp | 16 +++++++ 9 files changed, 112 insertions(+), 12 deletions(-) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 6e0be8609d..d05920bf8f 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -714,7 +714,7 @@ namespace OOX for(auto i:m_arrExt) { - if(i->m_sUri == L"{EB79DEF2-80B8-43E5-95BD-54CBDDF9020C}") + if(i->m_sUri == L"{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}") { ptr->m_STYLESHEET14 = i->m_oSlicerStyles->toBin(); } diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 38a901fc90..441bda33b0 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -534,6 +534,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else ptr->fDisplayPageFieldStyle = false; if (m_oPageWrap.IsInit()) ptr->cWrapPage = m_oPageWrap->GetValue(); + else + ptr->cWrapPage = 0; if (m_oPivotTableStyle.IsInit()) ptr->irstTableStyle = m_oPivotTableStyle.get(); else ptr->fDisplayTableStyle = false; @@ -577,6 +579,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oVacatedStyle.IsInit()) ptr->irstVacateStyle = m_oVacatedStyle.get(); else ptr->fDisplayVacateStyle = false; + ptr->sxaxis4Data = 2; + ptr->fReenterOnLoadOnce = false; return objectPtr; } @@ -2204,7 +2208,12 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oAvgSubtotal.IsInit()) ptr->fAverage = m_oAvgSubtotal.get(); - + + ptr->sxaxis.bCol = false; + ptr->sxaxis.bPage = false; + ptr->sxaxis.bRw = false; + ptr->sxaxis.bData = false; + if(m_oAxis.IsInit()) { if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisCol) @@ -2213,7 +2222,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->sxaxis.bPage = true; else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) ptr->sxaxis.bRw = true; - else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisRow) + else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) ptr->sxaxis.bData = true; } if(m_oCompact.IsInit()) diff --git a/OOXML/XlsxFormat/Styles/CellStyles.cpp b/OOXML/XlsxFormat/Styles/CellStyles.cpp index 6c9afccd31..6c7fe7e409 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.cpp +++ b/OOXML/XlsxFormat/Styles/CellStyles.cpp @@ -34,6 +34,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/Style.h" +#include "../../XlsbFormat/Biff12_records/BeginStyles.h" #include "../../XlsbFormat/Biff12_unions/STYLES.h" @@ -81,14 +82,19 @@ namespace OOX ptr->fBuiltIn = m_oBuiltinId->GetValue(); if (m_oCustomBuiltin.IsInit()) ptr->fCustom = m_oCustomBuiltin->GetValue(); + else + ptr->fCustom = false; if (m_oHidden.IsInit()) ptr->fHidden = m_oHidden->GetValue(); + else + ptr->fHidden = false; if (m_oILevel.IsInit()) ptr->iLevel = m_oILevel->GetValue(); if (m_oName.IsInit()) ptr->stName = m_oName.get(); if (m_oXfId.IsInit()) ptr->ixf = m_oXfId->GetValue(); + ptr->iStyBuiltIn = 0; return objectPtr; } @@ -183,9 +189,13 @@ namespace OOX XLS::BaseObjectPtr CCellStyles::toBin() { auto ptr(new XLSB::STYLES); + auto ptr1(new XLSB::BeginStyles); + ptr->m_BrtBeginStyles = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) ptr->m_arBrtStyle.push_back(i->toBin()); + ptr1->cstyles = ptr->m_arBrtStyle.size(); return objectPtr; } EElementType CCellStyles::getType () const diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index a78fa208ef..c62f0bdca5 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -36,6 +36,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/Fill.h" +#include "../../XlsbFormat/Biff12_records/BeginFills.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" #include "../../../XlsbFormat/Biff12_unions/FILLS.h" @@ -159,9 +160,28 @@ namespace OOX if(m_oBgColor.IsInit()) ptr->brtColorBack = m_oBgColor->toColor(); - + else + { + ptr->brtColorBack.bAlpha = 255; + ptr->brtColorBack.bBlue = 0; + ptr->brtColorBack.bGreen = 0; + ptr->brtColorBack.bRed = 0; + ptr->brtColorBack.index = 64; + ptr->brtColorBack.nTintAndShade = 0; + ptr->brtColorBack.xColorType = 0; + } if(m_oFgColor.IsInit()) ptr->brtColorFore = m_oFgColor->toColor(); + else + { + ptr->brtColorFore.bAlpha = 255; + ptr->brtColorFore.bBlue = 255; + ptr->brtColorFore.bGreen = 255; + ptr->brtColorFore.bRed = 255; + ptr->brtColorFore.index = 64; + ptr->brtColorFore.nTintAndShade = 0; + ptr->brtColorFore.xColorType = 0; + } } EElementType CPatternFill::getType () const { @@ -289,6 +309,8 @@ namespace OOX XLSB::GradientStop stop; if(m_oPosition.IsInit()) stop.xnumPosition.data.value = m_oPosition->GetValue(); + else + stop.xnumPosition.data.value = 0; if(m_oColor.IsInit()) { stop.brtColor = m_oColor->toColor(); @@ -383,16 +405,28 @@ namespace OOX if(m_oType.IsInit()) ptr->iGradientType = m_oType->GetValue(); + else + ptr->iGradientType = 0; if(m_oDegree.IsInit()) ptr->xnumDegree.data.value = m_oDegree->GetValue(); + else + ptr->xnumDegree.data.value = 0; if(m_oLeft.IsInit()) ptr->xnumFillToLeft.data.value = m_oLeft->GetValue(); + else + ptr->xnumFillToLeft.data.value = 0; if(m_oRight.IsInit()) ptr->xnumFillToRight.data.value = m_oRight->GetValue(); + else + ptr->xnumFillToRight.data.value = 0; if(m_oTop .IsInit()) ptr->xnumFillToTop.data.value = m_oTop->GetValue(); + else + ptr->xnumFillToTop.data.value = 0; if(m_oBottom.IsInit()) ptr->xnumFillToBottom.data.value = m_oBottom->GetValue(); + else + ptr->xnumFillToBottom.data.value = 0; for(auto i:m_arrItems) { @@ -499,6 +533,11 @@ namespace OOX { m_oGradientFill->toBin(objectPtr); } + else + { + ptr->iGradientType = 0; + } + ptr->cNumStop = 0; return objectPtr; } EElementType CFill::getType () const @@ -607,9 +646,13 @@ namespace OOX XLS::BaseObjectPtr CFills::toBin() { auto ptr(new XLSB::FILLS); + auto ptr1(new XLSB::BeginFills); + ptr->m_BrtBeginFills = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); for(auto i : m_arrItems) ptr->m_arBrtFill.push_back(i->toBin()); + ptr1->cfills = ptr->m_arBrtFill.size(); return objectPtr; } diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index 8028fc8957..f634cc49ff 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -34,6 +34,7 @@ #include "../ComplexTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BeginFonts.h" #include "../../../XlsbFormat/Biff12_unions/FONTS.h" @@ -517,13 +518,15 @@ namespace OOX XLS::BaseObjectPtr CFonts::toBin() { auto ptr(new XLSB::FONTS); + auto ptr1(new XLSB::BeginFonts); + ptr->m_BrtBeginFonts = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) { ptr->m_arBrtFont.push_back(i->toBin()); } - + ptr1->cfonts = ptr->m_arBrtFont.size(); return objectPtr; } EElementType CFonts::getType () const diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index 9952bfd017..930021a7b9 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -84,7 +84,6 @@ namespace OOX { auto ptr(new XLSB::TableStyleElement); XLS::BaseObjectPtr objectPtr(ptr); - ptr->index = m_oDxfId->GetValue(); ptr->size = m_oSize->GetValue(); @@ -426,8 +425,11 @@ namespace OOX { auto ptr(new XLSB::TABLESTYLES); XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginTableStyles); + ptr->m_BrtBeginTableStyles = XLS::BaseObjectPtr{ptr1}; for(auto i:m_arrItems) ptr->m_arTABLESTYLE.push_back(i->toBin()); + ptr1->cts = ptr->m_arTABLESTYLE.size(); return objectPtr; } EElementType CTableStyles::getType () const diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index 98a218804e..caf663bf66 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -36,6 +36,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BeginCellStyleXFs.h" #include "../../../XlsbFormat/Biff12_unions/CELLSTYLEXFS.h" #include "../../../XlsbFormat/Biff12_unions/CELLXFS.h" @@ -121,6 +122,8 @@ namespace OOX ptr->alc = 6; else if (m_oHorizontal == SimpleTypes::Spreadsheet::EHorizontalAlignment::horizontalalignmentDistributed) ptr->alc = 7; + else + ptr->alc = 0; if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentTop) ptr->alcV = 0; @@ -132,6 +135,8 @@ namespace OOX ptr->alcV = 3; else if (m_oVertical == SimpleTypes::Spreadsheet::EVerticalAlignment::verticalalignmentDistributed) ptr->alcV = 4; + else + ptr->alcV = 2; } EElementType CAligment::getType () const @@ -370,7 +375,7 @@ namespace OOX } XLS::BaseObjectPtr CXfs::toBin() { - size_t id = 1; + size_t id = 0; auto ptr(new XLSB::XF(id, id)); XLS::BaseObjectPtr objectPtr(ptr); if(m_oBorderId.IsInit()) @@ -385,9 +390,12 @@ namespace OOX ptr->fsxButton = m_oPivotButton->GetValue(); if(m_oQuotePrefix.IsInit()) ptr->f123Prefix = m_oQuotePrefix->GetValue(); + ptr->ind_xf = 0; if (m_oXfId.IsInit()) ptr->ixfParent = m_oXfId->GetValue(); + else + ptr->ixfParent = 65535; if(m_oApplyAlignment.IsInit()) ptr->fAtrAlc = m_oApplyAlignment->GetValue(); if(m_oApplyBorder.IsInit()) @@ -403,6 +411,11 @@ namespace OOX if(m_oAligment.IsInit()) m_oAligment->toBin(objectPtr); + else + { + ptr->alc = 0; + ptr->alcV = 2; + } if(m_oProtection.IsInit()) m_oProtection->toBin(objectPtr); @@ -599,10 +612,14 @@ namespace OOX } XLS::BaseObjectPtr CCellStyleXfs::toBin() { - auto ptr(new XLSB::CELLSTYLEXFS); + auto ptr(new XLSB::CELLSTYLEXFS); + auto ptr1(new XLSB::BeginCellStyleXFs); + ptr->m_BrtBeginCellStyleXFs = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); + for(auto i:m_arrItems) ptr->m_arBrtXF.push_back(i->toBin()); + ptr1->cxfs = ptr->m_arBrtXF.size(); return objectPtr; } void CCellStyleXfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) diff --git a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp index cbc1478bb3..2e945d49f9 100644 --- a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp +++ b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp @@ -225,11 +225,11 @@ namespace OOX if (m_oFills.IsInit()) stylesStream->m_FILLS = m_oFills->toBin(); - if (m_oBorders.IsInit()) - stylesStream->m_BORDERS = m_oBorders->toBin(); + if (m_oBorders.IsInit()) + stylesStream->m_BORDERS = m_oBorders->toBin(); - if (m_oCellStyleXfs.IsInit()) - stylesStream->m_CELLSTYLEXFS = m_oCellStyleXfs->toBin(); + if (m_oCellStyleXfs.IsInit()) + stylesStream->m_CELLSTYLEXFS = m_oCellStyleXfs->toBin();// if (m_oCellXfs.IsInit()) stylesStream->m_CELLXFS = m_oCellXfs->toBin(); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index ad8273138d..fad3bdd11d 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1182,10 +1182,16 @@ namespace OOX XLS::BaseObjectPtr objectPtr(ptr); if(m_oActiveCell.IsInit()) ptr->activeCell = m_oActiveCell.get(); + else + ptr->activeCell = L"A1"; if(m_oActiveCellId.IsInit()) ptr->irefAct = m_oActiveCellId->GetValue(); + else + ptr->irefAct = 0; if(m_oSqref.IsInit()) ptr->sqref = m_oSqref.get(); + else + ptr->sqref = L"A1"; if(m_oPane.IsInit()) { if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneBottomRight) @@ -1197,6 +1203,10 @@ namespace OOX else if(m_oPane == SimpleTypes::Spreadsheet::EActivePane::activepaneTopLeft) ptr->pnn_xlsb = 3; } + else + ptr->pnn_xlsb = 3; + ptr->rwAct = 0; + ptr->colAct = 0; return objectPtr; } @@ -1387,8 +1397,12 @@ namespace OOX pWsView->fSelected = false; if(m_oTopLeftCell.IsInit()) pWsView->topLeftCell = m_oTopLeftCell.get(); + else + pWsView->topLeftCell = L"A1"; if (m_oView.IsInit()) pWsView->xlView = m_oView->m_eValue; + else + pWsView->xlView = 0; if (m_oWindowProtection.IsInit()) pWsView->fWnProt = m_oWindowProtection->m_eValue; else @@ -1411,6 +1425,8 @@ namespace OOX pWsView->wScaleSLV = m_oZoomScaleSheetLayoutView->m_eValue; else pWsView->wScaleSLV = 0; + pWsView->rwTop = 0; + pWsView->colLeft = 0; if(m_oPane.IsInit()) ptr->m_BrtPane = m_oPane->toBin(); From 2d53f96522787ff712fe18f6f8bec03307eddee5 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 14 Nov 2023 15:15:43 +0600 Subject: [PATCH 099/221] Add query table conversion --- OOXML/XlsxFormat/Table/QueryTable.h | 12 +- OOXML/XlsxFormat/Table/Tables.cpp | 185 +++++++++++++++++++++++++++- 2 files changed, 187 insertions(+), 10 deletions(-) diff --git a/OOXML/XlsxFormat/Table/QueryTable.h b/OOXML/XlsxFormat/Table/QueryTable.h index 9967417ab1..23ce219654 100644 --- a/OOXML/XlsxFormat/Table/QueryTable.h +++ b/OOXML/XlsxFormat/Table/QueryTable.h @@ -61,6 +61,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableField; @@ -99,6 +100,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableFields; @@ -126,6 +128,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableDeletedField; @@ -154,6 +157,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableFields; @@ -181,6 +185,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTableRefresh; @@ -224,6 +229,7 @@ namespace OOX virtual void toXML(NSStringUtils::CStringBuilder& writer) const; virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + XLS::BaseObjectPtr toBin(); virtual EElementType getType () const { return et_x_QueryTable; @@ -280,6 +286,7 @@ namespace OOX { } void readBin(const CPath& oPath); + XLS::BaseObjectPtr WriteBin() const; virtual void read(const CPath& oPath) { //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) @@ -288,10 +295,7 @@ namespace OOX } virtual void read(const CPath& oRootPath, const CPath& oPath); virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; - virtual const OOX::FileType type() const - { - return OOX::Spreadsheet::FileTypes::QueryTable; - } + virtual const OOX::FileType type() const; virtual const CPath DefaultDirectory() const { return type().DefaultDirectory(); diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index a0b49257ca..64c4c6df97 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -47,12 +47,14 @@ #include "../../XlsbFormat/Biff12_records/ListTrFmla.h" #include "../../XlsbFormat/Biff12_records/List14.h" #include "../../XlsbFormat/Biff12_records/BeginDeletedName.h" +#include "../../XlsbFormat/Biff12_records/BeginDeletedNames.h" #include "../../XlsbFormat/QueryTableStream.h" #include "../../XlsbFormat/Biff12_unions/QSI.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" #include "../../XlsbFormat/Biff12_unions/QSIR.h" #include "../../XlsbFormat/Biff12_unions/QSIFS.h" +#include "../../XlsbFormat/Biff12_records/BeginQSIFs.h" #include "../../XlsbFormat/Biff12_unions/QSIF.h" #include "../../XlsbFormat/Biff12_unions/DELETEDNAMES.h" #include "../../XlsbFormat/Biff12_unions/DELETEDNAME.h" @@ -1109,6 +1111,29 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_oExtLst = oReader; } } + XLS::BaseObjectPtr CQueryTableField::toBin() + { + auto ptr1(new XLSB::QSIF); + auto ptr(new XLSB::BeginQSIF); + ptr1->m_BrtBeginQSIF = XLS::BaseObjectPtr{ptr}; + + if(m_oId.IsInit()) + ptr->idField = m_oId->GetValue(); + if(m_oTableColumnId.IsInit()) + ptr->idList = m_oTableColumnId->GetValue(); + if(m_oName.IsInit()) + ptr->name = m_oName.get(); + if(m_oRowNumbers.IsInit()) + ptr->fRowNums = m_oRowNumbers.get(); + if(m_oFillFormulas.IsInit()) + ptr->fFillDown = m_oFillFormulas.get(); + if(m_oDataBound.IsInit()) + ptr->fUserIns = m_oDataBound.get(); + if(m_oClipped.IsInit()) + ptr->fClipped = m_oClipped.get(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTableField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1187,6 +1212,16 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } } + XLS::BaseObjectPtr CQueryTableFields::toBin() + { + auto ptr(new XLSB::QSIFS); + auto ptr1(new XLSB::BeginQSIFs); + ptr->m_BrtBeginQSIFs = XLS::BaseObjectPtr{ptr1}; + for(auto i:m_arrItems) + ptr->m_arQSIF.push_back(i->toBin()); + ptr1->nCols = m_arrItems.size(); + return XLS::BaseObjectPtr{ptr}; + } void CQueryTableFields::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1218,6 +1253,16 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); } + XLS::BaseObjectPtr CQueryTableDeletedField::toBin() + { + auto ptr1(new XLSB::DELETEDNAME); + auto ptr(new XLSB::BeginDeletedName); + ptr1->m_BrtBeginDeletedName = XLS::BaseObjectPtr{ptr}; + if(m_oName.IsInit()) + ptr->rgb = m_oName.get(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTableDeletedField::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1280,6 +1325,18 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") } } } + XLS::BaseObjectPtr CQueryTableDeletedFields::toBin() + { + auto ptr(new XLSB::DELETEDNAMES); + auto ptr1(new XLSB::BeginDeletedNames); + ptr->m_BrtBeginDeletedNames = XLS::BaseObjectPtr{ptr1}; + + for(auto i:m_arrItems) + ptr->m_arDELETEDNAME.push_back(i->toBin()); + + ptr1->nCols = ptr->m_arDELETEDNAME.size(); + return XLS::BaseObjectPtr{ptr}; + } void CQueryTableDeletedFields::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1345,6 +1402,36 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") m_oExtLst = oReader; } } + XLS::BaseObjectPtr CQueryTableRefresh::toBin() + { + auto ptr1(new XLSB::QSIR); + auto ptr(new XLSB::BeginQSIR); + ptr1->m_BrtBeginQSIR = XLS::BaseObjectPtr{ptr}; + + if(m_oNextId.IsInit()) + ptr->idFieldNext = m_oNextId->GetValue(); + if(m_oMinimumVersion.IsInit()) + ptr->wVerBeforeRefreshAlert = m_oMinimumVersion->GetValue(); + if(m_FieldIdWrapped.IsInit()) + ptr->fidWrapped = m_FieldIdWrapped.get(); + if(m_HeadersInLastRefresh.IsInit()) + ptr->fTitlesOld = m_HeadersInLastRefresh.get(); + if(m_PreserveSortFilterLayout.IsInit()) + ptr->fPersist = m_PreserveSortFilterLayout.get(); + if(m_UnboundColumnsLeft.IsInit()) + ptr->ccolExtraLeft = m_UnboundColumnsLeft->GetValue(); + if(m_UnboundColumnsRight.IsInit()) + ptr->ccolExtraRight = m_UnboundColumnsRight->GetValue(); + + if(m_oQueryTableFields.IsInit()) + ptr1->m_QSIFS = m_oQueryTableFields->toBin(); + if(m_oQueryTableDeletedFields.IsInit()) + ptr1->m_DELETEDNAMES = m_oQueryTableDeletedFields->toBin(); + if(m_oSortState.IsInit()) + ptr1->m_SORTSTATE = m_oSortState->toBin(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTableRefresh::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1455,6 +1542,69 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" m_oExtLst = oReader; } } + XLS::BaseObjectPtr CQueryTable::toBin() + { + auto ptr1(new XLSB::QSI); + auto ptr(new XLSB::BeginQSI); + ptr1->m_BrtBeginQSI = XLS::BaseObjectPtr{ptr}; + + if(m_oAdjustColumnWidth.IsInit()) + ptr->fAutoFit = m_oAdjustColumnWidth.get(); + if(m_oApplyAlignmentFormats.IsInit()) + ptr->fibitAtrAlc = m_oApplyAlignmentFormats.get(); + if(m_oApplyBorderFormats.IsInit()) + ptr->fibitAtrBdr = m_oApplyBorderFormats.get(); + if(m_oApplyFontFormats.IsInit()) + ptr->fibitAtrFnt = m_oApplyFontFormats.get(); + if(m_oApplyNumberFormats.IsInit()) + ptr->fibitAtrNum = m_oApplyNumberFormats.get(); + if(m_oApplyPatternFormats.IsInit()) + ptr->fibitAtrPat = m_oApplyPatternFormats.get(); + if(m_oApplyWidthHeightFormats.IsInit()) + ptr->fibitAtrProt = m_oApplyWidthHeightFormats.get(); + if(m_oBackgroundRefresh.IsInit()) + ptr->fAsync = m_oBackgroundRefresh.get(); + + if(m_oAutoFormatId.IsInit()) + ptr->itblAutoFmt = m_oAutoFormatId->GetValue(); + if(m_oConnectionId.IsInit()) + ptr->dwConnID = m_oConnectionId->GetValue(); + if(m_oDisableEdit.IsInit()) + ptr->fDisableEdit = m_oDisableEdit.get(); + if(m_oDisableRefresh.IsInit()) + ptr->fDisableRefresh = m_oDisableRefresh.get(); + if(m_oFillFormulas.IsInit()) + ptr->fFill = m_oFillFormulas.get(); + if(m_oFirstBackgroundRefresh.IsInit()) + ptr->fNewAsync = m_oFirstBackgroundRefresh.get(); + ptr->fOverwrite = false; + ptr->fShrink = false; + + if(m_oGrowShrinkType == L"overwriteClear" ) + ptr->fOverwrite = true; + else if(m_oGrowShrinkType == L"insertDelete") + ptr->fShrink = true; + if(m_oHeaders.IsInit()) + ptr->fTitles = m_oHeaders.get(); + if(m_oIntermediate.IsInit()) + ptr->fDummyList = m_oIntermediate.get(); + + if(!ptr->name.empty()) + m_oName = ptr->name; + if(m_oPreserveFormatting.IsInit()) + ptr->fPreserveFmt = m_oPreserveFormatting.get(); + if(m_oRefreshOnLoad.IsInit()) + ptr->fAutoRefresh = m_oRefreshOnLoad.get(); + if(m_oRemoveDataOnSave.IsInit()) + ptr->fSaveData = !m_oRemoveDataOnSave.get(); + if(m_oRowNumbers.IsInit()) + ptr->fRowNums = m_oRowNumbers.get(); + + if(m_oQueryTableRefresh.IsInit()) + ptr1->m_QSIR = m_oQueryTableRefresh->toBin(); + + return XLS::BaseObjectPtr{ptr1}; + } void CQueryTable::fromBin(XLS::BaseObjectPtr& obj) { auto ptr = static_cast(obj.get()); @@ -1560,6 +1710,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } + XLS::BaseObjectPtr CQueryTableFile::WriteBin() const + { + XLSB::QueryTableStreamPtr querytableStream(new XLSB::QueryTableStream); + if(m_oQueryTable.IsInit()) + querytableStream->m_QSI = m_oQueryTable->toBin(); + return XLS::BaseObjectPtr{querytableStream}; + } void CQueryTableFile::read(const CPath& oRootPath, const CPath& oPath) { m_oReadPath = oPath; @@ -1585,17 +1742,33 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { if(false == m_oQueryTable.IsInit()) return; - NSStringUtils::CStringBuilder sXml; + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + XLS::BaseObjectPtr object = WriteBin(); + xlsb->WriteBin(oPath, object.get()); + } + { + NSStringUtils::CStringBuilder sXml; - sXml.WriteString(L""); - m_oQueryTable->toXML(sXml); - - std::wstring sPath = oPath.GetPath(); - NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + sXml.WriteString(L""); + m_oQueryTable->toXML(sXml); + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + } oContent.Registration( type().OverrideType(), oDirectory, oPath.GetFilename() ); IFileContainer::Write( oPath, oDirectory, oContent ); } + const OOX::FileType CQueryTableFile::type() const + { + CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); + if ((xlsb) && (xlsb->m_bWriteToXlsb)) + { + return OOX::SpreadsheetBin::FileTypes::QueryTableBin; + } + return OOX::Spreadsheet::FileTypes::QueryTable; + } } //Spreadsheet } // namespace OOX From fb608d3dd5d0c38047f171dc50e0b896c7b9c114 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 14 Nov 2023 16:33:26 +0600 Subject: [PATCH 100/221] Fix connection conversion --- OOXML/XlsxFormat/Table/Connections.cpp | 12 ++++++++++++ OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 10 +++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index ec86aeb199..e5fd67ad72 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -974,10 +974,14 @@ namespace OOX ptr1->iCredMethod = m_oCredentials->GetValue(); if(m_oBackground.IsInit()) ptr1->fBackgroundQuery = m_oBackground.get(); + else + ptr1->fBackgroundQuery = false; if(m_oDeleted.IsInit()) ptr1->fDeleted = m_oDeleted.get(); if(m_oDescription.IsInit()) ptr1->stConnDesc = m_oDescription.get(); + else + ptr1->fLoadConnectionDesc = false; if(m_oInterval.IsInit()) ptr1->wInterval = m_oInterval.get(); if(m_oKeepAlive.IsInit()) @@ -988,8 +992,12 @@ namespace OOX ptr1->fNewQuery = m_oNew.get(); if(m_oOdcFile.IsInit()) ptr1->stConnectionFile = m_oOdcFile.get(); + else + ptr1->fLoadSourceConnectionFile = false; if(m_oOnlyUseConnectionFile.IsInit()) ptr1->fAlwaysUseConnectionFile = m_oOnlyUseConnectionFile.get(); + else + ptr1->fAlwaysUseConnectionFile = false; if(m_oReconnectionMethod.IsInit()) ptr1->irecontype = m_oReconnectionMethod.get(); if(m_oRefreshedVersion.IsInit()) @@ -1004,8 +1012,12 @@ namespace OOX } if(m_oSingleSignOnId.IsInit()) ptr1->stSso = m_oSingleSignOnId.get(); + else + ptr1->fLoadSSOApplicationID = false; if(m_oSourceFile.IsInit()) ptr1->stDataFile = m_oSourceFile.get(); + else + ptr1->fLoadSourceDataFile = false; } return objectPtr; diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 84755a911f..eab563e4a7 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -133,7 +133,15 @@ namespace OOX if (m_oXlm.IsInit()) ptr->fFutureFunction = m_oXlm->GetValue(); if (m_oRef.IsInit()) - ptr->rgce = m_oRef.get(); + { + auto ref = m_oRef.get(); + auto separatorPos = ref.find(L"!"); + if(separatorPos != std::string::npos && separatorPos != ref.size() -1) + ref = ref.substr(separatorPos + 1, ref.size() - separatorPos -1); + else if(separatorPos == ref.size() -1) + ref = L""; + ptr->rgce = ref; + } return objectPtr; } From e3a0b16578c780021d3361b368ac495a38237f46 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 16 Nov 2023 00:45:21 +0600 Subject: [PATCH 101/221] Fix styles conversion --- OOXML/XlsxFormat/Styles/Borders.cpp | 9 +++++++++ OOXML/XlsxFormat/Styles/CellStyles.cpp | 4 ++++ OOXML/XlsxFormat/Styles/TableStyles.cpp | 2 ++ OOXML/XlsxFormat/Styles/Xfs.cpp | 4 ++++ OOXML/XlsxFormat/Styles/dxf.cpp | 4 ++++ OOXML/XlsxFormat/Workbook/Sheets.cpp | 2 ++ OOXML/XlsxFormat/Workbook/Workbook.cpp | 6 ++++-- 7 files changed, 29 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 23a6006894..d835092476 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -36,6 +36,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../XlsbFormat/Biff12_records/Border.h" +#include "../../XlsbFormat/Biff12_records/BeginBorders.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" #include "../../../XlsbFormat/Biff12_unions/BORDERS.h" @@ -149,7 +150,10 @@ namespace OOX } if(!m_oStyle.IsInit()) + { + ptr->dg = 0x00; return; + } if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleNone) ptr->dg = 0x00; @@ -179,6 +183,8 @@ namespace OOX ptr->dg = 0x0C; else if (m_oStyle == SimpleTypes::Spreadsheet::EBorderStyle::borderstyleSlantDashDot) ptr->dg = 0x0D; + else + ptr->dg = 0x00; } bool CBorderProp::IsEmpty() { @@ -467,9 +473,12 @@ namespace OOX XLS::BaseObjectPtr CBorders::toBin() { auto ptr(new XLSB::BORDERS); + auto ptr1(new XLSB::BeginBorders); + ptr->m_BrtBeginBorders = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) ptr->m_arBrtBorder.push_back(i->toBin()); + ptr1->cborders = ptr->m_arBrtBorder.size(); return objectPtr; } EElementType CBorders::getType () const diff --git a/OOXML/XlsxFormat/Styles/CellStyles.cpp b/OOXML/XlsxFormat/Styles/CellStyles.cpp index 6c7fe7e409..1becfb48b4 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.cpp +++ b/OOXML/XlsxFormat/Styles/CellStyles.cpp @@ -80,6 +80,8 @@ namespace OOX XLS::BaseObjectPtr objectPtr(ptr); if(m_oBuiltinId.IsInit()) ptr->fBuiltIn = m_oBuiltinId->GetValue(); + else + ptr->fBuiltIn = false; if (m_oCustomBuiltin.IsInit()) ptr->fCustom = m_oCustomBuiltin->GetValue(); else @@ -90,6 +92,8 @@ namespace OOX ptr->fHidden = false; if (m_oILevel.IsInit()) ptr->iLevel = m_oILevel->GetValue(); + else + ptr->iLevel = 0; if (m_oName.IsInit()) ptr->stName = m_oName.get(); if (m_oXfId.IsInit()) diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index 930021a7b9..f0a6174117 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -430,6 +430,8 @@ namespace OOX for(auto i:m_arrItems) ptr->m_arTABLESTYLE.push_back(i->toBin()); ptr1->cts = ptr->m_arTABLESTYLE.size(); + ptr1->rgchDefTableStyle = m_oDefaultTableStyle.get(); + ptr1->rgchDefPivotStyle = m_oDefaultPivotStyle.get(); return objectPtr; } EElementType CTableStyles::getType () const diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index caf663bf66..65bb8bb1b2 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -37,6 +37,7 @@ #include "../../XlsbFormat/Biff12_records/CommonRecords.h" #include "../../XlsbFormat/Biff12_records/BeginCellStyleXFs.h" +#include "../../XlsbFormat/Biff12_records/BeginCellXFs.h" #include "../../../XlsbFormat/Biff12_unions/CELLSTYLEXFS.h" #include "../../../XlsbFormat/Biff12_unions/CELLXFS.h" @@ -524,9 +525,12 @@ namespace OOX XLS::BaseObjectPtr CCellXfs::toBin() { auto ptr(new XLSB::CELLXFS); + auto ptr1(new XLSB::BeginCellXFs); + ptr->m_BrtBeginCellXFs = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_arrItems) ptr->m_arBrtXF.push_back(i->toBin()); + ptr1->cxfs = ptr->m_arBrtXF.size(); return objectPtr; } EElementType CCellXfs::getType () const diff --git a/OOXML/XlsxFormat/Styles/dxf.cpp b/OOXML/XlsxFormat/Styles/dxf.cpp index 1956658d24..a1a5585595 100644 --- a/OOXML/XlsxFormat/Styles/dxf.cpp +++ b/OOXML/XlsxFormat/Styles/dxf.cpp @@ -41,6 +41,7 @@ #include "../../XlsbFormat/Biff12_unions/DXF.h" #include "../../XlsbFormat/Biff12_unions/FRTDXF.h" #include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BeginDXFs.h" #include "../../Common/SimpleTypes_Shared.h" #include @@ -321,10 +322,13 @@ namespace OOX { auto ptr(new XLSB::DXFS); XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::BeginDXFs); + ptr->m_BrtBeginDXFs = XLS::BaseObjectPtr{ptr1}; for(auto i:m_arrItems) { ptr->m_aruDXF.push_back(i->toBin()); } + ptr1->cdxfs = ptr->m_aruDXF.size(); return objectPtr; } void CDxfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) diff --git a/OOXML/XlsxFormat/Workbook/Sheets.cpp b/OOXML/XlsxFormat/Workbook/Sheets.cpp index 7b64bb9a31..6fc2a4616d 100644 --- a/OOXML/XlsxFormat/Workbook/Sheets.cpp +++ b/OOXML/XlsxFormat/Workbook/Sheets.cpp @@ -84,6 +84,8 @@ namespace OOX ptr->hsState = XLSB::BundleSh::ST_SheetState::HIDDEN; else if(m_oState == SimpleTypes::Spreadsheet::EVisibleType::visibleVeryHidden) ptr->hsState = XLSB::BundleSh::ST_SheetState::VERYHIDDEN; + else + ptr->hsState = XLSB::BundleSh::ST_SheetState::VISIBLE; return objectPtr; } diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 5354977701..9da4d3f869 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -311,7 +311,9 @@ namespace OOX ptr->m_arSUP = m_oExternalReferences->toBin(); workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr}; } - if (m_oAppName.IsInit()) + + /* + if (m_oAppName.IsInit()) { auto ptr(new XLSB::FileVersion); ptr->stAppName = m_oAppName.get(); @@ -319,7 +321,7 @@ namespace OOX ptr->stLowestEdited = L""; ptr->stRupBuild = L""; workBookStream->m_BrtFileVersion = XLS::BaseObjectPtr{ptr}; - } + }*/ if (m_oExtLst.IsInit()) workBookStream->m_FRTWORKBOOK = m_oExtLst->toBinWorkBook(); From be08b9c6c6e423ddd06e3a797f224217a4c78cc0 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 28 Nov 2023 13:33:33 +0600 Subject: [PATCH 102/221] Fix pivot conversion --- OOXML/XlsxFormat/Pivot/Pivots.cpp | 186 ++++++++++++++++++++++++++---- 1 file changed, 161 insertions(+), 25 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 441bda33b0..7eb31e565d 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -1200,19 +1200,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr1->itmtype = XLSB::PivotItemType::PITDATA; } - auto ptr2(new XLSB::ISXVIS(size)); - ptr2->_cisxvis = size; + if(ptr1->cisxvis > 0) + { - ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; - auto ptr3(new XLSB::BeginISXVIs(size)); - ptr3->_cisxvis = size; - ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; + auto ptr2(new XLSB::ISXVIS(size)); + ptr2->_cisxvis = size; - for(auto i:m_arrItems) - if(i->m_oV.IsInit()) - ptr3->rgisxvis.push_back(i->m_oV->GetValue()); - else - ptr3->rgisxvis.push_back(0); + ptr->m_ISXVIS = XLS::BaseObjectPtr{ptr2}; + auto ptr3(new XLSB::BeginISXVIs(size)); + ptr3->_cisxvis = size; + ptr2->m_BrtBeginISXVIs = XLS::BaseObjectPtr{ptr3}; + + for(auto i:m_arrItems) + if(i->m_oV.IsInit()) + ptr3->rgisxvis.push_back(i->m_oV->GetValue()); + else + ptr3->rgisxvis.push_back(0); + } return objectPtr; } void CColumnRowItem::fromBin(XLS::BaseObjectPtr& obj) @@ -2202,12 +2206,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oAllDrilled.IsInit()) ptr->fDrilledLevel = m_oAllDrilled.get(); + else + ptr->fDrilledLevel = false; if(m_oAutoShow.IsInit()) ptr->fAutoShow = m_oAutoShow.get(); + else + ptr->fAutoShow = false; if(m_oAvgSubtotal.IsInit()) ptr->fAverage = m_oAvgSubtotal.get(); + else + ptr->fAverage = false; ptr->sxaxis.bCol = false; ptr->sxaxis.bPage = false; @@ -2225,34 +2235,79 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else if(m_oAxis == SimpleTypes::Spreadsheet::EPivotAxisType::axisValues) ptr->sxaxis.bData = true; } + else + ptr->sxaxis.bData = true; if(m_oCompact.IsInit()) ptr->fCompact = m_oCompact.get(); + else + ptr->fCompact = false; if(m_oCountASubtotal.IsInit()) ptr->fCounta = m_oCountASubtotal.get(); + else + ptr->fCounta = false; if(m_oCountSubtotal.IsInit()) ptr->fCount = m_oCountSubtotal.get(); + else + ptr->fCount = false; if(m_oDataField.IsInit()) ptr->fDrilledLevel = m_oDataField.get(); + else + ptr->fDrilledLevel = false; if(m_oDataSourceSort.IsInit()) ptr->fTensorSort = m_oDataSourceSort.get(); + else + ptr->fTensorSort = false; if(m_oDefaultAttributeDrillState.IsInit()) ptr->fItemsDrilledByDefault = m_oDefaultAttributeDrillState.get(); + else + ptr->fItemsDrilledByDefault = false; if(m_oDefaultSubtotal.IsInit()) ptr->fDefault = m_oDefaultSubtotal.get(); + else + ptr->fDefault = false; if(m_oDragOff.IsInit()) ptr->fDragToHide = m_oDragOff.get(); + else + ptr->fDragToHide = false; - if (m_oDragToCol.IsInit()) ptr->fDragToColumn = m_oDragToCol.get(); - if (m_oDragToData.IsInit()) ptr->fDragToData = m_oDragToData.get(); - if (m_oDragToPage.IsInit()) ptr->fDragToPage = m_oDragToPage.get(); - if (m_oDragToRow.IsInit()) ptr->fDragToRow = m_oDragToRow.get(); - if (m_oHiddenLevel.IsInit()) ptr->fHiddenLvl = m_oHiddenLevel.get(); - if (m_oHideNewItems.IsInit()) ptr->fHideNewItems = m_oHideNewItems.get(); - if (m_oIncludeNewItemsInFilter.IsInit()) ptr->fFilterInclusive = m_oIncludeNewItemsInFilter.get(); - if (m_oInsertBlankRow.IsInit()) ptr->fInsertBlankRow = m_oInsertBlankRow.get(); - if (m_oInsertPageBreak.IsInit()) ptr->fPageBreaksBetweenItems = m_oInsertPageBreak.get(); + if (m_oDragToCol.IsInit()) + ptr->fDragToColumn = m_oDragToCol.get(); + else + ptr->fDragToColumn = false; + if (m_oDragToData.IsInit()) + ptr->fDragToData = m_oDragToData.get(); + else + ptr->fDragToData = false; + if (m_oDragToPage.IsInit()) + ptr->fDragToPage = m_oDragToPage.get(); + else + ptr->fDragToPage = false; + if (m_oDragToRow.IsInit()) + ptr->fDragToRow = m_oDragToRow.get(); + else + ptr->fDragToRow = false; + if (m_oHiddenLevel.IsInit()) + ptr->fHiddenLvl = m_oHiddenLevel.get(); + else + ptr->fHiddenLvl = false; + if (m_oHideNewItems.IsInit()) + ptr->fHideNewItems = m_oHideNewItems.get(); + else + ptr->fHideNewItems = false; + if (m_oIncludeNewItemsInFilter.IsInit()) + ptr->fFilterInclusive = m_oIncludeNewItemsInFilter.get(); + else + ptr->fFilterInclusive = false; + if (m_oInsertBlankRow.IsInit()) + ptr->fInsertBlankRow = m_oInsertBlankRow.get(); + else + ptr->fInsertBlankRow = false; + if (m_oInsertPageBreak.IsInit()) + ptr->fPageBreaksBetweenItems = m_oInsertPageBreak.get(); + else + ptr->fPageBreaksBetweenItems = false; if(m_oItemPageCount.IsInit()) ptr->citmAutoShow = m_oItemPageCount->GetValue(); @@ -2261,15 +2316,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oMaxSubtotal.IsInit()) ptr->fMax = m_oMaxSubtotal.get(); + else + ptr->fMax = false; if(m_oMeasureFilter.IsInit()) ptr->fHasAdvFilter = m_oMeasureFilter.get(); + else + ptr->fHasAdvFilter = false; if(m_oMinSubtotal.IsInit()) ptr->fMin = m_oMinSubtotal.get(); + else + ptr->fMin = false; if(m_oMultipleItemSelectionAllowed.IsInit()) ptr->fEnableMultiplePageItems = m_oMultipleItemSelectionAllowed.get(); + else + ptr->fEnableMultiplePageItems = false; if(m_oName.IsInit()) ptr->irstName = m_oName.get(); @@ -2279,17 +2342,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oNonAutoSortDefault.IsInit()) ptr->fNotAutoSortDft = m_oNonAutoSortDefault.get(); + else + ptr->fNotAutoSortDft = false; if (m_oNumFmtId.IsInit()) ptr->ifmt = m_oNumFmtId->GetValue(); else - ptr->ifmt = 0; + ptr->ifmt = 0; if (m_oOutline.IsInit()) ptr->fOutline = m_oOutline.get(); + else + ptr->fOutline = false; if (m_oProductSubtotal.IsInit()) ptr->fProduct = m_oProductSubtotal.get(); + else + ptr->fProduct = false; if (m_oRankBy.IsInit()) ptr->isxdiAutoShow = m_oRankBy->GetValue(); @@ -2298,21 +2367,33 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oServerField.IsInit()) ptr->fServerBased = m_oServerField.get(); + else + ptr->fServerBased = false; if (m_oShowAll.IsInit()) ptr->fShowAllItems = m_oShowAll.get(); + else + ptr->fShowAllItems = false; if (m_oShowDropDowns.IsInit()) ptr->fHideDD = !m_oShowDropDowns.get(); + else + ptr->fHideDD = false; if (m_oShowPropAsCaption.IsInit()) ptr->fMemPropDisplayInCaption = m_oShowPropAsCaption.get(); + else + ptr->fMemPropDisplayInCaption = false; if (m_oShowPropCell.IsInit()) ptr->fMemPropDisplayInReport = m_oShowPropCell.get(); + else + ptr->fMemPropDisplayInReport = false; if (m_oShowPropTip.IsInit()) ptr->fMemPropDisplayInTip = m_oShowPropTip.get(); + else + ptr->fMemPropDisplayInTip = false; if(m_oSortType.IsInit()) { if(m_oSortType->GetValue() != SimpleTypes::Spreadsheet::EFieldSortType::sortManual) @@ -2325,9 +2406,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oStdDevPSubtotal.IsInit()) ptr->fStdevp = m_oStdDevPSubtotal.get(); + else + ptr->fStdevp = false; if (m_oStdDevSubtotal.IsInit()) ptr->fStdev = m_oStdDevSubtotal.get(); + else + ptr->fStdev = false; if (m_oSubtotalCaption.IsInit()) ptr->irstSub.value() = m_oSubtotalCaption.get(); @@ -2336,12 +2421,18 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oSubtotalTop.IsInit()) ptr->fSubtotalAtTop = !m_oSubtotalTop.get(); + else + ptr->fSubtotalAtTop = false; if (m_oSumSubtotal.IsInit()) ptr->fSum = m_oSumSubtotal.get(); + else + ptr->fSum = false; if (m_oTopAutoShow.IsInit()) ptr->fTopAutoShow = !m_oTopAutoShow.get(); + else + ptr->fTopAutoShow = false; if (m_oUniqueMemberProperty.IsInit()) ptr->irstMemberPropertyCaption = m_oUniqueMemberProperty.get(); @@ -2350,9 +2441,13 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oVarPSubtotal.IsInit()) ptr->fVarp = m_oVarPSubtotal.get(); + else + ptr->fVarp = false; if (m_oVarSubtotal.IsInit()) ptr->fVar = m_oVarSubtotal.get(); + else + ptr->fVar = false; return objectPtr; } @@ -3530,7 +3625,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oMinRefreshableVersion.IsInit()) ptr->bVerCacheRefreshableMin = m_oMinRefreshableVersion->GetValue(); - + else + ptr->bVerCacheRefreshableMin = 0; if (m_oMissingItemsLimit.IsInit()) ptr->citmGhostMax = m_oMissingItemsLimit->GetValue(); else @@ -3836,18 +3932,25 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oDatabaseField.IsInit()) ptr->fSrcField = m_oDatabaseField.get(); else - ptr->fSrcField = false; + ptr->fSrcField = true; if (m_oServerField.IsInit()) ptr->fServerBased = m_oServerField.get(); + else + ptr->fServerBased = false; if (m_oFormula.IsInit()) ptr->fldFmla = m_oFormula.get(); else + { ptr->fLoadFmla = false; + ptr->fldFmla.cSxName = 0; + } if (m_oHierarchy.IsInit()) ptr->ihdb = m_oHierarchy.get(); + else + ptr->ihdb = 0; if (m_oMemberPropertyField.IsInit()) ptr->fOlapMemPropField = m_oMemberPropertyField.get(); @@ -3861,16 +3964,28 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if (m_oSqlType.IsInit()) ptr->wTypeSql = m_oSqlType.get(); + else + ptr->wTypeSql = 0; if (m_oUniqueList.IsInit()) ptr->fCantGetUniqueItems = !m_oUniqueList.get(); + else + ptr->fCantGetUniqueItems = false; if (m_oLevel.IsInit()) ptr->isxtl = m_oLevel->GetValue(); + else + ptr->isxtl = 0; if(m_oMappingCount.IsInit()) ptr->cIsxtmps = m_oMappingCount->GetValue(); + else + ptr->cIsxtmps = 0; if(m_oNumFmtId.IsInit()) ptr->ifmt = m_oNumFmtId->GetValue(); + else + ptr->ifmt = 0xFFFFFFFF; + + ptr->cbRgisxtmp = 0; return objectPtr; } @@ -4104,25 +4219,44 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oContainsBlank.IsInit()) ptr->fHasBlankItem = m_oContainsBlank.get(); + else + ptr->fHasBlankItem = false; if(m_oContainsDate.IsInit()) ptr->fDateInField = m_oContainsDate.get(); + else + ptr->fDateInField = false; if(m_oContainsInteger.IsInit()) ptr->fIntField = m_oContainsInteger.get(); + else + ptr->fIntField = false; if(m_oContainsMixedTypes.IsInit()) ptr->fMixedTypesIgnoringBlanks = m_oContainsMixedTypes.get(); + else + ptr->fMixedTypesIgnoringBlanks = false; if(m_oContainsNonDate.IsInit()) ptr->fNonDates = m_oContainsNonDate.get(); + else + ptr->fNonDates = false; if(m_oContainsNumber.IsInit()) ptr->fNumField = m_oContainsNumber.get(); + else + ptr->fNumField = false; if(m_oContainsSemiMixedTypes.IsInit()) ptr->fTextEtcField = m_oContainsSemiMixedTypes.get(); - + else + ptr->fTextEtcField = false; if(m_oContainsString.IsInit()) ptr->fHasTextItem = m_oContainsString.get(); + else + ptr->fHasTextItem = false; if(m_oLongText.IsInit()) ptr->fHasLongTextItem = m_oLongText.get(); + else + ptr->fHasLongTextItem = false; if(m_oCount.IsInit()) ptr->citems = m_oCount->GetValue(); + else + ptr->citems = 0; if(m_oMinDate.IsInit() && m_oMaxDate.IsInit()) { ptr->xnumMin.data.value = std::stod(m_oMinDate->GetValue()); @@ -5717,7 +5851,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr1->iSrcType = 0x00000003; } if(m_oConnectionId.IsInit()) - ptr1->dwConnID = m_oConnectionId->GetValue(); + ptr1->dwConnID = m_oConnectionId->GetValue(); + else + ptr1->dwConnID = 0; if(m_oWorksheetSource.IsInit()) ptr->m_PCDSRANGE = m_oWorksheetSource->toBin(); From 3426704f80efbcbaae9632d315a9cffa969222f1 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 30 Nov 2023 14:00:19 +0600 Subject: [PATCH 103/221] mend --- X2tConverter/src/lib/xlsx.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index d638c7d095..e18e81d577 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -300,6 +300,34 @@ namespace NExtractTools return nRes; } + _UINT32 xlsx_dir2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + + COfficeUtils oCOfficeUtils(NULL); + _UINT32 nRes = oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0); + if(!SUCCEEDED_X2T(nRes)) + return nRes; + + + const OOX::CPath oox_path(sTempUnpackedXLSX); + + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.m_bWriteToXlsb = true; + oXlsb.Read(oox_path); + + + + OOX::CContentTypes oContentTypes; + nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + + return nRes; + } + _UINT32 xlsx2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + return NSCommon::ooxml2ooxml(sFrom, sTo, params, convertParams, L"xlsb", xlsx_dir2xlsb); + } _UINT32 xml2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { return NSCommon::format2ooxml(sFrom, sTo, params, convertParams, L"xlsx", xml2xlsx_dir); From d404457744958816fb8819141098c5f6533b52b4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 1 Dec 2023 18:17:12 +0600 Subject: [PATCH 104/221] FIx tables and cols conversion --- OOXML/XlsxFormat/Table/Tables.cpp | 2 +- OOXML/XlsxFormat/Worksheets/Cols.cpp | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 64c4c6df97..9aeba06f02 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -319,7 +319,7 @@ namespace Spreadsheet if(m_oQueryTableFieldId.IsInit()) ptr1->idqsif = m_oQueryTableFieldId->GetValue(); else - ptr1->idqsif = 0xFFFFFFFF; + ptr1->idqsif = 0; if(m_oTotalsRowLabel.IsInit()) ptr1->stTotal = m_oTotalsRowLabel.get(); diff --git a/OOXML/XlsxFormat/Worksheets/Cols.cpp b/OOXML/XlsxFormat/Worksheets/Cols.cpp index c10922071f..2d686f81d0 100644 --- a/OOXML/XlsxFormat/Worksheets/Cols.cpp +++ b/OOXML/XlsxFormat/Worksheets/Cols.cpp @@ -103,6 +103,8 @@ namespace OOX castedPtr->fPhonetic = m_oPhonetic->ToBool(); if(m_oStyle.IsInit()) castedPtr->ixfeXLSB = m_oStyle->m_eValue; + else + castedPtr->ixfeXLSB = 0; if (m_oWidth.IsInit()) { From 1bf45a3c2307417e44dd35e57e0c2e2dfd668463 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 4 Dec 2023 13:07:30 +0600 Subject: [PATCH 105/221] Add xlsx 2 xlsb tests --- .../test/ExampleFiles/xlsx2xlsb/simple1.xlsb | Bin 0 -> 6973 bytes .../test/ExampleFiles/xlsx2xlsb/simple1.xlsx | Bin 0 -> 7310 bytes .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 0 -> 14044 bytes .../test/ExampleFiles/xlsx2xlsb/simple2.xlsx | Bin 0 -> 18500 bytes OOXML/test/common.cpp | 4 +- OOXML/test/test.pro | 3 +- OOXML/test/xlsx2xlsb/conversion.cpp | 247 ++++++++++++++++++ 7 files changed, 251 insertions(+), 3 deletions(-) create mode 100644 OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb create mode 100644 OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx create mode 100644 OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb create mode 100644 OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsx create mode 100644 OOXML/test/xlsx2xlsb/conversion.cpp diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb new file mode 100644 index 0000000000000000000000000000000000000000..c71a49e25f38717f7bf71cf02a1e2946ccfcfd05 GIT binary patch literal 6973 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 literal 0 HcmV?d00001 diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6f10ff38a5c0f1f5178ac2415bc6c29d267998b1 GIT binary patch literal 7310 zcmb_h2{=@H*dJMn?6Om`WgpqH@05Mbnq`bJGlrRA>||deOGMdAwq%z*ODLj56ta!1 z$-ZYv->7?UxzGKM=Qw7L-@E+&@BcmT`yPEQe1bE8@5gyS{Vt#}g%AKZI%#lU zTB@LsZV;rKjj=Zxg0T|va&}sI(k!chyRvyeTrqGIQjYzikT5$N1PMmj!;w%q_N&I~ zf|BfP7&j2o9^`~VLgd)JAsBWAc@o)gQrK`{Bu0)M=H`Z$1_Ci)7{nQb5kjFMNZcI< zl&dqy4foL%3Pgjz2oMwk6cHAd0D`|;BItHx3A?a$`F7)PKse`)=>eh9PH-^D4aXwz z={z>QGsdmGKH3azW z_r?Egz&A1fsPQj;aY6N;)j^K7ls&}$Uoh>7az%V22m}0f`R_jeO8Q^&|B;2GC5M4r zA@)XYuDE3M|Gx4+%l^L%IkMOeg+l!2)%cZ&Z|n*=gW$+N4FG;itMdAPWb#wEynPuR2vfcvWwcOK>U-!UT|qeR{+OiIv9y{l^_$rhS`R-7bU4SXo>oYM{m(|=qcJ{kMC z@XgT63p%rEYIY7M_wxuc5mxhIR!P~yLX2N62s!x$;1;{_Yx$fIP`zH2&QLHOA9no0d(9npiDPj@fTjtM-f z`D|I{@rC|ZAEw@1=TyfB0JMn#0J1-P_-jKinRFYD2vhpg#w@pJr0Ta0IWVz_z7iHR z`lwwRB{;&j=fcIvA}zP`RA!UaXEAF9fO?x`Pi;gF+QT5o%eP-H*YIC2be{|{LA$9{ zfi$_jDn*~&=+d6izC-NqSiIQ2MatB;08+s(&NO@MfT5DuL<1z`lWf zMHGphhp`UVfgz9J4ML;4@de^sbuLQ5m#03UFHwhTurO?^ZL?4-Z9G&-TNZ$U3qn#e@S>FgH+#T-6HtrAeUOpEm|CTs_4ccyFhN5BvT zuY3a?1)voxc6vNw(mu2dqE)! zrH1O=)m!N5x37W-siI5w-kGX0e{8mfEN|9dX;D--ss4fOpbbDa<#$~d%n~RT?oeU; zl91t{rA?9J@DfQwmx>K{2n_^&U};*lR}K zBu+oX(~#^qGT$XSG#lg0!6;P&@N9;rCEFm|g*pV+v~H0%KV$5!wykI!!w^dK2 z^@!eIQ7SJ`C~?v9X?6K*CK|k7$PQDO(B{_?W#$%9KgTTGBPM9JKr^_g`Q979gFPdo zeLCpGRn5oDSC)~A8eH!}!C2wgv&sr$?G<+Jn$dC)WIFzAIEnWDr7QsoG()lJracXm zuX}nX%%aTJGMNUI#FeEE7|n&IG_P0#qf5jKfKQ8`q;2`=J+zae+!rpX&>HMgs;dqx zZBkY$Rk-^|@DQ5X=mD8BHEH$Z(xyG z{;Q+3_<({zwt27uYmd$A*jW0hmT`2`rQ`<5Omc_*-8Z(2{@dzlTZRknp{4w3@vU`^)E#$d^$lfuX?bKjt9T3Aip`%_izwC!06crXr4^}$>Nltq|I9dbNoN&0q&A!vv7($5%;@aCOmxFvcklX_j39$C&_yHdjKGp8&qe40Zdv1(cwZFVEZLliH;hGZeQPUMB#Q&eS9+Ze2P z%aFwK6>DN~OQn0Jmee~+Q zj!S@c*lPJjL|9nKcB)I+ObDwvSz{XG?ZTL!O8b#B2>DY1Z)E$b^Jy=v^-N*&ZSRc*nyAc6z765lm9})^M5^m{4#7>$aSO90O z3bk~+FQp8uu}l#!THHup95k}xw=wNY6H=6pk`Lk3u$*lL&{U_zQY`0k<3a26<}Ai~ z$tuY$%7+;az+0US7p)Ag8oduwYmy*!=!x`PT6FN(qxdz>DRM<*PT&CmBe;_i7w5-| zrwoIaj%~t}2ejF~0=Z%Otrq7c1?4LB%le<(8mN9KK&(N$jWx}BrZHb!lW|h?iNIps zn=?>S0~yPB_s%OpCepdiHu2#73Lkbg?N&Ze`tzt)44tuUm(gcc`WSAq*n-u<6A$k6 z@tkB)6L{?OxUWt)DiQRtU_n}NZDJa(n)VSN%p7H;T&Q1sKz+rZx@K+@t3NXhY5x5F zwfvmRkT0t83@`Qtwu)4!UWm5mwyMftT7sMi(dIZo6?0>m=*fERx@;wH66tQ)k(Kie zvkz=5zeH`ZImJbJwyF~BnFiLJmfjm+Rc$R?xkMauhG@aB?P@bsFDd)|uC1HZl!~Z; z57=M%;@c~ilE!i6g3Aq5KlAlxF&~p)g=%Fx6aH1R?Yb5`|6)#YXSJ93ZLS6R3Yim^ zx#%?3DOO5?D zI{9Wn&|vRyUyzeJhcqwYxun?+i4a9JDH%`iI4FVA4EZJLvCXgeX~gN)rA z@1$C+7n)zkBikiDv}kG|%WgN^Nt+COq>Szo6vhsJQbC^fySnoPk-YJ;Y&wZx%}bI! zAkMe1Rd*X@6d%O!a#HM*!D)69s(F|Dm^sk^pA!0qU3~&^#F3pjx==B_dHcPw3-xsY zRF8}TzcS>Dr}UmwevFth*C&faHEV30{*`E1Pge&O&NVPVd-?qgdh&uA>@FbSk~JFk)>h6X=?IDONsq2~2jkC;F!P zrLT2oQ^Ou`c)lk#+B59C04>`E{7T0Hs}*4pt^mxV{yvVt6|u+LswFcW%m^Fh7yjtw z;-+Frnwr}~Yn!*KMRla*z{DDyr{I8&?q(p-du8>gv35DPyv~-g#gXez1j@GGb=;%H z>$%}_tv_X|d50wsW&us66P?>{TOSLdoT=+tk{HeN zsak_G1!q(an~;=A2=8t_p6NtdWc!4=Mez-0ukmNaY&ftyBJq4P1jA%swDJzGfmx?yGaqUK#GLy$Zs*SZVoVclPUu)ZA2HJ!p>v=* z@0Z0+tp6&#`~^~36%ma6XY)pHMTIc@Q`5>quUPcHXxw;WWYR{b`|L*26rBZZ`wY+N zBC{nORRb2C63b9)SO(E>0a=|6@{u_W&`K{G$mM)PM9uX+dD@ZxUTQ|*EE z+Ym6N(y67d3}TD-;|Z;V=Bz{nVQ-bDf{M6XWSK(RS>5cEXjXivxWM|kHq_ep1n$%8 zweBh=Y!7?u$dj?>yHskQV1AExExWynm(Pb5W$a6M4pE&*^2mR>;DKU;7*9mO+ccG6 zQ_>KbYl+If#(b7m1Z2+<;pg9woO&eM9${)!BJX3(uN`M7S-A1~9)kOF?jxpd<5=Q4 zdLY4=%k#uR0;m?RF%9AHih)rV=!x1BS~*cA!jQ4#8i&*5si`kdxLB9-8NcK75>77?f8TU2ig@u}5Ks`*EB3{YoWVoV1zbYo}+r4>; zNli{2UACx|eBM$ivd3DYf4=+?argsaNpAWJ27chN+U+ehSOAg4I@2jITrjMH>g9|T zf5cUeZdVIQK!WmiN&(FCQ}M3(4-qmq+gO+8ZK4S%uPP^cq5&r6I4n3iIZ?! zCp$~d0-;)*Q!cZ+XGkBHPh4^8(}kOf+@zp6fE>QyyCBv>*^)ghg`UEkGdyKb2w9-wC@E}Etuz-FuSoK~4+Fr3Ag zxP0)+ieBUz`MkK%N-$$g|V?Dwa$~vTx`R-u-r9~DfEN6|Z za%KZwdmSY*!sj2NE}QMD{o0i&0OfOHia?JDnq1KuH)LbUohIxAWbI0k7;-bZqV$nV z&?vJw)XlcZj<|)m3+lqU*PwVcyvC!26J>u==AN{Pfc}F{v#H)G(pe*?^fM$pki06V zyCq4s;3gfN{yu-A$S0Iyj7>M)XC7p=j#>FNJ1v~Z)w!Qq3?g1Oz;>AJxE*TSBb~a& zF;X>VymmP0=m_Jz*N{h(Zc!S?EHg+xvUG_G*L*BU{ z)x5;-9%q>HQk#%spRC^l`qAbu$}T#$ z!}WaVURcjdr=Z$3qI11^5o8dW#uNwZcq1S0_80YG$+KJVuPpZ*wiWOTCl*rYgZ8mI zU!p}d!SOsC_5L^du0B3^kR5N~fe(Mtei=-`lzUrB;vUl|L{<1=qENcw@@N_zc&|Dm zE-yqdY_`)!?b7@MvL?_RGv#afmQ(5BXa)Oc!Bx+U1m5VaxtrCarz;0GRpL{DEqJtj zZ~1iXD)kxH7`6sCwnpl9*evQ#Dx3F39)`i{;NlFajXKz&#@0!jE?M#%I!iYS>oa{w zbiyf)zE>T(Saz&pO5dlVIL)R?Uu$*}rn@F4%vqxu`!MBb_4EBfUxy7s``Y0wy~4VJD@1sh4P{g$ZoKA$G# zN1d`_)EQalb0tV6N(9QCUY3vHmTlEFS-X6xnp+5t$XBa5PcL@J@ODZriqoEd&~wTC zO5-ex5l6O!%-H?(q?s7)IZ_7EFf&U+xbqxawaT-vPgSgHh*myZ4hvgn-BK- zxaud`aUf?C>p!-RudjuNW90AO{NSki>G;iipdSK$KX5!k<5~vX(S>`N^tK)>Q55!GieyabE1CQ6nKY($#mKNvo@k;r)faA~K9|D|kVetoN|7)aw mT*~qN^+QS@?xBv8@;AFpUyBg8r~m*7?k5lziJuvdKK%~^qzBai literal 0 HcmV?d00001 diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb new file mode 100644 index 0000000000000000000000000000000000000000..b6e5e04031d0669c92005dfc13117e648a3853c1 GIT binary patch literal 14044 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 YMM|20Kr3W3zneYB-!0;`0w4_ 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 APXGV_ literal 0 HcmV?d00001 diff --git a/OOXML/test/common.cpp b/OOXML/test/common.cpp index cde7cd8c13..42c17f05a0 100644 --- a/OOXML/test/common.cpp +++ b/OOXML/test/common.cpp @@ -96,8 +96,8 @@ std::wstring CreateParamsFile(const std::wstring &pathFrom, const std::wstring & oBuilder.WriteString(L""); oBuilder.WriteString(L""); - int nFormat = COfficeFileFormatChecker::GetFormatByExtension(L"." + NSFile::GetFileExtention(pathTo)); - oBuilder.WriteString(std::to_wstring(nFormat)); + int nFormat = COfficeFileFormatChecker::GetFormatByExtension(L"." + NSFile::GetFileExtention(pathTo)); + oBuilder.WriteString(std::to_wstring(nFormat)); oBuilder.WriteString(L""); if (nFormat == AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA) diff --git a/OOXML/test/test.pro b/OOXML/test/test.pro index 4763e64c7c..d9ab1094cd 100644 --- a/OOXML/test/test.pro +++ b/OOXML/test/test.pro @@ -14,7 +14,8 @@ SOURCES += $$X2T_DIR/src/dylib/x2t.cpp SOURCES += main.cpp\ common.cpp\ - xlsb2xlsx/conversion.cpp + xlsb2xlsx/conversion.cpp\ + xlsx2xlsb/conversion.cpp\ HEADERS += common.h diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp new file mode 100644 index 0000000000..2930c2dc0e --- /dev/null +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -0,0 +1,247 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ + +#include "../common.h" +#include +#include +#include +#include "gtest/gtest.h" + +namespace xlsbTests +{ +void processTestFile(const std::wstring &tempDir, const std::wstring &testFile, const std::wstring &resultFile, const std::wstring &exampleFile) +{ + + boost::filesystem::path rootPath = std::wstring{L".."} + FILE_SEPARATOR_STR; + rootPath =boost::filesystem::absolute(rootPath.wstring() + rootPath.wstring() + rootPath.wstring()+ rootPath.wstring()); + boost::filesystem::path filePath = rootPath.wstring() +L"OOXML" + FILE_SEPARATOR_STR + L"test" + FILE_SEPARATOR_STR +L"ExampleFiles" + + FILE_SEPARATOR_STR + L"xlsx2xlsb" + FILE_SEPARATOR_STR + testFile; + boost::filesystem::path examplePath = rootPath.wstring() +L"OOXML" + FILE_SEPARATOR_STR + L"test" + FILE_SEPARATOR_STR +L"ExampleFiles" + + FILE_SEPARATOR_STR + L"xlsx2xlsb" + FILE_SEPARATOR_STR + exampleFile; + + std::wstring resultPath = tempDir + FILE_SEPARATOR_STR + resultFile; + + auto paramsPath = CreateParamsFile(filePath.wstring(), resultPath, tempDir); + ConvertFile(paramsPath); + PrepareFiles(resultPath, examplePath.wstring(), tempDir); +} + +class XlsbSimpleTests1 : public ::testing::Test +{ +public: + + static void SetUpTestCase() + { + + tempDir = GetWorkDir(); + processTestFile(tempDir, L"simple1.xlsx", L"result.xlsb", L"simple1.xlsb"); + } + + + static void TearDownTestCase() + { + RemoveWorkDir(tempDir); + } + + static std::wstring tempDir; +}; +class XlsbSimpleTests2 : public ::testing::Test +{ +public: + + static void SetUpTestCase() + { + + tempDir = GetWorkDir(); + processTestFile(tempDir, L"simple2.xlsx", L"result.xlsb", L"simple2.xlsb"); + } + + + static void TearDownTestCase() + { + RemoveWorkDir(tempDir); + } + + static std::wstring tempDir; +}; + +std::wstring XlsbSimpleTests1::tempDir = L""; +std::wstring XlsbSimpleTests2::tempDir = L""; + +_UINT32 readBinaryFiles(const std::wstring &filePath, const std::wstring &examplePath, std::vector &fileContent, std::vector &exampleContent) +{ + boost::filesystem::path path1(filePath); + boost::filesystem::path path2(examplePath); + path1 = boost::filesystem::absolute(path1); + path2 = boost::filesystem::absolute(path2); + std::ifstream file1(path1.string(), std::ios::binary); + std::ifstream file2(path2.string(), std::ios::binary); + + if (!file1.is_open() || !file2.is_open()) + { + return 1; + } + + fileContent = std::vector((std::istreambuf_iterator(file1)), std::istreambuf_iterator()); + exampleContent = std::vector((std::istreambuf_iterator(file2)), std::istreambuf_iterator()); + + return 0; +} + + +TEST_F(XlsbSimpleTests1, ContentTypesTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} +/* +TEST_F(SimpleTests1, WorkbookTest) +{ + auto tempDir = SimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests1, StylesTest) +{ + auto tempDir = SimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests1, SharedStringsTest) +{ + auto tempDir = SimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests1, WorksheetsTest) +{ + auto tempDir = SimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests2, ContentTypesTest) +{ + auto tempDir = SimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests2, WorkbookTest) +{ + auto tempDir = SimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests2, StylesTest) +{ + auto tempDir = SimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests2, SharedStringsTest) +{ + auto tempDir = SimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} + +TEST_F(SimpleTests2, WorksheetsTest) +{ + auto tempDir = SimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + std::wstring content1; + std::wstring content2; + ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); + ASSERT_TRUE(boost::algorithm::equals(content1, content2)); +} +*/ +} From 0a157c4afd92d44d8db6b6aa8b4267a7e26f0765 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 4 Dec 2023 20:19:08 +0600 Subject: [PATCH 106/221] Remove formats from test convert params --- OOXML/test/common.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/OOXML/test/common.cpp b/OOXML/test/common.cpp index 42c17f05a0..daac3751ae 100644 --- a/OOXML/test/common.cpp +++ b/OOXML/test/common.cpp @@ -95,14 +95,6 @@ std::wstring CreateParamsFile(const std::wstring &pathFrom, const std::wstring & oBuilder.WriteEncodeXmlString(pathTo); oBuilder.WriteString(L""); - oBuilder.WriteString(L""); - int nFormat = COfficeFileFormatChecker::GetFormatByExtension(L"." + NSFile::GetFileExtention(pathTo)); - oBuilder.WriteString(std::to_wstring(nFormat)); - oBuilder.WriteString(L""); - - if (nFormat == AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDFA) - oBuilder.WriteString(L"true"); - // changes oBuilder.WriteString(L"false"); From bfbae147f0280740e6e6a88f12a4012ce4b6e8d8 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 5 Dec 2023 13:10:22 +0600 Subject: [PATCH 107/221] Add tests for simple xlsb --- .../Worksheets/WorksheetChildOther.cpp | 9 +- .../test/ExampleFiles/xlsb2xlsx/simple2.xlsx | Bin 18500 -> 18503 bytes .../test/ExampleFiles/xlsx2xlsb/simple1.xlsb | Bin 6973 -> 4932 bytes .../test/ExampleFiles/xlsx2xlsb/simple1.xlsx | Bin 7310 -> 7602 bytes OOXML/test/xlsx2xlsb/conversion.cpp | 148 +++++++++--------- 5 files changed, 80 insertions(+), 77 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index fad3bdd11d..2d306b2ad5 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1795,7 +1795,10 @@ namespace OOX auto ptr(new XLSB::WsProp); objectPtr = XLS::BaseObjectPtr{ptr}; - ptr->strName.value = m_oCodeName.get(); + if(m_oCodeName.IsInit()) + ptr->strName.value = m_oCodeName.get(); + else + ptr->strName.value = L""; ptr->fCondFmtCalc = m_oEnableFormatConditionsCalculation->GetValue(); ptr->fFilterMode = m_oFilterMode->GetValue(); @@ -1807,8 +1810,8 @@ namespace OOX if (m_oSyncRef.IsInit()) ptr->syncRef = m_oSyncRef.get(); - - ptr->brtcolorTab = m_oTabColor->toColor(); + if(m_oTabColor.IsInit()) + ptr->brtcolorTab = m_oTabColor->toColor(); } return objectPtr; diff --git a/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx b/OOXML/test/ExampleFiles/xlsb2xlsx/simple2.xlsx index e49f4060d7fd14daf4103c23f822e210051642ad..7cf898ccb1827f299b1e4e46ed552d6f71433dcd 100644 GIT binary patch delta 1140 zcmV-)1dIE`kO9Y#0kFpr3h>ld?^6Q+01OC|(GeAYt(EI;+cp%(UqxU)JG$6%W5afl zxD9F`O}r&-KMpi?9I>WIfuwvv(GS~e>_zq%=^O2kvMf6ph9DbYOXA_t@7(^hNAI?U z2-cttS8`0^vxo#Bnaa3)7?aQUSDkYb7)xbFg_1BPJ22$kWVBIwwNPpm;Oo+iNp5X9 z3`4_zaww=dQzb~;St?yni%b0wnol01sB}zJd^|l8_pi2(sUuP=xv+^TaBMSe&Yx) zNfT)s_nw6+IMd3gr9DIRKI!N655mDo2QbKg>qv1F#_=iYc{g81>R~(A+-adj^9F%KF3S({|R|#W!?DFKlFO@##%-sxe2Gz6VsL ztNfbFm3Q6Hogv|5`6ZPW#SCvBEWA9WDn97aqm);%M%H^wWC$^YO2rzyJKh*M{a<=PhNqoy*Ae0gG%!;`QGbae(0YM($3p%ns$10 z(Cu7C(T7el?WS?Jn_dp4gCGCrulZzzl%ersZqma4n`28`LJ!@;C%fMAln`P?_0`uG zHYaWJH&9Ch1d|~`8naXtnk)+N)K~9Q0{{RF2$T3hO#wNRMnXLSX_JIPJ_^Yf003Wd zWo&aVlh8&Lli@-d0@xUn@faGD7egumS(8FTNCCQ&i$g*I+mp^iR03)ulg~pMlRiW? z1gawd0F%lB9+PTC5R=Fz5DNeR0003100000y_3O2O#yC`4@E-)$SITIDHfAzMJfWO zE0ez~6_cw)DguKqlbkOqlSf7nlLavl3;+NC009610002`Fq82$6_Y|nF9O&#lkqhg zlZ{3y0u(!wEjt{O)kZ1-l#)kZ0hW_sM^*xrK9iw88G@T1yY9ojN@ad=hJ){QV++u;!X=KRR5J& z{XJH{1&gEKMvJ2sE_o$dx<^Y$E9RLFs1R!X0Tvoe{=Nde9T6-?E2}1`67-rGXSTuz zJS-%bQ-%t<;!Y%(haA{)awwEIR>Iz6NARgRnwY(R z;KG8QX}+SYM$UN#Grm&xii60mxv}0|YQ(gV-6>J|vr&7ix!@+BS}1CVuKT zKjt`+IPE(p#ST}1eK-zSE9_U$zwh6EeEspS?+xA4tnL$g#;DT|P6Wp| z9r~R>ZR@|eCF4JC!i%%;AZ2`iWZ~-=U)HvZU1zTcK+<9X{SdA z-Ogncz3n8EZW?#H>E&QD_=2Ak{E!cg-%W#sKN5$Ywr&s8!zWSid5RDsjr!_Ih0XC8 z{{*u+6}T)4PaVC$Py+w}!3UH3K}`WRlSx870cMkjLOub;lg2_g0o9ZLLPY^qlSM;F z0k@NmLqY-AlhH#|1ZN@u0F#{xB$G`kvx;I zJT#LyM=Al6lVe9#0+K$Hu|6e};72L~g+G(AJ{yz2KMEF5O9ci10000Q02%;H2LJ%# IKmY&$0H0j<2><{9 diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb index c71a49e25f38717f7bf71cf02a1e2946ccfcfd05..809f7678c97eb272a319e10ee557715dcc4e686b 100644 GIT binary patch literal 4932 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 literal 6973 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 diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsx index 6f10ff38a5c0f1f5178ac2415bc6c29d267998b1..99714a52fd3b336e9590fc969c76ddb14d25a7b1 100644 GIT binary patch literal 7602 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 literal 7310 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 diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index 2930c2dc0e..2cfc2bc58b 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -36,7 +36,7 @@ #include #include "gtest/gtest.h" -namespace xlsbTests +namespace xlsb2xlsxTests { void processTestFile(const std::wstring &tempDir, const std::wstring &testFile, const std::wstring &resultFile, const std::wstring &exampleFile) { @@ -128,68 +128,68 @@ TEST_F(XlsbSimpleTests1, ContentTypesTest) ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } + +TEST_F(XlsbSimpleTests1, WorkbookTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"workbook.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, DISABLED_StylesTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"styles.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, SharedStringsTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"sharedStrings.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests1, WorksheetsTest) +{ + auto tempDir = XlsbSimpleTests1::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} /* -TEST_F(SimpleTests1, WorkbookTest) -{ - auto tempDir = SimpleTests1::tempDir; - std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"workbook.xml"); - std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"workbook.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); -} - -TEST_F(SimpleTests1, StylesTest) -{ - auto tempDir = SimpleTests1::tempDir; - std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"styles.xml"); - std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"styles.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); -} - -TEST_F(SimpleTests1, SharedStringsTest) -{ - auto tempDir = SimpleTests1::tempDir; - std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"sharedStrings.xml"); - std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"sharedStrings.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); -} - -TEST_F(SimpleTests1, WorksheetsTest) -{ - auto tempDir = SimpleTests1::tempDir; - std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); - std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); -} - TEST_F(SimpleTests2, ContentTypesTest) { auto tempDir = SimpleTests2::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); } TEST_F(SimpleTests2, WorkbookTest) @@ -199,10 +199,10 @@ TEST_F(SimpleTests2, WorkbookTest) FILE_SEPARATOR_STR + L"workbook.xml"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"workbook.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); } TEST_F(SimpleTests2, StylesTest) @@ -212,10 +212,10 @@ TEST_F(SimpleTests2, StylesTest) FILE_SEPARATOR_STR + L"styles.xml"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"styles.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); } TEST_F(SimpleTests2, SharedStringsTest) @@ -225,10 +225,10 @@ TEST_F(SimpleTests2, SharedStringsTest) FILE_SEPARATOR_STR + L"sharedStrings.xml"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"sharedStrings.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); } TEST_F(SimpleTests2, WorksheetsTest) @@ -238,10 +238,10 @@ TEST_F(SimpleTests2, WorksheetsTest) FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); - std::wstring content1; - std::wstring content2; - ASSERT_EQ(readFiles(path1, path2, content1, content2), 0); - ASSERT_TRUE(boost::algorithm::equals(content1, content2)); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); } */ -} +} \ No newline at end of file From 4f32c84e8a1a3b90a6ab01ee00ba56469c2055c0 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 5 Dec 2023 13:10:51 +0600 Subject: [PATCH 108/221] Add defaults for style colors --- OOXML/XlsxFormat/Styles/rPr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 4909887134..9d2b036393 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -479,6 +479,8 @@ namespace OOX { ptr.nTintAndShade = m_oTint->GetValue() * 32767.0; } + else + ptr.nTintAndShade = 0; return ptr; } XLS::BaseObjectPtr CColor::toBin() @@ -514,6 +516,8 @@ namespace OOX { ptr->nTintAndShade = m_oTint->GetValue() * 32767.0; } + else + ptr->nTintAndShade = 0; return objectPtr; } EElementType CColor::getType () const From 5af35f3b09c0d978de4f6da6bf74fdbde40a81e7 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 5 Dec 2023 21:21:10 +0600 Subject: [PATCH 109/221] Fix styles conversion --- OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 8 ++++++++ OOXML/XlsxFormat/Styles/Borders.cpp | 2 ++ OOXML/XlsxFormat/Styles/XlsxStyles.cpp | 4 ++-- OOXML/test/xlsx2xlsb/conversion.cpp | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 9d294356df..90740eded4 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -50,6 +50,8 @@ #include "../../XlsbFormat/Biff12_unions/TABLESLICERCACHEIDS.h" #include "../../XlsbFormat/Biff12_unions/TABLESLICERCACHEID.h" #include "../../XlsbFormat/Biff12_records/TableSlicerCacheID.h" +#include "../../XlsbFormat/Biff12_records/FRTBegin.h" +#include "../../XlsbFormat/Biff12_structures/FRTProductVersion.h" #include "../../Binary/Presentation/XmlWriter.h" #include "../../Binary/Presentation/BinReaderWriterDefines.h" @@ -1129,6 +1131,12 @@ void CSlicerStyles::fromBin(XLS::BaseObjectPtr &obj) XLS::BaseObjectPtr CSlicerStyles::toBin() { auto ptr(new XLSB::STYLESHEET14); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; XLS::BaseObjectPtr objectPtr(ptr); auto slicerStyle(new XLSB::SLICERSTYLES); ptr->m_SLICERSTYLES = XLS::BaseObjectPtr {slicerStyle}; diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index d835092476..11548d478e 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -146,6 +146,8 @@ namespace OOX { XLSB::Color col; col.xColorType = 0; + col.nTintAndShade = 0; + col.index = 0; ptr->brtColor = col; } diff --git a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp index 2e945d49f9..059707090a 100644 --- a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp +++ b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp @@ -246,8 +246,8 @@ namespace OOX if (m_oColors.IsInit()) stylesStream->m_COLORPALETTE = m_oColors->toBin(); - if (m_oExtLst.IsInit()) - stylesStream->m_FRTSTYLESHEET = m_oExtLst->toBinStyles(); + if (m_oExtLst.IsInit()) + stylesStream->m_FRTSTYLESHEET = m_oExtLst->toBinStyles(); return objectPtr; } void CStyles::read(const CPath& oPath) diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index 2cfc2bc58b..d6625a6cdf 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -142,7 +142,7 @@ TEST_F(XlsbSimpleTests1, WorkbookTest) ASSERT_EQ(fileContent, exampleContent); } -TEST_F(XlsbSimpleTests1, DISABLED_StylesTest) +TEST_F(XlsbSimpleTests1, StylesTest) { auto tempDir = XlsbSimpleTests1::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + From 986b1114be9cf7f6cd7971470d07c531c396faf9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 5 Dec 2023 21:21:23 +0600 Subject: [PATCH 110/221] Change test file --- .../test/ExampleFiles/xlsx2xlsb/simple1.xlsb | Bin 4932 -> 4924 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb index 809f7678c97eb272a319e10ee557715dcc4e686b..1b80dd46442977eadc04328af495951e0cfd8827 100644 GIT binary patch delta 344 zcmV-e0jK`NCcGxFo&|rS?&an20000A0ssIF0001ZY%gUxvGC9C5|Cbu~sGEkCLly z{X>_bFo_n~KQh{G1^mu?7T%)r125PZ?vZ9Lyu{e%NQ=D+(+JC_;=DcCwiKi$CsI~j zl9{kHVzCdyr}3?4mu~1`n|j(S>fF%}y)%86dggnsISg68Mi1O7W6e6%T#L5G1&Vwb zcEa{kmxa3*x33U~zjmSY-VdekE;E-5j}G6nv<8g|1*7ie q5j_EClM)g>0nw9D5;y_llZp~R0l<^X5=8-olMxdw2Br`I0002hpqujm delta 367 zcmV-#0g(Q@Cd4MNo&|s3ldkOf0000A0ssIF0001ZY%g$-rHGCD9Y{09OM z4FvxgNCdhrf>bc&4hzFmh)48{nSsX1i8DbYh+{otVfX~mt}lP^AIWk71_g%CEDSGU za>!PK98% zu{%HUH3!2t4lNj%@xkC&O9m=0!lCs$2g4f<1{H?sObh_CtOkt=1>cjd?D>;E5l{iN zlaCQR0Y8(>5j_EKlL`_(0ojvD5;y|u3X}f|6_c0}Dgww3liUs(lim_40*nunpbs3A NCKC__t`GnK002StlXd_A From 0c7963f4275c4494799a98f7876081a1a7425d0d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Dec 2023 15:53:17 +0600 Subject: [PATCH 111/221] Fix slicercache ext conversion --- OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 6 ++++++ OOXML/test/xlsx2xlsb/conversion.cpp | 16 ++++++++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 90740eded4..964b005267 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -874,6 +874,12 @@ XLS::BaseObjectPtr CSlicerCaches::toBin() XLS::BaseObjectPtr CSlicerCaches::toBinTable() { auto ptr(new XLSB::TABLESLICERCACHEIDS); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; XLS::BaseObjectPtr objectPtr(ptr); for(auto i:m_oSlicerCache) { diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index d6625a6cdf..91abd48c28 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -180,10 +180,10 @@ TEST_F(XlsbSimpleTests1, WorksheetsTest) ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } -/* -TEST_F(SimpleTests2, ContentTypesTest) + +TEST_F(XlsbSimpleTests2, ContentTypesTest) { - auto tempDir = SimpleTests2::tempDir; + auto tempDir = XlsbSimpleTests2::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); std::wstring path2(tempDir + FILE_SEPARATOR_STR + L"example_unpacked"+ FILE_SEPARATOR_STR + L"[Content_Types].xml"); std::vector fileContent; @@ -192,19 +192,19 @@ TEST_F(SimpleTests2, ContentTypesTest) ASSERT_EQ(fileContent, exampleContent); } -TEST_F(SimpleTests2, WorkbookTest) +TEST_F(XlsbSimpleTests2, WorkbookTest) { - auto tempDir = SimpleTests2::tempDir; + auto tempDir = XlsbSimpleTests2::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"workbook.xml"); + FILE_SEPARATOR_STR + L"workbook.bin"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"workbook.xml"); + FILE_SEPARATOR_STR + L"workbook.bin"); std::vector fileContent; std::vector exampleContent; ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } - +/* TEST_F(SimpleTests2, StylesTest) { auto tempDir = SimpleTests2::tempDir; From 2fde5de8b02f5edecfae542bb91cd289b678816d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Dec 2023 17:54:11 +0600 Subject: [PATCH 112/221] Fix defined names conversion --- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 19 ++++++++++++++++-- .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 14044 -> 12641 bytes .../test/ExampleFiles/xlsx2xlsb/simple2.xlsx | Bin 18500 -> 18819 bytes 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index eab563e4a7..424486d384 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -91,7 +91,7 @@ namespace OOX if(m_oFunction.IsInit()) ptr->fFunc = m_oFunction->GetValue(); else - ptr->fFunc = 0xFFFFFFFF; + ptr->fFunc = false; if(m_oFunctionGroupId.IsInit()) ptr->fGrp = m_oFunctionGroupId->GetValue(); @@ -113,8 +113,12 @@ namespace OOX ptr->name = 0xFFFFFFFF; if (m_oPublishToServer.IsInit()) ptr->fPublished = m_oPublishToServer->GetValue(); + else + ptr->fPublished = false; if (m_oShortcutKey.IsInit()) ptr->chKey = std::stoi(m_oShortcutKey.get()); + else + ptr->chKey = 0; if (m_oVbProcedure.IsInit()) ptr->fOB = m_oVbProcedure->GetValue(); @@ -130,8 +134,12 @@ namespace OOX if (m_oWorkbookParameter.IsInit()) ptr->fWorkbookParam = m_oWorkbookParameter->GetValue(); + else + ptr->fWorkbookParam = false; if (m_oXlm.IsInit()) ptr->fFutureFunction = m_oXlm->GetValue(); + else + ptr->fFutureFunction = false; if (m_oRef.IsInit()) { auto ref = m_oRef.get(); @@ -141,8 +149,15 @@ namespace OOX else if(separatorPos == ref.size() -1) ref = L""; ptr->rgce = ref; + if(m_oRef.get() == L"#N/A") + { + ptr->rgce.rgce.sequence.at(0)->offset_in_record = 35; + ptr->rgce.rgce.sequence.at(0)->size_of_struct = 2; + ptr->rgce.rgce.cce = 2; + } } - + ptr->fCalcExp = true; + ptr->fBuiltin = false; return objectPtr; } void CDefinedName::fromBin(XLS::BaseObjectPtr& obj) diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index b6e5e04031d0669c92005dfc13117e648a3853c1..e7a64a5c9e768a2878e8f260479c95fa399e5f18 100644 GIT binary patch literal 12641 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 YMM| ztvzdY@7h(}ySl2ntG>Y$h;R@DyP6^tG&bN*BL}3xcWn6~0RX=*tk+IMNf&2NYiCbW zEk9Rl4`UWzCr2<>0VL?FBpFB=K^TM%j|yUf27`=XLqNiCp`dTDCLl|gJ5V&R;9 z;^g!y(u4iCv_$oB=WRCRM;vjOn>{+WcO(8zcy@CD82MpRhzDb1$GG`@5@f<>LI9$0x$ zKvlZ-HA`}b_dJ@2$|x$9tj!xAH6jnV*b|5%ouIph2}6uZ=7NExd95a-1RSVj9(hb~nIAea=gUp#cK15sgY#uS z|4LyT5~GIW9!xuQu{z(85*W{7V>rI)Wg$c-K2pkrXL_q&$uWWko>wM+QGj*B&^r#v z>OfUF2Oa&$`uuXkJdSgUC5o-vcFvk&UX2nkd`2-yGWv5`nfFOHgi0lz6cZ1}3pr0W zKTdRZHjlIaCs7kQ3N{3=o^oi;=2aWCumAwcAB}i;`Z-#A{8mS;)~fR=8}bv5_<1F( zVh2rw@f&3n?1MN6<@r$9RW|PLw%fe;KMsuQQ8@Hxl=6Sq3_p*bSOyAzs25aVhJ>_p?`&!{mP)Pk z)zNpl*PURQFw`d@+4tm>Pk!%q@@zp`QvB8A&}TLJIw<%YilnlNszdz}FNo z?NxLLI>bpf%g~YGzJdKovB*{P{)_wGY#=&S)zG{SgE9}X0j!KhvB<~8LwO8$=3m>^ za@-scr|Up=>Lxms@GT05^k!J?DiH24AAs!x*+IUmm|5d2Vr zNHTa^qDkU|A>;-#S7Ouz$a+&`E%Q9G@p3+ZG;9-CYaEl9Yxy_`X_3n4z1a5lGkVve zRbgop2)ajXEpd+9Xk|VMO3Nyb2lwuQKRui&8V8tTv%0pJ2^T+6b>j~AX2iZ0Gs_Ty zxiL4jHZ8*RjLemc&;mAUSR1>?q$S;rKGx9{v%%h9 zs6ToMymcu|ykNzAc#^UO-8p{DohU~eU#!X-v3vY+EE-&4 z#x>??&L?$P{8jw%IA-^D5aH(l!2nh^P za2G~WQw_Z&yqo1i9_aFNpOsd0wGCz2-6&zO-qU8&hM>pjFY;wmq_Ks% zkc)4^x6TRu*kSpirbsr&kTQIVg&yba%L}a`U*≷ae=m>qk36@H?t!c356MyTPS3 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 F`5)&LQo;ZL delta 12222 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 EKh~+fj{pDw From 93b8a80fa942f6e678d21eb5f2c2ffe6897ded6a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Dec 2023 20:59:10 +0600 Subject: [PATCH 113/221] Fix parsed formula binary writing --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp | 4 ++++ MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h | 1 + 2 files changed, 5 insertions(+) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp index ebf02c6989..48691468f2 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.cpp @@ -57,6 +57,10 @@ void PtgErr::loadFields(CFRecord& record) record >> err; } +void PtgErr::writeFields(CFRecord& record) +{ + record << err; +} void PtgErr::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h index b83569a1a6..4abd32527d 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgErr.h @@ -49,6 +49,7 @@ public: virtual void loadFields(CFRecord& record); + void writeFields(CFRecord& record) override; virtual void assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref = false); From af7d46dbf7d3eba354e37068d8c76a1e473d5ff7 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Dec 2023 20:59:59 +0600 Subject: [PATCH 114/221] Remove rgce check --- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 424486d384..3c288b6379 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -149,12 +149,6 @@ namespace OOX else if(separatorPos == ref.size() -1) ref = L""; ptr->rgce = ref; - if(m_oRef.get() == L"#N/A") - { - ptr->rgce.rgce.sequence.at(0)->offset_in_record = 35; - ptr->rgce.rgce.sequence.at(0)->size_of_struct = 2; - ptr->rgce.rgce.cce = 2; - } } ptr->fCalcExp = true; ptr->fBuiltin = false; From f3b23b3b47353e5070a006bac7cd780fabad5646 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Dec 2023 21:05:51 +0600 Subject: [PATCH 115/221] Change example file --- .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 12641 -> 12642 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index e7a64a5c9e768a2878e8f260479c95fa399e5f18..4bb6fc68be94154aaf51e2c8200aaf8049bf9ffe 100644 GIT binary patch delta 366 zcmaEu^eAb=bRN#a&WUqZGcYhnOb=cjJqcoj?^E$aNx{^ zBRpn&iAy&-@b2VgS-c}dVDeunKbC%7p}5Wd(u>(y98xb7ZT_Yt#>nb@M2&O(WATW8m8nUBTO|CTvV_Z4; Yia`L=9F57_HB={i8w#*7Xn~9Z0QppGQ~&?~ delta 356 zcmaEq^e}0|bRNzv^G;Z-Vqjp9oVd9|(LKsUYJL(29osyjVTvB0jhn|2m$SF2JC9XiM096X1UQfQS z>&uurSy#`Q@$}?EJx9i>$(!{Y7{e!j(Fm)l3@e!!7$i`P zcrtl{zAK~FCFwNGOyhB5E NvX7wv+kZ`vBmf@^aQy%P From 6298d21b5ae667467e40d5c53c3030f232b5ca17 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 6 Dec 2023 21:43:18 +0600 Subject: [PATCH 116/221] Fix worksheet conversion --- OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp | 12 +++++ .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 12642 -> 12640 bytes OOXML/test/xlsx2xlsb/conversion.cpp | 41 ++++++++++++------ 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp index 964b005267..ceb34ce64e 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCacheExt.cpp @@ -945,6 +945,12 @@ XLS::BaseObjectPtr CSlicerRefs::toBin() { auto ptr(new XLSB::SLICERSEX); XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; for(auto i:m_oSlicer) { @@ -956,6 +962,12 @@ XLS::BaseObjectPtr CSlicerRefs::toBinTable() { auto ptr(new XLSB::TABLESLICERSEX); XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::FRTBegin); + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr1->productVersion = version; for(auto i:m_oSlicer) { diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index 4bb6fc68be94154aaf51e2c8200aaf8049bf9ffe..0f0f857c698240aae2a0eaac2ad0efb54b2e77b6 100644 GIT binary patch delta 182 zcmaEq^dM=&FDaH4w$C~y|C92Sn%1%Qb?q~*4@^IKdIEH;{2Lrw6Q$V?i}A5-PL=Ls zXFbxCGna4k4<%7Xg^u$Z<~Ap)v$t{T1hl5{?6#07D==7LU}9**z!2cg%rbeSzSL$< zm1<6~>6=gJu4RO1pIoIM&8Ru~n!Y>JBGt(UR81zYG7y-&Lrs920SFjD1jCBSbp~OK a%O_to2w<9}F?olE>SP~70k(gdAV~mVFXZ zSshX@6bWqpp(M(vl=0NyV?)c^nh diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index 91abd48c28..ab3803c8c3 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -204,44 +204,57 @@ TEST_F(XlsbSimpleTests2, WorkbookTest) ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } -/* -TEST_F(SimpleTests2, StylesTest) + +TEST_F(XlsbSimpleTests2, StylesTest) { - auto tempDir = SimpleTests2::tempDir; + auto tempDir = XlsbSimpleTests2::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"styles.xml"); + FILE_SEPARATOR_STR + L"styles.bin"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"styles.xml"); + FILE_SEPARATOR_STR + L"styles.bin"); std::vector fileContent; std::vector exampleContent; ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } -TEST_F(SimpleTests2, SharedStringsTest) +TEST_F(XlsbSimpleTests2, SharedStringsTest) { - auto tempDir = SimpleTests2::tempDir; + auto tempDir = XlsbSimpleTests2::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"sharedStrings.xml"); + FILE_SEPARATOR_STR + L"sharedStrings.bin"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"sharedStrings.xml"); + FILE_SEPARATOR_STR + L"sharedStrings.bin"); std::vector fileContent; std::vector exampleContent; ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } -TEST_F(SimpleTests2, WorksheetsTest) +TEST_F(XlsbSimpleTests2, Worksheet1Test) { - auto tempDir = SimpleTests2::tempDir; + auto tempDir = XlsbSimpleTests2::tempDir; std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + - FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.xml"); + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet1.bin"); std::vector fileContent; std::vector exampleContent; ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } -*/ + +TEST_F(XlsbSimpleTests2, Worksheet2Test) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"worksheets" + FILE_SEPARATOR_STR + L"sheet2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + } \ No newline at end of file From e4031da0ba0162b74e16e4ef4b3943826f491dbb Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 7 Dec 2023 14:24:13 +0600 Subject: [PATCH 117/221] Add comments and tables test --- OOXML/test/xlsx2xlsb/conversion.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index ab3803c8c3..2f493726dd 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -257,4 +257,29 @@ TEST_F(XlsbSimpleTests2, Worksheet2Test) ASSERT_EQ(fileContent, exampleContent); } +TEST_F(XlsbSimpleTests2, CommentsTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"comments2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"comments2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, TablesTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"tables" + FILE_SEPARATOR_STR + L"table2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"tables" + FILE_SEPARATOR_STR + L"table2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} } \ No newline at end of file From 92312df5ad12d20f4cedefa73ef09d72b32d8f88 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 7 Dec 2023 20:57:20 +0600 Subject: [PATCH 118/221] Add slicer tests --- OOXML/test/xlsx2xlsb/conversion.cpp | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index 2f493726dd..51c32c7474 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -282,4 +282,31 @@ TEST_F(XlsbSimpleTests2, TablesTest) ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); ASSERT_EQ(fileContent, exampleContent); } + +TEST_F(XlsbSimpleTests2, SlicerTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicers" + FILE_SEPARATOR_STR + L"slicer2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicers" + FILE_SEPARATOR_STR + L"slicer2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, SlicerCacheTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicerCaches" + FILE_SEPARATOR_STR + L"slicerCache2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"slicerCaches" + FILE_SEPARATOR_STR + L"slicerCache2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + } \ No newline at end of file From 5c7f07f71d73dcd3cb6c42b438eba61c4d31f918 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 7 Dec 2023 20:57:56 +0600 Subject: [PATCH 119/221] Fix frtslicercache conversion --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 26 +++++++++++++++++++++++++ OOXML/XlsxFormat/Styles/Borders.cpp | 1 + 2 files changed, 27 insertions(+) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index 041ce8784f..f9a1415e40 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -771,6 +771,16 @@ namespace OOX ptr->m_SLICERCACHEBOOKPIVOTTABLES = XLS::BaseObjectPtr{ptr1}; auto ptr2(new XLSB::SlicerCacheBookPivotTables); ptr1->m_BrtSlicerCacheBookPivotTables = XLS::BaseObjectPtr{ptr2}; + + auto ptr3(new XLSB::FRTBegin); + ptr1->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr3}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0x0F03; + ptr3->productVersion = version; + + + for(auto j:i->m_oSlicerCachePivotTables) { XLSB::SlicerCachePivotTable table; @@ -781,12 +791,28 @@ namespace OOX if(i->m_sUri == L"{2F2917AC-EB37-4324-AD4E-5DD8C200BD13}") { auto ptr1(new XLSB::TABLESLICERCACHE); + + auto ptr2(new XLSB::FRTBegin); + ptr1->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr2}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0x0F03; + ptr2->productVersion = version; + ptr->m_TABLESLICERCACHE = XLS::BaseObjectPtr{ptr1}; ptr1->m_BrtBeginTableSlicerCache = i->m_oTableSlicerCache->toBin(); } if(i->m_sUri == L"{470722E0-AACD-4C17-9CDC-17EF765DBC7E}") { auto ptr1(new XLSB::SLICERCACHECROSSFILTEREXT); + + auto ptr2(new XLSB::FRTBegin); + ptr1->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr2}; + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0; + ptr2->productVersion = version; + ptr->m_SLICERCACHECROSSFILTEREXT = XLS::BaseObjectPtr{ptr1}; ptr1->m_BrtSlicerCacheHideItemsWithNoData = i->m_oSlicerCacheHideItemsWithNoData->toBin(); } diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 11548d478e..0089e7a535 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -148,6 +148,7 @@ namespace OOX col.xColorType = 0; col.nTintAndShade = 0; col.index = 0; + col.fValidRGB = true; ptr->brtColor = col; } From daba967cdc4c407946bd8e7622655d57f71248a9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 7 Dec 2023 21:10:08 +0600 Subject: [PATCH 120/221] Add pivot tables tests --- .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 12640 -> 12640 bytes OOXML/test/xlsx2xlsb/conversion.cpp | 39 ++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index 0f0f857c698240aae2a0eaac2ad0efb54b2e77b6..ba7c4c50e3e30eb82c61d417b4c199c3d80b29eb 100644 GIT binary patch delta 58 zcmaEm^dM=&FDVwK!WC~O|C92S5=*ONYum}R$H9(SS)}`%a6&-hjbjHlv^FztPL+-o M0xR5nOm`MD0QLqL-~a#s delta 58 zcmaEm^dM=&FDaH4w$C~y|C92Sn%1%Qb?q~*4@^IKdIEH;{2Lrw6Q$V?i}A5-PL+-o M0xR5nOm`MD05SU+PXGV_ diff --git a/OOXML/test/xlsx2xlsb/conversion.cpp b/OOXML/test/xlsx2xlsb/conversion.cpp index 51c32c7474..9469cc5060 100644 --- a/OOXML/test/xlsx2xlsb/conversion.cpp +++ b/OOXML/test/xlsx2xlsb/conversion.cpp @@ -309,4 +309,43 @@ TEST_F(XlsbSimpleTests2, SlicerCacheTest) ASSERT_EQ(fileContent, exampleContent); } +TEST_F(XlsbSimpleTests2, PivotTableTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotTables" + FILE_SEPARATOR_STR + L"pivotTable2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotTables" + FILE_SEPARATOR_STR + L"pivotTable2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, PivotCacheDefTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheDefinition2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheDefinition2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + +TEST_F(XlsbSimpleTests2, PivotCacheRecordsTest) +{ + auto tempDir = XlsbSimpleTests2::tempDir; + std::wstring path1(tempDir + FILE_SEPARATOR_STR + L"result_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheRecords2.bin"); + std::wstring path2(tempDir + FILE_SEPARATOR_STR +L"example_unpacked"+ FILE_SEPARATOR_STR + L"xl" + + FILE_SEPARATOR_STR + L"pivotCache" + FILE_SEPARATOR_STR + L"pivotCacheRecords2.bin"); + std::vector fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + } \ No newline at end of file From e01ba114d8d9b92966203a71fb7417600833ca0e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 13 Dec 2023 13:47:09 +0600 Subject: [PATCH 121/221] Add chart sheet conversion --- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 36 +++ .../Worksheets/WorksheetChildOther.cpp | 297 +++++++++++------- .../Worksheets/WorksheetChildOther.h | 5 + 3 files changed, 224 insertions(+), 114 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 5203cd010d..7b3d91627d 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -236,6 +236,40 @@ namespace OOX if(m_bIsChartSheet) { XLSB::ChartSheetStreamPtr chartSheetStream(new XLSB::ChartSheetStream); + + if (m_oPageMargins.IsInit()) + chartSheetStream->m_BrtMargins = m_oPageMargins->toBin(); + if (m_oHeaderFooter.IsInit()) + chartSheetStream->m_HEADERFOOTER = m_oHeaderFooter->toBin(); + if (m_oDrawing.IsInit()) + chartSheetStream->m_BrtDrawing = m_oDrawing->toBin(); + if (m_oLegacyDrawing.IsInit()) + chartSheetStream->m_BrtLegacyDrawing = m_oLegacyDrawing->toBin(); + if (m_oLegacyDrawingHF.IsInit()) + chartSheetStream->m_BrtLegacyDrawingHF = m_oLegacyDrawingHF->toBin(); + if (m_oPicture.IsInit()) + chartSheetStream->m_BrtBkHim = m_oPicture->toBin(); + + if (m_oSheetViews.IsInit()) + chartSheetStream->m_CSVIEWS = m_oSheetViews->toBin(); + + if (m_oPageSetup.IsInit()) + chartSheetStream->m_BrtCsPageSetup = m_oPageSetup->toBinCs(); + + if(m_oSheetProtection.IsInit()) + { + if (m_oSheetProtection->m_oAlgorithmName.IsInit()) + chartSheetStream->m_BrtCsProtectionIso = m_oSheetProtection->toBinCS(); + else if(m_oSheetProtection->m_oPassword.IsInit()) + chartSheetStream->m_BrtCsProtection = m_oSheetProtection->toBinCS(); + } + + if (m_oSheetPr.IsInit()) + { + if(m_oSheetPr->m_oCodeName.IsInit()) + chartSheetStream->m_BrtCsProp = m_oSheetPr->toBinCs(); + } + return chartSheetStream; } else @@ -830,6 +864,8 @@ mc:Ignorable=\"x14ac\">"); CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); if ((xlsb) && (xlsb->m_bWriteToXlsb)) { + if(m_bIsChartSheet) + return OOX::SpreadsheetBin::FileTypes::ChartsheetsBin; return OOX::SpreadsheetBin::FileTypes::WorksheetBin; } return m_bIsChartSheet?OOX::Spreadsheet::FileTypes::Chartsheets:OOX::Spreadsheet::FileTypes::Worksheet; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 2d306b2ad5..91f4e37f58 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -557,117 +557,115 @@ namespace OOX } XLS::BaseObjectPtr CPageSetup::toBin() { - if(m_oErrors.IsInit() || m_oScale.IsInit()) + auto ptr(new XLSB::PageSetup); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oBlackAndWhite.IsInit()) + ptr->fNoColor = m_oBlackAndWhite->m_eValue; + if (ptr->fNoColor && m_oCellComments.IsInit()) { - auto ptr(new XLSB::PageSetup); - XLS::BaseObjectPtr objectPtr(ptr); - if(m_oBlackAndWhite.IsInit()) - ptr->fNoColor = m_oBlackAndWhite->m_eValue; - if (ptr->fNoColor && m_oCellComments.IsInit()) - { - if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) - ptr->fNotes = true; - else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) - ptr->fNotes = false; - } + if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) + ptr->fNotes = true; + else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) + ptr->fNotes = false; + } - if (m_oCopies.IsInit()) - ptr->iCopies = m_oCopies->m_eValue; + if (m_oCopies.IsInit()) + ptr->iCopies = m_oCopies->m_eValue; - if (m_oDraft.IsInit()) - ptr->fDraft = m_oDraft->m_eValue; + if (m_oDraft.IsInit()) + ptr->fDraft = m_oDraft->m_eValue; - if (m_oErrors.IsInit()) - ptr->iErrors = m_oErrors->m_eValue; + if (m_oErrors.IsInit()) + ptr->iErrors = m_oErrors->m_eValue; - if (m_oFirstPageNumber.IsInit()) - ptr->iPageStart = m_oFirstPageNumber->m_eValue; + if (m_oFirstPageNumber.IsInit()) + ptr->iPageStart = m_oFirstPageNumber->m_eValue; - if (m_oFitToHeight.IsInit()) - ptr->iFitHeight = m_oFitToHeight->m_eValue; + if (m_oFitToHeight.IsInit()) + ptr->iFitHeight = m_oFitToHeight->m_eValue; - if (m_oFitToWidth.IsInit()) - ptr->iFitWidth = m_oFitToWidth->m_eValue; + if (m_oFitToWidth.IsInit()) + ptr->iFitWidth = m_oFitToWidth->m_eValue; - if (m_oHorizontalDpi.IsInit()) - ptr->iRes = m_oHorizontalDpi->m_eValue; + if (m_oHorizontalDpi.IsInit()) + ptr->iRes = m_oHorizontalDpi->m_eValue; - if (m_oRId.IsInit()) - ptr->szRelID = m_oRId->GetValue(); + if (m_oRId.IsInit()) + ptr->szRelID = m_oRId->GetValue(); + if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) + ptr->fLandscape = true; + else + ptr->fLandscape = false; + + if ( m_oPageOrder == SimpleTypes::Spreadsheet::EPageOrder::pageorderOverThenDown) + ptr->fLeftToRight = true; + else + ptr->fLeftToRight = false; + + if (m_oPaperSize.IsInit()) + ptr->iPaperSize = m_oPaperSize->m_eValue; + + if (m_oScale.IsInit()) + ptr->iScale = m_oScale->m_eValue; + + if (m_oUseFirstPageNumber.IsInit()) + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + + if (m_oVerticalDpi.IsInit()) + ptr->iVRes = m_oVerticalDpi->m_eValue; + + return objectPtr; + } + XLS::BaseObjectPtr CPageSetup::toBinCs() + { + auto ptr(new XLSB::CsPageSetup); + XLS::BaseObjectPtr objectPtr(ptr); + + if(m_oBlackAndWhite.IsInit()) + ptr->fNoColor = m_oBlackAndWhite->m_eValue; + if (ptr->fNoColor) + { + if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) + ptr->fNotes = true; + else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) + ptr->fNotes = false; + } + + if (m_oCopies.IsInit()) + ptr->iCopies = m_oCopies->m_eValue; + + if (m_oDraft.IsInit()) + ptr->fDraft = m_oDraft->m_eValue; + + if (m_oFirstPageNumber.IsInit()) + ptr->iPageStart = m_oFirstPageNumber->m_eValue; + + if (m_oHorizontalDpi.IsInit()) + ptr->iRes = m_oHorizontalDpi->m_eValue; + + if (m_oRId.IsInit()) + ptr->szRelID = m_oRId->GetValue(); + + if (m_oOrientation.IsInit()) + { if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) ptr->fLandscape = true; else ptr->fLandscape = false; - - if ( m_oPageOrder == SimpleTypes::Spreadsheet::EPageOrder::pageorderOverThenDown) - ptr->fLeftToRight = true; - else - ptr->fLeftToRight = false; - - if (m_oPaperSize.IsInit()) - ptr->iPaperSize = m_oPaperSize->m_eValue; - - if (m_oScale.IsInit()) - ptr->iScale = m_oScale->m_eValue; - - if (m_oUseFirstPageNumber.IsInit()) - ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; - - if (m_oVerticalDpi.IsInit()) - ptr->iVRes = m_oVerticalDpi->m_eValue; - - return objectPtr; } - else - { - auto ptr(new XLSB::CsPageSetup); - XLS::BaseObjectPtr objectPtr(ptr); - if(m_oBlackAndWhite.IsInit()) - ptr->fNoColor = m_oBlackAndWhite->m_eValue; - if (ptr->fNoColor) - { - if (m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAtEnd) - ptr->fNotes = true; - else if(m_oCellComments == SimpleTypes::Spreadsheet::ECellComments::cellcommentsAsDisplayed) - ptr->fNotes = false; - } + if (m_oPaperSize.IsInit()) + ptr->iPaperSize = m_oPaperSize->m_eValue; - if (m_oCopies.IsInit()) - ptr->iCopies = m_oCopies->m_eValue; + if (m_oUseFirstPageNumber.IsInit()) + ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; - if (m_oDraft.IsInit()) - ptr->fDraft = m_oDraft->m_eValue; - - if (m_oFirstPageNumber.IsInit()) - ptr->iPageStart = m_oFirstPageNumber->m_eValue; - - if (m_oHorizontalDpi.IsInit()) - ptr->iRes = m_oHorizontalDpi->m_eValue; - - if (m_oRId.IsInit()) - ptr->szRelID = m_oRId->GetValue(); - - if (m_oOrientation.IsInit()) - { - if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) - ptr->fLandscape = true; - else - ptr->fLandscape = false; - } - - if (m_oPaperSize.IsInit()) - ptr->iPaperSize = m_oPaperSize->m_eValue; - - if (m_oUseFirstPageNumber.IsInit()) - ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; - - if (m_oVerticalDpi.IsInit()) - ptr->iVRes = m_oVerticalDpi->m_eValue; - return objectPtr; - } + if (m_oVerticalDpi.IsInit()) + ptr->iVRes = m_oVerticalDpi->m_eValue; + return objectPtr; } + EElementType CPageSetup::getType() const { return et_x_PageSetup; @@ -1435,19 +1433,19 @@ namespace OOX ptr->m_arBrtSel.push_back(i->toBin()); } return castedPtr; - /*} - else - { - auto pWsView(new XLSB::BeginCsView); - XLS::BaseObjectPtr castedPtr(pWsView); - if(m_oTabSelected.IsInit()) + + } + XLS::BaseObjectPtr CSheetView::toBinCs() + { + auto pWsView(new XLSB::BeginCsView); + XLS::BaseObjectPtr castedPtr(pWsView); + if(m_oTabSelected.IsInit()) pWsView->fSelected = m_oTabSelected->m_eValue; - if(m_oWorkbookViewId.IsInit()) + if(m_oWorkbookViewId.IsInit()) pWsView->iWbkView = m_oWorkbookViewId->m_eValue; - if(m_oZoomScale.IsInit()) + if(m_oZoomScale.IsInit()) pWsView->wScale = m_oZoomScale->m_eValue; - return castedPtr; - }*/ + return castedPtr; } EElementType CSheetView::getType() const { @@ -1591,23 +1589,19 @@ namespace OOX XLS::BaseObjectPtr CSheetViews::toBin() { auto view = m_arrItems.back(); - //if(view->m_oView.IsInit() || view->m_oTopLeftCell.IsInit() || view->m_oTopLeftCell.IsInit()) - //{ + auto castedPtr(new XLSB::WSVIEWS2); XLS::BaseObjectPtr ptr(castedPtr); for(auto i:m_arrItems) castedPtr->m_arWSVIEW2.push_back(i->toBin()); return ptr; - //} - /* - else - { - auto castedPtr(new XLSB::CSVIEWS); - XLS::BaseObjectPtr ptr(castedPtr); - for(auto i:m_arrItems) - castedPtr->m_arCSVIEW.push_back(i->toBin()); - return ptr; - }*/ + } + XLS::BaseObjectPtr CSheetViews::toBinCs() + { + auto ptr(new XLSB::CSVIEWS); + for(auto i:m_arrItems) + ptr->m_arCSVIEW.push_back(i->toBinCs()); + return XLS::BaseObjectPtr{ptr}; } EElementType CSheetViews::getType() const { @@ -1816,6 +1810,19 @@ namespace OOX return objectPtr; } + XLS::BaseObjectPtr CSheetPr::toBinCs() + { + auto ptr(new XLSB::CsProp); + + if(m_oCodeName.IsInit()) + ptr->strName = m_oCodeName.get(); + if(m_oPublished.IsInit()) + ptr->fPublish = m_oPublished->GetValue(); + if(m_oTabColor.IsInit()) + ptr->brtcolorTab = m_oTabColor->toColor(); + return XLS::BaseObjectPtr{ptr}; + } + void CSheetPr::fromBin(XLS::BaseObjectPtr& obj) { if (obj->get_type() == XLS::typeWsProp) @@ -2692,6 +2699,68 @@ namespace OOX return castedPtr; } } + XLS::BaseObjectPtr CSheetProtection::toBinCS() + { + XLS::BaseObjectPtr objectPtr; + if(m_oPassword.IsInit()) + { + auto ptr(new XLSB::CsProtection); + objectPtr = XLS::BaseObjectPtr{ptr}; + ptr->protpwd = std::stoul(m_oPassword.get()); + if(m_oObjects.IsInit()) + ptr->fObjects = m_oObjects->GetValue(); + else + ptr->fObjects = false; + if(m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fObjects = false; + } + else + { + auto ptr(new XLSB::CsProtectionIso); + objectPtr = XLS::BaseObjectPtr{ptr}; + + if(m_oAlgorithmName.IsInit()) + ptr->ipdPasswordData.szAlgName = m_oAlgorithmName->GetValue(); + else + ptr->ipdPasswordData.szAlgName = false; + if(m_oSpinCount.IsInit()) + ptr->dwSpinCount = m_oSpinCount->GetValue(); + else + ptr->dwSpinCount = 0; + + if(m_oHashValue.IsInit()) + { + byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + auto tempSize = 0; + NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), + m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); + ptr->ipdPasswordData.rgbHash.cbLength = tempSize; + } + + if(m_oSaltValue.IsInit()) + { + byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + auto tempSize2 = 0; + NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), + m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); + ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; + } + + if(m_oObjects.IsInit()) + ptr->fObjects = m_oObjects->GetValue(); + else + ptr->fObjects = false; + if(m_oSheet.IsInit()) + ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fObjects = false; + + } + + return objectPtr; + } EElementType CSheetProtection::getType() const { return et_x_SheetProtection; diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 34c2a93806..4560a53ae8 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -203,6 +203,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); @@ -398,6 +399,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; private: @@ -444,6 +446,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; }; @@ -517,6 +520,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCs(); virtual EElementType getType () const; private: @@ -745,6 +749,7 @@ namespace OOX void fromBin(XLS::BaseObjectPtr& obj); XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBinCS(); virtual EElementType getType () const; void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); From 03af151c302f80d2e350f55baf5fc3d568c916d8 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 13 Dec 2023 22:15:23 +0600 Subject: [PATCH 122/221] Fix conversion --- OOXML/XlsxFormat/Slicer/Slicer.cpp | 8 ++++++ OOXML/XlsxFormat/Styles/Borders.cpp | 7 +----- OOXML/XlsxFormat/Styles/Fonts.cpp | 4 +-- OOXML/XlsxFormat/Styles/XlsxStyles.cpp | 2 +- OOXML/XlsxFormat/Styles/rPr.cpp | 29 +++++++++++++++++++++- OOXML/XlsxFormat/Styles/rPr.h | 1 + OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 2 ++ 7 files changed, 42 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Slicer/Slicer.cpp b/OOXML/XlsxFormat/Slicer/Slicer.cpp index 54bc570237..087b3f6a75 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.cpp +++ b/OOXML/XlsxFormat/Slicer/Slicer.cpp @@ -189,14 +189,22 @@ XLS::BaseObjectPtr CSlicer::toBin() if(m_oStartItem.IsInit()) ptr->dwStartSlicerItem = m_oStartItem.get(); + else + ptr->dwStartSlicerItem = 0; if(m_oColumnCount.IsInit()) ptr->dwColumnCount = m_oColumnCount.get(); + else + ptr->dwColumnCount = 1; if(m_oShowCaption.IsInit()) ptr->fCaptionVisible = m_oShowCaption.get(); if(m_oLevel.IsInit()) ptr->dwLevel = m_oLevel.get(); + else + ptr->dwLevel = 0; if(m_oLockedPosition.IsInit()) ptr->fLockedPosition = m_oLockedPosition.get(); + else + ptr->fLockedPosition = false; if(m_oRowHeight.IsInit()) ptr->dxRowHeight = m_oRowHeight.get(); diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 0089e7a535..1801f19c78 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -144,12 +144,7 @@ namespace OOX ptr->brtColor = m_oColor->toColor(); else { - XLSB::Color col; - col.xColorType = 0; - col.nTintAndShade = 0; - col.index = 0; - col.fValidRGB = true; - ptr->brtColor = col; + ptr->brtColor = m_oColor->GetDefaultColor(); } if(!m_oStyle.IsInit()) diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index f634cc49ff..2a8a438d3b 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -252,9 +252,7 @@ namespace OOX ptr->brtColor = m_oColor->toColor(); else { - XLSB::Color col; - col.xColorType = 0; - ptr->brtColor = col; + ptr->brtColor = m_oColor->GetDefaultColor(); } if(m_oScheme.IsInit()) diff --git a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp index 059707090a..51770f3545 100644 --- a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp +++ b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp @@ -229,7 +229,7 @@ namespace OOX stylesStream->m_BORDERS = m_oBorders->toBin(); if (m_oCellStyleXfs.IsInit()) - stylesStream->m_CELLSTYLEXFS = m_oCellStyleXfs->toBin();// + stylesStream->m_CELLSTYLEXFS = m_oCellStyleXfs->toBin(); if (m_oCellXfs.IsInit()) stylesStream->m_CELLXFS = m_oCellXfs->toBin(); diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 9d2b036393..87ca745567 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -448,10 +448,31 @@ namespace OOX { ReadAttributes(obj); } + XLSB::Color CColor::GetDefaultColor() + { + XLSB::Color ptr; + + ptr.bAlpha = 0; + ptr.bBlue = 0; + ptr.bGreen = 0; + ptr.bRed = 0; + + ptr.xColorType = 0; + ptr.nTintAndShade = 0; + ptr.index = 0; + ptr.fValidRGB = true; + + return ptr; + } XLSB::Color CColor::toColor() { XLSB::Color ptr; + ptr.bAlpha = 0; + ptr.bBlue = 0; + ptr.bGreen = 0; + ptr.bRed = 0; + if(m_oAuto.IsInit()) { if(m_oAuto->GetValue()) @@ -467,7 +488,7 @@ namespace OOX ptr.index = m_oThemeColor->GetValue(); ptr.xColorType = 3; } - else + else if(m_oRgb.IsInit()) { ptr.bAlpha = m_oRgb->Get_A(); ptr.bBlue = m_oRgb->Get_B(); @@ -475,6 +496,7 @@ namespace OOX ptr.bRed = m_oRgb->Get_R(); } + if ( m_oTint.IsInit()) { ptr.nTintAndShade = m_oTint->GetValue() * 32767.0; @@ -489,6 +511,11 @@ namespace OOX XLS::BaseObjectPtr objectPtr(ptr); + ptr->bAlpha = 0; + ptr->bAlpha = 0; + ptr->bAlpha = 0; + ptr->bAlpha = 0; + if(m_oAuto.IsInit()) { if(m_oAuto->GetValue()) diff --git a/OOXML/XlsxFormat/Styles/rPr.h b/OOXML/XlsxFormat/Styles/rPr.h index e5f60c05b7..ddd9a2d7b7 100644 --- a/OOXML/XlsxFormat/Styles/rPr.h +++ b/OOXML/XlsxFormat/Styles/rPr.h @@ -149,6 +149,7 @@ namespace OOX void fromBin(XLS::BaseObject* obj); XLS::BaseObjectPtr toBin(); XLSB::Color toColor(); + XLSB::Color GetDefaultColor(); virtual EElementType getType () const; diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 3c288b6379..4a373a35f7 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -101,6 +101,8 @@ namespace OOX ptr->helpTopic = 0xFFFFFFFF; if(m_oHidden.IsInit()) ptr->fHidden = m_oHidden->GetValue(); + else + ptr->fHidden = false; if (m_oLocalSheetId.IsInit()) ptr->itab = m_oLocalSheetId->GetValue(); From 7ff4d0e1676a919298e8e6e8f76f862cff59a7f1 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 13 Dec 2023 22:16:19 +0600 Subject: [PATCH 123/221] Add chart sheet conversion test --- .../test/ExampleFiles/xlsx2xlsb/simple1.xlsb | Bin 4924 -> 4928 bytes .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 12640 -> 17947 bytes .../test/ExampleFiles/xlsx2xlsb/simple2.xlsx | Bin 18819 -> 22955 bytes OOXML/test/xlsx2xlsb/conversion.cpp | 13 +++++++++++++ 4 files changed, 13 insertions(+) diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple1.xlsb index 1b80dd46442977eadc04328af495951e0cfd8827..7a984b15fdefc057f782ac73c254492a73eecb1d 100644 GIT binary patch delta 421 zcmdm^c0g^zJl6U(wLE4Y7#JA1m>3v%fpkTVesM`wL)sAG_%6M7?K)oWSMwws3cri zX2fDV#UP|9a-YK-CZ1a}yY!NE^*C{F9m%z$X2F zR`WyYcCj-*5(?I+GEWufe|X{7+~$Y8?9E(o*^V412>V8fk6UjG6L-9n|y~)YVtiHEv63s$qV>pCaVbxu&ojR GsQ>_SlAmJ$ delta 421 zcmX@0wnuHlJl6Wf@18#W$iTqB#l*nC3#2P@^ovU>b5e`-k}~twPW1O?N)$L&|IYe> z-1gP&0zyqkE-@W!7SJf!kl?uAA#6ngYfxkS5xbasR~CGkk|1%^?7iOVxTYqydq2P1 z7#}`kT_Dk^((vZpgsm#MU9;OJhXg;IqbED-OGtmKx}f{#ovZ3qRr?eJHioG_=%2JY z@2~Upg$A8sH|>pX<+1)bS1opL(I;m88xrp(rs?fDa^smt_g=2c9H*B*+GBfjo5&J1 z^`NlWNi#Q?ByHqBy!_+Z^yzso5@%Q4(tdU4BL80F+UZr#s@GZaMDBCrzoV6W*6M0Z z_qJoKT{V(rhrR_*Z{01veZ4^Y{<4K%?(r{uuV*}+r=Rcs=GAOU9GpisEzjx$h6elO zYkUiMS z3Ry5dp4=v+CIdHzk%2)1XdVI_;G2A#Pipc~L4nEB_yxE@5?0Ei6$ DXa1|y diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index ba7c4c50e3e30eb82c61d417b4c199c3d80b29eb..bf92710a8a6da17c1c09cf6ae79107c3f6fcfa37 100644 GIT binary patch delta 9770 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 delta 4960 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 literal 18819 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 fileContent; + std::vector exampleContent; + ASSERT_EQ(readBinaryFiles(path1, path2, fileContent, exampleContent), 0); + ASSERT_EQ(fileContent, exampleContent); +} + } \ No newline at end of file From 48053414c9559d6a512f791d72e3c3a3a81690c1 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 15 Dec 2023 20:02:44 +0600 Subject: [PATCH 124/221] Add frtpivot cache def version set --- OOXML/DocxFormat/Drawing/DrawingExt.cpp | 8 ++++++++ .../test/ExampleFiles/xlsx2xlsb/simple2.xlsb | Bin 17947 -> 17943 bytes 2 files changed, 8 insertions(+) diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index f9a1415e40..a8592dbdbf 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -741,6 +741,14 @@ namespace OOX XLS::BaseObjectPtr COfficeArtExtensionList::toBinPivotCache() { auto ptr(new XLSB::FRTPIVOTCACHEDEF); + + auto ptr1(new XLSB::FRTBegin); + XLSB::FRTProductVersion version; + version.product = 0; + version.version = 0x0F03; + ptr1->productVersion = version; + ptr->m_BrtFRTBegin = XLS::BaseObjectPtr{ptr1}; + XLS::BaseObjectPtr objectPtr(ptr); if (!m_arrExt.empty()) diff --git a/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb b/OOXML/test/ExampleFiles/xlsx2xlsb/simple2.xlsb index bf92710a8a6da17c1c09cf6ae79107c3f6fcfa37..6aac6466dfa0cc1bbc50ae378559a2570c8a0888 100644 GIT binary patch delta 369 zcmbQ;!#KT%af62jtI>!Wx^g$7dr3>XKH8(>lhpkc`UK0s*lmFz~a)r^7A=O zfsU(peNmaX&w?d1sLj}|Qqk|oG$E<#Yb^Kg8wI>9NHu-B{N{)CPt^ap$^1Bf`|sCn z;zs#aXZBhz(p6)dwoQiZW9-IFFA|(>7&l96){8@(Io~0RMO>4CVRAl~#N;;|Jd?lJ z2uyZ#lw!=89OLNC)T=dlt(MZ{(~ep!?Akz8j%;F+`JJ>Fb0=FlIWo#ju5of;{5g5A zQz%n`;p7R1Qj_(ZwU~U3fK1WJ`Of-`izd%^c4yKvo$P0-IGNK$i_vJZiAx}(%H%ee z07j9?*InY7q%0>}S!z#Cu@jiAZ6(0N00fL6fYi~*aB0kB9Y1%L$VA)J#h2XZviQy`mLJ<)J_Z-_wv+hFD;Rsm2JRdX6E+usG1X zcTa4BUQVmJ^dyvlSU6Qsx--7=OdN>~#Wi-U3BJFjpwi;PYQj&m5xi0`39iJR|GXdF zUvDe*CZo)|CE5~~?)}&l-JpC^EDbtX6Hib}0|b-dKpL|(DPb1{fCTCxoRgbCY6Kf8 z005J33K)}3DGZY>K`H@olUPAZ0+A|{sVX9q$3ZFt3o8HslR*X+lM6yB0dbQyLO}r_ zlXyZv0sWJ?LRA5DlMh2h0#P!P5JMG{YeO#rrZbbiGaQq+Ln;C?HIqs;A(N;?5R(-| z8UZ$wFho%TC^wTpHzkv(L@ELpIFm3qG?NHLDgquklQuaklV3$D0v$S&+(jFcP&x{e Tuth2X5R= Date: Tue, 19 Dec 2023 15:04:56 +0600 Subject: [PATCH 125/221] Fix included headers paths --- OOXML/XlsxFormat/Worksheets/MergeCells.cpp | 2 +- OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp index ea9f80a7a5..c6ff804527 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp @@ -34,7 +34,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/MergeCell.h" -#include "../../XlsbFormat\Biff12_unions\MERGECELLS.h" +#include "../../XlsbFormat/Biff12_unions/MERGECELLS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp index 79292d3331..19479f6c12 100644 --- a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp +++ b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp @@ -35,7 +35,7 @@ #include "../../Common/SimpleTypes_Shared.h" -#include "..\..\XlsbFormat\Biff12_unions\HLINKS.h" +#include "../../XlsbFormat/Biff12_unions/HLINKS.h" namespace OOX { From 057eed59c102f3d8141cfaa4a9ba6ff51330bb17 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 25 Dec 2023 19:42:49 +0300 Subject: [PATCH 126/221] xlst->xlsb --- .../Sheets/Common/BinReaderWriterDefines.h | 6 +- OOXML/Binary/Sheets/Writer/BinaryReader.cpp | 41 +++++++++--- OOXML/XlsxFormat/Styles/Borders.cpp | 2 +- OOXML/XlsxFormat/Styles/Fills.cpp | 2 +- OOXML/XlsxFormat/Styles/Fonts.cpp | 2 +- OOXML/XlsxFormat/Styles/NumFmts.cpp | 2 +- OOXML/XlsxFormat/Styles/Xfs.cpp | 4 +- OOXML/XlsxFormat/Styles/dxf.cpp | 2 +- X2tConverter/src/ASCConverters.cpp | 11 +++ X2tConverter/src/cextracttools.cpp | 2 + X2tConverter/src/cextracttools.h | 3 + X2tConverter/src/lib/xlsx.h | 67 +++++++++++++++++-- 12 files changed, 116 insertions(+), 28 deletions(-) diff --git a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h index f7469f9bac..e88d7c0c81 100644 --- a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h +++ b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h @@ -47,9 +47,9 @@ namespace BinXlsxRW namespace c_oFileTypes{enum c_oFileTypes { XLSX = 1, - CSV = 2, - JSON = 3, - XLSB = 4 + CSV = 2, + JSON = 3, + XLSB = 4 };} diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp index 5049cda88f..8dcce5462b 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp @@ -8117,7 +8117,7 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD if (NULL != pData) { - // File Type + // File Type std::wstring sDstPathCSV = sDstPath; BYTE fileType; UINT nCodePage; @@ -8125,8 +8125,8 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD BYTE saveFileType; SerializeCommon::ReadFileType(sXMLOptions, fileType, nCodePage, sDelimiter, saveFileType); - // Делаем для CSV перебивку пути, иначе создается папка с одинаковым имеем (для rels) и файл не создается. - + // Делаем для CSV перебивку пути, иначе создается папка с одинаковым имеем (для rels) и файл не создается. + if (BinXlsxRW::c_oFileTypes::CSV == fileType) { sDstPath = pOfficeDrawingConverter->GetTempPath(); @@ -8135,36 +8135,55 @@ int BinaryFileReader::ReadFile(const std::wstring& sSrcFileName, std::wstring sD sDstPath = NSDirectory::CreateDirectoryWithUniqueName(sDstPath); } - - OOX::Spreadsheet::CXlsx oXlsx; - + std::wstring themePath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::Theme.DefaultDirectory().GetPath(); std::wstring drawingsPath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Drawings.DefaultDirectory().GetPath(); std::wstring embeddingsPath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::MicrosoftOfficeUnknown.DefaultDirectory().GetPath(); std::wstring chartsPath = sDstPath + FILE_SEPARATOR_STR + OOX::Spreadsheet::FileTypes::Workbook.DefaultDirectory().GetPath() + FILE_SEPARATOR_STR + OOX::FileTypes::Chart.DefaultDirectory().GetPath(); oBufferedStream.m_pRels->m_pManager->SetDstCharts(chartsPath); - + bResultOk = true; - + if (BinXlsxRW::c_oFileTypes::XLSX == fileType) { + OOX::Spreadsheet::CXlsx oXlsx; SaveParams oSaveParams(drawingsPath, embeddingsPath, themePath, pOfficeDrawingConverter->GetContentTypes(), NULL, bMacro); - + try { ReadMainTable(oXlsx, oBufferedStream, OOX::CPath(sSrcFileName).GetDirectory(), sDstPath, oSaveParams, pOfficeDrawingConverter); } - catch(...) + catch (...) { bResultOk = false; } - + oXlsx.PrepareToWrite(); oXlsx.Write(sDstPath, *oSaveParams.pContentTypes); } + else if (BinXlsxRW::c_oFileTypes::XLSB == fileType) + { + OOX::Spreadsheet::CXlsb oXlsb; + oXlsb.m_bWriteToXlsb = true; + + SaveParams oSaveParams(drawingsPath, embeddingsPath, themePath, pOfficeDrawingConverter->GetContentTypes(), NULL, bMacro); + + try + { + ReadMainTable(oXlsb, oBufferedStream, OOX::CPath(sSrcFileName).GetDirectory(), sDstPath, oSaveParams, pOfficeDrawingConverter); + } + catch (...) + { + bResultOk = false; + } + + oXlsb.PrepareToWrite(); + oXlsb.WriteBin(sDstPath, *oSaveParams.pContentTypes); + } else { + OOX::Spreadsheet::CXlsx oXlsx; CSVWriter oCSVWriter; oCSVWriter.Init(oXlsx, nCodePage, sDelimiter, false); diff --git a/OOXML/XlsxFormat/Styles/Borders.cpp b/OOXML/XlsxFormat/Styles/Borders.cpp index 1801f19c78..5350fe6b44 100644 --- a/OOXML/XlsxFormat/Styles/Borders.cpp +++ b/OOXML/XlsxFormat/Styles/Borders.cpp @@ -39,7 +39,7 @@ #include "../../XlsbFormat/Biff12_records/BeginBorders.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" -#include "../../../XlsbFormat/Biff12_unions/BORDERS.h" +#include "../../XlsbFormat/Biff12_unions/BORDERS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index c62f0bdca5..75880f3381 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -39,7 +39,7 @@ #include "../../XlsbFormat/Biff12_records/BeginFills.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" -#include "../../../XlsbFormat/Biff12_unions/FILLS.h" +#include "../../XlsbFormat/Biff12_unions/FILLS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/Fonts.cpp b/OOXML/XlsxFormat/Styles/Fonts.cpp index 2a8a438d3b..fd18d078e3 100644 --- a/OOXML/XlsxFormat/Styles/Fonts.cpp +++ b/OOXML/XlsxFormat/Styles/Fonts.cpp @@ -36,7 +36,7 @@ #include "../../XlsbFormat/Biff12_records/CommonRecords.h" #include "../../XlsbFormat/Biff12_records/BeginFonts.h" -#include "../../../XlsbFormat/Biff12_unions/FONTS.h" +#include "../../XlsbFormat/Biff12_unions/FONTS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/NumFmts.cpp b/OOXML/XlsxFormat/Styles/NumFmts.cpp index 267cc2a10e..9109cf6fe9 100644 --- a/OOXML/XlsxFormat/Styles/NumFmts.cpp +++ b/OOXML/XlsxFormat/Styles/NumFmts.cpp @@ -36,7 +36,7 @@ #include "../../XlsbFormat/Biff12_unions/ACFMT.h" #include "../../Common/SimpleTypes_Shared.h" -#include "../../../XlsbFormat/Biff12_unions/FMTS.h" +#include "../../XlsbFormat/Biff12_unions/FMTS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index 65bb8bb1b2..b12160f9f7 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -39,8 +39,8 @@ #include "../../XlsbFormat/Biff12_records/BeginCellStyleXFs.h" #include "../../XlsbFormat/Biff12_records/BeginCellXFs.h" -#include "../../../XlsbFormat/Biff12_unions/CELLSTYLEXFS.h" -#include "../../../XlsbFormat/Biff12_unions/CELLXFS.h" +#include "../../XlsbFormat/Biff12_unions/CELLSTYLEXFS.h" +#include "../../XlsbFormat/Biff12_unions/CELLXFS.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Styles/dxf.cpp b/OOXML/XlsxFormat/Styles/dxf.cpp index a1a5585595..15dd9aee75 100644 --- a/OOXML/XlsxFormat/Styles/dxf.cpp +++ b/OOXML/XlsxFormat/Styles/dxf.cpp @@ -46,7 +46,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include -#include "../../../XlsbFormat/Biff12_unions/DXFS.h" +#include "../../XlsbFormat/Biff12_unions/DXFS.h" namespace OOX { diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index d10bb637db..42badaa106 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -799,6 +799,10 @@ namespace NExtractTools { nRes = xlst_bin2csv(sFrom, sTo, params, convertParams); } + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == nFormatTo) + { + nRes = xlst_bin2xlsb(sFrom, sTo, params, convertParams); + } else if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::XLST; @@ -1536,6 +1540,13 @@ namespace NExtractTools result = xlst2xlsx(sFileFrom, sFileTo, oInputParams, oConvertParams); } break; + case TCD_XLST2XLSB: + { + oInputParams.m_bMacro = true; + oInputParams.m_nFormatTo = new int(AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB); + result = xlst2xlsb(sFileFrom, sFileTo, oInputParams, oConvertParams); + } + break; case TCD_XLST2XLTX: { oInputParams.m_bMacro = false; diff --git a/X2tConverter/src/cextracttools.cpp b/X2tConverter/src/cextracttools.cpp index abc8ed5dc8..bf4144f912 100644 --- a/X2tConverter/src/cextracttools.cpp +++ b/X2tConverter/src/cextracttools.cpp @@ -329,6 +329,8 @@ namespace NExtractTools res = TCD_T2BIN; else if (0 == sExt2.compare(L".csv")) res = TCD_XLST2CSV; + else if (0 == sExt2.compare(L".xlsb")) + res = TCD_XLST2XLSB; } break; case AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY: diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index fcde055f1d..d4d8948ba3 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -95,6 +95,7 @@ namespace NExtractTools TCD_XLTM2XLSM, TCD_XLSB2XLST, TCD_XLSX2XLSB, + TCD_XLST2XLSB, TCD_PPTX2PPTT, TCD_PPTT2PPTX, @@ -915,6 +916,8 @@ namespace NExtractTools sSaveType = _T(" saveFileType='3'"); else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == *m_nFormatTo) nFileType = 2; + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == *m_nFormatTo) + nFileType = 4; } sRes = L" Date: Tue, 26 Dec 2023 16:49:50 +0300 Subject: [PATCH 127/221] . --- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 7b3d91627d..5b0a9b9ddc 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -385,8 +385,10 @@ namespace OOX void CWorksheet::PrepareAfterRead() { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); - if (!(xlsb) && (xlsb->m_bWriteToXlsb)) + if (!xlsb || ((xlsb) && (xlsb->m_bWriteToXlsb))) + { PrepareComments(m_pComments, m_pThreadedComments, m_oLegacyDrawing.GetPointer()); + } PrepareConditionalFormatting(); PrepareDataValidations(); } From 4ae8962af23fb5045cf4579a2c43cd5037af0571 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 27 Dec 2023 16:53:05 +0300 Subject: [PATCH 128/221] . --- X2tConverter/src/ASCConverters.cpp | 4 ++++ X2tConverter/src/lib/xlsx.h | 28 ++++++++++++++++------------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 42badaa106..b375299619 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -769,6 +769,10 @@ namespace NExtractTools convertParams.m_bIsTemplate = false; nRes = xlsx_dir2ods(sFrom, sTo, params, convertParams); } + else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_XLSB == nFormatTo) + { + nRes = xlsx_dir2xlsb(sFrom, sTo, params, convertParams); + } // else if (AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV == nFormatTo) //{ // nRes = xlsx_dir2csv(sFrom, sTo, sTemp, params); diff --git a/X2tConverter/src/lib/xlsx.h b/X2tConverter/src/lib/xlsx.h index 2a5afef34f..396b6233c5 100644 --- a/X2tConverter/src/lib/xlsx.h +++ b/X2tConverter/src/lib/xlsx.h @@ -358,32 +358,36 @@ namespace NExtractTools } return nRes; } - _UINT32 xlsx_dir2xlsb_dir(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { - std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); - NSDirectory::CreateDirectory(sTempUnpackedXLSX); - - COfficeUtils oCOfficeUtils(NULL); - _UINT32 nRes = oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0); - if(!SUCCEEDED_X2T(nRes)) - return nRes; - - const OOX::CPath oox_path(sTempUnpackedXLSX); + const OOX::CPath oox_path(sFrom); OOX::Spreadsheet::CXlsb oXlsb; oXlsb.m_bWriteToXlsb = true; oXlsb.Read(oox_path); OOX::CContentTypes oContentTypes; - nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; + _UINT32 nRes = oXlsb.WriteBin(sTo, oContentTypes) ? S_OK : AVS_FILEUTILS_ERROR_CONVERT; return nRes; } - _UINT32 xlsx2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + _UINT32 xlsx_dir2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { return NSCommon::ooxml2ooxml(sFrom, sTo, params, convertParams, L"xlsb", xlsx_dir2xlsb_dir); } + _UINT32 xlsx2xlsb(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) + { + std::wstring sTempUnpackedXLSX = combinePath(convertParams.m_sTempDir, L"xlsx_unpacked"); + NSDirectory::CreateDirectory(sTempUnpackedXLSX); + + COfficeUtils oCOfficeUtils(NULL); + _UINT32 nRes = oCOfficeUtils.ExtractToDirectory(sFrom, sTempUnpackedXLSX, NULL, 0); + if (SUCCEEDED_X2T(nRes)) + { + nRes = xlsx_dir2xlsb(sTempUnpackedXLSX, sTo, params, convertParams); + } + return nRes; + } _UINT32 xml2xlsx(const std::wstring& sFrom, const std::wstring& sTo, InputParams& params, ConvertParams& convertParams) { return NSCommon::format2ooxml(sFrom, sTo, params, convertParams, L"xlsx", xml2xlsx_dir); From 189269031a329171906d83f43b1c527dcb137be9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 29 Dec 2023 17:49:12 +0600 Subject: [PATCH 129/221] Fix shared string conversion --- OOXML/XlsxFormat/SharedStrings/Si.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/OOXML/XlsxFormat/SharedStrings/Si.cpp b/OOXML/XlsxFormat/SharedStrings/Si.cpp index dbe89aee6d..e008680be1 100644 --- a/OOXML/XlsxFormat/SharedStrings/Si.cpp +++ b/OOXML/XlsxFormat/SharedStrings/Si.cpp @@ -139,15 +139,18 @@ namespace OOX ptr->fRichStr = false; for(auto i = 0; i < m_arrItems.size(); i++) { - auto text = static_cast(m_arrItems[i]); - if(text) + + + if(m_arrItems[i]->getType() == OOX::et_x_t) { + auto text = static_cast(m_arrItems[i]); ptr->str = text->ToString(); continue; } - auto crunPtr = static_cast(m_arrItems[i]); - if(crunPtr) + + if(m_arrItems[i]->getType() == OOX::et_x_r) { + auto crunPtr = static_cast(m_arrItems[i]); ptr->fRichStr = true; USHORT ind = 0; ptr->str = ptr->str.value() + crunPtr->toBin(ind); @@ -155,6 +158,7 @@ namespace OOX run.ifnt = ind; run.ich = ptr->str.value().size(); ptr->rgsStrRun.push_back(run); + continue; } auto phonPtr = static_cast(m_arrItems[i]); if(phonPtr) From 9b06b9e7a81ee90b6ff3a4819aa3e6e847a4d71d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 29 Dec 2023 19:04:40 +0600 Subject: [PATCH 130/221] Remove unused code --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 91f4e37f58..9ec554e55f 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1342,8 +1342,6 @@ namespace OOX } XLS::BaseObjectPtr CSheetView::toBin() { - //if(m_oView.IsInit() || m_oTopLeftCell.IsInit() || m_oTopLeftCell.IsInit()) - //{ auto ptr(new XLSB::WSVIEW2); XLS::BaseObjectPtr castedPtr(ptr); auto pWsView(new XLSB::BeginWsView); @@ -1588,8 +1586,6 @@ namespace OOX } XLS::BaseObjectPtr CSheetViews::toBin() { - auto view = m_arrItems.back(); - auto castedPtr(new XLSB::WSVIEWS2); XLS::BaseObjectPtr ptr(castedPtr); for(auto i:m_arrItems) From 1f92b15aae47e7e6766f2f42a55967ff2a0819bf Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 29 Dec 2023 19:05:03 +0600 Subject: [PATCH 131/221] Fix blank cell conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 44 +++++++++++++++++------ 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index f0f0ab6d25..f859b1bd5f 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1806,21 +1806,34 @@ namespace OOX { case SimpleTypes::Spreadsheet::celltypeNumber: { - auto pCellRk = new(XLSB::CellRk); - if( m_oValue->m_sText.find('.') == std::string::npos) + if(m_oValue.IsInit()) { - pCellRk->value.fInt = 1; - pCellRk->value.fX100 = 0; - pCellRk->value.num = std::stoi(m_oValue->m_sText); + auto pCellRk = new(XLSB::CellRk); + if( m_oValue->m_sText.find('.') == std::string::npos) + { + pCellRk->value.fInt = 1; + pCellRk->value.fX100 = 0; + pCellRk->value.num = std::stoi(m_oValue->m_sText); + } + else + { + pCellRk->value.fInt = 0; + pCellRk->value.fX100 = 1; + pCellRk->value.num = std::stod(m_oValue->m_sText) * 100; + } + oCell = &pCellRk->cell; + pSource = pCellRk; } else { - pCellRk->value.fInt = 0; - pCellRk->value.fX100 = 1; - pCellRk->value.num = std::stod(m_oValue->m_sText) * 100; + auto pCellblank = new(XLSB::CellBlank); + oCell = &pCellblank->cell; + oCell->fPhShow = false; + pSource = pCellblank; } - oCell = &pCellRk->cell; - pSource = pCellRk; + + + } break; case SimpleTypes::Spreadsheet::celltypeError: @@ -2053,7 +2066,16 @@ namespace OOX pSHRFMLACELL->m_source = m_oFormula->toBin(); } } - oCell->column = m_oCol.get(); + if(m_oCol.IsInit()) + oCell->column = m_oCol.get(); + else if(m_oRef.IsInit()) + { + std::wstring strRef(m_oRef.get().begin(), m_oRef.get().end()); + XLS::CellRef reference(strRef); + oCell->column = reference.getColumn(); + } + else + oCell->column = 0; if(m_oShowPhonetic.IsInit()) oCell->fPhShow = m_oShowPhonetic->GetValue(); else From 2588d45ffe3d01619a333dc3f30b460878713989 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 9 Jan 2024 12:33:57 +0300 Subject: [PATCH 132/221] . --- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 5b0a9b9ddc..996fb65a23 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -49,7 +49,7 @@ #include "../../XlsbFormat/Biff12_unions/HLINKS.h" #include "../../XlsbFormat/Biff12_unions/MERGECELLS.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { From fc99dedbd4e29e85ddc24e0cd4d46e461b169be0 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 9 Jan 2024 12:37:47 +0300 Subject: [PATCH 133/221] fix build --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 91f4e37f58..94845c0522 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -152,13 +152,13 @@ namespace OOX if (m_oName.IsInit()) ptr->rangeProtectionTitleSDRel.rgchTitle = m_oName.get(); - byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); auto tempSize = 0; NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); ptr->ipdPasswordData.rgbHash.cbLength = tempSize; - byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + BYTE* temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); auto tempSize2 = 0; NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); @@ -2632,7 +2632,7 @@ namespace OOX ptr->dwSpinCount = m_oSpinCount->GetValue(); if(m_oHashValue.IsInit()) { - byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); auto tempSize = 0; NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); @@ -2641,7 +2641,7 @@ namespace OOX if(m_oSaltValue.IsInit()) { - byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + BYTE * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); auto tempSize2 = 0; NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); @@ -2732,7 +2732,7 @@ namespace OOX if(m_oHashValue.IsInit()) { - byte * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); + BYTE * temp = ptr->ipdPasswordData.rgbHash.rgbData.data(); auto tempSize = 0; NSFile::CBase64Converter::CBase64Converter::Decode(std::string{m_oHashValue.get().begin(), m_oHashValue.get().end()}.c_str(), m_oHashValue.get().size(), temp, tempSize); @@ -2741,7 +2741,7 @@ namespace OOX if(m_oSaltValue.IsInit()) { - byte * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); + BYTE * temp2 = ptr->ipdPasswordData.rgbSalt.rgbData.data(); auto tempSize2 = 0; NSFile::CBase64Converter::Decode(std::string{m_oSaltValue.get().begin(), m_oSaltValue.get().end()}.c_str(), m_oSaltValue.get().size(), temp2, tempSize2); From 5bb50ffd479b9b14b2e162dce266367bc6a69a9b Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 9 Jan 2024 14:00:21 +0300 Subject: [PATCH 134/221] . --- OOXML/XlsxFormat/Table/Tables.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 9aeba06f02..1a434f5638 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -64,7 +64,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../DocxFormat/Drawing/DrawingExt.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { From 83a053a1dd66c161f34fbd2623412a64ee699a97 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 9 Jan 2024 18:15:15 +0600 Subject: [PATCH 135/221] Fix numbers conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 122 ++++++++++++++++------ 1 file changed, 89 insertions(+), 33 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index f859b1bd5f..5855d5cd39 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1796,44 +1796,90 @@ namespace OOX XLSB::SHRFMLACELL* pSHRFMLACELL = nullptr; BiffRecord* pSource = nullptr; XLSB::Cell* oCell; + bool isReal = false; if(!m_oType.IsInit()) { m_oType.Init(); - m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeStr); + if(m_oValue.IsInit()) + { + if(m_oValue->m_sText == L"TRUE" || m_oValue->m_sText == L"FALSE") + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool); + else if(std::all_of(m_oValue->m_sText.begin(), m_oValue->m_sText.end(), [](const char c) { return std::isdigit(c); }) && m_oValue->m_sText.size() <= 10) + { + if(m_oValue->m_sText.size() < 10) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + } + else if(m_oValue->m_sText.size() == 10) + { + _INT64 tempVal = std::stoll(m_oValue->m_sText); + if(tempVal < MAXINT32 && tempVal > MININT32) + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + } + } + + if((m_oValue->m_sText.find(L".") == std::string::npos || m_oValue->m_sText.find(L".") == m_oValue->m_sText.rfind(L".")) + && m_oValue->m_sText.size() <=17) + { + if(m_oValue->m_sText.size() < 17) + { + double tempVal = std::stod(m_oValue->m_sText); + if(!isnan(tempVal)) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + isReal = true; + } + } + else + { + long double tempVal = std::stold(m_oValue->m_sText); + if(!isnan(tempVal)) + if(tempVal <= DBL_MAX) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + isReal = true; + } + } + } + else if((m_oValue->m_sText.find(L"E") == std::string::npos || m_oValue->m_sText.find(L"E") == m_oValue->m_sText.rfind(L"E"))) + { + long double tempVal = std::stold(m_oValue->m_sText); + if(!isnan(tempVal)) + if(tempVal <= DBL_MAX) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + isReal = true; + } + } + + } } switch (m_oType->GetValue()) { case SimpleTypes::Spreadsheet::celltypeNumber: { - if(m_oValue.IsInit()) + if(!isReal) { auto pCellRk = new(XLSB::CellRk); - if( m_oValue->m_sText.find('.') == std::string::npos) - { - pCellRk->value.fInt = 1; - pCellRk->value.fX100 = 0; - pCellRk->value.num = std::stoi(m_oValue->m_sText); - } - else - { - pCellRk->value.fInt = 0; - pCellRk->value.fX100 = 1; - pCellRk->value.num = std::stod(m_oValue->m_sText) * 100; - } + pCellRk->value.fInt = 1; + pCellRk->value.fX100 = 0; + pCellRk->value.num = std::stoi(m_oValue->m_sText); + + oCell = &pCellRk->cell; pSource = pCellRk; } - else + else if(isReal) { - auto pCellblank = new(XLSB::CellBlank); - oCell = &pCellblank->cell; - oCell->fPhShow = false; - pSource = pCellblank; + auto pCellReal = new(XLSB::CellReal); + + pCellReal->value.data.value = std::stod(m_oValue->m_sText); + + oCell = &pCellReal->cell; + pSource = pCellReal; } - - - } break; case SimpleTypes::Spreadsheet::celltypeError: @@ -1987,23 +2033,33 @@ namespace OOX case SimpleTypes::Spreadsheet::celltypeInlineStr: case SimpleTypes::Spreadsheet::celltypeStr: { - if(m_oFormula.IsInit()) + if(m_oValue.IsInit()) { - auto str(new XLSB::FmlaString); - if(m_oValue.IsInit()) - str->value = m_oValue->m_sText; - oCell = &str->cell; + if(m_oFormula.IsInit()) + { + auto str(new XLSB::FmlaString); + if(m_oValue.IsInit()) + str->value = m_oValue->m_sText; + oCell = &str->cell; - pSource = str; + pSource = str; + } + else + { + auto str(new XLSB::CellSt); + if(m_oValue.IsInit()) + str->value = m_oValue->m_sText; + oCell = &str->cell; + pSource = str; + } } else { - auto str(new XLSB::CellSt); - if(m_oValue.IsInit()) - str->value = m_oValue->m_sText; - oCell = &str->cell; - pSource = str; + auto pCellblank = new(XLSB::CellBlank); + oCell = &pCellblank->cell; + oCell->fPhShow = false; + pSource = pCellblank; } } break; From 54ec8853163a8dab6eb38a9e1802e9ee92ba753a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 9 Jan 2024 20:21:40 +0600 Subject: [PATCH 136/221] Fix cell value parsing --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 25 +++++++++++++---------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 5855d5cd39..e0b55497aa 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1825,8 +1825,9 @@ namespace OOX { if(m_oValue->m_sText.size() < 17) { - double tempVal = std::stod(m_oValue->m_sText); - if(!isnan(tempVal)) + wchar_t *tail; + double tempVal = std::wcstod(m_oValue->m_sText.c_str(), &tail); + if(*tail == L'\0') { m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); isReal = true; @@ -1834,8 +1835,9 @@ namespace OOX } else { - long double tempVal = std::stold(m_oValue->m_sText); - if(!isnan(tempVal)) + wchar_t *tail; + long double tempVal = std::wcstold(m_oValue->m_sText.c_str(), &tail); + if(*tail == L'\0') if(tempVal <= DBL_MAX) { m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); @@ -1845,13 +1847,14 @@ namespace OOX } else if((m_oValue->m_sText.find(L"E") == std::string::npos || m_oValue->m_sText.find(L"E") == m_oValue->m_sText.rfind(L"E"))) { - long double tempVal = std::stold(m_oValue->m_sText); - if(!isnan(tempVal)) - if(tempVal <= DBL_MAX) - { - m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); - isReal = true; - } + wchar_t *tail; + long double tempVal = std::wcstold(m_oValue->m_sText.c_str(), &tail); + if(*tail == L'\0') + if(tempVal <= DBL_MAX) + { + m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + isReal = true; + } } } From cdf10bbc38e5acac5b85c7cd50279ca1b48686ed Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 9 Jan 2024 17:22:38 +0300 Subject: [PATCH 137/221] fix build --- OOXML/XlsxFormat/Comments/XlsxComments.cpp | 2 +- OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp | 2 +- OOXML/XlsxFormat/Pivot/Pivots.cpp | 2 +- OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp | 2 +- OOXML/XlsxFormat/Slicer/Slicer.cpp | 2 +- OOXML/XlsxFormat/Slicer/SlicerCache.cpp | 2 +- OOXML/XlsxFormat/Styles/XlsxStyles.cpp | 2 +- OOXML/XlsxFormat/Table/Connections.cpp | 2 +- OOXML/XlsxFormat/Workbook/Workbook.cpp | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/OOXML/XlsxFormat/Comments/XlsxComments.cpp b/OOXML/XlsxFormat/Comments/XlsxComments.cpp index 9a3682e79c..05a8a7f323 100644 --- a/OOXML/XlsxFormat/Comments/XlsxComments.cpp +++ b/OOXML/XlsxFormat/Comments/XlsxComments.cpp @@ -49,7 +49,7 @@ #include "../SharedStrings/Si.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { diff --git a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp index 98fa67fb02..4ffd81b7ed 100644 --- a/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp +++ b/OOXML/XlsxFormat/ExternalLinks/ExternalLinks.cpp @@ -65,7 +65,7 @@ #include "../../XlsbFormat/Biff12_records/SupName.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" #include namespace OOX diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 7eb31e565d..71eba1bd80 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -140,7 +140,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../ComplexTypes_Spreadsheet.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" #include namespace OOX diff --git a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp index a9cc1c86ec..136a189d72 100644 --- a/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp +++ b/OOXML/XlsxFormat/SharedStrings/SharedStrings.cpp @@ -38,7 +38,7 @@ #include "../../XlsbFormat/Biff12_unions/SHAREDSTRINGS.h" #include "../../XlsbFormat/Biff12_records/SSTItem.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Slicer/Slicer.cpp b/OOXML/XlsxFormat/Slicer/Slicer.cpp index 087b3f6a75..915cd4ad9c 100644 --- a/OOXML/XlsxFormat/Slicer/Slicer.cpp +++ b/OOXML/XlsxFormat/Slicer/Slicer.cpp @@ -38,7 +38,7 @@ #include "../../DocxFormat/Drawing/DrawingExt.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Slicer/SlicerCache.cpp b/OOXML/XlsxFormat/Slicer/SlicerCache.cpp index 2f437cfa67..34ec92e727 100644 --- a/OOXML/XlsxFormat/Slicer/SlicerCache.cpp +++ b/OOXML/XlsxFormat/Slicer/SlicerCache.cpp @@ -59,7 +59,7 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffStructure.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { namespace Spreadsheet diff --git a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp index 51770f3545..c9baa4c890 100644 --- a/OOXML/XlsxFormat/Styles/XlsxStyles.cpp +++ b/OOXML/XlsxFormat/Styles/XlsxStyles.cpp @@ -61,7 +61,7 @@ #include "../../XlsbFormat/Biff12_unions/STYLES.h" #include "../../XlsbFormat/Biff12_unions/DXFS.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index e5fd67ad72..1eca709bf4 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -55,7 +55,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../Common/SimpleTypes_Spreadsheet.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 0a5fbee6cb..75e2b8b35b 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -49,7 +49,7 @@ #include "../../Common/SimpleTypes_Spreadsheet.h" #include "../../DocxFormat/Drawing/DrawingExt.h" -#include "../../binary/XlsbFormat/FileTypes_SpreadsheetBin.h" +#include "../../Binary/XlsbFormat/FileTypes_SpreadsheetBin.h" namespace OOX { From 7266619e24c4e3747379d223fe113c08f31cf69b Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 9 Jan 2024 17:58:25 +0300 Subject: [PATCH 138/221] fix build --- .../XlsFile/Format/Logic/Biff_structures/BiffString.h | 4 ++++ OOXML/XlsxFormat/Workbook/WorkbookPr.cpp | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h index 0be5d56720..50786da3a4 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h @@ -116,6 +116,10 @@ public: cch_ = str.length(); return *this; } + XLUnicodeString_T operator=(const bool& boolVal) + { + return *this; + } const size_t getStructSizeWouldWritten() const // Number of unsigned chars that would be written { return recalculateStructSize(); diff --git a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp index 69eec4ffe3..e7a7eed4e6 100644 --- a/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp +++ b/OOXML/XlsxFormat/Workbook/WorkbookPr.cpp @@ -109,9 +109,9 @@ namespace OOX else ptr->fCheckCompat = false; if(m_oCodeName.IsInit()) - ptr->strName.value = m_oCodeName->GetValue(); + ptr->strName.value = m_oCodeName->GetValue(); else - ptr->strName.value = false; + ptr->strName.value = false; if(m_oDate1904.IsInit()) ptr->f1904 = m_oDate1904->GetValue(); else From 1017b30776322241a92ecafda1e61e7d5ac23842 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 10 Jan 2024 14:14:09 +0600 Subject: [PATCH 139/221] Add numeric value cache for cell value --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index e0b55497aa..25ab5a9930 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1797,6 +1797,8 @@ namespace OOX BiffRecord* pSource = nullptr; XLSB::Cell* oCell; bool isReal = false; + _INT32 intCache = 0; + double realCache = 0; if(!m_oType.IsInit()) { @@ -1810,13 +1812,17 @@ namespace OOX { if(m_oValue->m_sText.size() < 10) { + intCache = std::stoi(m_oValue->m_sText); m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); } else if(m_oValue->m_sText.size() == 10) { _INT64 tempVal = std::stoll(m_oValue->m_sText); if(tempVal < MAXINT32 && tempVal > MININT32) + { + intCache = tempVal; m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + } } } @@ -1831,6 +1837,7 @@ namespace OOX { m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); isReal = true; + realCache = tempVal; } } else @@ -1838,9 +1845,10 @@ namespace OOX wchar_t *tail; long double tempVal = std::wcstold(m_oValue->m_sText.c_str(), &tail); if(*tail == L'\0') - if(tempVal <= DBL_MAX) + if(tempVal <= DBL_MAX && tempVal >= DBL_MIN) { m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + realCache = tempVal; isReal = true; } } @@ -1853,6 +1861,7 @@ namespace OOX if(tempVal <= DBL_MAX) { m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeNumber); + realCache = tempVal; isReal = true; } } @@ -1868,7 +1877,7 @@ namespace OOX auto pCellRk = new(XLSB::CellRk); pCellRk->value.fInt = 1; pCellRk->value.fX100 = 0; - pCellRk->value.num = std::stoi(m_oValue->m_sText); + pCellRk->value.num = intCache; oCell = &pCellRk->cell; @@ -1878,7 +1887,7 @@ namespace OOX { auto pCellReal = new(XLSB::CellReal); - pCellReal->value.data.value = std::stod(m_oValue->m_sText); + pCellReal->value.data.value = realCache; oCell = &pCellReal->cell; pSource = pCellReal; From 508167f0f9eb62502e07df90a6e9d431735a1a53 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 11 Jan 2024 18:08:00 +0600 Subject: [PATCH 140/221] Fix conditional formating conversion --- .../Worksheets/ConditionalFormatting.cpp | 89 ++++++++++++++++--- 1 file changed, 77 insertions(+), 12 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index b7a9d7a948..4a3a96d123 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -1741,30 +1741,61 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() { ptr->dxfId = m_oDxfId->GetValue(); } - ptr->iPri = m_oPriority->GetValue(); - ptr->fStopTrue = m_oStopIfTrue->GetValue(); - ptr->fAbove = m_oAboveAverage->GetValue(); - ptr->fBottom = m_oBottom->GetValue(); - ptr->fPercent = m_oPercent->GetValue(); - ptr->strParam = m_oText.get(); + if(m_oPriority.IsInit()) + ptr->iPri = m_oPriority->GetValue(); + if(m_oStopIfTrue.IsInit()) + ptr->fStopTrue = m_oStopIfTrue->GetValue(); + else + ptr->fStopTrue = false; + if(m_oAboveAverage.IsInit()) + ptr->fAbove = m_oAboveAverage->GetValue(); + else + ptr->fAbove = false; + if(m_oBottom.IsInit()) + ptr->fBottom = m_oBottom->GetValue(); + else + ptr->fBottom = false; + if(m_oPercent.IsInit()) + ptr->fPercent = m_oPercent->GetValue(); + else + ptr->fPercent = false; + if(m_oText.IsInit()) + ptr->strParam = m_oText.get(); + else + ptr->strParam = L""; if(!m_arrFormula.empty()) { ptr->rgce1 = m_arrFormula.front()->m_sText; m_arrFormula.erase(m_arrFormula.begin()); } + else + { + ptr->cbFmla1 = 0; + } if(!m_arrFormula.empty()) { ptr->rgce2 = m_arrFormula.front()->m_sText; m_arrFormula.erase(m_arrFormula.begin()); } + else + { + ptr->cbFmla2 = 0; + } if(!m_arrFormula.empty()) { ptr->rgce3 = m_arrFormula.front()->m_sText; m_arrFormula.erase(m_arrFormula.begin()); } + else + { + ptr->cbFmla3 = 0; + } - if (m_oType == SimpleTypes::Spreadsheet::ECfType::cellIs) +ptr->iType = XLSB::CFType::CF_TYPE_EXPRIS; +ptr->iParam =0; + +if (m_oType == SimpleTypes::Spreadsheet::ECfType::cellIs) { if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_between) ptr->iParam = XLSB::CFOper::CF_OPER_BN; @@ -1782,6 +1813,7 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() ptr->iParam = XLSB::CFOper::CF_OPER_GE; else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_lessThanOrEqual) ptr->iParam = XLSB::CFOper::CF_OPER_LE; + ptr->iType = XLSB::CFType::CF_TYPE_CELLIS; } if (m_oType == SimpleTypes::Spreadsheet::ECfType::expression) @@ -1832,25 +1864,55 @@ else if (m_oType == SimpleTypes::Spreadsheet::ECfType::notContainsErrors) else if (m_oType == SimpleTypes::Spreadsheet::ECfType::timePeriod) { if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::today) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTODAY; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_TODAY; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::tomorrow) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTOMORROW; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_TOMORROW; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::yesterday) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODYESTERDAY; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_YESTERDAY; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::last7Days) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLAST7DAYS; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LAST7DAYS; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastMonth) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTMONTH; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LASTMONTH; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextMonth) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTMONTH; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_NEXTMONTH; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisWeek) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISWEEK; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_THISWEEK; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::nextWeek) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODNEXTWEEK; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_NEXTWEEK; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::lastWeek) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODLASTWEEK; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_LASTWEEK; + } else if (m_oTimePeriod == SimpleTypes::Spreadsheet::ETimePeriod::thisMonth) + { ptr->iTemplate.value().get() = XLSB::CFTemp::CF_TEMPLATE_TIMEPERIODTHISMONTH; + ptr->iParam = XLSB::CFDateOper::CF_TIMEPERIOD_THISMONTH; + } } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::aboveAverage) @@ -2557,23 +2619,26 @@ XLS::BaseObjectPtr CConditionalFormatting::toBin() { return objectPtr; } - if(m_arrItems.back()->m_oExtId.IsInit()) - { + auto ptr(new XLSB::CONDITIONALFORMATTING); objectPtr = XLS::BaseObjectPtr{ptr}; if(m_oSqRef.IsInit()) { auto conditionPtr(new XLSB::BeginConditionalFormatting); ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; - + conditionPtr->ccf = m_arrItems.size(); conditionPtr->sqrfx.strValue = m_oSqRef.get(); - conditionPtr->fPivot = m_oPivot->GetValue(); + if(m_oPivot.IsInit()) + conditionPtr->fPivot = m_oPivot->GetValue(); + else + conditionPtr->fPivot = false; + } for(auto i: m_arrItems) { ptr->m_arCFRULE.push_back(i->toBin()); } - } + return objectPtr; } bool CConditionalFormatting::IsUsage() From 7af7b50f663ae14a3e7d6578fd9741f034a868d6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 12 Jan 2024 20:12:33 +0600 Subject: [PATCH 141/221] Fix autofilter conversion --- OOXML/XlsxFormat/Table/Autofilter.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Table/Autofilter.cpp b/OOXML/XlsxFormat/Table/Autofilter.cpp index 990559617f..e9fba5c921 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.cpp +++ b/OOXML/XlsxFormat/Table/Autofilter.cpp @@ -130,7 +130,11 @@ namespace OOX { ptr->sortOn = 3; } - + else + { + ptr->sortOn = 0; + } + ptr->stSslist = L""; return objectPtr; } EElementType CSortCondition::getType () const @@ -295,8 +299,12 @@ namespace OOX beginSortState->rfx = m_oRef->GetValue(); if(m_oCaseSensitive.IsInit()) beginSortState->fCaseSensitive = m_oCaseSensitive->GetValue(); + else + beginSortState->fCaseSensitive = false; if(m_oColumnSort.IsInit()) beginSortState->fCol = m_oColumnSort->GetValue(); + else + beginSortState->fCol = false; if(m_oSortMethod == SimpleTypes::Spreadsheet::ESortMethod::sortmethodStroke) beginSortState->fAltMethod = true; else @@ -308,6 +316,7 @@ namespace OOX { sortConds->m_arSORTCOND.push_back(i->toBin()); } + beginSortState->cconditions = sortConds->m_arSORTCOND.size(); return objectPtr; } From 5c1882722449cb851a18395d2a4c1ae6ca0c7be8 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Fri, 12 Jan 2024 17:26:47 +0300 Subject: [PATCH 142/221] fix chartEx --- .../Binary/Sheets/Reader/ChartFromToBinary.cpp | 14 ++++++++------ OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp | 18 ++++++++---------- OOXML/XlsxFormat/Chart/ChartSerializeEx.h | 5 +++-- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp index 67eb2a9217..d3c8a75654 100644 --- a/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp +++ b/OOXML/Binary/Sheets/Reader/ChartFromToBinary.cpp @@ -7033,11 +7033,13 @@ namespace BinXlsxRW if (c_oserct_chartExBinningBINSIZE == type) { - pBinning->m_binSize = m_oBufferedStream.GetDoubleReal(); + pBinning->m_binSize.Init(); + pBinning->m_binSize->m_oVal = m_oBufferedStream.GetDoubleReal(); } else if (c_oserct_chartExBinningBINCOUNT == type) { - pBinning->m_binCount = m_oBufferedStream.GetLong(); + pBinning->m_binCount.Init(); + pBinning->m_binCount->m_oVal = m_oBufferedStream.GetLong(); } else if (c_oserct_chartExBinningINTERVAL == type) { @@ -12604,16 +12606,16 @@ namespace BinXlsxRW } void BinaryChartWriter::WriteCT_ChartExBinning(OOX::Spreadsheet::ChartEx::CBinning *pVal) { - if (pVal->m_binSize.IsInit()) + if ((pVal->m_binSize.IsInit()) && (pVal->m_binSize->m_oVal.IsInit())) { int nCurPos = m_oBcw.WriteItemStart(c_oserct_chartExBinningBINSIZE); - m_oBcw.m_oStream.WriteDoubleReal(*pVal->m_binSize); + m_oBcw.m_oStream.WriteDoubleReal(pVal->m_binSize->m_oVal->GetValue()); m_oBcw.WriteItemEnd(nCurPos); } - if (pVal->m_binCount.IsInit()) + if ((pVal->m_binCount.IsInit()) && (pVal->m_binCount->m_oVal.IsInit())) { int nCurPos = m_oBcw.WriteItemStart(c_oserct_chartExBinningBINCOUNT); - m_oBcw.m_oStream.WriteLONG(*pVal->m_binCount); + m_oBcw.m_oStream.WriteLONG(*pVal->m_binCount->m_oVal); m_oBcw.WriteItemEnd(nCurPos); } if (pVal->m_intervalClosed.IsInit()) diff --git a/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp b/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp index 38f50909c2..ce140704c1 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp +++ b/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp @@ -1405,13 +1405,11 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); if( L"binSize" == sName) { - std::wstring s = oReader.GetText3(); - m_binSize = XmlUtils::GetDouble(s); + m_binSize = oReader; } else if( L"binCount" == sName) { - std::wstring s = oReader.GetText3(); - m_binCount = XmlUtils::GetInteger(s); + m_binCount = oReader; } } } @@ -1432,15 +1430,15 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" writer.WriteString(L">"); if (m_binCount.IsInit()) { - writer.WriteString(L""); - writer.WriteString(XmlUtils::ToString(*m_binCount)); - writer.WriteString(L""); + writer.WriteString(L"ToString()); + writer.WriteString(L"/>"); } else if (m_binSize.IsInit()) { - writer.WriteString(L""); - writer.WriteString(std::to_wstring(*m_binSize)); - writer.WriteString(L""); + writer.WriteString(L"ToString()); + writer.WriteString(L"/>"); } writer.WriteString(L""); } diff --git a/OOXML/XlsxFormat/Chart/ChartSerializeEx.h b/OOXML/XlsxFormat/Chart/ChartSerializeEx.h index 668fae7962..01a7b5401a 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerializeEx.h +++ b/OOXML/XlsxFormat/Chart/ChartSerializeEx.h @@ -60,6 +60,7 @@ namespace ComplexTypes { class CParentLabelLayout; class CRegionLabelLayout; + class CDouble; } } @@ -294,8 +295,8 @@ namespace ChartEx void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - nullable_double m_binSize; - nullable_int m_binCount; + nullable m_binSize; + nullable m_binCount; nullable m_intervalClosed; nullable> m_underflow; From fe2779824bea6ab40590960218c0809d53ddda76 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 12 Jan 2024 21:37:42 +0600 Subject: [PATCH 143/221] Fix comment conversion error --- OOXML/XlsbFormat/Biff12_records/BeginComment.cpp | 8 ++++++++ OOXML/XlsxFormat/Comments/XlsxComments.cpp | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp b/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp index 0d3f298110..9999b924d1 100644 --- a/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp +++ b/OOXML/XlsbFormat/Biff12_records/BeginComment.cpp @@ -59,10 +59,18 @@ namespace XLSB void BeginComment::writeFields(XLS::CFRecord& record) { + if(!guid.empty()) + { _GUID_ guid_; STR::bstr2guid(guid, guid_); record << iauthor << rfx << guid_; + } + else + { + record << iauthor << rfx; + record.reserveNunBytes(16); + } } } // namespace XLSB diff --git a/OOXML/XlsxFormat/Comments/XlsxComments.cpp b/OOXML/XlsxFormat/Comments/XlsxComments.cpp index 9a3682e79c..77ac492f44 100644 --- a/OOXML/XlsxFormat/Comments/XlsxComments.cpp +++ b/OOXML/XlsxFormat/Comments/XlsxComments.cpp @@ -219,8 +219,12 @@ namespace OOX ptr1->rfx = m_oRef->GetValue(); if(m_oAuthorId.IsInit()) ptr1->iauthor = m_oAuthorId->GetValue(); + else + ptr1->iauthor = 0; if(m_oUid.IsInit()) ptr1->guid = m_oUid->ToString(); + else + ptr1->guid = L""; if(m_oText.IsInit()) { auto type = m_oText->getType(); From 01ac03f24b32b4ff636031cd7a8dd294b8ab3e5a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 15 Jan 2024 13:44:52 +0600 Subject: [PATCH 144/221] Fix comment convert condition --- OOXML/XlsxFormat/Worksheets/Worksheet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp index 996fb65a23..8aa1070b25 100644 --- a/OOXML/XlsxFormat/Worksheets/Worksheet.cpp +++ b/OOXML/XlsxFormat/Worksheets/Worksheet.cpp @@ -385,7 +385,7 @@ namespace OOX void CWorksheet::PrepareAfterRead() { CXlsb* xlsb = dynamic_cast(File::m_pMainDocument); - if (!xlsb || ((xlsb) && (xlsb->m_bWriteToXlsb))) + if (!xlsb || !xlsb->m_bWriteToXlsb) { PrepareComments(m_pComments, m_pThreadedComments, m_oLegacyDrawing.GetPointer()); } From fb27d004907cca8a9f605329faae8557f8c3a0ef Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 15 Jan 2024 15:49:20 +0600 Subject: [PATCH 145/221] Fix hyperlinks conversion --- OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp index 19479f6c12..3b4bd4a027 100644 --- a/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp +++ b/OOXML/XlsxFormat/Worksheets/XlsxHyperlinks.cpp @@ -82,14 +82,22 @@ namespace OOX if(m_oDisplay.IsInit()) castedPtr->display = m_oDisplay.get(); + else + castedPtr->display = L""; if(m_oRid.IsInit()) castedPtr->relId.value = m_oRid->GetValue(); + else + castedPtr->relId.value = L""; if(m_oLocation.IsInit()) castedPtr->location = m_oLocation.get(); + else + castedPtr->location = L""; if(m_oRef.IsInit()) castedPtr->rfx = m_oRef.get(); if(m_oTooltip.IsInit()) castedPtr->tooltip = m_oTooltip.get(); + else + castedPtr->tooltip = L""; return ptr; } From 7d82d4a8b7befc936b5a5a42c9a484da61c97936 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 17 Jan 2024 22:01:51 +0600 Subject: [PATCH 146/221] Fix conditional formating conversion --- OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index 4a3a96d123..f0cd4e2671 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -1713,7 +1713,6 @@ XLS::BaseObjectPtr CConditionalFormattingRule::toBin() auto ptr(new XLSB::CFRULE(cellRef)); XLS::BaseObjectPtr objPtr(ptr); - auto beginRule(new XLSB::BeginCFRule(cellRef)); ptr->m_BrtBeginCFRule = WriteAttributes(); if(m_oColorScale.IsInit()) @@ -1768,6 +1767,7 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() { ptr->rgce1 = m_arrFormula.front()->m_sText; m_arrFormula.erase(m_arrFormula.begin()); + ptr->cbFmla1 = 1; } else { @@ -1777,6 +1777,7 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() { ptr->rgce2 = m_arrFormula.front()->m_sText; m_arrFormula.erase(m_arrFormula.begin()); + ptr->cbFmla2 = 1; } else { @@ -1786,6 +1787,7 @@ XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() { ptr->rgce3 = m_arrFormula.front()->m_sText; m_arrFormula.erase(m_arrFormula.begin()); + ptr->cbFmla3 = 1; } else { @@ -1814,6 +1816,7 @@ if (m_oType == SimpleTypes::Spreadsheet::ECfType::cellIs) else if (m_oOperator == SimpleTypes::Spreadsheet::ECfOperator::Operator_lessThanOrEqual) ptr->iParam = XLSB::CFOper::CF_OPER_LE; ptr->iType = XLSB::CFType::CF_TYPE_CELLIS; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_EXPR; } if (m_oType == SimpleTypes::Spreadsheet::ECfType::expression) @@ -1927,19 +1930,23 @@ else if (m_oType == SimpleTypes::Spreadsheet::ECfType::duplicateValues) else if (m_oType == SimpleTypes::Spreadsheet::ECfType::colorScale) { ptr->iType = XLSB::CFType::CF_TYPE_GRADIENT; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_GRADIENT; } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::dataBar) { ptr->iType = XLSB::CFType::CF_TYPE_DATABAR; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_DATABAR; } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::iconSet) { ptr->iType = XLSB::CFType::CF_TYPE_MULTISTATE; + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_MULTISTATE; } else if (m_oType == SimpleTypes::Spreadsheet::ECfType::top10) { ptr->iType = XLSB::CFType::CF_TYPE_FILTER; ptr->iParam = m_oRank->GetValue(); + ptr->iTemplate = XLSB::CFTemp::CF_TEMPLATE_FILTER; } return objectPtr; From 6e0a28f8c80d37667bf5bdb5f8aaf7bc0e9aa2e4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 17 Jan 2024 22:02:15 +0600 Subject: [PATCH 147/221] Fix merged cellc conversion --- OOXML/XlsxFormat/Worksheets/MergeCells.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp index c6ff804527..b677a0291a 100644 --- a/OOXML/XlsxFormat/Worksheets/MergeCells.cpp +++ b/OOXML/XlsxFormat/Worksheets/MergeCells.cpp @@ -34,6 +34,7 @@ #include "../../Common/SimpleTypes_Shared.h" #include "../../XlsbFormat/Biff12_records/MergeCell.h" +#include "../../XlsbFormat/Biff12_records/BeginMergeCells.h" #include "../../XlsbFormat/Biff12_unions/MERGECELLS.h" namespace OOX @@ -163,11 +164,14 @@ namespace OOX XLS::BaseObjectPtr CMergeCells::toBin() { auto castedPtr(new XLSB::MERGECELLS); + auto beginCells(new XLSB::BeginMergeCells); + castedPtr->m_BrtBeginMergeCells = XLS::BaseObjectPtr{beginCells}; XLS::BaseObjectPtr ptr(castedPtr); for(auto i:m_arrItems) { castedPtr->m_arBrtMergeCell.push_back(i->toBin()); } + beginCells->cmcs = castedPtr->m_arBrtMergeCell.size(); return ptr; } EElementType CMergeCells::getType () const From 0bbd2d6d35f9695feacfb0d09c8d424b198324b9 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 18 Jan 2024 20:03:38 +0600 Subject: [PATCH 148/221] Fix xfs conversion --- OOXML/XlsxFormat/Styles/Xfs.cpp | 42 +++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index b12160f9f7..9002b31d8d 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -391,27 +391,16 @@ namespace OOX ptr->fsxButton = m_oPivotButton->GetValue(); if(m_oQuotePrefix.IsInit()) ptr->f123Prefix = m_oQuotePrefix->GetValue(); - ptr->ind_xf = 0; if (m_oXfId.IsInit()) ptr->ixfParent = m_oXfId->GetValue(); else ptr->ixfParent = 65535; - if(m_oApplyAlignment.IsInit()) - ptr->fAtrAlc = m_oApplyAlignment->GetValue(); - if(m_oApplyBorder.IsInit()) - ptr->fAtrBdr = m_oApplyBorder->GetValue(); - if(m_oApplyFill.IsInit()) - ptr->fAtrPat = m_oApplyFill->GetValue(); - if(m_oApplyFont.IsInit()) - ptr->fAtrFnt = m_oApplyFont->GetValue(); - if(m_oApplyNumberFormat.IsInit()) - ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); - if(m_oApplyProtection.IsInit()) - ptr->fAtrProt = m_oApplyProtection->GetValue(); if(m_oAligment.IsInit()) + { m_oAligment->toBin(objectPtr); + } else { ptr->alc = 0; @@ -420,6 +409,33 @@ namespace OOX if(m_oProtection.IsInit()) m_oProtection->toBin(objectPtr); + + + if(m_oApplyAlignment.IsInit()) + ptr->fAtrAlc = m_oApplyAlignment->GetValue(); + else + ptr->fAtrAlc = false; + if(m_oApplyBorder.IsInit()) + ptr->fAtrBdr = m_oApplyBorder->GetValue(); + else + ptr->fAtrBdr = false; + if(m_oApplyFill.IsInit()) + ptr->fAtrPat = m_oApplyFill->GetValue(); + else + ptr->fAtrPat = false; + if(m_oApplyFont.IsInit()) + ptr->fAtrFnt = m_oApplyFont->GetValue(); + else + ptr->fAtrFnt = false; + if(m_oApplyNumberFormat.IsInit()) + ptr->fAtrNum = m_oApplyNumberFormat->GetValue(); + else + ptr->fAtrNum = false; + if(m_oApplyProtection.IsInit()) + ptr->fAtrProt = m_oApplyProtection->GetValue(); + else + ptr->fAtrProt = false; + return objectPtr; } void CXfs::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) From bc4449f7a754ca8863ef402296d3b7eedfec379a Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 21 Jan 2024 23:11:32 +0300 Subject: [PATCH 149/221] Fix bug 62427 CFileBinary::GetTime, CFileBinary::SetTime was updated Fix bugs with time in Zip/Unzip --- DesktopEditor/common/File.cpp | 167 ++++++++++++++++++++++++++++----- DesktopEditor/common/File.h | 13 ++- OfficeUtils/src/OfficeUtils.h | 2 +- OfficeUtils/src/ZipUtilsCP.cpp | 78 ++++++++------- 4 files changed, 203 insertions(+), 57 deletions(-) diff --git a/DesktopEditor/common/File.cpp b/DesktopEditor/common/File.cpp index b0a4415998..9349e5dfa2 100644 --- a/DesktopEditor/common/File.cpp +++ b/DesktopEditor/common/File.cpp @@ -43,6 +43,8 @@ #include #include #include +#include +#include #endif #ifdef _MAC @@ -1688,38 +1690,161 @@ namespace NSFile g_overrideTmpPath = strTempPath; } - unsigned long CFileBinary::GetDateTime(const std::wstring & inputFile) + bool CFileBinary::GetTime(const std::wstring& sFilename, struct tm* ptmLastWrite, struct tm* ptmLastAccess) { - unsigned long result = 0; -#if defined(_WIN32) || defined (_WIN64) + bool result = true; + + if (ptmLastWrite) memset(ptmLastWrite, 0, sizeof(struct tm)); + if (ptmLastAccess) memset(ptmLastAccess, 0, sizeof(struct tm)); + +#if defined(_WIN32) || defined (_WIN64) // windows + HANDLE hFile; - hFile = ::CreateFileW(inputFile.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + hFile = ::CreateFileW(sFilename.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile) { - FILETIME ft; ft.dwLowDateTime = ft.dwHighDateTime = 0; - if (GetFileTime(hFile, NULL, NULL, &ft)) + FILETIME ftLastWrite{}, ftLastAccess{}; + if (::GetFileTime(hFile, NULL, &ftLastAccess, &ftLastWrite)) { - WORD fatDate = 0, fatTime = 0; - if (FileTimeToDosDateTime(&ft, &fatDate, &fatTime)) + FILETIME ftLastWriteLocal{}, ftLastAccessLocal{}; + result = result && ::FileTimeToLocalFileTime(&ftLastWrite, &ftLastWriteLocal); + result = result && ::FileTimeToLocalFileTime(&ftLastAccess, &ftLastAccessLocal); + + SYSTEMTIME stLastWrite{}, stLastAccess{}; + result = result && ::FileTimeToSystemTime(&ftLastWriteLocal, &stLastWrite); + result = result && ::FileTimeToSystemTime(&ftLastAccessLocal, &stLastAccess); + + auto set_tm_by_st = [] (struct tm* time_tm, SYSTEMTIME* time_st) { + time_tm->tm_sec = static_cast(time_st->wSecond); + time_tm->tm_min = static_cast(time_st->wMinute); + time_tm->tm_hour = static_cast(time_st->wHour); + time_tm->tm_mday = static_cast(time_st->wDay); + time_tm->tm_mon = static_cast(time_st->wMonth); + time_tm->tm_year = static_cast(time_st->wYear); + }; + + if (result) { - result = (fatDate << 16) + fatTime; + if (ptmLastWrite) set_tm_by_st(ptmLastWrite, &stLastWrite); + if (ptmLastAccess) set_tm_by_st(ptmLastAccess, &stLastAccess); } } + else + result = false; + CloseHandle(hFile); } -#else - std::string inputFileA = U_TO_UTF8(inputFile); -#if defined(__linux__) && !defined(_MAC) - struct stat attrib; - stat(inputFileA.c_str(), &attrib); - result = attrib.st_mtim.tv_nsec; -#else - struct stat attrib; - stat(inputFileA.c_str(), &attrib); - result = (unsigned long)attrib.st_mtimespec.tv_nsec; -#endif -#endif + else + result = false; + + +#else // linux or macOS + struct stat attr; + result = (0 == stat(U_TO_UTF8(sFilename).c_str(), &attr)); + + if (result) + { + auto set_tm_by_secs = [] (struct tm* time_tm, time_t time_secs) { + struct tm* ltime = localtime(&time_secs); + *time_tm = *ltime; + time_tm->tm_year += 1900; + time_tm->tm_mon += 1; + }; + + time_t m_secs = attr.st_mtim.tv_sec; // edit + time_t a_secs = attr.st_atim.tv_sec; // access + + if (ptmLastWrite) set_tm_by_secs(ptmLastWrite, m_secs); + if (ptmLastAccess) set_tm_by_secs(ptmLastAccess, a_secs); + } + +#endif // defined(_WIN32) || defined (_WIN64) + return result; + } + + bool CFileBinary::SetTime(const std::wstring& sFilename, struct tm* ptmLastWrite, struct tm* ptmLastAccess) + { + bool result = true; + +#if defined(_WIN32) || defined (_WIN64) // windows + + auto set_st_by_tm = [] (SYSTEMTIME* time_st, struct tm* time_tm) { + time_st->wSecond = static_cast(time_tm->tm_sec); + time_st->wMinute = static_cast(time_tm->tm_min); + time_st->wHour = static_cast(time_tm->tm_hour); + time_st->wDay = static_cast(time_tm->tm_mday); + time_st->wMonth = static_cast(time_tm->tm_mon); + time_st->wYear = static_cast(time_tm->tm_year); + }; + + SYSTEMTIME stLastWrite{}, stLastAccess{}; + if (ptmLastWrite) set_st_by_tm(&stLastWrite, ptmLastWrite); + if (ptmLastAccess) set_st_by_tm(&stLastAccess, ptmLastAccess); + + FILETIME ftLastWriteLocal{}, ftLastAccessLocal{}; + if (ptmLastWrite) result = result && ::SystemTimeToFileTime(&stLastWrite, &ftLastWriteLocal); + if (ptmLastAccess) result = result && ::SystemTimeToFileTime(&stLastAccess, &ftLastAccessLocal); + + FILETIME ftLastWrite{}, ftLastAccess{}; + if (ptmLastWrite) result = result && ::LocalFileTimeToFileTime(&ftLastWriteLocal, &ftLastWrite); + if (ptmLastAccess) result = result && ::LocalFileTimeToFileTime(&ftLastAccessLocal, &ftLastAccess); + + if (result) + { + HANDLE hFile; + hFile = ::CreateFileW(sFilename.c_str(), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (hFile) + { + FILETIME* pftLastWrite = NULL; + FILETIME* pftLastAccess = NULL; + + if (ptmLastWrite) pftLastWrite = &ftLastWrite; + if (ptmLastAccess) pftLastAccess = &ftLastAccess; + + result = SetFileTime(hFile, NULL, pftLastAccess, pftLastWrite); + } + else + result = false; + + CloseHandle(hFile); + } + + +#else // linux or macOS + struct stat attr; + std::string sFilenameA = U_TO_UTF8(sFilename); + result = (0 == stat(sFilenameA.c_str(), &attr)); + + if (result) + { + time_t m_secs = attr.st_mtim.tv_sec; // edit + time_t a_secs = attr.st_atim.tv_sec; // access + + time_t new_m_secs = m_secs; + time_t new_a_secs = a_secs; + + if (ptmLastWrite) + { + struct tm tmLastWriteUnix = *ptmLastWrite; + tmLastWriteUnix.tm_year -= 1900; + tmLastWriteUnix.tm_mon -= 1; + new_m_secs = mktime(&tmLastWriteUnix); + } + if (ptmLastAccess) + { + struct tm tmLastAccessUnix = *ptmLastAccess; + tmLastAccessUnix.tm_year -= 1900; + tmLastAccessUnix.tm_mon -= 1; + new_a_secs = mktime(&tmLastAccessUnix); + } + + utimbuf new_time{}; + new_time.actime = new_a_secs; + new_time.modtime = new_m_secs; + utime(sFilenameA.c_str(), &new_time); + } +#endif // defined(_WIN32) || defined (_WIN64) return result; } } diff --git a/DesktopEditor/common/File.h b/DesktopEditor/common/File.h index dfe3ac4170..b8ce97b3f8 100644 --- a/DesktopEditor/common/File.h +++ b/DesktopEditor/common/File.h @@ -194,7 +194,18 @@ namespace NSFile static bool OpenTempFile(std::wstring *pwsName, FILE **ppFile, wchar_t *wsMode, wchar_t *wsExt, wchar_t *wsFolder, wchar_t* wsName = NULL); static FILE* OpenFileNative(const std::wstring& sFileName, const std::wstring& sMode); - static unsigned long GetDateTime(const std::wstring & strFileName); + // returns true if everything is OK; + // you can set ptmLastWrite / ptmLastAccess to nullptr if you are not going to use them; + // tm_wday && tm_yday && tm_isdst is unused on windows + static bool GetTime(const std::wstring& sFilename, + struct tm* ptmLastWrite = nullptr, + struct tm* ptmLastAccess = nullptr); + + // returns true if everything is OK; + // you can set ptmLastWrite / ptmLastAccess to nullptr if you are not going to change them + static bool SetTime(const std::wstring& sFilename, + struct tm* ptmLastWrite = nullptr, + struct tm* ptmLastAccess = nullptr); }; class KERNEL_DECL CBase64Converter diff --git a/OfficeUtils/src/OfficeUtils.h b/OfficeUtils/src/OfficeUtils.h index 7e9d1a081c..827352118f 100644 --- a/OfficeUtils/src/OfficeUtils.h +++ b/OfficeUtils/src/OfficeUtils.h @@ -53,7 +53,7 @@ public: HRESULT ExtractToDirectory (const std::wstring& zipFile, const std::wstring& unzipDir, wchar_t* password, short extract_without_path); HRESULT ExtractToDirectory (BYTE* data, size_t len, const std::wstring& unzipDir, wchar_t* password, short extract_without_path); - HRESULT CompressFileOrDirectory (const std::wstring& name, const std::wstring& outputFile, bool bSorted = false, int method = Z_DEFLATED, short level = -1, bool bDateTime = false); + HRESULT CompressFileOrDirectory (const std::wstring& name, const std::wstring& outputFile, bool bSorted = false, int method = Z_DEFLATED, short level = -1, bool bDateTime = true); HRESULT Uncompress (BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize); HRESULT Compress (BYTE* destBuf, ULONG* destSize, BYTE* sourceBuf, ULONG sourceSize, short level = -1); diff --git a/OfficeUtils/src/ZipUtilsCP.cpp b/OfficeUtils/src/ZipUtilsCP.cpp index 1e8bcf3f7c..3d0dbff1f9 100644 --- a/OfficeUtils/src/ZipUtilsCP.cpp +++ b/OfficeUtils/src/ZipUtilsCP.cpp @@ -217,28 +217,6 @@ namespace ZLibZipUtils /*========================================================================================================*/ - /* change_file_date : change the date/time of a file - filename : the filename of the file where date/time must be modified - dosdate : the new date at the MSDos format (4 bytes) - tmu_date : the SAME new date at the tm_unz format */ - static void change_file_date( const wchar_t *filename, uLong dosdate, tm_unz tmu_date ) - { -#if defined(_WIN32) || defined (_WIN64) - HANDLE hFile; - FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite; - - hFile = CreateFileW(filename,GENERIC_READ | GENERIC_WRITE, - 0,NULL,OPEN_EXISTING,0,NULL); - GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite); - DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal); - LocalFileTimeToFileTime(&ftLocal,&ftm); - SetFileTime(hFile,&ftm,&ftLastAcc,&ftm); - CloseHandle(hFile); -#endif - } - - /*========================================================================================================*/ - static void replace_all(std::string& subject, const std::string& search, const std::string& replace) { size_t pos = 0; @@ -380,13 +358,22 @@ namespace ZLibZipUtils break; } } + // ? while (err>0); - - //close вызовется в oFile - if (err==0) { - change_file_date(write_filename, file_info.dosDate, file_info.tmu_date); + oFile.CloseFile(); + + struct tm time; + memset(&time, 0, sizeof(struct tm)); + time.tm_sec = file_info.tmu_date.tm_sec; + time.tm_min = file_info.tmu_date.tm_min; + time.tm_hour = file_info.tmu_date.tm_hour; + time.tm_mday = file_info.tmu_date.tm_mday; + time.tm_mon = file_info.tmu_date.tm_mon + 1; + time.tm_year = file_info.tmu_date.tm_year; + + NSFile::CFileBinary::SetTime(write_filename, &time); } } @@ -568,16 +555,24 @@ namespace ZLibZipUtils zip_fileinfo zinfo; zinfo.dosDate = zinfo.external_fa = zinfo.internal_fa = 0; - zinfo.tmz_date.tm_sec = zinfo.tmz_date.tm_min = zinfo.tmz_date.tm_hour = 0; - zinfo.tmz_date.tm_mday = 1; - zinfo.tmz_date.tm_mon = 0; - zinfo.tmz_date.tm_year = 1980; zip_fileinfo* zi_new = zi ? zi : &zinfo; - if (bDateTime ) + + if (bDateTime) { - zi_new->dosDate = oFile.GetDateTime(file_name); + struct tm edited; + bool ok = NSFile::CFileBinary::GetTime(file_name, &edited); + if (ok) + { + zi_new->tmz_date.tm_sec = edited.tm_sec; + zi_new->tmz_date.tm_min = edited.tm_min; + zi_new->tmz_date.tm_hour = edited.tm_hour; + zi_new->tmz_date.tm_mday = edited.tm_mday; + zi_new->tmz_date.tm_mon = edited.tm_mon - 1; + zi_new->tmz_date.tm_year = edited.tm_year; + } } + if(oFile.OpenFile(file_name)) { DWORD dwSizeRead; @@ -726,9 +721,24 @@ namespace ZLibZipUtils zip_fileinfo zinfo; zinfo.external_fa = zinfo.internal_fa = 0; - zinfo.dosDate = bDateTime ? oFile.GetDateTime(inputFile) : 0; + zinfo.dosDate = 0; - if(oFile.OpenFile(inputFile)) + if (bDateTime) + { + struct tm edited; + bool ok = NSFile::CFileBinary::GetTime(inputFile, &edited); + if (ok) + { + zinfo.tmz_date.tm_sec = edited.tm_sec; + zinfo.tmz_date.tm_min = edited.tm_min; + zinfo.tmz_date.tm_hour = edited.tm_hour; + zinfo.tmz_date.tm_mday = edited.tm_mday; + zinfo.tmz_date.tm_mon = edited.tm_mon - 1; + zinfo.tmz_date.tm_year = edited.tm_year; + } + } + + if (oFile.OpenFile(inputFile)) { DWORD dwSizeRead; BYTE* pData = new BYTE[oFile.GetFileSize()]; From daaeaee4df6821374b25a01cc3c140710ba74301 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 23 Jan 2024 13:27:47 +0300 Subject: [PATCH 150/221] Add tests for time --- OfficeUtils/tests/.gitignore | 3 +- OfficeUtils/tests/main.cpp | 116 +++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/OfficeUtils/tests/.gitignore b/OfficeUtils/tests/.gitignore index 07fb5b83ca..3390380ff3 100644 --- a/OfficeUtils/tests/.gitignore +++ b/OfficeUtils/tests/.gitignore @@ -1 +1,2 @@ -unzip \ No newline at end of file +unzip +temp \ No newline at end of file diff --git a/OfficeUtils/tests/main.cpp b/OfficeUtils/tests/main.cpp index 22bfc76362..4f6364f603 100644 --- a/OfficeUtils/tests/main.cpp +++ b/OfficeUtils/tests/main.cpp @@ -1,5 +1,7 @@ #include #include +#include +#include #include "gtest/gtest.h" @@ -53,6 +55,7 @@ public: std::wstring zipDirectory; std::wstring unzipDirectory; std::wstring wsep; + std::wstring tempDirectory; std::vector expected_general; std::vector expected_general_no_folder; @@ -70,10 +73,14 @@ public: workDirectory = NSFile::GetProcessDirectory(); unzipDirectory = workDirectory + wsep + L".." + wsep + L"unzip"; zipDirectory = workDirectory + wsep + L".." + wsep + L"zip"; + tempDirectory = workDirectory + wsep + L".." + wsep + L"temp"; if(!NSDirectory::Exists(unzipDirectory)) NSDirectory::CreateDirectories(unzipDirectory); + if(!NSDirectory::Exists(tempDirectory)) + NSDirectory::CreateDirectories(tempDirectory); + // general expected_general.push_back(L"1.txt"); expected_general.push_back(L"2.txt"); @@ -380,3 +387,112 @@ TEST_F(COfficeUtilsTest, other_win) ASSERT_EQ(error_code, S_OK); EXPECT_EQ(wstr, L"123 321"); } + +TEST_F(COfficeUtilsTest, time_file) +{ + // creating file + std::wstring filename = L"time_file_test.txt"; + std::wstring file_path = tempDirectory + wsep + filename; + + std::wstring zip_filename = L"time_file_test.zip"; + std::wstring zip_path = tempDirectory + wsep + zip_filename; + + std::wstring unzip_folder = tempDirectory + wsep + L"time_file_test"; + std::wstring unzip_path = unzip_folder + wsep + filename; + + // folder for unzip files + if (NSDirectory::Exists(unzip_folder)) + NSDirectory::DeleteDirectory(unzip_folder); + + NSDirectory::CreateDirectories(unzip_folder); + + // create file to zip, then unzip it + if (NSFile::CFileBinary::Exists(file_path)) + NSFile::CFileBinary::Remove(file_path); + + NSFile::CFileBinary file; + file.CreateFileW(file_path); + file.WriteStringUTF8(L"some text"); + file.CloseFile(); + + struct tm edit_time_before{}; + bool result_get_time_before = NSFile::CFileBinary::GetTime(file_path, &edit_time_before); + ASSERT_EQ(result_get_time_before, true); + + HRESULT error_code = utils.CompressFileOrDirectory(file_path, zip_path); + ASSERT_EQ(error_code, S_OK); + + error_code = utils.ExtractToDirectory(zip_path, unzip_folder, NULL, false); + ASSERT_EQ(error_code, S_OK); + + struct tm edit_time_after{}; + bool result_get_time_after = NSFile::CFileBinary::GetTime(unzip_path, &edit_time_after); + ASSERT_EQ(result_get_time_after, true); + + EXPECT_EQ(edit_time_before.tm_sec, edit_time_after.tm_sec); + EXPECT_EQ(edit_time_before.tm_min, edit_time_after.tm_min); + EXPECT_EQ(edit_time_before.tm_hour, edit_time_after.tm_hour); + EXPECT_EQ(edit_time_before.tm_mday, edit_time_after.tm_mday); + EXPECT_EQ(edit_time_before.tm_mon, edit_time_after.tm_mon); + EXPECT_EQ(edit_time_before.tm_year, edit_time_after.tm_year); +} + +TEST_F(COfficeUtilsTest, time_folder) +{ + std::wstring file_folder = tempDirectory + wsep + L"time_file_test_folder"; + + // creating file + std::wstring filename = L"time_file_test.txt"; + std::wstring file_path = file_folder + wsep + filename; + + std::wstring zip_filename = L"time_file_test.zip"; + std::wstring zip_path = tempDirectory + wsep + zip_filename; + + std::wstring unzip_folder = tempDirectory + wsep + L"time_file_test"; + std::wstring unzip_path = unzip_folder + wsep + filename; + + // folder for unzip files + if (NSDirectory::Exists(unzip_folder)) + NSDirectory::DeleteDirectory(unzip_folder); + + NSDirectory::CreateDirectories(unzip_folder); + + // folder for zip files + if (NSDirectory::Exists(file_folder)) + NSDirectory::DeleteDirectory(file_folder); + + NSDirectory::CreateDirectories(file_folder); + + // create file to zip, then unzip it + if (NSFile::CFileBinary::Exists(file_path)) + NSFile::CFileBinary::Remove(file_path); + + NSFile::CFileBinary file; + file.CreateFileW(file_path); + file.WriteStringUTF8(L"some text"); + file.CloseFile(); + + struct tm edit_time_before{}; + bool result_get_time_before = NSFile::CFileBinary::GetTime(file_path, &edit_time_before); + ASSERT_EQ(result_get_time_before, true); + + HRESULT error_code = utils.CompressFileOrDirectory(file_folder, zip_path); + ASSERT_EQ(error_code, S_OK); + + error_code = utils.ExtractToDirectory(zip_path, unzip_folder, NULL, false); + ASSERT_EQ(error_code, S_OK); + + struct tm edit_time_after{}; + bool result_get_time_after = NSFile::CFileBinary::GetTime(unzip_path, &edit_time_after); + ASSERT_EQ(result_get_time_after, true); + + // the 2-second precision + EXPECT_LE(std::abs(edit_time_before.tm_sec - edit_time_after.tm_sec), 1); + + EXPECT_EQ(edit_time_before.tm_min, edit_time_after.tm_min); + EXPECT_EQ(edit_time_before.tm_hour, edit_time_after.tm_hour); + EXPECT_EQ(edit_time_before.tm_mday, edit_time_after.tm_mday); + EXPECT_EQ(edit_time_before.tm_mon, edit_time_after.tm_mon); + EXPECT_EQ(edit_time_before.tm_year, edit_time_after.tm_year); +} + From ae7854d23f9d9e4bfbf74c593e3d4bc88a260f8e Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 24 Jan 2024 01:34:57 +0500 Subject: [PATCH 151/221] For bug #65838 Convert text href pptx to odp --- OdfFile/Writer/Converter/ConvertDrawing.cpp | 27 ++++++++++-- OdfFile/Writer/Converter/PptxConverter.cpp | 41 +++++++++++++++---- OdfFile/Writer/Format/odf_text_context.cpp | 11 +++-- .../Writer/Format/odp_conversion_context.h | 2 +- 4 files changed, 64 insertions(+), 17 deletions(-) diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 88f06face0..4dd8e04500 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -2499,10 +2499,6 @@ void OoxConverter::convert(PPTX::Logic::RunProperties *oox_run_pr, odf_writer::t { text_properties->fo_text_transform_ = odf_types::text_transform(odf_types::text_transform::Capitalize); } - if (oox_run_pr->hlinkClick.IsInit()) - { - convert(oox_run_pr->hlinkClick.GetPointer()); - } } static std::vector split_tabs(const std::wstring& text) { @@ -2577,6 +2573,29 @@ void OoxConverter::convert(PPTX::Logic::Run *oox_run) bool bExternal = false; std::wstring hlink = find_link_by_id(oox_run->rPr->hlinkClick->id.get(), 2, bExternal); std::wstring location; + + smart_ptr file = find_file_by_id(oox_run->rPr->hlinkClick->id.get()); + OOX::HyperLink* hyperlink = dynamic_cast(file.GetPointer()); + + if (hyperlink) + location = hyperlink->Uri().GetBasename(); + + if (oox_run->rPr->hlinkClick->action.IsInit() && location.empty()) + { + const std::wstring& action = *oox_run->rPr->hlinkClick->action; + + if (std::wstring::npos != action.find(L"previousslide")) + location = L"previous-page"; + else if (std::wstring::npos != action.find(L"nextslide")) + location = L"next-page"; + else if (std::wstring::npos != action.find(L"firstslide")) + location = L"first-page"; + else if (std::wstring::npos != action.find(L"lastslide")) + location = L"last-page"; + else if (std::wstring::npos != action.find(L"endshow")) + location = L"end"; + } + text_context->add_hyperlink(hlink, oox_run->GetText(), location); } else diff --git a/OdfFile/Writer/Converter/PptxConverter.cpp b/OdfFile/Writer/Converter/PptxConverter.cpp index 0275f16570..df562327db 100644 --- a/OdfFile/Writer/Converter/PptxConverter.cpp +++ b/OdfFile/Writer/Converter/PptxConverter.cpp @@ -84,6 +84,7 @@ #include "../Format/odf_text_context.h" #include "../Format/odf_drawing_context.h" #include "../Format/office_event_listeners.h" +#include "../Format/paragraph_elements.h" #include "../Format/styles.h" #include "../Format/style_presentation.h" @@ -1280,22 +1281,44 @@ std::wstring PptxConverter::get_page_name(PPTX::Logic::CSld* oox_slide, _typePag void PptxConverter::fill_in_deferred_hyperlinks() { - for (auto hyperlink : odp_context->get_deferred_hyperlinks()) + auto links = odp_context->get_deferred_hyperlinks(); + auto slidenames_vec = std::vector>(odp_context->map_slidenames_.begin(), odp_context->map_slidenames_.end()); + + for (size_t i = 0; i < links.size(); i++) { + const auto& hyperlink = links[i]; + cpdoccore::odf_writer::presentation_event_listener* event_listener = dynamic_cast(hyperlink.first.get()); + cpdoccore::odf_writer::text_a* text = dynamic_cast(hyperlink.first.get()); const std::wstring& slidename = hyperlink.second; - if (!event_listener) - continue; - + std::wstring href; auto hrefIt = odp_context->map_slidenames_.find(slidename); - if (hrefIt == odp_context->map_slidenames_.end()) + if (slidename == L"previous-page" && i > 0) + href = slidenames_vec[i - 1].second; + else if (slidename == L"next-page" && i < slidenames_vec.size() - 2) + href = slidenames_vec[i + 1].second; + else if (slidename == L"first-page") + href = slidenames_vec[0].second; + else if (slidename == L"last-page") + href = slidenames_vec[slidenames_vec.size() - 1].second; + else if (hrefIt == odp_context->map_slidenames_.end()) continue; + else + href = hrefIt->second; - event_listener->attlist_.common_xlink_attlist_.href_ = std::wstring(L"#") + hrefIt->second; - event_listener->attlist_.common_xlink_attlist_.type_ = xlink_type::Simple; - event_listener->attlist_.common_xlink_attlist_.show_ = xlink_show::Embed; - event_listener->attlist_.common_xlink_attlist_.actuate_ = xlink_actuate::OnRequest; + if (event_listener) + { + event_listener->attlist_.common_xlink_attlist_.href_ = std::wstring(L"#") + href; + event_listener->attlist_.common_xlink_attlist_.type_ = xlink_type::Simple; + event_listener->attlist_.common_xlink_attlist_.show_ = xlink_show::Embed; + event_listener->attlist_.common_xlink_attlist_.actuate_ = xlink_actuate::OnRequest; + } + else if (text) + { + text->common_xlink_attlist_.href_ = std::wstring(L"#") + href; + text->common_xlink_attlist_.type_ = xlink_type::Simple; + } } } diff --git a/OdfFile/Writer/Format/odf_text_context.cpp b/OdfFile/Writer/Format/odf_text_context.cpp index 468f7ff0e5..771b4347ee 100644 --- a/OdfFile/Writer/Format/odf_text_context.cpp +++ b/OdfFile/Writer/Format/odf_text_context.cpp @@ -669,9 +669,14 @@ void odf_text_context::add_hyperlink (const std::wstring & link, const std::wstr if (!display.empty()) hyperlink->add_text(display); //////////////////////////// - - hyperlink->common_xlink_attlist_.href_ = link + (location.empty() ? L"" : (L"#" + location)); - hyperlink->common_xlink_attlist_.type_ = xlink_type::Simple; + + if (!link.empty()) + { + hyperlink->common_xlink_attlist_.href_ = link + (location.empty() ? L"" : (L"#" + location)); + hyperlink->common_xlink_attlist_.type_ = xlink_type::Simple; + } + else + odf_context_->add_hyperlink(elm, location); if (false == current_level_.empty()) current_level_.back().elm->add_child_element(elm); diff --git a/OdfFile/Writer/Format/odp_conversion_context.h b/OdfFile/Writer/Format/odp_conversion_context.h index 4068241e00..76b3246216 100644 --- a/OdfFile/Writer/Format/odp_conversion_context.h +++ b/OdfFile/Writer/Format/odp_conversion_context.h @@ -103,7 +103,7 @@ public: std::vector map_identifiers_; // NOTE(Kamil Kerimov): Key - slide name in pptx (e.g. slide1.xml), Value - slide name in odp (e.g. "This is a title") - using SlidenameMap = std::unordered_map; + using SlidenameMap = std::map; SlidenameMap map_slidenames_; private: odp_slide_context slide_context_; From 6f3dae7d5d4a5f72e2ccb5a0ef813d54e56ded6d Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 24 Jan 2024 01:35:26 +0500 Subject: [PATCH 152/221] Fix bug #65838 Convert text href odp to pptx --- OdfFile/Reader/Converter/oox_rels.cpp | 2 +- OdfFile/Reader/Converter/pptx_drawings.cpp | 10 ++++- .../Reader/Converter/pptx_text_context.cpp | 45 ++++++++++++++++--- OdfFile/Reader/Converter/pptx_text_context.h | 11 ++++- OdfFile/Reader/Format/paragraph_elements.cpp | 36 ++++++++++++++- .../Reader/Format/style_text_properties.cpp | 15 ++++--- OdfFile/Reader/Format/style_text_properties.h | 2 +- 7 files changed, 103 insertions(+), 18 deletions(-) diff --git a/OdfFile/Reader/Converter/oox_rels.cpp b/OdfFile/Reader/Converter/oox_rels.cpp index f51ca1710d..d6fca2e5c4 100644 --- a/OdfFile/Reader/Converter/oox_rels.cpp +++ b/OdfFile/Reader/Converter/oox_rels.cpp @@ -52,7 +52,7 @@ std::wostream & relationship::xml_to_stream(std::wostream & _Wostream) const CP_XML_ATTR(L"Type", type()); CP_XML_ATTR(L"Target", target()); - if (!target_mode().empty()) + if (!target_mode().empty() && type() != L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide") CP_XML_ATTR(L"TargetMode", target_mode()); } } diff --git a/OdfFile/Reader/Converter/pptx_drawings.cpp b/OdfFile/Reader/Converter/pptx_drawings.cpp index 516633bbf6..b60312ccc2 100644 --- a/OdfFile/Reader/Converter/pptx_drawings.cpp +++ b/OdfFile/Reader/Converter/pptx_drawings.cpp @@ -31,6 +31,7 @@ */ #include +#include #include "oox_rels.h" @@ -74,8 +75,13 @@ public: } } - if(!found) - pptx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, typeHyperlink)); + if (!found) + { + oox::_rels_type type = boost::algorithm::starts_with(d.hlinks[i].hRef, L"slide") && + boost::algorithm::ends_with(d.hlinks[i].hRef, L".xml") ? typeSlide : typeHyperlink; + pptx_drawing_rels_.push_back(_rel(false, d.hlinks[i].hId, d.hlinks[i].hRef, type)); + } + } if (!d.action.hId.empty()) { diff --git a/OdfFile/Reader/Converter/pptx_text_context.cpp b/OdfFile/Reader/Converter/pptx_text_context.cpp index 0bfc224aea..78574034bf 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.cpp +++ b/OdfFile/Reader/Converter/pptx_text_context.cpp @@ -80,8 +80,12 @@ public: void set_local_styles_container(odf_reader::styles_container* local_styles_);//это если стили объектов содержатся в другом документе - void end_hyperlink (std::wstring hId); + hyperlink_data get_hyperlink(); void start_hyperlink(); + void set_rel_id(const std::wstring& rId); + void set_action(const std::wstring& action); + void end_hyperlink (); + void start_list (const std::wstring & StyleName, bool Continue = false); void end_list (); @@ -102,6 +106,7 @@ private: odf_reader::odf_read_context & odf_context_ ; std::wstring hyperlink_hId; + hyperlink_data hyperlink_; bool in_span; bool in_paragraph; @@ -240,11 +245,10 @@ void pptx_text_context::Impl::start_hyperlink() dump_run();//проверить } -void pptx_text_context::Impl::end_hyperlink(std::wstring hId) +void pptx_text_context::Impl::end_hyperlink() { - hyperlink_hId = hId; dump_run(); - hyperlink_hId = L""; + hyperlink_ = { L"", L"" }; } void pptx_text_context::Impl::ApplyTextProperties(std::wstring style_name, std::wstring para_style_name, odf_reader::text_format_properties & propertiesOut, bool inStyle) { @@ -780,6 +784,21 @@ void pptx_text_context::Impl::write_list_styles(std::wostream & strm)//defaults list_style_stack_.clear(); } +void pptx_text_context::Impl::set_rel_id(const std::wstring& rId) +{ + hyperlink_.rId = rId; +} + +void pptx_text_context::Impl::set_action(const std::wstring& action) +{ + hyperlink_.action = action; +} + +hyperlink_data pptx_text_context::Impl::get_hyperlink() +{ + return hyperlink_; +} + ///////////////////////////////////////////////////////////////////////////////////////////////////// pptx_text_context::pptx_text_context(odf_reader::odf_read_context & odf_context_, pptx_conversion_context & pptx_context_): @@ -865,14 +884,28 @@ void pptx_text_context::start_hyperlink() { return impl_->start_hyperlink(); } -void pptx_text_context::end_hyperlink(std::wstring hId) +void pptx_text_context::set_rel_id(const std::wstring& rId) { - return impl_->end_hyperlink(hId); + impl_->set_rel_id(rId); +} +void pptx_text_context::set_action(const std::wstring& action) +{ + impl_->set_action(action); +} +void pptx_text_context::end_hyperlink() +{ + return impl_->end_hyperlink(); } std::wstring pptx_text_context::end_object() { return impl_->end_object(); } + +hyperlink_data pptx_text_context::get_hyperlink() +{ + return impl_->get_hyperlink(); +} + styles_context & pptx_text_context::get_styles_context() { return impl_->get_styles_context() ; diff --git a/OdfFile/Reader/Converter/pptx_text_context.h b/OdfFile/Reader/Converter/pptx_text_context.h index a0aa4dc68a..fcc55f6372 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.h +++ b/OdfFile/Reader/Converter/pptx_text_context.h @@ -58,6 +58,12 @@ enum field_type datetime }; +struct hyperlink_data +{ + std::wstring rId; + std::wstring action; +}; + class pptx_text_context: boost::noncopyable { public: @@ -85,8 +91,11 @@ public: void start_object(); std::wstring end_object(); + hyperlink_data get_hyperlink(); void start_hyperlink(); - void end_hyperlink(std::wstring hId); + void set_rel_id(const std::wstring& rId); + void set_action(const std::wstring& action); + void end_hyperlink(); void start_field(field_type type, const std::wstring & styleName);//1 - datetime, 2 -pagecount, 3 - pagenumber - void end_field(); diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index 6931d03870..cadfe5e048 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -778,6 +778,27 @@ void a::xlsx_convert(oox::xlsx_conversion_context & Context) } Context.end_hyperlink(xlink_attlist_.href_.get_value_or(L"")); } + +static std::wstring convert_href(oox::pptx_conversion_context& Context, const std::wstring& href) +{ + std::wstring result = href; + + if (boost::algorithm::starts_with(href, L"#")) + result = href.substr(1); + + const auto& page_names = Context.get_page_names(); + for (size_t i = 0; i < page_names.size(); i++) + { + if (result == page_names[i]) + { + result = std::wstring(L"slide") + std::to_wstring(i + 1) + std::wstring(L".xml"); + break; + } + } + + return result; +} + void a::pptx_convert(oox::pptx_conversion_context & Context) { Context.get_text_context().start_hyperlink(); @@ -786,9 +807,20 @@ void a::pptx_convert(oox::pptx_conversion_context & Context) content_[i]->pptx_convert(Context); } - std::wstring hId = Context.get_slide_context().add_hyperlink(xlink_attlist_.href_.get_value_or(L"")); - Context.get_text_context().end_hyperlink(hId); + std::wstring href = xlink_attlist_.href_.get_value_or(L""); + if (boost::algorithm::starts_with(href, L"#")) + { + Context.get_text_context().set_action(L"ppaction://hlinksldjump"); + + href = convert_href(Context, href); + } + + std::wstring hId = Context.get_slide_context().add_hyperlink(href); + + Context.get_text_context().set_rel_id(hId); + + Context.get_text_context().end_hyperlink(); } //------------------------------------------------------------------------------------------------------------ const wchar_t * endnote::ns = L"text"; diff --git a/OdfFile/Reader/Format/style_text_properties.cpp b/OdfFile/Reader/Format/style_text_properties.cpp index 1ed28cf320..3ffccee423 100644 --- a/OdfFile/Reader/Format/style_text_properties.cpp +++ b/OdfFile/Reader/Format/style_text_properties.cpp @@ -311,7 +311,7 @@ void text_format_properties::pptx_convert_as_list(oox::pptx_conversion_context & } } } -void text_format_properties::drawing_serialize(std::wostream & strm, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style, std::wstring hlink) +void text_format_properties::drawing_serialize(std::wostream & strm, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style, const oox::hyperlink_data link) { CP_XML_WRITER(strm) { @@ -541,12 +541,15 @@ void text_format_properties::drawing_serialize(std::wostream & strm, std::wstrin } } - if (!hlink.empty()) + if (!link.rId.empty()) { CP_XML_NODE(L"a:hlinkClick") { - CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); - CP_XML_ATTR(L"r:id", hlink); + if (link.action == L"ppaction://hlinksldjump") + CP_XML_ATTR(L"action", link.action); + else + CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + CP_XML_ATTR(L"r:id", link.rId); } } } @@ -1031,7 +1034,9 @@ void text_format_properties::pptx_convert(oox::pptx_conversion_context & Context oox::styles_context & styles_context_ = Context.get_text_context().get_styles_context(); fonts_container & fonts_ = Context.root()->odf_context().fontContainer(); - drawing_serialize(styles_context_.text_style(), styles_context_.extern_node(), fonts_, styles_context_.get_current_processed_style(), styles_context_.hlinkClick()); + oox::hyperlink_data link = Context.get_text_context().get_hyperlink(); + + drawing_serialize(styles_context_.text_style(), styles_context_.extern_node(), fonts_, styles_context_.get_current_processed_style(), link); // styles_context_.hlinkClick() } void text_format_properties::docx_convert(oox::docx_conversion_context & Context) diff --git a/OdfFile/Reader/Format/style_text_properties.h b/OdfFile/Reader/Format/style_text_properties.h index 5953eccc9e..59e1b2ef7d 100644 --- a/OdfFile/Reader/Format/style_text_properties.h +++ b/OdfFile/Reader/Format/style_text_properties.h @@ -78,7 +78,7 @@ public: void oox_serialize (std::wostream & stream, bool graphic, fonts_container & fonts, bool default_ = false); void docx_serialize (std::wostream & stream, fonts_container & fonts); - void drawing_serialize (std::wostream & stream, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style = NULL, std::wstring hlink = L""); + void drawing_serialize (std::wostream & stream, std::wstring node, fonts_container & fonts, const odf_reader::style_instance *current_style = NULL, const oox::hyperlink_data link = {L"", L""}); void xlsx_serialize (std::wostream & strm, oox::xlsx_conversion_context & Context); From 5b6735e3bf95868eed59cd7ada7e555d0fc38466 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 24 Jan 2024 15:36:14 +0600 Subject: [PATCH 153/221] Fix formula conversion --- OOXML/XlsxFormat/Workbook/Workbook.cpp | 44 +++++++- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 126 +++++++++++----------- OOXML/XlsxFormat/Worksheets/SheetData.h | 2 +- 3 files changed, 107 insertions(+), 65 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index 0a5fbee6cb..365b9b8ed5 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -43,6 +43,11 @@ #include "../../XlsbFormat/Biff12_unions/PIVOTCACHEID.h" #include "../../XlsbFormat/Biff12_records/FileVersion.h" #include "../../XlsbFormat/Biff12_records/BeginPivotCacheID.h" +#include "../../XlsbFormat/Biff12_unions/SUP.h" +#include "../../XlsbFormat/Biff12_records/SupSelf.h" +#include "../../XlsbFormat/Biff12_records/CommonRecords.h" +#include "../../XlsbFormat/Biff12_records/BundleSh.h" + #include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" #include "../../Common/SimpleTypes_Shared.h" @@ -296,6 +301,36 @@ namespace OOX auto ptr(new XLSB::BUNDLESHS); ptr->m_arBrtBundleSh = m_oSheets->toBin(); workBookStream->m_BUNDLESHS = XLS::BaseObjectPtr{ptr}; + + auto ptr1(new XLSB::EXTERNALS); + workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr1}; + auto externSheet(new XLSB::ExternSheet); + ptr1->m_BrtExternSheet = XLS::BaseObjectPtr{externSheet}; + externSheet->cXTI = ptr->m_arBrtBundleSh.size(); + for(auto i = 0; i < ptr->m_arBrtBundleSh.size(); i++) + { + auto sup(new XLSB::SUP); + auto supSelf(new XLSB::SupSelf); + sup->m_source = XLS::BaseObjectPtr{supSelf}; + ptr1->m_arSUP.push_back(XLS::BaseObjectPtr{sup}); + auto xti(new XLS::XTI); + xti->iSupBook = i; + xti->itabFirst = i; + xti->itabLast = i; + + auto biffStructPtr = XLS::BiffStructurePtr(xti); + externSheet->rgXTI.push_back(biffStructPtr); + + XLS::GlobalWorkbookInfo::_xti val_1; + val_1.iSup = xti->iSupBook; + val_1.itabFirst = i; + val_1.itabLast = i; + auto sheet = static_cast(ptr->m_arBrtBundleSh[i].get()); + val_1.link = sheet->strName; + + XLS::GlobalWorkbookInfo::arXti_External_static.push_back(val_1); + + } } if (m_oWorkbookPr.IsInit()) workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); @@ -307,11 +342,14 @@ namespace OOX if (m_oExternalReferences.IsInit()) { - auto ptr(new XLSB::EXTERNALS); - ptr->m_arSUP = m_oExternalReferences->toBin(); - workBookStream->m_EXTERNALS = XLS::BaseObjectPtr{ptr}; + auto ptr = static_cast(workBookStream->m_EXTERNALS.get()); + auto sups = m_oExternalReferences->toBin(); + if(!sups.empty()) + ptr->m_arSUP.insert(ptr->m_arSUP.end(), sups.begin(), sups.end()); + } + /* if (m_oAppName.IsInit()) { diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 25ab5a9930..306c10285e 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1085,47 +1085,43 @@ namespace OOX } } - XLS::BaseObjectPtr CFormula::toBin() + void CFormula::toBin(XLS::BaseObjectPtr& obj) { - XLS::BaseObjectPtr objectPtr; switch(m_oT->GetValue()) { case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeNormal: { - auto formula(new XLSB::FmlaBase(false)); + auto formula = dynamic_cast(obj.get()); formula->formula = m_sText; - objectPtr = XLS::BaseObjectPtr{dynamic_cast(formula)}; + } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeShared: { + auto formula = dynamic_cast(obj.get()); + formula->formula = m_sText; if(m_oRef.IsInit()) - { - auto formula(new XLSB::ShrFmla(m_oRef.get())); - formula->formula = m_sText; - objectPtr = XLS::BaseObjectPtr{formula}; - } + formula->rfx = m_oRef.get(); + } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeArray: { - if(m_oRef.IsInit()) + auto formula = dynamic_cast(obj.get()); + formula->formula = m_sText; + if(m_oAca.IsInit()) { - auto formula(new XLSB::ArrFmla(m_oRef.get())); - - formula->formula = m_sText; - if(m_oAca.IsInit()) - { - formula->fAlwaysCalc = m_oAca->GetValue(); - } - objectPtr = XLS::BaseObjectPtr{formula}; + formula->fAlwaysCalc = m_oAca->GetValue(); } + if(m_oRef.IsInit()) + formula->rfx = m_oRef.get(); + + } break; case SimpleTypes::Spreadsheet::ECellFormulaType::cellformulatypeDataTable: { - - auto dataTable(new XLSB::Table); + auto dataTable = dynamic_cast(obj.get()); if(m_oCa.IsInit()) { @@ -1169,7 +1165,6 @@ namespace OOX } break; } - return objectPtr; } EElementType CFormula::getType () const { @@ -1804,7 +1799,7 @@ namespace OOX { m_oType.Init(); m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeStr); - if(m_oValue.IsInit()) + if(m_oValue.IsInit() && !m_oFormula.IsInit()) { if(m_oValue->m_sText == L"TRUE" || m_oValue->m_sText == L"FALSE") m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool); @@ -2083,55 +2078,64 @@ namespace OOX ptr->m_source = XLS::BaseObjectPtr{pDATACELL}; pDATACELL->m_source = XLS::BaseObjectPtr{pSource}; } - else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeDataTable) - { - pTABLECELL = new(XLSB::TABLECELL); - ptr->m_source = XLS::BaseObjectPtr{pTABLECELL}; - pFMLACELL->m_source = m_oFormula->toBin(); - pTABLECELL->m_source = XLS::BaseObjectPtr{pSource}; - } else { - std::vector ref; - pFMLACELL = new XLSB::FMLACELL(0, ref); - - if(m_oRef.IsInit()) + if(!m_oFormula->m_oT.IsInit()) { - pSHRFMLACELL = new XLSB::SHRFMLACELL(0,0, ref); - pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; - ptr->m_source = XLS::BaseObjectPtr{pSHRFMLACELL}; + m_oFormula->m_oT.Init(); + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; } - if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeShared) + if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeDataTable) { - - if(!m_oRef.IsInit()) - { - pFMLACELL->m_source = m_oFormula->toBin(); - if(m_oFormula->m_oSi.IsInit()) - pFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); - pFMLACELL->isShared = true; - ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; - } - else - { - if(m_oFormula->m_oSi.IsInit()) - { - pSHRFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); - pSHRFMLACELL->m_source = m_oFormula->toBin(); - } - } + pTABLECELL = new(XLSB::TABLECELL); + ptr->m_source = XLS::BaseObjectPtr{pTABLECELL}; + pTABLECELL->m_source = XLS::BaseObjectPtr{pSource}; + auto table(new XLSB::Table); + pTABLECELL->m_BrtTable = XLS::BaseObjectPtr{table}; + m_oFormula->toBin(pTABLECELL->m_BrtTable); + } - else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeNormal) + else { std::vector ref; pFMLACELL = new XLSB::FMLACELL(0, ref); - ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; - pFMLACELL->m_source = m_oFormula->toBin(); - } - else if(m_oFormula->getType() == SimpleTypes::Spreadsheet::cellformulatypeArray) - { - pSHRFMLACELL->m_source = m_oFormula->toBin(); + if(m_oFormula->m_oRef.IsInit()) + { + ref.push_back(m_oFormula->m_oRef.get()); + } + /*if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeShared) + { + + pSHRFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + if(m_oFormula->m_oSi.IsInit()) + pFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); + pFMLACELL->isShared = true; + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + + else + { + if(m_oFormula->m_oSi.IsInit()) + { + pSHRFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); + pSHRFMLACELL->m_source = m_oFormula->toBin(); + } + } + }*/ + else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeNormal) + { + + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + m_oFormula->toBin(pFMLACELL->m_source); + } + + /*else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) + { + pSHRFMLACELL->m_source = m_oFormula->toBin(pSHRFMLACELL); + }*/ } } if(m_oCol.IsInit()) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 57dece8a77..976d88ca4a 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -141,7 +141,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream); void fromXLSBExt (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nFlags); void fromBin(XLS::BaseObjectPtr& obj, SimpleTypes::Spreadsheet::ECellFormulaType eType); - XLS::BaseObjectPtr toBin(); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; From 71afe4a0d52240f9919077c10b2402d9803a748e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 24 Jan 2024 16:41:41 +0600 Subject: [PATCH 154/221] Add relative reference saving --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h index ba50316040..e5d13bf7ab 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h @@ -180,10 +180,12 @@ public: void save(CFRecord& record) override { RwType rw; - ColType col; + ColType col = 0; rw = row; - col = column; + SETBITS(col, 0, 13, column); + SETBIT(col, 14, colRelative); + SETBIT(col, 15, rowRelative); record << rw << col; } From 9947e80e6c468005cb74773d8ea4b97e93de4c0a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 24 Jan 2024 17:50:21 +0600 Subject: [PATCH 155/221] Fix XLUnicodeString_T operator= --- MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h | 1 + 1 file changed, 1 insertion(+) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h index 50786da3a4..03443bef33 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BiffString.h @@ -118,6 +118,7 @@ public: } XLUnicodeString_T operator=(const bool& boolVal) { + cch_ = 0; return *this; } const size_t getStructSizeWouldWritten() const // Number of unsigned chars that would be written From d5de6a710d139441f4e6f73ee99ab50ea92876fa Mon Sep 17 00:00:00 2001 From: Alexey Date: Thu, 25 Jan 2024 00:07:00 +0300 Subject: [PATCH 156/221] Fix ZipFile func for linux --- OfficeUtils/src/ZipUtilsCP.cpp | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/OfficeUtils/src/ZipUtilsCP.cpp b/OfficeUtils/src/ZipUtilsCP.cpp index 3d0dbff1f9..7c5db7baa1 100644 --- a/OfficeUtils/src/ZipUtilsCP.cpp +++ b/OfficeUtils/src/ZipUtilsCP.cpp @@ -746,24 +746,8 @@ namespace ZLibZipUtils { zipFile zf = zipOpenHelp(outputFile); if (zf) - { - wstring inputFileName( inputFile ); - - wstring::size_type pos = 0; - static const wstring::size_type npos = -1; - - pos = inputFileName.find_last_of( L'\\' ); - - wstring zipFileName; - - if ( pos != npos ) - { - zipFileName = wstring( ( inputFileName.begin() + pos + 1 ), inputFileName.end() ); - } - else - { - zipFileName = wstring( inputFileName.begin(), inputFileName.end() ); - } + { + wstring zipFileName = NSFile::GetFileName(inputFile); std::string zipFileNameA = codepage_issue_fixToOEM(zipFileName); err = zipOpenNewFileInZip( zf, zipFileNameA.c_str(), &zinfo, NULL, 0, NULL, 0, NULL, method, compressionLevel ); From bccdeedc4e3f2bfbe3dd085688103094c811346f Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 25 Jan 2024 15:55:14 +0600 Subject: [PATCH 157/221] Fix cell refs conversion --- .../Logic/Biff_structures/CellRangeRef.h | 43 ++++++++++++++----- .../Format/Logic/Biff_structures/CellRef.h | 16 +++++-- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h index 9d9605b83f..31e1652c5b 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h @@ -189,20 +189,43 @@ public: RwType rwLast; ColType colFirst; ColType colLast; - + + auto version = record.getGlobalWorkbookInfo()->Version; + rwFirst = rowFirst; rwLast = rowLast; - switch (rel_info) + if (version < 0x0800) { - case rel_Present: - colFirst = (columnFirst >> 2) << 2; - colLast = (columnLast >> 2) << 2; - break; - case rel_Absent: - colFirst = columnFirst; - colLast = columnLast; - break; + switch (rel_info) + { + case rel_Present: + colFirst = (columnFirst >> 2) << 2; + colLast = (columnLast >> 2) << 2; + break; + case rel_Absent: + colFirst = columnFirst; + colLast = columnLast; + break; + } + } + else + { + if(rel_info == rel_Present) + { + SETBITS(colFirst, 0, 13, columnFirst); + SETBIT(colFirst, 14, columnFirstRelative); + SETBIT(colFirst, 15, rowFirstRelative); + + SETBITS(colLast, 0, 13, columnLast); + SETBIT(colLast, 14, columnLastRelative); + SETBIT(colLast, 15, rowLastRelative); + } + else if(rel_info == rel_Absent) + { + colFirst = columnFirst; + colLast = columnLast; + } } record << rwFirst << rwLast << colFirst << colLast; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h index e5d13bf7ab..f2d617a035 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h @@ -181,11 +181,19 @@ public: { RwType rw; ColType col = 0; - rw = row; - SETBITS(col, 0, 13, column); - SETBIT(col, 14, colRelative); - SETBIT(col, 15, rowRelative); + auto version = record.getGlobalWorkbookInfo()->Version; + + if (version < 0x0800) + { + col = column; + } + else + { + SETBITS(col, 0, 13, column); + SETBIT(col, 14, colRelative); + SETBIT(col, 15, rowRelative); + } record << rw << col; } From afdc28dbe44248d8e71fde9456cdd48d211a78da Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 25 Jan 2024 18:44:32 +0600 Subject: [PATCH 158/221] Fix page setup --- .../Worksheets/WorksheetChildOther.cpp | 46 +++++++++++++++---- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index e96a8970bf..705b931460 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -444,22 +444,22 @@ namespace OOX XLS::BaseObjectPtr objPtr(ptr); if(m_oLeft.IsInit()) - ptr->xnumLeft.data.value = std::round(m_oLeft->GetValue() * 100) / 100; + ptr->xnumLeft.data.value = std::round(m_oLeft->GetValue()) / 100; if(m_oTop.IsInit()) - ptr->xnumTop.data.value = std::round(m_oTop->GetValue() * 100) / 100; + ptr->xnumTop.data.value = std::round(m_oTop->GetValue()) / 100; if(m_oRight.IsInit()) - ptr->xnumRight.data.value = std::round(m_oRight->GetValue() * 100) / 100; + ptr->xnumRight.data.value = std::round(m_oRight->GetValue()) / 100; if(m_oBottom.IsInit()) - ptr->xnumBottom.data.value = std::round(m_oBottom->GetValue() * 100) / 100; + ptr->xnumBottom.data.value = std::round(m_oBottom->GetValue()) / 100; if(m_oHeader.IsInit()) - ptr->xnumHeader.data.value = std::round(m_oHeader->GetValue() * 100) / 100; + ptr->xnumHeader.data.value = std::round(m_oHeader->GetValue()) / 100; if(m_oFooter.IsInit()) - ptr->xnumFooter.data.value = std::round(m_oFooter->GetValue() * 100) / 100; + ptr->xnumFooter.data.value = std::round(m_oFooter->GetValue()) / 100; return objPtr; } @@ -571,6 +571,8 @@ namespace OOX if (m_oCopies.IsInit()) ptr->iCopies = m_oCopies->m_eValue; + else + ptr->iCopies = 1; if (m_oDraft.IsInit()) ptr->fDraft = m_oDraft->m_eValue; @@ -580,37 +582,63 @@ namespace OOX if (m_oFirstPageNumber.IsInit()) ptr->iPageStart = m_oFirstPageNumber->m_eValue; + else + ptr->iPageStart = 1; if (m_oFitToHeight.IsInit()) ptr->iFitHeight = m_oFitToHeight->m_eValue; + else + ptr->iFitHeight = 1; if (m_oFitToWidth.IsInit()) ptr->iFitWidth = m_oFitToWidth->m_eValue; + else + ptr->iFitWidth = 1; if (m_oHorizontalDpi.IsInit()) ptr->iRes = m_oHorizontalDpi->m_eValue; + else + ptr->iRes = 600; if (m_oRId.IsInit()) ptr->szRelID = m_oRId->GetValue(); - if (m_oOrientation == SimpleTypes::EPageOrientation::pageorientLandscape) + if (m_oOrientation.IsInit() && m_oOrientation->GetValue() == SimpleTypes::EPageOrientation::pageorientLandscape) + { + ptr->fPortrait = false; ptr->fLandscape = true; - else + } + else if(m_oOrientation.IsInit()) + { ptr->fLandscape = false; + ptr->fPortrait = true; + } + else + { + ptr->fPortrait = false; + ptr->fLandscape = false; + ptr->fNoOrient = true; + } - if ( m_oPageOrder == SimpleTypes::Spreadsheet::EPageOrder::pageorderOverThenDown) + if (m_oPageOrder.IsInit() && m_oPageOrder->GetValue() == SimpleTypes::Spreadsheet::EPageOrder::pageorderOverThenDown) ptr->fLeftToRight = true; else ptr->fLeftToRight = false; if (m_oPaperSize.IsInit()) ptr->iPaperSize = m_oPaperSize->m_eValue; + else + ptr->iPaperSize = 9; if (m_oScale.IsInit()) ptr->iScale = m_oScale->m_eValue; + else + ptr->iScale = 100; if (m_oUseFirstPageNumber.IsInit()) ptr->fUsePage = m_oUseFirstPageNumber->m_eValue; + else + ptr->fUsePage = true; if (m_oVerticalDpi.IsInit()) ptr->iVRes = m_oVerticalDpi->m_eValue; From 7333e6943bb02eceab285501ef2a28c071d95136 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Fri, 26 Jan 2024 19:18:28 +0500 Subject: [PATCH 159/221] Fix bug #65611 --- OdfFile/Reader/Converter/pptx_slide_context.cpp | 13 +++++++++++-- OdfFile/Reader/Format/draw_shapes_pptx.cpp | 6 ++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_slide_context.cpp b/OdfFile/Reader/Converter/pptx_slide_context.cpp index 3a9d5f1845..cc9248c690 100644 --- a/OdfFile/Reader/Converter/pptx_slide_context.cpp +++ b/OdfFile/Reader/Converter/pptx_slide_context.cpp @@ -170,6 +170,7 @@ public: private: void process_common_properties(drawing_object_description& obj, _pptx_drawing & drawing); + void process_crop(const drawing_object_description& obj, _pptx_drawing& drawing, const std::wstring& filename); void process_shape (drawing_object_description& obj, _pptx_drawing & drawing); void process_image (drawing_object_description& obj, _pptx_drawing & drawing); @@ -688,8 +689,7 @@ void pptx_slide_context::Impl::process_image(drawing_object_description& obj, _p } std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + obj.xlink_href_; - drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, fileName, drawing.fill.bitmap->cropRect, get_mediaitems()->applicationFonts()); - drawing.fill.bitmap->bStretch = true; + process_crop(obj, drawing, fileName); if ((sColorMode) && (*sColorMode == L"greyscale")) drawing.fill.bitmap->luminance = true; @@ -748,6 +748,9 @@ void pptx_slide_context::Impl::process_shape(drawing_object_description & obj, _ drawing.fill.bitmap->rId = get_mediaitems()->add_or_find(drawing.fill.bitmap->xlink_href_, typeImage, isMediaInternal, ref, oox::document_place); add_additional_rels(isMediaInternal, drawing.fill.bitmap->rId, ref, typeImage); + + std::wstring fileName = odfPacket_ + FILE_SEPARATOR_STR + drawing.fill.bitmap->xlink_href_; + process_crop(obj, drawing, fileName); } std::wstring rId = get_mediaitems()->add_or_find(L"", typeShape, isMediaInternal, ref, oox::document_place); @@ -845,6 +848,12 @@ void pptx_slide_context::Impl::process_common_properties(drawing_object_descript drawing.fill = pic.fill_; } +void pptx_slide_context::Impl::process_crop(const drawing_object_description& obj, _pptx_drawing& drawing, const std::wstring& filename) +{ + drawing.fill.bitmap->bCrop = odf_reader::parse_clipping(obj.clipping_string_, filename, drawing.fill.bitmap->cropRect, get_mediaitems()->applicationFonts()); + drawing.fill.bitmap->bStretch = true; +} + void pptx_slide_context::dump_rels(rels & Rels) { impl_->get_drawings()->dump_rels(Rels); diff --git a/OdfFile/Reader/Format/draw_shapes_pptx.cpp b/OdfFile/Reader/Format/draw_shapes_pptx.cpp index 5a28971259..e3e2cd70ba 100644 --- a/OdfFile/Reader/Format/draw_shapes_pptx.cpp +++ b/OdfFile/Reader/Format/draw_shapes_pptx.cpp @@ -139,6 +139,12 @@ void draw_shape::common_pptx_convert(oox::pptx_conversion_context & Context) { properties->apply_to(Context.get_slide_context().get_properties()); Compute_GraphicFill(properties->common_draw_fill_attlist_, properties->style_background_image_, Context.root(), fill); + + if (properties->fo_clip_) + { + std::wstring strRectClip = properties->fo_clip_.get(); + Context.get_slide_context().set_clipping(strRectClip.substr(5, strRectClip.length() - 6)); + } } for (size_t i = 0; i < additional_.size(); i++) { From 7d3940a3828a250eb9fcbc6e4e39cb24099991eb Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 29 Jan 2024 15:04:03 +0600 Subject: [PATCH 160/221] Fix area ptg conversion --- .../Format/Logic/Biff_structures/CellRangeRef.h | 11 ++++------- .../Format/Logic/Biff_structures/StringPtgParser.cpp | 4 ++-- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h index 31e1652c5b..a1ecbcab55 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRangeRef.h @@ -185,15 +185,12 @@ public: void save(CFRecord& record) override { - RwType rwFirst; - RwType rwLast; - ColType colFirst; - ColType colLast; + RwType rwFirst = rowFirst; + RwType rwLast = rowLast; + ColType colFirst = 0; + ColType colLast = 0; auto version = record.getGlobalWorkbookInfo()->Version; - - rwFirst = rowFirst; - rwLast = rowLast; if (version < 0x0800) { diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 08f56fb64e..55d5a2c65a 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -301,7 +301,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R { if(SyntaxPtg::extract_PtgArea(it, itEnd, operand_str)) { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgArea3d(ixti, operand_str, OperandPtg::ptg_VALUE, rgce.getLocation()))); + rgce.addPtg(found_operand = OperandPtgPtr(new PtgArea3d(ixti, operand_str, OperandPtg::ptg_REFERENCE, rgce.getLocation()))); } else if(SyntaxPtg::extract_PtgRef(it, itEnd, operand_str)) { @@ -340,7 +340,7 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } else { - found_operand = OperandPtgPtr(new PtgArea(operand_str, OperandPtg::ptg_VALUE)); + found_operand = OperandPtgPtr(new PtgArea(operand_str, OperandPtg::ptg_REFERENCE)); } rgce.addPtg(found_operand); } From 71fc5323c72a4671eb47c43e16ed5ecef74ab678 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 29 Jan 2024 15:04:34 +0600 Subject: [PATCH 161/221] Fix formula value conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 37 ++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 306c10285e..f11b816b97 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1799,7 +1799,7 @@ namespace OOX { m_oType.Init(); m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeStr); - if(m_oValue.IsInit() && !m_oFormula.IsInit()) + if(m_oValue.IsInit()) { if(m_oValue->m_sText == L"TRUE" || m_oValue->m_sText == L"FALSE") m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeBool); @@ -1869,23 +1869,46 @@ namespace OOX { if(!isReal) { - auto pCellRk = new(XLSB::CellRk); - pCellRk->value.fInt = 1; - pCellRk->value.fX100 = 0; - pCellRk->value.num = intCache; + if(!m_oFormula.IsInit()) + { + auto pCellRk = new(XLSB::CellRk); + pCellRk->value.fInt = 1; + pCellRk->value.fX100 = 0; + pCellRk->value.num = intCache; + oCell = &pCellRk->cell; + pSource = pCellRk; + } + else + { + auto pCellRk = new(XLSB::FmlaNum); + + pCellRk->value.data.value = intCache; + oCell = &pCellRk->cell; + pSource = pCellRk; + } + - oCell = &pCellRk->cell; - pSource = pCellRk; } else if(isReal) { + if(!m_oFormula.IsInit()) + { auto pCellReal = new(XLSB::CellReal); pCellReal->value.data.value = realCache; oCell = &pCellReal->cell; pSource = pCellReal; + } + else + { + auto pCellRk = new(XLSB::FmlaNum); + + pCellRk->value.data.value = realCache; + oCell = &pCellRk->cell; + pSource = pCellRk; + } } } break; From efbb6f38a0cf14246f30009dbbd88ce0776b8872 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 29 Jan 2024 20:05:20 +0600 Subject: [PATCH 162/221] Fix cell protection --- OOXML/XlsxFormat/Styles/Xfs.cpp | 11 +++--- .../Worksheets/WorksheetChildOther.cpp | 36 ++++++++++++++++++- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Xfs.cpp b/OOXML/XlsxFormat/Styles/Xfs.cpp index 9002b31d8d..f771a556c5 100644 --- a/OOXML/XlsxFormat/Styles/Xfs.cpp +++ b/OOXML/XlsxFormat/Styles/Xfs.cpp @@ -281,8 +281,12 @@ namespace OOX auto ptr = static_cast(obj.get()); if(m_oHidden.IsInit()) ptr->fHidden = m_oHidden->GetValue(); + else + ptr->fHidden = false; if(m_oLocked.IsInit()) ptr->fLocked = m_oLocked->GetValue(); + else + ptr->fLocked = true; } EElementType CProtection::getType () const { @@ -406,10 +410,9 @@ namespace OOX ptr->alc = 0; ptr->alcV = 2; } - if(m_oProtection.IsInit()) - m_oProtection->toBin(objectPtr); - - + if(!m_oProtection.IsInit()) + m_oProtection.Init(); + m_oProtection->toBin(objectPtr); if(m_oApplyAlignment.IsInit()) ptr->fAtrAlc = m_oApplyAlignment->GetValue(); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 705b931460..74f7f549ef 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1414,7 +1414,7 @@ namespace OOX if (m_oShowZeros.IsInit()) pWsView->fDspZerosRt = m_oShowZeros->m_eValue; else - pWsView->fDspZerosRt = false; + pWsView->fDspZerosRt = true; if (m_oTabSelected.IsInit()) pWsView->fSelected = m_oTabSelected->m_eValue; else @@ -2595,54 +2595,88 @@ namespace OOX if (m_oPassword.IsInit()) ptr->protpwd = std::stoul(m_oPassword.get()); + else + ptr->protpwd = 0; if (m_oAutoFilter.IsInit()) ptr->fAutoFilter = m_oAutoFilter->GetValue(); + else + ptr->fAutoFilter = false; if (m_oDeleteColumns.IsInit()) ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + else + ptr->fDeleteColumns= false; if (m_oDeleteRows.IsInit()) ptr->fDeleteRows = m_oDeleteRows->GetValue(); + else + ptr->fDeleteRows = false; if (m_oFormatCells.IsInit()) ptr->fFormatCells = m_oFormatCells->GetValue(); + else + ptr->fFormatCells = false; if (m_oFormatColumns.IsInit()) ptr->fFormatColumns = m_oFormatColumns->GetValue(); + else + ptr->fFormatColumns = false; if (m_oFormatRows.IsInit()) ptr->fFormatRows = m_oFormatRows->GetValue(); + else + ptr->fFormatRows = false; if (m_oInsertColumns.IsInit()) ptr->fInsertColumns = m_oInsertColumns->GetValue(); + else + ptr->fInsertColumns = false; if (m_oInsertHyperlinks.IsInit()) ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + else + ptr->fInsertHyperlinks = false; if (m_oInsertRows.IsInit()) ptr->fInsertRows = m_oInsertRows->GetValue(); + else + ptr->fInsertRows = false; if (m_oObjects.IsInit()) ptr->fObjects = m_oObjects->GetValue(); + else + ptr->fObjects = false; if (m_oPivotTables.IsInit()) ptr->fPivotTables = m_oPivotTables->GetValue(); + else + ptr->fPivotTables = false; if (m_oScenarios.IsInit()) ptr->fScenarios = m_oScenarios->GetValue(); + else + ptr->fScenarios = false; if (m_oSelectLockedCells.IsInit()) ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + else + ptr->fSelLockedCells = true; if (m_oSelectUnlockedCells.IsInit()) ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + else + ptr->fSelUnlockedCells = true; if (m_oSheet.IsInit()) ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fLocked = false; if (m_oSort.IsInit()) ptr->fSort = m_oSort->GetValue(); + else + ptr->fSort = false; return castedPtr; } From 278d6294188f819794b287648f5304c4add6582c Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 30 Jan 2024 11:54:32 +0300 Subject: [PATCH 163/221] . --- MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp | 10 ++++++++-- OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp | 10 +++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp b/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp index 07b74b285d..9c0b90f093 100644 --- a/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp +++ b/MsBinaryFile/XlsFile/Converter/xlsx_sheet_context.cpp @@ -47,8 +47,14 @@ table_state::table_state(xlsx_conversion_context & Context) : drawing_context_(C table_state_ptr & xlsx_sheet_context::state() { - if (tables_state_.empty()) return table_state_ptr(); - return tables_state_.back(); + if (false == tables_state_.empty()) + { + return tables_state_.back(); + } + else + { + throw; + } } xlsx_sheet_context::xlsx_sheet_context(xlsx_conversion_context & Context) : context_(Context) diff --git a/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp b/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp index ce140704c1..e02622249f 100644 --- a/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp +++ b/OOXML/XlsxFormat/Chart/ChartSerializeEx.cpp @@ -657,11 +657,11 @@ xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"" { m_title = oReader; } - //else if(_T("numFmt") == sName) - //{ - // m_numFmt = new CT_NumFmt; - // m_numFmt->fromXML(oReader); - //} + else if(_T("numFmt") == sName) + { + m_numFmt = new CNumberFormat; + m_numFmt->fromXML(oReader); + } else if(_T("majorTickMark") == sName) { m_majorTickMarks = new CTickMarks; From d4f4f4d500c09a2502a747b7adca8ed8cf245840 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 30 Jan 2024 15:00:13 +0600 Subject: [PATCH 164/221] Fix whitespace showing in worksheet --- OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 74f7f549ef..3e40ff86fd 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -1408,7 +1408,7 @@ namespace OOX else pWsView->fDspRuler = false; if (m_oShowWhiteSpace.IsInit()) - pWsView->fWhitespaceHidden = m_oShowWhiteSpace->m_eValue; + pWsView->fWhitespaceHidden = !m_oShowWhiteSpace->m_eValue; else pWsView->fWhitespaceHidden = false; if (m_oShowZeros.IsInit()) From 79bb09f2c23e28c2e4115e0b7f4f26e802ded7af Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Wed, 31 Jan 2024 19:06:37 +0500 Subject: [PATCH 165/221] Fix odf tests --- .../Converter/pptx_conversion_context.cpp | 1 + OdfFile/Reader/Format/draw_page.cpp | 1 - OdfFile/Test/audio.cpp | 32 ++++++----- OdfFile/Test/common.cpp | 9 ++- OdfFile/Test/entrance.cpp | 12 ++-- OdfFile/Test/interactions.cpp | 56 +++++++++++++------ 6 files changed, 68 insertions(+), 43 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_conversion_context.cpp b/OdfFile/Reader/Converter/pptx_conversion_context.cpp index cd06a9bd62..f857f0e1d0 100644 --- a/OdfFile/Reader/Converter/pptx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/pptx_conversion_context.cpp @@ -461,6 +461,7 @@ const std::vector& pptx_conversion_context::get_page_names() const { create_new_slide(pageName); get_slide_context().start_slide();//pageName, pageStyleName); + get_slide_context().get_animation_context().clear(); current_master_page_name_ = pageMasterName; current_layout_page_name_ = pageLayoutName; diff --git a/OdfFile/Reader/Format/draw_page.cpp b/OdfFile/Reader/Format/draw_page.cpp index 12fe1fecab..ac0ab28507 100644 --- a/OdfFile/Reader/Format/draw_page.cpp +++ b/OdfFile/Reader/Format/draw_page.cpp @@ -207,7 +207,6 @@ void draw_page::pptx_convert(oox::pptx_conversion_context & Context) } Context.end_page(); - Context.get_slide_context().get_animation_context().clear(); if (presentation_notes_) { diff --git a/OdfFile/Test/audio.cpp b/OdfFile/Test/audio.cpp index 0152443eeb..b7df1b30d1 100644 --- a/OdfFile/Test/audio.cpp +++ b/OdfFile/Test/audio.cpp @@ -104,36 +104,40 @@ const cpdoccore::oox::pptx_animation_context::Impl::_animation_element_array& OD return actions; } -TEST_F(ODP2OOX_AnimationAudioTest, r_embed_id) +TEST_F(ODP2OOX_AnimationAudioTest, set) { using namespace cpdoccore::oox; const auto& mainArray = GetMainSequenceArray(); ASSERT_GE(mainArray.size(), 1); const auto& actions = GetInnermostPar(mainArray[0])->AnimationActionArray; - ASSERT_EQ(actions.size(), 4); - const auto audio = dynamic_cast(actions[3].get()); ; - ASSERT_NE(audio, nullptr); - - const std::wstring rIdExp = L"aId1"; - - EXPECT_EQ(audio->RId.value(), rIdExp); + ASSERT_EQ(actions.size(), 3); + const auto set = dynamic_cast(actions[0].get()); + ASSERT_NE(set, nullptr); } -TEST_F(ODP2OOX_AnimationAudioTest, name) +TEST_F(ODP2OOX_AnimationAudioTest, anim_1) { using namespace cpdoccore::oox; const auto& mainArray = GetMainSequenceArray(); ASSERT_GE(mainArray.size(), 1); const auto& actions = GetInnermostPar(mainArray[0])->AnimationActionArray; - ASSERT_EQ(actions.size(), 4); - const auto audio = dynamic_cast(actions[3].get()); ; - ASSERT_NE(audio, nullptr); + ASSERT_EQ(actions.size(), 3); + const auto anim = dynamic_cast(actions[1].get()); + ASSERT_NE(anim, nullptr); +} - const std::wstring nameExp = L"apert.wav"; +TEST_F(ODP2OOX_AnimationAudioTest, anim_2) +{ + using namespace cpdoccore::oox; - EXPECT_EQ(audio->Name.value(), nameExp); + const auto& mainArray = GetMainSequenceArray(); + ASSERT_GE(mainArray.size(), 1); + const auto& actions = GetInnermostPar(mainArray[0])->AnimationActionArray; + ASSERT_EQ(actions.size(), 3); + const auto anim = dynamic_cast(actions[2].get()); + ASSERT_NE(anim, nullptr); } ////////////////////////////////////////////////////////////////////////// diff --git a/OdfFile/Test/common.cpp b/OdfFile/Test/common.cpp index 42da3e35e8..c62de29df6 100644 --- a/OdfFile/Test/common.cpp +++ b/OdfFile/Test/common.cpp @@ -191,7 +191,10 @@ const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetInnerPar(const if (!par) return nullptr; - const anim_par* inner_par = dynamic_cast(par->anim_par_.get()); + if (par->anim_par_.size() == 0) + return nullptr; + + const anim_par* inner_par = dynamic_cast(par->anim_par_[0].get()); if (!inner_par) return nullptr; @@ -208,9 +211,9 @@ const cpdoccore::odf_writer::anim_par* OOX2ODP_AnimationTest::GetInnermostPar(co const anim_par* innermost = GetInnerPar(par); - while (innermost->anim_par_) + while (innermost->anim_par_.size()) { - innermost = dynamic_cast(innermost->anim_par_.get()); + innermost = dynamic_cast(innermost->anim_par_[0].get()); if (!innermost) return nullptr; } diff --git a/OdfFile/Test/entrance.cpp b/OdfFile/Test/entrance.cpp index ac0dd1cbf4..75001e91cb 100644 --- a/OdfFile/Test/entrance.cpp +++ b/OdfFile/Test/entrance.cpp @@ -432,8 +432,8 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_fly_in_action_animate_1_key_point const pptx_animation_context::Impl::_anim* animate1 = dynamic_cast(actions[1].get()); std::vector keypointsExp; - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"#ppt_x", boost::none)); - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"#ppt_x", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"ppt_x", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"ppt_x", boost::none)); EXPECT_EQ(animate1->KeypointArray->size(), keypointsExp.size()); for (size_t i = 0; i < animate1->KeypointArray->size(); i++) @@ -513,8 +513,8 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_fly_in_action_animate_2_key_point const pptx_animation_context::Impl::_anim* animate2 = dynamic_cast(actions[2].get()); std::vector keypointsExp; - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"1+#ppt_h/2", boost::none)); - keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"#ppt_y", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(0, L"1+ppt_h/2", boost::none)); + keypointsExp.push_back(pptx_animation_context::Impl::_anim::_keypoint(100000, L"ppt_y", boost::none)); EXPECT_EQ(animate2->KeypointArray->size(), keypointsExp.size()); for (size_t i = 0; i < animate2->KeypointArray->size(); i++) @@ -576,9 +576,7 @@ TEST_F(ODP2OOX_EntranceAnimationTest, entrance_venetian_blinds_anim_effect_trans const pptx_animation_context::Impl::_animation_element_array& actions = GetAnimationActionsByIndex(animationIndex); const pptx_animation_context::Impl::_anim_effect* animEffect = dynamic_cast(actions[1].get()); - const std::wstring transitionExp = L"in"; - - EXPECT_EQ(animEffect->Transition.value(), transitionExp); + EXPECT_FALSE(animEffect->Transition.has_value()); } TEST_F(ODP2OOX_EntranceAnimationTest, entrance_venetian_blinds_anim_effect_duration) diff --git a/OdfFile/Test/interactions.cpp b/OdfFile/Test/interactions.cpp index 16860f0de9..8247f9b856 100644 --- a/OdfFile/Test/interactions.cpp +++ b/OdfFile/Test/interactions.cpp @@ -197,49 +197,69 @@ TEST_F(ODP2OOX_AnimationPlayAudioTest, rels_size) ASSERT_NE(mConversionContext, nullptr); auto rels_ = mConversionContext->current_slide().Rels().relationships(); - const size_t relsSizeExp = 3; + const size_t relsSizeExp = 2; - EXPECT_EQ(rels_.size(), 3); + EXPECT_EQ(rels_.size(), relsSizeExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_id) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_slide_rel_type) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring idExp = L"hId1"; + auto slideRel = mConversionContext->current_slide().Rels().relationships()[0]; + const std::wstring typeExp = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/slideLayout"; - EXPECT_EQ(audioRel.id(), idExp); + EXPECT_EQ(slideRel.type(), typeExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_type) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_slide_rel_target) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring typeExp = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink"; + auto slideRel = mConversionContext->current_slide().Rels().relationships()[0]; + const std::wstring targetExp = L"../slideLayouts/slideLayout1.xml"; - EXPECT_EQ(audioRel.type(), typeExp); + EXPECT_EQ(slideRel.target(), targetExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_target) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_slide_rel_target_mode) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring targetExp = L"../../../../X2tConverter/test/win32Test/Res/media_example.wav"; + auto slideRel = mConversionContext->current_slide().Rels().relationships()[0]; + const std::wstring targetModeExp = L""; - EXPECT_EQ(audioRel.target(), targetExp); + EXPECT_EQ(slideRel.target_mode(), targetModeExp); } -TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_rel_target_mode) +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_notes_rel_type) { ASSERT_NE(mConversionContext, nullptr); - auto audioRel = mConversionContext->current_slide().Rels().relationships()[1]; - const std::wstring targetModeExp = L"External"; + auto notesRel = mConversionContext->current_slide().Rels().relationships()[1]; + const std::wstring typeExp = L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesSlide"; - EXPECT_EQ(audioRel.target_mode(), targetModeExp); + EXPECT_EQ(notesRel.type(), typeExp); +} + +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_notes_rel_target) +{ + ASSERT_NE(mConversionContext, nullptr); + + auto notesRel = mConversionContext->current_slide().Rels().relationships()[1]; + const std::wstring targetExp = L"../notesSlides/notesSlide1.xml"; + + EXPECT_EQ(notesRel.target(), targetExp); +} + +TEST_F(ODP2OOX_AnimationPlayAudioTest, audio_notes_rel_target_mode) +{ + ASSERT_NE(mConversionContext, nullptr); + + auto notesRel = mConversionContext->current_slide().Rels().relationships()[1]; + const std::wstring targetModeExp = L""; + + EXPECT_EQ(notesRel.target_mode(), targetModeExp); } ////////////////////////////////////////////////////////////////////////// From 00671ffdd65865ca989246fa94a523b7dcc4d2ac Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 2 Feb 2024 14:47:45 +0600 Subject: [PATCH 166/221] Fix shared formulas conversion --- .../Format/Logic/Biff_structures/PtgRef.h | 2 +- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 98 +++++++++++++------ OOXML/XlsxFormat/Worksheets/SheetData.h | 9 +- 3 files changed, 74 insertions(+), 35 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h index a10b730b56..fae265d364 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h @@ -56,7 +56,7 @@ public: static const unsigned short fixed_id = 0x04; -private: + RgceLoc loc; XLSB::RgceLoc loc_xlsb; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index f11b816b97..468fd8c6cc 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -62,6 +62,8 @@ #include "../../XlsbFormat/Biff12_records/Cell.h" #include "../../XlsbFormat/Biff12_records/Fmla.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BIFF12/CellRef.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h" #include #include @@ -1757,7 +1759,7 @@ namespace OOX oStream.Seek(nEnd); } - XLS::BaseObjectPtr CCell::toBin() + XLS::BaseObjectPtr CCell::toBin(sharedFormula &sharedFormulas) { std::vector shared_formulas_locations_ref; auto ptr(new XLSB::CELL(0, shared_formulas_locations_ref)); @@ -2120,45 +2122,76 @@ namespace OOX } else { - std::vector ref; - pFMLACELL = new XLSB::FMLACELL(0, ref); - - if(m_oFormula->m_oRef.IsInit()) + std::vector refs; + pFMLACELL = new XLSB::FMLACELL(0, refs); + + if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeNormal) { - ref.push_back(m_oFormula->m_oRef.get()); + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; + m_oFormula->toBin(pFMLACELL->m_source); } - /*if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeShared) + if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeShared) { + + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; + ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; - pSHRFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; - pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; - pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; - if(m_oFormula->m_oSi.IsInit()) - pFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); - pFMLACELL->isShared = true; - ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; - - else + if(!m_oFormula->m_sText.empty()) { - if(m_oFormula->m_oSi.IsInit()) - { - pSHRFMLACELL->m_sharedIndex = m_oFormula->m_oSi->GetValue(); - pSHRFMLACELL->m_source = m_oFormula->toBin(); - } + m_oFormula->toBin(pFMLACELL->m_source); + std::wstring wstrRef(m_oRef.get().begin(), m_oRef.get().end()); + XLS::CellRef ref(wstrRef); + sharedFormulas.shrFmla.push_back(std::make_pair(ref, m_oFormula->m_sText)); + } - }*/ - else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeNormal) + else if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) + { + + auto fmla = dynamic_cast(pSource); + std::wstring wstrRef(m_oRef.get().begin(), m_oRef.get().end()); + XLS::CellRef ref(wstrRef); + auto dataPair = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; + auto ref1 = dataPair.first; + int coldiff = 0; + if(ref1.colRelative) + coldiff = ref.column - dataPair.first.column; + int rowdiff = 0; + if(ref1.rowRelative) + rowdiff = ref.row - dataPair.first.row; + fmla->formula = dataPair.second; + if(rowdiff || coldiff) + { + for(auto i:fmla->formula.rgce.sequence) + { + if(i->ptg_id.is_initialized() && i->ptg_id.get() == 37) + { + auto area(static_cast(i.get())); + area->areaXlsb.columnFirst += coldiff; + area->areaXlsb.columnLast += coldiff; + area->areaXlsb.rowFirst += rowdiff; + area->areaXlsb.rowLast += rowdiff; + } + else if(i->ptg_id.is_initialized() && i->ptg_id.get() == 36) + { + auto area(static_cast(i.get())); + area->loc_xlsb.column += coldiff; + area->loc_xlsb.row += rowdiff; + } + } + } + + } + } + else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) { - + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; m_oFormula->toBin(pFMLACELL->m_source); } - /*else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) - { - pSHRFMLACELL->m_source = m_oFormula->toBin(pSHRFMLACELL); - }*/ } } if(m_oCol.IsInit()) @@ -2801,7 +2834,7 @@ namespace OOX m_arrItems.push_back(pCell); }*/ } - XLS::BaseObjectPtr CRow::toBin() + XLS::BaseObjectPtr CRow::toBin(sharedFormula &sharedFormulas) { std::vector shared_formulas_locations_ref; auto ptr(new XLSB::Parenthesis_CELLTABLE(shared_formulas_locations_ref)); @@ -2809,7 +2842,7 @@ namespace OOX for(auto it = m_arrItems.begin(); it != m_arrItems.end();) { - ptr->m_arCELL.push_back((*it)->toBin()); + ptr->m_arCELL.push_back((*it)->toBin(sharedFormulas)); it = m_arrItems.erase(it); } @@ -3422,10 +3455,11 @@ namespace OOX { auto ptr(new XLSB::CELLTABLE); XLS::BaseObjectPtr objectPtr(ptr); - + sharedFormula fmlaStruct; + for(auto it = m_arrItems.begin(); it != m_arrItems.end();) { - ptr->m_arParenthesis_CELLTABLE.push_back((*it)->toBin()); + ptr->m_arParenthesis_CELLTABLE.push_back((*it)->toBin(fmlaStruct)); it = m_arrItems.erase(it); } diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 976d88ca4a..441c4b9766 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -33,6 +33,7 @@ #include "../SharedStrings/Si.h" #include "../../Common/SimpleTypes_Shared.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h" namespace NSBinPptxRW { @@ -125,6 +126,10 @@ namespace OOX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); }; + struct sharedFormula + { + std::vector> shrFmla; + }; class CFormula : public WritingElement { public: @@ -216,7 +221,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType, _UINT32 nRow); void fromBin(XLS::BaseObjectPtr& obj); - XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBin(sharedFormula &sharedFormulas); virtual EElementType getType () const; @@ -285,7 +290,7 @@ namespace OOX void fromXLSB (NSBinPptxRW::CBinaryFileReader& oStream, _UINT16 nType); void toXLSB (NSBinPptxRW::CXlsbBinaryWriter& oStream) const; void fromBin(XLS::BaseObjectPtr& obj); - XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBin(sharedFormula &sharedFormulas); virtual EElementType getType () const; From aa8a0cfbc24539196f8fb43c7e346e9eca734653 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 2 Feb 2024 23:18:05 +0600 Subject: [PATCH 167/221] FIx array formula conversion --- .../Format/Logic/Biff_structures/PtgExp.h | 1 - .../Logic/Biff_structures/PtgExtraCol.h | 2 +- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 110 ++++++++++++++---- OOXML/XlsxFormat/Worksheets/SheetData.h | 2 + 4 files changed, 92 insertions(+), 23 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h index ef52ce5860..affb820df7 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h @@ -53,7 +53,6 @@ public: static const unsigned short fixed_id = 0x01; -private: unsigned short row; unsigned short col; diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h index 7f9325f4a5..64cce73f71 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h @@ -52,7 +52,7 @@ public: // No type info const std::wstring toString() const; -private: + _INT32 col; }; diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 468fd8c6cc..19b63e487c 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -64,6 +64,8 @@ #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/BIFF12/CellRef.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgArea.h" #include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRef.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExp.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgExtraCol.h" #include #include @@ -1111,6 +1113,17 @@ namespace OOX { auto formula = dynamic_cast(obj.get()); formula->formula = m_sText; + for(auto i:formula->formula.rgce.sequence) + { + if(i->ptg_id.get() == 37) + { + i->ptg_id = 101; + } + if(i->ptg_id.get() == 36) + { + i->ptg_id = 100; + } + } if(m_oAca.IsInit()) { formula->fAlwaysCalc = m_oAca->GetValue(); @@ -1376,6 +1389,18 @@ namespace OOX } } } + bool CCell::checkArrayCell(XLS::CellRef &cellref, const sharedFormula& ArrFmlas) + { + for(auto i:ArrFmlas.arrfmla) + { + if(i.first.inRange(cellref)) + { + cellref = i.second; + return true; + } + } + return false; + } void CCell::After2003Read() { CXlsxFlat* xlsx_flat = dynamic_cast(m_pMainDocument); @@ -1797,6 +1822,21 @@ namespace OOX _INT32 intCache = 0; double realCache = 0; + XLS::CellRef cellref(m_oRow.get() -1, m_oCol.get(), 0, 0); + auto sourceCellRef = cellref; + + if(!sharedFormulas.arrfmla.empty()) + { + if(checkArrayCell(sourceCellRef, sharedFormulas)) + { + if(!m_oFormula.IsInit()) + { + m_oFormula.Init(); + m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeArray; + } + } + } + if(!m_oType.IsInit()) { m_oType.Init(); @@ -2141,25 +2181,23 @@ namespace OOX if(!m_oFormula->m_sText.empty()) { m_oFormula->toBin(pFMLACELL->m_source); - std::wstring wstrRef(m_oRef.get().begin(), m_oRef.get().end()); - XLS::CellRef ref(wstrRef); - sharedFormulas.shrFmla.push_back(std::make_pair(ref, m_oFormula->m_sText)); + + sharedFormulas.shrFmla.push_back(std::make_pair(cellref, m_oFormula->m_sText)); } else if(m_oFormula->m_oSi.IsInit() && sharedFormulas.shrFmla.size() > m_oFormula->m_oSi->GetValue() ) { auto fmla = dynamic_cast(pSource); - std::wstring wstrRef(m_oRef.get().begin(), m_oRef.get().end()); - XLS::CellRef ref(wstrRef); + auto dataPair = sharedFormulas.shrFmla[m_oFormula->m_oSi->GetValue()]; - auto ref1 = dataPair.first; + sourceCellRef = dataPair.first; int coldiff = 0; - if(ref1.colRelative) - coldiff = ref.column - dataPair.first.column; + if(sourceCellRef.colRelative) + coldiff = cellref.column - dataPair.first.column; int rowdiff = 0; - if(ref1.rowRelative) - rowdiff = ref.row - dataPair.first.row; + if(sourceCellRef.rowRelative) + rowdiff = cellref.row - dataPair.first.row; fmla->formula = dataPair.second; if(rowdiff || coldiff) { @@ -2186,10 +2224,40 @@ namespace OOX } else if(m_oFormula->m_oT.get() == SimpleTypes::Spreadsheet::cellformulatypeArray) { - m_oFormula->m_oT = SimpleTypes::Spreadsheet::cellformulatypeNormal; - ptr->m_source = XLS::BaseObjectPtr{pFMLACELL}; + pSHRFMLACELL = new XLSB::SHRFMLACELL(0,0, refs); + ptr->m_source = XLS::BaseObjectPtr{pSHRFMLACELL}; + pSHRFMLACELL->_fmlacell = XLS::BaseObjectPtr{pFMLACELL}; pFMLACELL->m_source = XLS::BaseObjectPtr{pSource}; - m_oFormula->toBin(pFMLACELL->m_source); + if(!m_oFormula->m_sText.empty()) + { + auto arrfmla(new XLSB::ArrFmla(XLS::CellRef())); + pSHRFMLACELL->m_source = XLS::BaseObjectPtr{arrfmla}; + m_oFormula->toBin(pSHRFMLACELL->m_source); + + auto rowPos = new XLS::PtgExp; + rowPos->rowXlsb = cellref.row; + auto colPos = new XLS::PtgExtraCol; + colPos->col = cellref.column; + auto cellFmla = dynamic_cast(pSource); + cellFmla->formula.rgce.addPtg(PtgPtr{rowPos}); + cellFmla->formula.rgcb.addPtg(PtgPtr{colPos}); + if(m_oFormula->m_oRef.IsInit()) + { + XLS::CellRangeRef arrRange(m_oFormula->m_oRef.get()); + sharedFormulas.arrfmla.push_back(std::make_pair(arrRange, cellref)); + } + } + else + { + auto rowPos = new XLS::PtgExp; + rowPos->rowXlsb = sourceCellRef.row; + auto colPos = new XLS::PtgExtraCol; + colPos->col = sourceCellRef.column; + auto cellFmla = dynamic_cast(pSource); + cellFmla->formula.rgce.addPtg(PtgPtr{rowPos}); + cellFmla->formula.rgcb.addPtg(PtgPtr{colPos}); + } + } } @@ -2888,14 +2956,14 @@ namespace OOX hdrPtr->fExAsc = m_oThickTop->GetValue(); } - if(m_oDyDescent.IsInit()) - { - auto ptrAccel(new XLSB::ACCELLTABLE); - ptr->m_ACCELLTABLE = XLS::BaseObjectPtr{ptrAccel}; - auto ptrdescent(new XLSB::RwDescent); - ptrAccel->m_BrtRwDescent = XLS::BaseObjectPtr{ptrdescent}; - ptrdescent->dyDescent = m_oDyDescent->GetValue(); - } + //if(m_oDyDescent.IsInit()) + //{ + //auto ptrAccel(new XLSB::ACCELLTABLE); + //ptr->m_ACCELLTABLE = XLS::BaseObjectPtr{ptrAccel}; + //auto ptrdescent(new XLSB::RwDescent); + // ptrAccel->m_BrtRwDescent = XLS::BaseObjectPtr{ptrdescent}; + // ptrdescent->dyDescent = m_oDyDescent->GetValue(); + //} return objectPtr; } diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.h b/OOXML/XlsxFormat/Worksheets/SheetData.h index 441c4b9766..1b18f455f1 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.h +++ b/OOXML/XlsxFormat/Worksheets/SheetData.h @@ -129,6 +129,7 @@ namespace OOX struct sharedFormula { std::vector> shrFmla; + std::vector> arrfmla; }; class CFormula : public WritingElement { @@ -241,6 +242,7 @@ namespace OOX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); void ReadComment(XmlUtils::CXmlLiteReader& oReader, CCommentItem* pComment); + bool checkArrayCell(XLS::CellRef &cellref, const sharedFormula& ArrFmlas); void AfterRead(); //----------- 2003 From 84f58b7b08a968be543a695902ff67d33fad0e45 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Mon, 5 Feb 2024 15:41:14 +0600 Subject: [PATCH 168/221] Add row col initialization check --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 19b63e487c..7d79964207 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1822,7 +1822,16 @@ namespace OOX _INT32 intCache = 0; double realCache = 0; - XLS::CellRef cellref(m_oRow.get() -1, m_oCol.get(), 0, 0); + XLS::CellRef cellref; + if(m_oRow.IsInit() && m_oCol.IsInit()) + cellref = XLS::CellRef(m_oRow.get() -1, m_oCol.get(), 0, 0); + else if(m_oRef.IsInit()) + { + std::wstring wstringRef(m_oRef.get().begin(), m_oRef.get().end()); + cellref = XLS::CellRef(wstringRef); + } + else + cellref = XLS::CellRef(0, 0, 0, 0); auto sourceCellRef = cellref; if(!sharedFormulas.arrfmla.empty()) @@ -2262,16 +2271,8 @@ namespace OOX } } - if(m_oCol.IsInit()) - oCell->column = m_oCol.get(); - else if(m_oRef.IsInit()) - { - std::wstring strRef(m_oRef.get().begin(), m_oRef.get().end()); - XLS::CellRef reference(strRef); - oCell->column = reference.getColumn(); - } - else - oCell->column = 0; + + oCell->column = cellref.column; if(m_oShowPhonetic.IsInit()) oCell->fPhShow = m_oShowPhonetic->GetValue(); else From 0e114331debd5e6a962699bffc2df3c5053de51f Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Tue, 6 Feb 2024 02:35:06 +0500 Subject: [PATCH 169/221] Fix bug #58244 --- .../Reader/Converter/pptx_text_context.cpp | 22 ++++++++++--- OdfFile/Reader/Converter/pptx_text_context.h | 2 ++ .../style_paragraph_properties_pptx.cpp | 32 ++++++++++++++++--- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/OdfFile/Reader/Converter/pptx_text_context.cpp b/OdfFile/Reader/Converter/pptx_text_context.cpp index 78574034bf..ccc4b7a24e 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.cpp +++ b/OdfFile/Reader/Converter/pptx_text_context.cpp @@ -98,6 +98,8 @@ public: void start_comment (); std::wstring end_comment(); + std::wstring get_last_paragraph_style_name(); + bool in_list_; bool process_layouts_; @@ -129,6 +131,7 @@ private: std::wstringstream paragraph_; //перманенто скидываемые параграфы std::wstringstream run_; //перманенто скидываемые куски с быть может разными свойствами + std::wstring last_paragraph_style_name_; std::wstring paragraph_style_name_; std::wstring span_style_name_; @@ -200,9 +203,10 @@ void pptx_text_context::Impl::start_paragraph(const std::wstring & styleName) text_.str(std::wstring()); field_value_.str(std::wstring()); } - paragraph_style_name_ = styleName; - in_paragraph = true; - is_predump = false; + last_paragraph_style_name_ = paragraph_style_name_; + paragraph_style_name_ = styleName; + in_paragraph = true; + is_predump = false; } void pptx_text_context::Impl::end_paragraph() @@ -397,7 +401,7 @@ void pptx_text_context::Impl::write_pPr(std::wostream & strm) const std::wstring & paragraphNodes = get_styles_context().paragraph_nodes().str(); - if (level < 0 && paragraphAttr.length() < 1 && !paragraphNodes.empty()) return; + if (level < 0 && paragraphAttr.length() < 1 && paragraphNodes.empty()) return; strm << L"process_layouts_ = val; } +std::wstring pptx_text_context::get_last_paragraph_style_name() +{ + return impl_->get_last_paragraph_style_name(); +} + } } diff --git a/OdfFile/Reader/Converter/pptx_text_context.h b/OdfFile/Reader/Converter/pptx_text_context.h index fcc55f6372..ffb9d306a2 100644 --- a/OdfFile/Reader/Converter/pptx_text_context.h +++ b/OdfFile/Reader/Converter/pptx_text_context.h @@ -111,6 +111,8 @@ public: styles_context & get_styles_context(); void set_process_layouts(bool val); + + std::wstring get_last_paragraph_style_name(); private: diff --git a/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp b/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp index 12ca330a5b..1735eb6972 100644 --- a/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp +++ b/OdfFile/Reader/Format/style_paragraph_properties_pptx.cpp @@ -35,6 +35,8 @@ #include #include "../../Reader/Converter/pptx_conversion_context.h" +#include "../../Reader/Format/odf_document.h" +#include "../../Reader/Format/odfcontext.h" #include "../../DataTypes/borderstyle.h" namespace cpdoccore { @@ -452,13 +454,32 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co } } } - if (fo_margin_top_/* || fo_margin_*/) + if (fo_margin_top_) { + style_instance* last_paragraph_style = Context.root()->odf_context().styleContainer().style_by_name( + Context.get_text_context().get_last_paragraph_style_name(), + style_family::Paragraph, + false + ); + CP_XML_NODE(L"a:spcBef") { if (fo_margin_top_->get_type() == length_or_percent::Length) { - std::wstring w_before = pptx_process_margin(fo_margin_top_, length::pt, 100.0); + _CP_OPT(length_or_percent) margin_top = fo_margin_top_; + if (last_paragraph_style) + { + const style_paragraph_properties* last_style_paragraph_props = last_paragraph_style->content()->get_style_paragraph_properties(); + const paragraph_format_properties& last_paragraph_props = last_paragraph_style->content()->get_style_paragraph_properties()->content_; + length_or_percent last_margin_bottom = last_paragraph_props.fo_margin_bottom_.get_value_or(length_or_percent(length(0.0, length::cm))); + + if (fo_margin_top_->get_length().get_value_unit(length::cm) > last_margin_bottom.get_length().get_value_unit(length::cm)) + margin_top = _CP_OPT(length_or_percent)(length(fo_margin_top_->get_length().get_value_unit(length::cm) - last_margin_bottom.get_length().get_value_unit(length::cm), length::cm)); + else + margin_top = _CP_OPT(length_or_percent)(length(0.0, length::cm)); + } + + std::wstring w_before = pptx_process_margin(margin_top, length::pt, 100.0); CP_XML_NODE(L"a:spcPts") { CP_XML_ATTR(L"val",w_before); @@ -475,16 +496,16 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co } } } - if (fo_margin_bottom_/* || fo_margin_*/) + if (fo_margin_bottom_) { CP_XML_NODE(L"a:spcAft") { if (fo_margin_bottom_->get_type() == length_or_percent::Length) { - std::wstring w_after = pptx_process_margin(fo_margin_bottom_, length::pt, 100.0); + std::wstring w_after = pptx_process_margin(fo_margin_bottom_, length::pt, 100.0); CP_XML_NODE(L"a:spcPts") { - CP_XML_ATTR(L"val",w_after); + CP_XML_ATTR(L"val", w_after); } } else @@ -498,6 +519,7 @@ void paragraph_format_properties::pptx_convert(oox::pptx_conversion_context & Co } } } + //if (style_punctuation_wrap_) //{ // std::wstring w_val; From cce60166a413b3a7cac32f68c86918512becd461 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 6 Feb 2024 03:42:48 +0300 Subject: [PATCH 170/221] Add extract mode in x2ttester --- Test/Applications/x2tTester/README.md | 21 +- Test/Applications/x2tTester/x2tTester.cpp | 245 +++++++++++++++++++--- Test/Applications/x2tTester/x2tTester.h | 42 +++- 3 files changed, 271 insertions(+), 37 deletions(-) diff --git a/Test/Applications/x2tTester/README.md b/Test/Applications/x2tTester/README.md index f8a03581a4..1b35855423 100644 --- a/Test/Applications/x2tTester/README.md +++ b/Test/Applications/x2tTester/README.md @@ -1,7 +1,9 @@ CONFIGURATION ============= -You need to create an xml configuration file. It must contain: +## Default conversion + +You need to create an xml configuration file. It contains: # root of xml @@ -95,8 +97,23 @@ You need to create an xml configuration file. It must contain: docx txt pptx xlsx txt doc pdf +## Extraction +x2ttester can extract files with the required output extension instead of default x2t conversion. Set extraction mode: -You can use the following templates: + (non-required) sets extraction mode (default - "0") + + +When `extract` is "1", you can set the `output` parameter to determine which exts will be extracted. Default `output` is `emf wmf`. +Params `input`, `inputDirectory`, `outputDirectory`, `cores` works the same. + +Extract mode has additional options: + + (non-required) converts non-zip office files into docx (e.g. pdf) (default - "0"). + + +The conversion params in `convertBeforeExtract` are the same as the default conversion. + +## Templates # main xml config diff --git a/Test/Applications/x2tTester/x2tTester.cpp b/Test/Applications/x2tTester/x2tTester.cpp index b594a8ae4b..cbbdc6a451 100644 --- a/Test/Applications/x2tTester/x2tTester.cpp +++ b/Test/Applications/x2tTester/x2tTester.cpp @@ -119,22 +119,23 @@ std::vector CFormatsList::GetAllExts() const { std::vector all_formats; - for(auto& val : m_documents) + for (const auto& val : m_documents) all_formats.push_back(val); - for(auto& val : m_presentations) + for (const auto& val : m_presentations) all_formats.push_back(val); - for(auto& val : m_spreadsheets) + for (const auto& val : m_spreadsheets) all_formats.push_back(val); - for(auto& val : m_images) + for (const auto& val : m_images) all_formats.push_back(val); - for(auto& val : m_crossplatform) + for (const auto& val : m_crossplatform) all_formats.push_back(val); - all_formats.push_back(m_pdf); + if (!m_pdf.empty()) + all_formats.push_back(m_pdf); return all_formats; } @@ -259,6 +260,16 @@ CFormatsList CFormatsList::GetOutputExts() return list; } +CFormatsList CFormatsList::GetExtractExts() +{ + CFormatsList list; + + list.m_images.push_back(L"emf"); + list.m_images.push_back(L"wmf"); + + return list; +} + Cx2tTester::Cx2tTester(const std::wstring& configPath) { m_bIsUseSystemFonts = true; @@ -269,14 +280,22 @@ Cx2tTester::Cx2tTester(const std::wstring& configPath) m_bIsFilenamePassword = true; m_bTroughConversion = false; m_bSaveEnvironment = false; + + m_bExtract = false; + m_bConvertBeforeExtract = false; + m_defaultCsvDelimiter = L";"; m_defaultCsvTxtEndcoding = L"UTF-8"; m_inputFormatsList = CFormatsList::GetDefaultExts(); m_outputFormatsList = CFormatsList::GetOutputExts(); + m_extractFormatsList = CFormatsList::GetExtractExts(); m_timeout = 5 * 60; // 5 min + SetConfig(configPath); + m_errorsXmlDirectory = m_outputDirectory + FILE_SEPARATOR_STR + L"_errors"; m_troughConversionDirectory = m_outputDirectory + FILE_SEPARATOR_STR + L"_t"; + m_tempDirectory = m_outputDirectory + FILE_SEPARATOR_STR + L"_temp"; m_fontsDirectory = NSFile::GetProcessDirectory() + FILE_SEPARATOR_STR + L"fonts"; @@ -335,6 +354,12 @@ Cx2tTester::~Cx2tTester() m_reportCS.DeleteCriticalSection(); m_outputCS.DeleteCriticalSection(); m_reportStream.CloseFile(); + + for(auto&& val : m_deleteLaterFiles) + NSFile::CFileBinary::Remove(val); + + for(auto&& val : m_deleteLaterDirectories) + NSDirectory::DeleteDirectory(val); } void Cx2tTester::SetConfig(const std::wstring& configPath) @@ -366,6 +391,8 @@ void Cx2tTester::SetConfig(const std::wstring& configPath) else if(name == L"troughConversion" && !node.GetText().empty()) m_bTroughConversion = std::stoi(node.GetText()); else if(name == L"saveEnvironment" && !node.GetText().empty()) m_bSaveEnvironment = std::stoi(node.GetText()); else if(name == L"defaultCsvTxtEncoding" && !node.GetText().empty()) m_defaultCsvTxtEndcoding = node.GetText(); + else if(name == L"extract" && !node.GetText().empty()) m_bExtract = std::stoi(node.GetText()); + else if(name == L"convertBeforeExtract" && !node.GetText().empty()) m_bConvertBeforeExtract = std::stoi(node.GetText()); else if(name == L"defaultCsvDelimiter" && !node.GetText().empty()) m_defaultCsvDelimiter = (wchar_t)std::stoi(node.GetText(), nullptr, 16); else if(name == L"inputFilesList" && !node.GetText().empty()) { @@ -418,17 +445,39 @@ void Cx2tTester::SetConfig(const std::wstring& configPath) exit(-1); } - if(default_input_formats) + if (default_input_formats) m_inputExts = m_inputFormatsList.GetAllExts(); - if(default_output_formats) - m_outputExts = m_outputFormatsList.GetAllExts(); + if (default_output_formats) + { + if (m_bExtract) + m_outputExts = m_extractFormatsList.GetAllExts(); + else + m_outputExts = m_outputFormatsList.GetAllExts(); + } + } void Cx2tTester::Start() { // setup timer m_timeStart = NSTimers::GetTickCount(); + m_outputDirectory = CorrectPathW(m_outputDirectory); + m_errorsXmlDirectory = CorrectPathW(m_errorsXmlDirectory); + m_troughConversionDirectory = CorrectPathW(m_troughConversionDirectory); + + // setup & clear output folder + if(NSDirectory::Exists(m_outputDirectory)) + NSDirectory::DeleteDirectory(m_outputDirectory); + + NSDirectory::CreateDirectory(m_outputDirectory); + + // setup & clear errors folder + if(NSDirectory::Exists(m_errorsXmlDirectory)) + NSDirectory::DeleteDirectory(m_errorsXmlDirectory); + + NSDirectory::CreateDirectory(m_errorsXmlDirectory); + // check fonts CApplicationFontsWorker fonts_worker; fonts_worker.m_sDirectory = m_fontsDirectory; @@ -449,23 +498,6 @@ void Cx2tTester::Start() NSFonts::IApplicationFonts* pFonts = fonts_worker.Check(); RELEASEINTERFACE(pFonts); - m_outputDirectory = CorrectPathW(m_outputDirectory); - m_errorsXmlDirectory = CorrectPathW(m_errorsXmlDirectory); - m_troughConversionDirectory = CorrectPathW(m_troughConversionDirectory); - - // setup & clear output folder - if(NSDirectory::Exists(m_outputDirectory)) - NSDirectory::DeleteDirectory(m_outputDirectory); - - NSDirectory::CreateDirectory(m_outputDirectory); - - // setup & clear errors folder - if(NSDirectory::Exists(m_errorsXmlDirectory)) - NSDirectory::DeleteDirectory(m_errorsXmlDirectory); - - NSDirectory::CreateDirectory(m_errorsXmlDirectory); - - std::vector files = NSDirectory::GetFiles(m_inputDirectory, true); for(int i = 0; i < files.size(); i++) { @@ -486,6 +518,54 @@ void Cx2tTester::Start() if(files.size() < m_maxProc) m_maxProc = files.size(); + if (m_bExtract) + { + COfficeFileFormatChecker checker; + COfficeUtils utils; + std::vector files_to_convert; + + for (size_t i = 0; i < files.size(); i++) + if (utils.IsArchive(files[i]) == S_FALSE && checker.isOfficeFile(files[i])) + { + if (m_bConvertBeforeExtract) + files_to_convert.push_back(files[i]); + files.erase(files.begin() + i); + } + + if (!files_to_convert.empty()) + { + if(NSDirectory::Exists(m_tempDirectory)) + NSDirectory::DeleteDirectory(m_tempDirectory); + + NSDirectory::CreateDirectories(m_tempDirectory); + + auto copy_inputDirectory = m_inputDirectory; + auto copy_outputDirectory = m_outputDirectory; + auto copy_outputExts = m_outputExts; + + m_outputDirectory = m_tempDirectory; + m_outputExts = {L"docx"}; + + Convert(files_to_convert, true, true); + + m_outputDirectory = copy_outputDirectory; + m_outputExts = copy_outputExts; + + m_inputDirectory = m_tempDirectory; + std::vector temp_files = NSDirectory::GetFiles(m_tempDirectory, true); + Extract(temp_files); + + m_inputDirectory = copy_inputDirectory; + } + + Extract(files); + + if(NSDirectory::Exists(m_tempDirectory)) + NSDirectory::DeleteDirectory(m_tempDirectory); + + return; + } + // conversion in _t directory -> _t directory to output if(m_bTroughConversion) { @@ -512,12 +592,6 @@ void Cx2tTester::Start() Convert(files); WriteTime(); - - for(auto&& val : m_deleteLaterFiles) - NSFile::CFileBinary::Remove(val); - - for(auto&& val : m_deleteLaterDirectories) - NSDirectory::DeleteDirectory(val); } void Cx2tTester::Convert(const std::vector& files, bool bNoDirectory, bool bTrough) @@ -652,6 +726,47 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto while(!IsAllFree()) NSThreads::Sleep(150); } +void Cx2tTester::Extract(const std::vector& files) +{ + for (int i = 0; i < files.size(); i++) + { + const std::wstring& input_file = files[i]; + std::wstring input_filename = NSFile::GetFileName(input_file); + std::wstring input_file_directory = NSFile::GetDirectoryName(input_file); + std::wstring input_subfolders = input_file_directory.substr(m_inputDirectory.size(), + input_file_directory.size() - m_inputDirectory.size()); + std::wstring output_files_directory = m_outputDirectory + input_subfolders + FILE_SEPARATOR_STR + input_filename; + + if(!NSDirectory::Exists(output_files_directory)) + NSDirectory::CreateDirectories(output_files_directory); + + // waiting... + do + { + NSThreads::Sleep(50); + } while(IsAllBusy()); + + m_coresCS.Enter(); + + // setup & start new extractor + CExtractor *extractor = new CExtractor(this); + extractor->SetInputFile(input_file); + extractor->SetOutputFilesDirectory(output_files_directory); + extractor->SetExtractExts(m_outputExts); + extractor->SetFilesCount(files.size(), i + 1); + extractor->DestroyOnFinish(); + m_currentProc++; + + m_coresCS.Leave(); + + extractor->Start(0); + } + + // waiting all procs end + while(!IsAllFree()) + NSThreads::Sleep(150); +} + void Cx2tTester::WriteReportHeader() { CTemporaryCS CS(&m_reportCS); @@ -844,7 +959,7 @@ DWORD CConverter::ThreadProc() for(int i = 0; i < m_outputExts.size(); i++) { std::wstring output_ext = L"."+ m_outputExts[i]; - int output_format = checker.GetFormatByExtension(output_ext); + int output_format = m_checker.GetFormatByExtension(output_ext); std::wstring xml_params_filename = input_filename + L"_" + output_ext + L".xml"; std::wstring xml_params_file = m_outputFilesDirectory + FILE_SEPARATOR_STR + xml_params_filename; @@ -1077,4 +1192,68 @@ DWORD CConverter::ThreadProc() return 0; } +CExtractor::CExtractor(Cx2tTester* internal) : m_internal(internal) +{ +} +CExtractor::~CExtractor() +{ + Stop(); +} +void CExtractor::SetInputFile(const std::wstring& inputFile) +{ + m_inputFile = inputFile; +} +void CExtractor::SetOutputFilesDirectory(const std::wstring& outputFilesDirectory) +{ + m_outputFilesDirectory = outputFilesDirectory; +} +void CExtractor::SetExtractExts(const std::vector& extractExts) +{ + m_extractExts = extractExts; +} +void CExtractor::SetFilesCount(int totalFiles, int currFile) +{ + m_totalFiles = totalFiles; + m_currFile = currFile; +} + +DWORD CExtractor::ThreadProc() +{ + std::wstring input_filename = NSFile::GetFileName(m_inputFile); + std::wstring input_ext = L'.' + NSFile::GetFileExtention(input_filename); + std::wstring input_filename_no_ext = input_filename.substr(0, input_filename.size() - input_ext.size()); + + for (size_t i = 0; i < m_extractExts.size(); i++) + { + const std::wstring& extract_ext = m_extractExts[i]; + std::wstring output_folder = m_outputFilesDirectory + FILE_SEPARATOR_STR + extract_ext; + + if (NSDirectory::Exists(output_folder)) + NSDirectory::DeleteDirectory(output_folder); + + NSDirectory::CreateDirectories(output_folder); + + std::wstring temp_folder = NSDirectory::CreateDirectoryWithUniqueName(output_folder); + m_utils.ExtractToDirectory(m_inputFile, temp_folder, nullptr, false); + + auto unzip_files = NSDirectory::GetFiles(temp_folder, true); + bool delete_empty = true; + for (const auto& file : unzip_files) + { + if (NSFile::GetFileExtention(file) == m_extractExts[i]) + { + delete_empty = false; + NSFile::CFileBinary::Move(file, output_folder + FILE_SEPARATOR_STR +NSFile::GetFileName(file)); + } + } + if (delete_empty) + NSDirectory::DeleteDirectory(output_folder); + NSDirectory::DeleteDirectory(temp_folder); + } + if (NSDirectory::GetFilesCount(m_outputFilesDirectory, true) == 0) + NSDirectory::DeleteDirectory(m_outputFilesDirectory); + + m_internal->m_currentProc--; + return 0; +} diff --git a/Test/Applications/x2tTester/x2tTester.h b/Test/Applications/x2tTester/x2tTester.h index 47dfac8605..01ce96ada2 100644 --- a/Test/Applications/x2tTester/x2tTester.h +++ b/Test/Applications/x2tTester/x2tTester.h @@ -55,7 +55,10 @@ public: static CFormatsList GetDefaultExts(); // all writable exts - static CFormatsList GetOutputExts(); + static CFormatsList GetOutputExts(); + + // default exts to extract + static CFormatsList GetExtractExts(); private: std::vector m_documents; @@ -111,6 +114,7 @@ private: // parse string like "docx txt" into vector std::vector ParseExtensionsString(std::wstring extensions, const CFormatsList& fl); void Convert(const std::vector& files, bool bNoDirectory = false, bool bTrough = false); + void Extract(const std::vector& files); // takes from config std::wstring m_reportFile; @@ -121,6 +125,7 @@ private: std::wstring m_errorsXmlDirectory; std::wstring m_troughConversionDirectory; std::wstring m_fontsDirectory; + std::wstring m_tempDirectory; // fonts bool m_bIsUseSystemFonts; @@ -137,6 +142,7 @@ private: // lists CFormatsList m_inputFormatsList; CFormatsList m_outputFormatsList; + CFormatsList m_extractFormatsList; bool m_bIsErrorsOnly; bool m_bIsTimestamp; @@ -157,6 +163,12 @@ private: std::vector m_deleteLaterFiles; std::vector m_deleteLaterDirectories; + + // extract files with output_ext from input_files + bool m_bExtract; + + // convert to docx before extract + bool m_bConvertBeforeExtract; }; // generates temp xml, convert, calls m_internal->writeReport @@ -194,7 +206,7 @@ private: std::wstring m_inputExt; std::wstring m_fontsDirectory; - COfficeFileFormatChecker checker; + COfficeFileFormatChecker m_checker; std::wstring m_x2tPath; std::wstring m_errorsXmlDirectory; @@ -214,4 +226,30 @@ private: unsigned long m_timeout; }; +// extracts files from office files +class CExtractor : public NSThreads::CBaseThread +{ +public: + CExtractor(Cx2tTester* internal); + virtual ~CExtractor(); + + void SetInputFile(const std::wstring& inputFile); + void SetOutputFilesDirectory(const std::wstring& outputFilesDirectory); + void SetExtractExts(const std::vector& extractExts); + void SetFilesCount(int totalFiles, int currFile); + + virtual DWORD ThreadProc(); + +private: + Cx2tTester* m_internal; + std::wstring m_inputFile; + std::wstring m_outputFilesDirectory; + std::vector m_extractExts; + COfficeUtils m_utils; + + int m_totalFiles; + int m_currFile; + +}; + #endif // X2T_TESTER_H From eb8e7866aa195b63cf9bd9a7172cda3496c5c991 Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 6 Feb 2024 07:57:47 +0300 Subject: [PATCH 171/221] Add diff-only arg in standardtester --- Test/Applications/StandardTester/main.cpp | 493 ++++++++++++---------- 1 file changed, 263 insertions(+), 230 deletions(-) diff --git a/Test/Applications/StandardTester/main.cpp b/Test/Applications/StandardTester/main.cpp index d68817925d..fa29715f0f 100644 --- a/Test/Applications/StandardTester/main.cpp +++ b/Test/Applications/StandardTester/main.cpp @@ -27,6 +27,19 @@ enum CheckResultCode bool g_save_x2t_xml = false; +int GetPagesCount(const std::wstring& dir) +{ + int nCount = 0; + std::vector files = NSDirectory::GetFiles(dir, false); + for (std::vector::iterator i = files.begin(); i != files.end(); i++) + { + std::wstring sExt = NSFile::GetFileExtention(*i); + if (sExt == L"png") + ++nCount; + } + return nCount; +} + class CConverter; class CInternalWorker { @@ -63,6 +76,7 @@ public: bool m_bIsStandard; bool m_bIsDiffAllInOne; + bool m_bDiffOnly{false}; NSCriticalSection::CRITICAL_SECTION m_oCS; NSCriticalSection::CRITICAL_SECTION m_oCS_OfficeUtils; @@ -121,6 +135,13 @@ public: void OpenDir(std::wstring sDir) { m_sInputFolder = sDir; + if (m_bDiffOnly) + { + m_files = NSDirectory::GetDirectories(m_sInputFolder); + m_nCount = (int)m_files.size(); + return; + } + std::vector arFiles = NSDirectory::GetFiles(sDir, true); for (std::vector::iterator iter = arFiles.begin(); iter != arFiles.end(); iter++) { @@ -268,6 +289,224 @@ public: NSFile::CFileBinary::SaveToFile(sLogFile, sLogContent, true); } + + + int GenerateDiff(const std::wstring strDirIn, const std::wstring strDirOut, const std::wstring strDiffs) + { + int nCountInPages = GetPagesCount(strDirIn); + int nCountOutPages = GetPagesCount(strDirOut); + int checkCode = crcEqual; + + if (nCountInPages != nCountOutPages) + { + if (nCountInPages > nCountOutPages) + nCountInPages = nCountOutPages; + + if (!NSDirectory::Exists(strDiffs)) + NSDirectory::CreateDirectories(CorrectPathW(strDiffs)); + + std::wstring sFilePagesDiff = strDiffs + L"/pages_count"; + NSFile::CFileBinary oFile; + oFile.CreateFileW(sFilePagesDiff); + oFile.CloseFile(); + + checkCode |= crcPageCount; + } + + for (int nPage = 0; nPage < nCountInPages; ++nPage) + { + std::wstring sPageI = strDirIn + L"/image" + std::to_wstring(nPage + 1) + L".png"; + std::wstring sPageO = strDirOut + L"/image" + std::to_wstring(nPage + 1) + L".png"; + std::wstring sPageDiff = strDiffs + L"/image" + std::to_wstring(nPage + 1) + L".png"; + + CBgraFrame frameI; + frameI.OpenFile(sPageI); + + CBgraFrame frameO; + frameO.OpenFile(sPageO); + + int nW_I = frameI.get_Width(); + int nH_I = frameI.get_Height(); + + int nW_O = frameO.get_Width(); + int nH_O = frameO.get_Height(); + + if (nW_I != nW_O || nH_I != nH_O) + { + if (!NSDirectory::Exists(strDiffs)) + NSDirectory::CreateDirectories(CorrectPathW(strDiffs)); + + std::wstring sFilePagesDiff = sPageDiff; + NSFile::CFileBinary oFile; + oFile.CreateFileW(sPageDiff); + oFile.WriteStringUTF8(L"sizes!"); + oFile.CloseFile(); + + checkCode |= crcPageSize; + continue; + } + + BYTE* pDataI = frameI.get_Data(); + BYTE* pDataO = frameO.get_Data(); + size_t sizeMemory = 4 * nW_I * nH_I; + + if (0 == memcmp(pDataI, pDataO, sizeMemory)) + continue; + + sizeMemory = nW_I * nH_I; + + int nEpsilonEps = 3; + int nEpsilonNatural = 5; + + int nDivExist = 0; + for (int indexPixH = 0; indexPixH < nH_I; indexPixH++) + { + for (int indexPixW = 0; indexPixW < nW_I; indexPixW++) + { + if (pDataI[0] != pDataO[0] || pDataI[1] != pDataO[1] || pDataI[2] != pDataO[2]) + { + // test epsilon natural + if ((abs(pDataI[0] - pDataO[0]) < nEpsilonNatural) && + (abs(pDataI[1] - pDataO[1]) < nEpsilonNatural) && + (abs(pDataI[2] - pDataO[2]) < nEpsilonNatural)) + { + pDataI += 4; + pDataO += 4; + continue; + } + + // test epsilon left, right, top, bottom + int nEpsUp = nEpsilonEps; + if (indexPixH > 0) + { + BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH - 1) * nW_I + 4 * indexPixW; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsUp = nEpsilonEps - 1; + } + } + + int nEpsDown = nEpsilonEps; + if (indexPixH < (nH_I - 1)) + { + BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH + 1) * nW_I + 4 * indexPixW; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsDown = nEpsilonEps - 1; + } + } + + int nEpsLeft = nEpsilonEps; + if (indexPixW > 0) + { + BYTE* pByteI = pDataI - 4; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsLeft = nEpsilonEps - 1; + } + } + + int nEpsRight = nEpsilonEps; + if (indexPixW < (nW_I - 1)) + { + BYTE* pByteI = pDataI + 4; + + if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && + (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && + (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) + { + nEpsRight = nEpsilonEps - 1; + } + } + + if ((nEpsLeft < nEpsilonEps) || + (nEpsRight < nEpsilonEps) || + (nEpsUp < nEpsilonEps) || + (nEpsDown < nEpsilonEps)) + { + pDataI += 4; + pDataO += 4; + continue; + } + + ++nDivExist; + + if (pDataO[0] == 0x00 && pDataO[1] == 0x00 && pDataO[2] == 0xFF) + { + pDataO[0] = 0xFF; + pDataO[1] = 0x00; + pDataO[2] = 0x00; + } + else + { + pDataO[0] = 0x00; + pDataO[1] = 0x00; + pDataO[2] = 0xFF; + } + } + pDataI += 4; + pDataO += 4; + } + } + + if (nDivExist > 7) + { + if (!NSDirectory::Exists(strDiffs)) + NSDirectory::CreateDirectories(CorrectPathW(strDiffs)); + + if (!m_bIsDiffAllInOne) + { + frameO.SaveFile(sPageDiff, 4); + } + else + { + CBgraFrame frameOSrc; + frameOSrc.OpenFile(sPageO); + + BYTE* pData1 = frameI.get_Data(); + BYTE* pData2 = frameOSrc.get_Data(); + BYTE* pData3 = frameO.get_Data(); + + int nRowW = 4 * nW_I; + BYTE* pDataAll = new BYTE[3 * nRowW * nH_I]; + BYTE* pDataAllSrc = pDataAll; + for (int j = 0; j < nH_I; j++) + { + memcpy(pDataAll, pData1, nRowW); + pDataAll += nRowW; + pData1 += nRowW; + + memcpy(pDataAll, pData2, nRowW); + pDataAll += nRowW; + pData2 += nRowW; + + memcpy(pDataAll, pData3, nRowW); + pDataAll += nRowW; + pData3 += nRowW; + } + + CBgraFrame oFrameAll; + oFrameAll.put_Data(pDataAllSrc); + oFrameAll.put_Width(3 * nW_I); + oFrameAll.put_Height(nH_I); + oFrameAll.put_Stride(-3 * nRowW); + oFrameAll.SaveFile(sPageDiff, 4); + } + + checkCode |= crcPageDiffs; + } + } + return checkCode; + } }; class CConverter : public NSThreads::CBaseThread @@ -277,6 +516,7 @@ public: std::wstring m_file; std::wstring m_folder_dst; int m_format; + bool m_bDiffOnly{false}; public: CConverter(CInternalWorker* pWorker) : NSThreads::CBaseThread() @@ -291,6 +531,21 @@ public: virtual DWORD ThreadProc() { + if (m_bDiffOnly) + { + std::wstring strDirIn = m_file; + std::wstring strDirOut = m_folder_dst; + + std::wstring strDiffsMain = NSFile::GetDirectoryName(strDirOut) + L"/DIFF"; + std::wstring strDiffs = strDiffsMain + L"/" + NSFile::GetFileName(m_file); + + int checkCode = m_pInternal->GenerateDiff(strDirIn, strDirOut, strDiffs); + + m_bRunThread = FALSE; + m_pInternal->OnConvertFile(this, 0, 0, checkCode); + + return 0; + } bool bIsOfficeFile = true; if (true) { @@ -393,223 +648,7 @@ public: std::wstring strDiffsMain = NSFile::GetDirectoryName(strDirOut) + L"/DIFF"; std::wstring strDiffs = strDiffsMain + L"/" + NSFile::GetFileName(m_file); - int nCountInPages = GetPagesCount(strDirIn); - int nCountOutPages = GetPagesCount(strDirOut); - - if (nCountInPages != nCountOutPages) - { - if (!NSDirectory::Exists(strDiffsMain)) - NSDirectory::CreateDirectory(strDiffsMain); - if (!NSDirectory::Exists(strDiffs)) - NSDirectory::CreateDirectory(strDiffs); - - if (nCountInPages > nCountOutPages) - nCountInPages = nCountOutPages; - - std::wstring sFilePagesDiff = strDiffs + L"/pages_count"; - NSFile::CFileBinary oFile; - oFile.CreateFileW(sFilePagesDiff); - oFile.CloseFile(); - - checkCode |= crcPageCount; - } - - for (int nPage = 0; nPage < nCountInPages; ++nPage) - { - std::wstring sPageI = strDirIn + L"/image" + std::to_wstring(nPage + 1) + L".png"; - std::wstring sPageO = strDirOut + L"/image" + std::to_wstring(nPage + 1) + L".png"; - std::wstring sPageDiff = strDiffs + L"/image" + std::to_wstring(nPage + 1) + L".png"; - - CBgraFrame frameI; - frameI.OpenFile(sPageI); - - CBgraFrame frameO; - frameO.OpenFile(sPageO); - - int nW_I = frameI.get_Width(); - int nH_I = frameI.get_Height(); - - int nW_O = frameO.get_Width(); - int nH_O = frameO.get_Height(); - - if (nW_I != nW_O || nH_I != nH_O) - { - if (!NSDirectory::Exists(strDiffsMain)) - NSDirectory::CreateDirectory(strDiffsMain); - if (!NSDirectory::Exists(strDiffs)) - NSDirectory::CreateDirectory(strDiffs); - - std::wstring sFilePagesDiff = sPageDiff; - NSFile::CFileBinary oFile; - oFile.CreateFileW(sPageDiff); - oFile.WriteStringUTF8(L"sizes!"); - oFile.CloseFile(); - - checkCode |= crcPageSize; - continue; - } - - BYTE* pDataI = frameI.get_Data(); - BYTE* pDataO = frameO.get_Data(); - size_t sizeMemory = 4 * nW_I * nH_I; - - if (0 == memcmp(pDataI, pDataO, sizeMemory)) - continue; - - sizeMemory = nW_I * nH_I; - - int nEpsilonEps = 3; - int nEpsilonNatural = 5; - - int nDivExist = 0; - for (int indexPixH = 0; indexPixH < nH_I; indexPixH++) - { - for (int indexPixW = 0; indexPixW < nW_I; indexPixW++) - { - if (pDataI[0] != pDataO[0] || pDataI[1] != pDataO[1] || pDataI[2] != pDataO[2]) - { - // test epsilon natural - if ((abs(pDataI[0] - pDataO[0]) < nEpsilonNatural) && - (abs(pDataI[1] - pDataO[1]) < nEpsilonNatural) && - (abs(pDataI[2] - pDataO[2]) < nEpsilonNatural)) - { - pDataI += 4; - pDataO += 4; - continue; - } - - // test epsilon left, right, top, bottom - int nEpsUp = nEpsilonEps; - if (indexPixH > 0) - { - BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH - 1) * nW_I + 4 * indexPixW; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsUp = nEpsilonEps - 1; - } - } - - int nEpsDown = nEpsilonEps; - if (indexPixH < (nH_I - 1)) - { - BYTE* pByteI = frameI.get_Data() + 4 * (indexPixH + 1) * nW_I + 4 * indexPixW; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsDown = nEpsilonEps - 1; - } - } - - int nEpsLeft = nEpsilonEps; - if (indexPixW > 0) - { - BYTE* pByteI = pDataI - 4; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsLeft = nEpsilonEps - 1; - } - } - - int nEpsRight = nEpsilonEps; - if (indexPixW < (nW_I - 1)) - { - BYTE* pByteI = pDataI + 4; - - if ((abs(pByteI[0] - pDataO[0]) < nEpsilonEps) && - (abs(pByteI[1] - pDataO[1]) < nEpsilonEps) && - (abs(pByteI[2] - pDataO[2]) < nEpsilonEps)) - { - nEpsRight = nEpsilonEps - 1; - } - } - - if ((nEpsLeft < nEpsilonEps) || - (nEpsRight < nEpsilonEps) || - (nEpsUp < nEpsilonEps) || - (nEpsDown < nEpsilonEps)) - { - pDataI += 4; - pDataO += 4; - continue; - } - - ++nDivExist; - - if (pDataO[0] == 0x00 && pDataO[1] == 0x00 && pDataO[2] == 0xFF) - { - pDataO[0] = 0xFF; - pDataO[1] = 0x00; - pDataO[2] = 0x00; - } - else - { - pDataO[0] = 0x00; - pDataO[1] = 0x00; - pDataO[2] = 0xFF; - } - } - pDataI += 4; - pDataO += 4; - } - } - - if (nDivExist > 7) - { - if (!NSDirectory::Exists(strDiffsMain)) - NSDirectory::CreateDirectory(strDiffsMain); - if (!NSDirectory::Exists(strDiffs)) - NSDirectory::CreateDirectory(strDiffs); - - if (!m_pInternal->m_bIsDiffAllInOne) - { - frameO.SaveFile(sPageDiff, 4); - } - else - { - CBgraFrame frameOSrc; - frameOSrc.OpenFile(sPageO); - - BYTE* pData1 = frameI.get_Data(); - BYTE* pData2 = frameOSrc.get_Data(); - BYTE* pData3 = frameO.get_Data(); - - int nRowW = 4 * nW_I; - BYTE* pDataAll = new BYTE[3 * nRowW * nH_I]; - BYTE* pDataAllSrc = pDataAll; - for (int j = 0; j < nH_I; j++) - { - memcpy(pDataAll, pData1, nRowW); - pDataAll += nRowW; - pData1 += nRowW; - - memcpy(pDataAll, pData2, nRowW); - pDataAll += nRowW; - pData2 += nRowW; - - memcpy(pDataAll, pData3, nRowW); - pDataAll += nRowW; - pData3 += nRowW; - } - - CBgraFrame oFrameAll; - oFrameAll.put_Data(pDataAllSrc); - oFrameAll.put_Width(3 * nW_I); - oFrameAll.put_Height(nH_I); - oFrameAll.put_Stride(-3 * nRowW); - oFrameAll.SaveFile(sPageDiff, 4); - } - - checkCode |= crcPageDiffs; - } - } + checkCode = m_pInternal->GenerateDiff(strDirIn, strDirOut, strDiffs); } m_bRunThread = FALSE; @@ -617,19 +656,6 @@ public: m_pInternal->OnConvertFile(this, nReturnCode, (int)(dwTime2 - dwTime1), checkCode); return 0; } - - int GetPagesCount(const std::wstring& dir) - { - int nCount = 0; - std::vector files = NSDirectory::GetFiles(dir, false); - for (std::vector::iterator i = files.begin(); i != files.end(); i++) - { - std::wstring sExt = NSFile::GetFileExtention(*i); - if (sExt == L"png") - ++nCount; - } - return nCount; - } }; CConverter* CInternalWorker::GetNextConverter() @@ -640,6 +666,7 @@ CConverter* CInternalWorker::GetNextConverter() CConverter* pConverter = new CConverter(this); pConverter->DestroyOnFinish(); pConverter->m_file = m_files[m_nCurrent]; + pConverter->m_bDiffOnly = m_bDiffOnly; ++m_nCurrent; std::wstring sName = NSFile::GetFileName(pConverter->m_file); @@ -737,6 +764,7 @@ int main(int argc, char** argv) { std::vector arFontsDirs; bool bIsStandard = false; + bool bDiffOnly = false; std::wstring strInputFolder = L""; std::wstring strOutputFolder = L""; bool bIsUseSystemFonts = true; @@ -780,6 +808,10 @@ int main(int argc, char** argv) { bIsStandard = true; } + else if (sKey == L"--diff-only") + { + bDiffOnly = true; + } else if (sKey == L"--use-system-fonts") { if (sValue == L"0" || sValue == L"false") @@ -853,6 +885,7 @@ int main(int argc, char** argv) #endif CInternalWorker oWorker; + oWorker.m_bDiffOnly = bDiffOnly; oWorker.OpenDir(strInputFolder); oWorker.m_sOutputFolder = strOutputFolder; oWorker.m_bIsStandard = bIsStandard; From 1089bb3226a78856ea8ffd03820f5fab842b7d3a Mon Sep 17 00:00:00 2001 From: Alexey Date: Tue, 6 Feb 2024 09:30:17 +0300 Subject: [PATCH 172/221] Fix bug --- Test/Applications/x2tTester/x2tTester.cpp | 27 ++++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/Test/Applications/x2tTester/x2tTester.cpp b/Test/Applications/x2tTester/x2tTester.cpp index cbbdc6a451..7ab3959110 100644 --- a/Test/Applications/x2tTester/x2tTester.cpp +++ b/Test/Applications/x2tTester/x2tTester.cpp @@ -515,9 +515,6 @@ void Cx2tTester::Start() } } - if(files.size() < m_maxProc) - m_maxProc = files.size(); - if (m_bExtract) { COfficeFileFormatChecker checker; @@ -537,7 +534,7 @@ void Cx2tTester::Start() if(NSDirectory::Exists(m_tempDirectory)) NSDirectory::DeleteDirectory(m_tempDirectory); - NSDirectory::CreateDirectories(m_tempDirectory); + NSDirectory::CreateDirectories(CorrectPathW(m_tempDirectory)); auto copy_inputDirectory = m_inputDirectory; auto copy_outputDirectory = m_outputDirectory; @@ -596,6 +593,9 @@ void Cx2tTester::Start() void Cx2tTester::Convert(const std::vector& files, bool bNoDirectory, bool bTrough) { + if(files.size() < m_maxProc) + m_maxProc = files.size(); + for(int i = 0; i < files.size(); i++) { const std::wstring& input_file = files[i]; @@ -643,8 +643,8 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto continue; // setup & clear output subfolder - while(!NSDirectory::Exists(output_files_directory)) - NSDirectory::CreateDirectories(output_files_directory); + if (!NSDirectory::Exists(output_files_directory)) + NSDirectory::CreateDirectories(CorrectPathW(output_files_directory)); std::wstring csvTxtEncodingS = m_defaultCsvTxtEndcoding; std::wstring csvDelimiter = m_defaultCsvDelimiter; @@ -694,6 +694,8 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto NSThreads::Sleep(50); } while(IsAllBusy()); + + m_coresCS.Enter(); // setup & start new coverter @@ -728,6 +730,9 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto } void Cx2tTester::Extract(const std::vector& files) { + if(files.size() < m_maxProc) + m_maxProc = files.size(); + for (int i = 0; i < files.size(); i++) { const std::wstring& input_file = files[i]; @@ -1229,6 +1234,16 @@ DWORD CExtractor::ThreadProc() const std::wstring& extract_ext = m_extractExts[i]; std::wstring output_folder = m_outputFilesDirectory + FILE_SEPARATOR_STR + extract_ext; + // output_CS start + m_internal->m_outputCS.Enter(); + + std::cout << "[" << m_currFile << "/" << m_totalFiles << "](" << i + 1 << "/" << m_extractExts.size() << ") "; + std::cout << "(" << m_internal->m_currentProc << " processes now) "; + std::cout << U_TO_UTF8(m_inputFile) << " extract " << U_TO_UTF8(extract_ext) << " "; + + std::cout << std::endl; + m_internal->m_outputCS.Leave(); + if (NSDirectory::Exists(output_folder)) NSDirectory::DeleteDirectory(output_folder); From 3e39bd8d13eb9345bf70d1205d22fda3c9b2245d Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 7 Feb 2024 14:38:24 +0600 Subject: [PATCH 173/221] Fix xf prop --- .../Format/Logic/Biff_structures/XFProp.cpp | 74 ++++++++++++++++++- .../Logic/Biff_structures/XFPropColor.cpp | 4 +- OOXML/XlsxFormat/Styles/dxf.cpp | 8 +- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp index 9a7f8e38cd..4fa7de73c5 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFProp.cpp @@ -143,8 +143,77 @@ void XFProp::save(CFRecord& record) { if (xfPropDataBlob) { - cb = sizeof(cb) + sizeof(xfPropType) + sizeof(*xfPropDataBlob.get()); + cb = sizeof(cb) + sizeof(xfPropType); + auto blobSize = 0; + switch(xfPropType) + { + case 0x000D: + case 0x000E: + case 0x000F: + case 0x0010: + case 0x0011: // XFPropTextRotation + case 0x0012: // indent + case 0x0013: // ReadingOrder + case 0x0014: + case 0x0015: + case 0x0016: + case 0x0017: + case 0x001C: + case 0x001D: + case 0x001E: + case 0x001F: + case 0x0020: + case 0x0021: + case 0x0022: + case 0x0023: + case 0x0025: + case 0x002B: + case 0x002C: + case 0x0000: + blobSize = 1; + break; + case 0x0001: + case 0x0002: + case 0x0005: + blobSize = 8; + break; + case 0x0003: + blobSize = 44; + break; + case 0x0004: + blobSize = 18; + break; + case 0x0006: + case 0x0007: + case 0x0008: + case 0x0009: + case 0x000A: + case 0x000B: + case 0x000C: + blobSize = 10; + break; + case 0x0026: + case 0x0018: + { + blobSize = sizeof(*xfPropDataBlob.get()); + } + break; + case 0x0019: + case 0x001A: + case 0x001B: + case 0x0029: + case 0x002A: + blobSize = 2; + break; + case 0x0024: + blobSize = 4; + break; + default: + // EXCEPT::RT::WrongBiffRecord("Unsupported type of XFProp.", record.getTypeString()); + break; + } + cb += blobSize; record << xfPropType << cb; if (xfPropType == 0x0026 || xfPropType == 0x0018) @@ -552,6 +621,9 @@ void XFProp::deserialize_attr(XmlUtils::CXmlLiteReader& oReader) xfPropDataBlob.reset(new BIFF_WORD(XmlUtils::GetInteger(oReader.GetText()))); break; case 0x0019: + xfPropDataBlob.reset(new BIFF_WORD(0x02BC1)); + deserialize_val_prop(oReader, L"BIFF_WORD", xfPropDataBlob); + break; case 0x001A: xfPropDataBlob.reset(new BIFF_WORD(1)); case 0x001B: diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp index d2630dc0c0..2d4075c68f 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/XFPropColor.cpp @@ -99,6 +99,7 @@ int XFPropColor::deserialize(XmlUtils::CXmlLiteReader& oReader) { std::wstring wsPropName = oReader.GetName(); nTintShade = 0; + fValidRGBA = false; while (!wsPropName.empty()) { if (wsPropName == L"auto" && oReader.GetText() == L"1") @@ -117,10 +118,11 @@ int XFPropColor::deserialize(XmlUtils::CXmlLiteReader& oReader) { xclrType = 2; dwRgba.Parse(oReader.GetText()); + fValidRGBA = true; } else if (wsPropName == L"tint") { - nTintShade = XmlUtils::GetInteger(oReader.GetText()) * 32767.0; + nTintShade = XmlUtils::GetDouble(oReader.GetText()) * 32767.0; } if (!oReader.MoveToNextAttribute()) diff --git a/OOXML/XlsxFormat/Styles/dxf.cpp b/OOXML/XlsxFormat/Styles/dxf.cpp index 15dd9aee75..d34afbdcd0 100644 --- a/OOXML/XlsxFormat/Styles/dxf.cpp +++ b/OOXML/XlsxFormat/Styles/dxf.cpp @@ -202,7 +202,9 @@ namespace OOX XLS::BaseObjectPtr CDxf::toBin() { auto ptr(new XLSB::DXF); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::FRTDXF); + ptr1->m_BrtDXF = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); NSStringUtils::CStringBuilder writer; toXML(writer); XmlUtils::CXmlLiteReader oReader; @@ -326,7 +328,9 @@ namespace OOX ptr->m_BrtBeginDXFs = XLS::BaseObjectPtr{ptr1}; for(auto i:m_arrItems) { - ptr->m_aruDXF.push_back(i->toBin()); + auto udxf(new XLSB::uDXF); + udxf->m_BrtFRTDXF = i->toBin(); + ptr->m_aruDXF.push_back(XLS::BaseObjectPtr{udxf}); } ptr1->cdxfs = ptr->m_aruDXF.size(); return objectPtr; From ae61dc5db9c196fe0185a27d863e96780e73c8e2 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 7 Feb 2024 14:39:30 +0600 Subject: [PATCH 174/221] Fix xml pattern fill writing --- OOXML/XlsxFormat/Styles/Fills.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/Fills.cpp b/OOXML/XlsxFormat/Styles/Fills.cpp index 75880f3381..1d8f16f533 100644 --- a/OOXML/XlsxFormat/Styles/Fills.cpp +++ b/OOXML/XlsxFormat/Styles/Fills.cpp @@ -78,11 +78,9 @@ namespace OOX else if(m_oFgColor.IsInit()) { m_oFgColor->toXMLWithNS(writer, child_ns, L"fgColor", child_ns); - m_oFgColor->toXMLWithNS(writer, child_ns, L"bgColor", child_ns); } else if(m_oBgColor.IsInit()) { - m_oBgColor->toXMLWithNS(writer, child_ns, L"fgColor", child_ns); m_oBgColor->toXMLWithNS(writer, child_ns, L"bgColor", child_ns); } From 2160c86556584c07a662ad73c93477a260330730 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 7 Feb 2024 14:39:57 +0600 Subject: [PATCH 175/221] Fix underline xml reading --- OOXML/XlsxFormat/Styles/rPr.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/OOXML/XlsxFormat/Styles/rPr.cpp b/OOXML/XlsxFormat/Styles/rPr.cpp index 87ca745567..6c99fa3e12 100644 --- a/OOXML/XlsxFormat/Styles/rPr.cpp +++ b/OOXML/XlsxFormat/Styles/rPr.cpp @@ -827,6 +827,10 @@ namespace OOX if ( !oReader.IsEmptyNode() ) oReader.ReadTillEnd(); + if(!m_oUnderline.IsInit()) + { + m_oUnderline.Init(); + } } std::wstring CUnderline::toXML() const { From ce2044a223d863ee637538d6406fc661c9ee40d4 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 7 Feb 2024 14:42:40 +0600 Subject: [PATCH 176/221] Fix default values for some structs --- OOXML/XlsxFormat/Styles/CellStyles.cpp | 6 ++++-- OOXML/XlsxFormat/Worksheets/Cols.cpp | 8 ++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/CellStyles.cpp b/OOXML/XlsxFormat/Styles/CellStyles.cpp index 1becfb48b4..505c043d45 100644 --- a/OOXML/XlsxFormat/Styles/CellStyles.cpp +++ b/OOXML/XlsxFormat/Styles/CellStyles.cpp @@ -79,7 +79,10 @@ namespace OOX auto ptr(new XLSB::Style); XLS::BaseObjectPtr objectPtr(ptr); if(m_oBuiltinId.IsInit()) - ptr->fBuiltIn = m_oBuiltinId->GetValue(); + { + ptr->fBuiltIn = true; + ptr->iStyBuiltIn = m_oBuiltinId->GetValue(); + } else ptr->fBuiltIn = false; if (m_oCustomBuiltin.IsInit()) @@ -98,7 +101,6 @@ namespace OOX ptr->stName = m_oName.get(); if (m_oXfId.IsInit()) ptr->ixf = m_oXfId->GetValue(); - ptr->iStyBuiltIn = 0; return objectPtr; } diff --git a/OOXML/XlsxFormat/Worksheets/Cols.cpp b/OOXML/XlsxFormat/Worksheets/Cols.cpp index 2d686f81d0..9434ba6cef 100644 --- a/OOXML/XlsxFormat/Worksheets/Cols.cpp +++ b/OOXML/XlsxFormat/Worksheets/Cols.cpp @@ -87,12 +87,20 @@ namespace OOX XLS::BaseObjectPtr ptr(castedPtr); if(m_oBestFit.IsInit()) castedPtr->fBestFit = m_oBestFit->ToBool(); + else + castedPtr->fBestFit = false; if(m_oCollapsed.IsInit()) castedPtr->fCollapsed = m_oCollapsed->ToBool(); + else + castedPtr->fCollapsed = false; if(m_oCustomWidth.IsInit()) castedPtr->fUserSet = m_oCustomWidth->ToBool(); + else + castedPtr->fUserSet = false; if(m_oHidden.IsInit()) castedPtr->fHidden = m_oHidden->ToBool(); + else + castedPtr->fHidden = false; if(m_oMax.IsInit()) castedPtr->colLast = m_oMax->m_eValue - 1; if(m_oMin.IsInit()) From b81fc6b3c7f0b1f8bd57d808a7e651063d7e5487 Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 7 Feb 2024 11:51:34 +0300 Subject: [PATCH 177/221] Fix bug --- DesktopEditor/common/Directory.cpp | 4 ---- Test/Applications/x2tTester/x2tTester.cpp | 5 +++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/DesktopEditor/common/Directory.cpp b/DesktopEditor/common/Directory.cpp index 66442dbb01..338a52f75a 100644 --- a/DesktopEditor/common/Directory.cpp +++ b/DesktopEditor/common/Directory.cpp @@ -586,11 +586,7 @@ namespace NSDirectory int GetFilesCount(const std::wstring& path, const bool& recursive) { std::vector arrFiles = NSDirectory::GetFiles(path, recursive); -#if defined(_WIN32) || defined (_WIN64) return (int)arrFiles.size(); -#endif - return (int)arrFiles.size() + 1; - // ??? } bool PathIsDirectory(const std::wstring& pathName) { diff --git a/Test/Applications/x2tTester/x2tTester.cpp b/Test/Applications/x2tTester/x2tTester.cpp index 7ab3959110..2a73a79329 100644 --- a/Test/Applications/x2tTester/x2tTester.cpp +++ b/Test/Applications/x2tTester/x2tTester.cpp @@ -465,6 +465,7 @@ void Cx2tTester::Start() m_outputDirectory = CorrectPathW(m_outputDirectory); m_errorsXmlDirectory = CorrectPathW(m_errorsXmlDirectory); m_troughConversionDirectory = CorrectPathW(m_troughConversionDirectory); + m_tempDirectory = CorrectPathW(m_tempDirectory); // setup & clear output folder if(NSDirectory::Exists(m_outputDirectory)) @@ -534,7 +535,7 @@ void Cx2tTester::Start() if(NSDirectory::Exists(m_tempDirectory)) NSDirectory::DeleteDirectory(m_tempDirectory); - NSDirectory::CreateDirectories(CorrectPathW(m_tempDirectory)); + NSDirectory::CreateDirectories(m_tempDirectory); auto copy_inputDirectory = m_inputDirectory; auto copy_outputDirectory = m_outputDirectory; @@ -644,7 +645,7 @@ void Cx2tTester::Convert(const std::vector& files, bool bNoDirecto // setup & clear output subfolder if (!NSDirectory::Exists(output_files_directory)) - NSDirectory::CreateDirectories(CorrectPathW(output_files_directory)); + NSDirectory::CreateDirectories(output_files_directory); std::wstring csvTxtEncodingS = m_defaultCsvTxtEndcoding; std::wstring csvDelimiter = m_defaultCsvDelimiter; From d3ea527e66f7a22b0d29330ced9781181def1905 Mon Sep 17 00:00:00 2001 From: Alexey Date: Wed, 7 Feb 2024 12:03:15 +0300 Subject: [PATCH 178/221] Fix output --- Test/Applications/x2tTester/x2tTester.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Test/Applications/x2tTester/x2tTester.cpp b/Test/Applications/x2tTester/x2tTester.cpp index 2a73a79329..6a6a5ccdcc 100644 --- a/Test/Applications/x2tTester/x2tTester.cpp +++ b/Test/Applications/x2tTester/x2tTester.cpp @@ -1240,7 +1240,7 @@ DWORD CExtractor::ThreadProc() std::cout << "[" << m_currFile << "/" << m_totalFiles << "](" << i + 1 << "/" << m_extractExts.size() << ") "; std::cout << "(" << m_internal->m_currentProc << " processes now) "; - std::cout << U_TO_UTF8(m_inputFile) << " extract " << U_TO_UTF8(extract_ext) << " "; + std::cout << U_TO_UTF8(input_filename) << " extract " << U_TO_UTF8(extract_ext) << " "; std::cout << std::endl; m_internal->m_outputCS.Leave(); From 127d70203cbf4e8aee33cfb6a94033965b27145a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 7 Feb 2024 15:50:23 +0600 Subject: [PATCH 179/221] Fix worksheet writing sequence --- OOXML/XlsbFormat/WorkSheetStream.cpp | 154 +++++++++++++-------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/OOXML/XlsbFormat/WorkSheetStream.cpp b/OOXML/XlsbFormat/WorkSheetStream.cpp index b9d929134d..410b7de2ca 100644 --- a/OOXML/XlsbFormat/WorkSheetStream.cpp +++ b/OOXML/XlsbFormat/WorkSheetStream.cpp @@ -453,13 +453,82 @@ const bool WorkSheetStream::saveContent(XLS::BinProcessor & proc) { proc.mandatory(); + if (m_BrtWsProp != nullptr) + proc.mandatory(*m_BrtWsProp); + + if (m_BrtWsDim != nullptr) + proc.mandatory(*m_BrtWsDim); + + if (m_WSVIEWS2 != nullptr) + proc.mandatory(*m_WSVIEWS2); + + if (m_BrtWsFmtInfo != nullptr) + proc.mandatory(*m_BrtWsFmtInfo); + for (auto &item : m_arCOLINFOS) { proc.mandatory(*item); } - if (m_BrtWsDim != nullptr) - proc.mandatory(*m_BrtWsDim); + if (m_CELLTABLE != nullptr) + proc.mandatory(*m_CELLTABLE); + + if (m_BrtSheetProtectionIso != nullptr) + proc.mandatory(*m_BrtSheetProtectionIso); + + if (m_BrtSheetProtection != nullptr) + proc.mandatory(*m_BrtSheetProtection); + + for (auto &item : m_arBrtRangeProtectionIso) + { + proc.mandatory(*item); + } + + for (auto &item : m_arBrtRangeProtection) + { + proc.mandatory(*item); + } + + if (m_AUTOFILTER != nullptr) + proc.mandatory(*m_AUTOFILTER); + + if (m_SORTSTATE != nullptr) + proc.mandatory(*m_SORTSTATE); + + if (m_DCON != nullptr) + proc.mandatory(*m_DCON); + + if (m_MERGECELLS != nullptr) + proc.mandatory(*m_MERGECELLS); + + for (auto &item : m_arCONDITIONALFORMATTING) + { + proc.mandatory(*item); + } + + if (m_DVALS != nullptr) + proc.mandatory(*m_DVALS); + + if (m_HLINKS != nullptr) + proc.mandatory(*m_HLINKS); + + if (m_BrtPrintOptions != nullptr) + proc.mandatory(*m_BrtPrintOptions); + + if (m_BrtMargins != nullptr) + proc.mandatory(*m_BrtMargins); + + if (m_BrtPageSetup != nullptr) + proc.mandatory(*m_BrtPageSetup); + + if (m_HEADERFOOTER != nullptr) + proc.mandatory(*m_HEADERFOOTER); + + if (m_RWBRK != nullptr) + proc.mandatory(*m_RWBRK); + + if (m_COLBRK != nullptr) + proc.mandatory(*m_COLBRK); if (m_BrtDrawing != nullptr) proc.mandatory(*m_BrtDrawing); @@ -470,87 +539,18 @@ const bool WorkSheetStream::saveContent(XLS::BinProcessor & proc) if (m_BrtLegacyDrawingHF != nullptr) proc.mandatory(*m_BrtLegacyDrawingHF); - if (m_HLINKS != nullptr) - proc.mandatory(*m_HLINKS); + if (m_BrtBkHim != nullptr) + proc.mandatory(*m_BrtBkHim); - if (m_MERGECELLS != nullptr) - proc.mandatory(*m_MERGECELLS); + if (m_OLEOBJECTS != nullptr) + proc.mandatory(*m_OLEOBJECTS); - if (m_CELLTABLE != nullptr) - proc.mandatory(*m_CELLTABLE); - - if (m_BrtWsFmtInfo != nullptr) - proc.mandatory(*m_BrtWsFmtInfo); - - if (m_WSVIEWS2 != nullptr) - proc.mandatory(*m_WSVIEWS2); - - if (m_BrtMargins != nullptr) - proc.mandatory(*m_BrtMargins); - - if (m_BrtPageSetup != nullptr) - proc.mandatory(*m_BrtPageSetup); - - if (m_BrtPrintOptions != nullptr) - proc.mandatory(*m_BrtPrintOptions); - - if (m_HEADERFOOTER != nullptr) - proc.mandatory(*m_HEADERFOOTER); - - if (m_BrtSheetProtectionIso != nullptr) - proc.mandatory(*m_BrtSheetProtectionIso); - - if (m_BrtSheetProtection != nullptr) - proc.mandatory(*m_BrtSheetProtection); + if (m_ACTIVEXCONTROLS != nullptr) + proc.mandatory(*m_ACTIVEXCONTROLS); if (m_LISTPARTS != nullptr) proc.mandatory(*m_LISTPARTS); - if (m_AUTOFILTER != nullptr) - proc.mandatory(*m_AUTOFILTER); - - if (m_SORTSTATE != nullptr) - proc.mandatory(*m_SORTSTATE); - - for (auto &item : m_arCONDITIONALFORMATTING) - { - proc.mandatory(*item); - } - - if (m_DVALS != nullptr) - proc.mandatory(*m_DVALS); - - if (m_OLEOBJECTS != nullptr) - proc.mandatory(*m_OLEOBJECTS); - - if (m_ACTIVEXCONTROLS != nullptr) - proc.mandatory(*m_ACTIVEXCONTROLS); - - if (m_BrtWsProp != nullptr) - proc.mandatory(*m_BrtWsProp); - - if (m_BrtBkHim != nullptr) - proc.mandatory(*m_BrtBkHim); - - if (m_RWBRK != nullptr) - proc.mandatory(*m_RWBRK); - - if (m_COLBRK != nullptr) - proc.mandatory(*m_COLBRK); - - for (auto &item : m_arBrtRangeProtectionIso) - { - proc.mandatory(*item); - } - - for (auto &item : m_arBrtRangeProtection) - { - proc.mandatory(*item); - } - - if (m_DCON != nullptr) - proc.mandatory(*m_DCON); - if (m_FRTWORKSHEET != nullptr) proc.mandatory(*m_FRTWORKSHEET); From 587bd78f2fc262d1d9689e6a2d01cef45e4f9d91 Mon Sep 17 00:00:00 2001 From: "Oleg.Korshul" Date: Wed, 7 Feb 2024 12:56:55 +0300 Subject: [PATCH 180/221] Fix build on macos/ios --- DesktopEditor/common/File.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/DesktopEditor/common/File.cpp b/DesktopEditor/common/File.cpp index 70a59d668b..ce2ae13a8c 100644 --- a/DesktopEditor/common/File.cpp +++ b/DesktopEditor/common/File.cpp @@ -51,6 +51,12 @@ #include #endif +#if defined(__APPLE__) || defined(__NetBSD__) +#define st_atim st_atimespec +#define st_ctim st_ctimespec +#define st_mtim st_mtimespec +#endif + #ifndef MAX_PATH #define MAX_PATH 1024 #endif From 33058fbbcefa7dd6c65c43d344754afd2e8c27cd Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 7 Feb 2024 16:00:59 +0600 Subject: [PATCH 181/221] Fix worksheet parts conversion --- .../Worksheets/WorksheetChildOther.cpp | 167 +++++++++++++----- .../Worksheets/WorksheetChildOther.h | 2 + 2 files changed, 127 insertions(+), 42 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 3e40ff86fd..76911ad75f 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -55,6 +55,7 @@ #include "../../XlsbFormat/Biff12_unions/DCON.h" #include "../../XlsbFormat/Biff12_records/BeginDCon.h" #include "../../XlsbFormat/Biff12_unions/DREFS.h" +#include "../../XlsbFormat/Biff12_records/BeginDRefs.h" #include "../../XlsbFormat/Biff12_records/DRef.h" #include "../../XlsbFormat/Biff12_unions/CSVIEWS.h" #include "../../XlsbFormat/Biff12_unions/CSVIEW.h" @@ -1663,6 +1664,18 @@ namespace OOX { ReadAttributes(obj); } + void CPageSetUpPr::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oAutoPageBreaks.IsInit()) + ptr->fShowAutoBreaks = m_oAutoPageBreaks->GetValue(); + else + ptr->fShowAutoBreaks = true; + if(m_oFitToPage.IsInit()) + ptr->fFitToPage = m_oFitToPage->GetValue(); + else + ptr->fFitToPage = false; + } EElementType CPageSetUpPr::getType() const { return et_x_PageSetUpPr; @@ -1673,7 +1686,7 @@ namespace OOX if (ptr != nullptr) { m_oAutoPageBreaks = ptr->fShowAutoBreaks; - m_oFitToPage = ptr->fFitToPage;; + m_oFitToPage = ptr->fFitToPage; } } void CPageSetUpPr::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -1717,6 +1730,26 @@ namespace OOX { ReadAttributes(obj); } + void COutlinePr::toBin(XLS::BaseObjectPtr& obj) + { + auto ptr = static_cast(obj.get()); + if(m_oApplyStyles.IsInit()) + ptr->fApplyStyles = m_oApplyStyles->GetValue(); + else + ptr->fApplyStyles = false; + if(m_oShowOutlineSymbols.IsInit()) + ptr->fShowOutlineSymbols = m_oShowOutlineSymbols->GetValue(); + else + ptr->fShowOutlineSymbols = true; + if(m_oSummaryBelow.IsInit()) + ptr->fRowSumsBelow = m_oSummaryBelow->GetValue(); + else + ptr->fRowSumsBelow = true; + if(m_oSummaryRight.IsInit()) + ptr->fColSumsRight = m_oSummaryRight->GetValue(); + else + ptr->fColSumsRight = true; + } EElementType COutlinePr::getType() const { return et_x_OutlinePr; @@ -1806,33 +1839,65 @@ namespace OOX } XLS::BaseObjectPtr CSheetPr::toBin() { - XLS::BaseObjectPtr objectPtr; - - if(m_oEnableFormatConditionsCalculation.IsInit() || m_oSyncHorizontal.IsInit() || m_oSyncHorizontal.IsInit() || m_oTransitionEvaluation.IsInit()) - { - auto ptr(new XLSB::WsProp); - objectPtr = XLS::BaseObjectPtr{ptr}; - - if(m_oCodeName.IsInit()) - ptr->strName.value = m_oCodeName.get(); - else - ptr->strName.value = L""; - - ptr->fCondFmtCalc = m_oEnableFormatConditionsCalculation->GetValue(); - ptr->fFilterMode = m_oFilterMode->GetValue(); - ptr->fPublish = m_oPublished->GetValue(); - ptr->fSyncHoriz = m_oSyncHorizontal->GetValue(); - ptr->fSyncVert = m_oSyncVertical->GetValue(); - ptr->fAltFormulaEntry = m_oTransitionEntry->GetValue(); - ptr->fAltExprEval = m_oTransitionEvaluation->GetValue(); - - if (m_oSyncRef.IsInit()) - ptr->syncRef = m_oSyncRef.get(); - if(m_oTabColor.IsInit()) - ptr->brtcolorTab = m_oTabColor->toColor(); - } - - return objectPtr; + auto ptr(new XLSB::WsProp); + XLS::BaseObjectPtr objectPtr(ptr); + if(m_oCodeName.IsInit()) + ptr->strName.value = m_oCodeName.get(); + else + ptr->strName.value = L""; + if(m_oEnableFormatConditionsCalculation.IsInit()) + ptr->fCondFmtCalc = m_oEnableFormatConditionsCalculation->GetValue(); + if(m_oFilterMode.IsInit()) + ptr->fFilterMode = m_oFilterMode->GetValue(); + else + ptr->fFilterMode = false; + if(m_oPublished.IsInit()) + ptr->fPublish = m_oPublished->GetValue(); + else + ptr->fPublish = true; + if(m_oSyncHorizontal.IsInit()) + ptr->fSyncHoriz = m_oSyncHorizontal->GetValue(); + else + ptr->fSyncHoriz = false; + if(m_oSyncVertical.IsInit()) + ptr->fSyncVert = m_oSyncVertical->GetValue(); + else + ptr->fSyncVert = false; + if(m_oTransitionEntry.IsInit()) + ptr->fAltFormulaEntry = m_oTransitionEntry->GetValue(); + else + ptr->fAltFormulaEntry = false; + if(m_oTransitionEvaluation.IsInit()) + ptr->fAltExprEval = m_oTransitionEvaluation->GetValue(); + else + ptr->fAltExprEval = false; + if (m_oSyncRef.IsInit()) + ptr->syncRef = m_oSyncRef.get(); + else + ptr->syncRef = L""; + if(m_oTabColor.IsInit()) + ptr->brtcolorTab = m_oTabColor->toColor(); + else + ptr->brtcolorTab = m_oTabColor->GetDefaultColor(); + if(m_oPageSetUpPr.IsInit()) + m_oPageSetUpPr->toBin(objectPtr); + else + { + ptr->fFitToPage = false; + ptr->fShowAutoBreaks = true; + } + if(m_oOutlinePr.IsInit()) + m_oOutlinePr->toBin(objectPtr); + else + { + ptr->fApplyStyles = false; + ptr->fColSumsRight = true; + ptr->fRowSumsBelow = true; + ptr->fShowOutlineSymbols = true; + } + ptr->fDialog = false; + ptr->fCondFmtCalc = false; + return objectPtr; } XLS::BaseObjectPtr CSheetPr::toBinCs() { @@ -2601,62 +2666,62 @@ namespace OOX if (m_oAutoFilter.IsInit()) ptr->fAutoFilter = m_oAutoFilter->GetValue(); else - ptr->fAutoFilter = false; + ptr->fAutoFilter = true; if (m_oDeleteColumns.IsInit()) ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); else - ptr->fDeleteColumns= false; + ptr->fDeleteColumns= true; if (m_oDeleteRows.IsInit()) ptr->fDeleteRows = m_oDeleteRows->GetValue(); else - ptr->fDeleteRows = false; + ptr->fDeleteRows = true; if (m_oFormatCells.IsInit()) ptr->fFormatCells = m_oFormatCells->GetValue(); else - ptr->fFormatCells = false; + ptr->fFormatCells = true; if (m_oFormatColumns.IsInit()) ptr->fFormatColumns = m_oFormatColumns->GetValue(); else - ptr->fFormatColumns = false; + ptr->fFormatColumns = true; if (m_oFormatRows.IsInit()) ptr->fFormatRows = m_oFormatRows->GetValue(); else - ptr->fFormatRows = false; + ptr->fFormatRows = true; if (m_oInsertColumns.IsInit()) ptr->fInsertColumns = m_oInsertColumns->GetValue(); else - ptr->fInsertColumns = false; + ptr->fInsertColumns = true; if (m_oInsertHyperlinks.IsInit()) ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); else - ptr->fInsertHyperlinks = false; + ptr->fInsertHyperlinks = true; if (m_oInsertRows.IsInit()) ptr->fInsertRows = m_oInsertRows->GetValue(); else - ptr->fInsertRows = false; + ptr->fInsertRows = true; if (m_oObjects.IsInit()) ptr->fObjects = m_oObjects->GetValue(); else - ptr->fObjects = false; + ptr->fObjects = true; if (m_oPivotTables.IsInit()) ptr->fPivotTables = m_oPivotTables->GetValue(); else - ptr->fPivotTables = false; + ptr->fPivotTables = true; if (m_oScenarios.IsInit()) ptr->fScenarios = m_oScenarios->GetValue(); else - ptr->fScenarios = false; + ptr->fScenarios = true; if (m_oSelectLockedCells.IsInit()) ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); @@ -2676,7 +2741,7 @@ namespace OOX if (m_oSort.IsInit()) ptr->fSort = m_oSort->GetValue(); else - ptr->fSort = false; + ptr->fSort = true; return castedPtr; } @@ -2977,12 +3042,18 @@ namespace OOX if (m_oName.IsInit()) ptr->xstrName = m_oName.get(); - + else + { + ptr->fName = false; + ptr->fBuiltin = false; + } if (m_oRef.IsInit()) ptr->rfx = m_oRef.get(); if (m_oSheet.IsInit()) ptr->xstrSheet = m_oSheet.get(); + else + ptr->xstrSheet = L""; return objectPtr; } @@ -3081,10 +3152,14 @@ namespace OOX { auto ptr(new XLSB::DREFS); XLS::BaseObjectPtr objectPtr(ptr); + auto beginRefs(new XLSB::BeginDRefs); + ptr->m_BrtBeginDRefs = XLS::BaseObjectPtr{beginRefs}; + for(auto i:m_arrItems) { ptr->m_arBrtDRef.push_back(i->toBin()); } + beginRefs->cdref = ptr->m_arBrtDRef.size(); return objectPtr; } EElementType CDataRefs::getType() const @@ -3147,12 +3222,20 @@ namespace OOX if(m_oFunction.IsInit()) beginPtr->iiftab = m_oFunction->GetValue(); + else + beginPtr->iiftab = 0; if(m_oFunction.IsInit()) beginPtr->fLinkConsol = m_oLink->GetValue(); + else + beginPtr->fLinkConsol = false; if(m_oFunction.IsInit()) beginPtr->fLeftCat = m_oStartLabels->GetValue(); + else + beginPtr->fLeftCat = false; if(m_oFunction.IsInit()) beginPtr->fTopCat = m_oTopLabels->GetValue(); + else + beginPtr->fTopCat = false; if(m_oDataRefs.IsInit()) { diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index 4560a53ae8..f6b7c54bcd 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -465,6 +465,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; private: @@ -491,6 +492,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); + void toBin(XLS::BaseObjectPtr& obj); virtual EElementType getType () const; private: From 0aa03275f45bc164759431a0e50a99aa2c207c89 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 8 Feb 2024 19:27:33 +0600 Subject: [PATCH 182/221] Fix worbook defined names conversion --- OOXML/XlsxFormat/Workbook/DefinedNames.cpp | 10 +--------- OOXML/XlsxFormat/Workbook/Workbook.cpp | 9 ++++----- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp index 4a373a35f7..e5e1ce607f 100644 --- a/OOXML/XlsxFormat/Workbook/DefinedNames.cpp +++ b/OOXML/XlsxFormat/Workbook/DefinedNames.cpp @@ -143,15 +143,7 @@ namespace OOX else ptr->fFutureFunction = false; if (m_oRef.IsInit()) - { - auto ref = m_oRef.get(); - auto separatorPos = ref.find(L"!"); - if(separatorPos != std::string::npos && separatorPos != ref.size() -1) - ref = ref.substr(separatorPos + 1, ref.size() - separatorPos -1); - else if(separatorPos == ref.size() -1) - ref = L""; - ptr->rgce = ref; - } + ptr->rgce = m_oRef.get(); ptr->fCalcExp = true; ptr->fBuiltin = false; return objectPtr; diff --git a/OOXML/XlsxFormat/Workbook/Workbook.cpp b/OOXML/XlsxFormat/Workbook/Workbook.cpp index fde3a4990f..9342b0ac08 100644 --- a/OOXML/XlsxFormat/Workbook/Workbook.cpp +++ b/OOXML/XlsxFormat/Workbook/Workbook.cpp @@ -292,10 +292,6 @@ namespace OOX } if (m_oCalcPr.IsInit()) workBookStream->m_BrtCalcProp = m_oCalcPr->toBin(); - if (m_oDefinedNames.IsInit()) - { - workBookStream->m_arBrtName = m_oDefinedNames->toBin(); - } if (m_oSheets.IsInit()) { auto ptr(new XLSB::BUNDLESHS); @@ -336,7 +332,10 @@ namespace OOX workBookStream->m_BrtWbProp = m_oWorkbookPr->toBin(); if (m_oPivotCaches.IsInit()) workBookStream->m_PIVOTCACHEIDS = m_oPivotCaches->toBin(); - + if (m_oDefinedNames.IsInit()) + { + workBookStream->m_arBrtName = m_oDefinedNames->toBin(); + } if (m_oWorkbookProtection.IsInit()) workBookStream->m_BrtBookProtection = m_oWorkbookProtection->toBin(); From c43536c61858f75810caa0f9b9f1dbfddd2429b6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 9 Feb 2024 15:00:55 +0600 Subject: [PATCH 183/221] Fix strings to shared strings conversion --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index 7d79964207..6289c616c4 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -1633,7 +1633,7 @@ namespace OOX m_oType->SetValue(SimpleTypes::Spreadsheet::celltypeSharedString); } } - else if (SimpleTypes::Spreadsheet::celltypeStr == m_oType->GetValue() || SimpleTypes::Spreadsheet::celltypeError == m_oType->GetValue()) + else if ((SimpleTypes::Spreadsheet::celltypeStr == m_oType->GetValue() || SimpleTypes::Spreadsheet::celltypeError == m_oType->GetValue()) && !m_oFormula.IsInit()) { if (m_oValue.IsInit()) { From 80782f371c68c9b3a39c376bd340ede093ecfcba Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 9 Feb 2024 15:01:14 +0600 Subject: [PATCH 184/221] Fix pcdi conversion --- OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h | 2 - OOXML/XlsxFormat/Pivot/Pivots.cpp | 145 ++++++++++-------- 2 files changed, 85 insertions(+), 62 deletions(-) diff --git a/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h b/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h index 9111c18973..114093b2c8 100644 --- a/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h +++ b/OOXML/XlsxFormat/Pivot/PivotCacheDefinition.h @@ -92,8 +92,6 @@ namespace OOX nullable m_oMinDate; nullable m_oMaxDate; nullable m_oCount; - private: - XLS::BaseObjectPtr parsePCDI(XLS::BaseObjectPtr object); }; class COLAPGroupItems : public WritingElementWithChilds { diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 921b4c06d2..684274ac5b 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -1849,7 +1849,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if ( oReader.IsEmptyNode() ) return; } - XLS::BaseObjectPtr CFieldItem::toBin() + XLS::BaseObjectPtr CFieldItem::toBin()// fix name init { auto ptr1(new XLSB::SXVI); XLS::BaseObjectPtr objectPtr(ptr1); @@ -1870,7 +1870,14 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oMissing.IsInit()) ptr->fMissing = m_oMissing.get(); if(m_oUserCaption.IsInit()) + { ptr->displayName = m_oUserCaption.get(); + ptr->fDisplayName = true; + } + else + { + ptr->fDisplayName = false; + } if(m_oCharacter.IsInit()) ptr->fOlapFilterSelected = m_oCharacter.get(); if(m_oHideDetails.IsInit()) @@ -4184,66 +4191,53 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" ptr->m_BrtBeginPCDFAtbl = writeAttributes(); for(auto i:m_arrItems) { - auto valueBool = static_cast(i); - if(valueBool) + + if(i->getType() == et_x_PivotBooleanValue) { - XLS::BaseObjectPtr element= valueBool->toBin(); - ptr->m_arSource.push_back(parsePCDI(element)); + auto valueBool = static_cast(i); + XLS::BaseObjectPtr element = valueBool->toBin(); + ptr->m_arSource.push_back(element); continue; } - auto noVal = static_cast(i); - if(noVal) + else if(i->getType() == et_x_PivotNoValue) { + auto noVal = static_cast(i); XLS::BaseObjectPtr element = noVal->toBin(); - ptr->m_arSource.push_back(parsePCDI(element)); + ptr->m_arSource.push_back(element); continue; } - auto numVal = static_cast(i); - if(numVal) + else if(i->getType() == et_x_PivotNumericValue) { + auto numVal = static_cast(i); XLS::BaseObjectPtr element = numVal->toBin(); - ptr->m_arSource.push_back(parsePCDI(element)); + ptr->m_arSource.push_back(element); continue; } - auto charVal = static_cast(i); - if(charVal) + else if(i->getType() == et_x_PivotCharacterValue) { + auto charVal = static_cast(i); XLS::BaseObjectPtr element = charVal->toBin(); - ptr->m_arSource.push_back(parsePCDI(element)); + ptr->m_arSource.push_back(element); continue; } - auto dateValue = static_cast(i); - if(dateValue) + else if(i->getType() == et_x_PivotDateTimeValue) { + auto dateValue = static_cast(i); XLS::BaseObjectPtr element = dateValue->toBin(); - ptr->m_arSource.push_back(parsePCDI(element)); + ptr->m_arSource.push_back(element); continue; } - auto errorVal = static_cast(i); - if(errorVal) + else if(i->getType() == et_x_PivotErrorValue) { + auto errorVal = static_cast(i); XLS::BaseObjectPtr element = errorVal->toBin(); - ptr->m_arSource.push_back(parsePCDI(element)); + ptr->m_arSource.push_back(element); continue; } } return objectPtr; } - XLS::BaseObjectPtr CSharedItems::parsePCDI(XLS::BaseObjectPtr object) - { - if(object->get_type() == XLS::typePCDI) - { - auto ptr1(new XLSB::PCDI); - ptr1->m_source = object; - return XLS::BaseObjectPtr{ptr1}; - } - else if(object->get_type() == XLS::typePCDIA) - { - auto ptr1(new XLSB::PCDIA); - ptr1->m_source = object; - return XLS::BaseObjectPtr{ptr1}; - } - } + XLS::BaseObjectPtr CSharedItems::writeAttributes() { auto ptr(new XLSB::BeginPCDFAtbl); @@ -4960,6 +4954,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) { auto ptr(new XLSB::PCDIAString); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr1}; XLS::BaseObjectPtr objectPtr(ptr); if(m_oCaption.IsInit()) ptr->info.stCaption = m_oCaption.get(); @@ -4976,7 +4972,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else { auto ptr(new XLSB::PCDIString); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->st = m_oValue.get(); if(m_oBold.IsInit()) @@ -5128,7 +5126,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) { auto ptr(new XLSB::PCDIAError); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) { if (m_oValue == L"#NULL!") ptr->err = 0x00; @@ -5155,7 +5155,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else { auto ptr(new XLSB::PCDIError); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) { if (m_oValue == L"#NULL!") ptr->err = 0x00; @@ -5338,7 +5340,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) { auto ptr(new XLSB::PCDIANumber); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oCaption.IsInit()) ptr->info.stCaption = m_oCaption.get(); if(m_oCalculated.IsInit()) @@ -5354,7 +5358,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else { auto ptr(new XLSB::PCDINumber); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->xnum.data.value = m_oValue.get(); if(m_oBold.IsInit()) @@ -5488,7 +5494,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) { auto ptr(new XLSB::PCDIADatetime); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oCaption.IsInit()) ptr->info.stCaption = m_oCaption.get(); if(m_oCalculated.IsInit()) @@ -5504,7 +5512,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else { auto ptr(new XLSB::PCDIDatetime); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->datetime.fromString(m_oValue->GetValue()); @@ -5604,7 +5614,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(m_oCalculated.IsInit() || m_oUnused.IsInit() || m_oCount.IsInit() || !m_arrItems.empty() || m_oCaption.IsInit()) { auto ptr(new XLSB::PCDIABoolean); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->f = m_oValue.get(); if(m_oCalculated.IsInit()) @@ -5622,7 +5634,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else { auto ptr(new XLSB::PCDIBoolean); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oValue.IsInit()) ptr->f = m_oValue.get(); return objectPtr; @@ -5738,7 +5752,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" || m_oBackColor.IsInit() || m_oForeColor.IsInit()) { auto ptr(new XLSB::PCDIMissing); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDI); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oBold.IsInit()) ptr->sxvcellextra->fSrvFmtBold = m_oBold.get(); if(m_oItalic.IsInit()) @@ -5758,7 +5774,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" else { auto ptr(new XLSB::PCDIAMissing); - XLS::BaseObjectPtr objectPtr(ptr); + auto ptr1(new XLSB::PCDIA); + ptr1->m_source = XLS::BaseObjectPtr{ptr}; + XLS::BaseObjectPtr objectPtr(ptr1); if(m_oCaption.IsInit()) ptr->info.stCaption = m_oCaption.get(); if(m_oCalculated.IsInit()) @@ -6822,51 +6840,58 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { auto ptrPCDIDT(new XLSB::PCDIDT); - auto boolValue = static_cast(i); - if(boolValue) + + if(i->getType() == et_x_PivotBooleanValue) { + auto boolValue = static_cast(i); ptrPCDIDT->m_source = boolValue->toBin(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; } - auto dataValue = static_cast(i); - if(dataValue) + + else if(i->getType() == et_x_PivotDateTimeValue) { + auto dataValue = static_cast(i); ptrPCDIDT->m_source = dataValue->toBin(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; } - auto errorValue = static_cast(i); - if(errorValue) + + else if(i->getType() == et_x_PivotErrorValue) { + auto errorValue = static_cast(i); ptrPCDIDT->m_source = errorValue->toBin(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; } - auto noValue = static_cast(i); - if(noValue) + + else if(i->getType() == et_x_PivotNoValue) { + auto noValue = static_cast(i); ptrPCDIDT->m_source = noValue->toBin(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; } - auto numValue = static_cast(i); - if(numValue) + + else if(i->getType() == et_x_PivotNumericValue) { + auto numValue = static_cast(i); ptrPCDIDT->m_source = numValue->toBin(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; } - auto charValue = static_cast(i); - if(charValue) + + else if(i->getType() == et_x_PivotCharacterValue) { + auto charValue = static_cast(i); ptrPCDIDT->m_source = charValue->toBin(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; } - auto itemIndex = static_cast(i); - if(charValue) + + else if(i->getType() == et_x_SharedItemsIndex) { + auto itemIndex = static_cast(i); ptrPCDIDT->m_source = itemIndex->toBinItemIndex(); ptr1->m_arPCDIDT.push_back(XLS::BaseObjectPtr{ptrPCDIDT}); continue; From 6f0af189e1343a2b4cea9b2c3fe7dc0ac9585aa2 Mon Sep 17 00:00:00 2001 From: Kamil Kerimov Date: Mon, 12 Feb 2024 16:05:06 +0500 Subject: [PATCH 185/221] Fix bug #61378 --- OdfFile/Writer/Converter/ConvertDrawing.cpp | 34 ++++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 02306d43b3..8b071518da 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -1993,6 +1993,26 @@ void OoxConverter::convert_list_level(PPTX::Logic::TextParagraphPr *oox_para_pro odf_context()->styles_context()->lists_styles().end_style_level(); } +static bool is_empty_run_elems(const std::vector& runElems) +{ + using namespace PPTX::Logic; + + auto runIt = std::find_if_not(runElems.begin(), runElems.end(), + [](const RunElem& r) { + return !r.is(); + }); + if (runIt != runElems.end()) + { + const Run& run = runIt->as(); + if (!run.HasText()) + return true; + } + else + return true; + + return false; +} + void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::TextListStyle *oox_list_style) { if (!oox_paragraph)return; @@ -2036,6 +2056,8 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T if (paraPr->ParagraphBullet.is()) list_present = false; } + else + list_present = false; //свойства могут быть приписаны не только к параграфу, но и к самому объекту odf_writer::paragraph_format_properties* paragraph_properties = odf_context()->text_context()->get_paragraph_properties(); odf_writer::text_format_properties* text_properties = odf_context()->text_context()->get_text_properties(); @@ -2061,17 +2083,7 @@ void OoxConverter::convert(PPTX::Logic::Paragraph *oox_paragraph, PPTX::Logic::T } } - std::vector::iterator runIt = std::find_if_not(oox_paragraph->RunElems.begin(), oox_paragraph->RunElems.end(), - [](const PPTX::Logic::RunElem& r) { - return !r.is(); - }); - if (runIt != oox_paragraph->RunElems.end()) - { - const PPTX::Logic::Run& run = runIt->as(); - if (!run.HasText()) - list_present = false; - } - else + if (is_empty_run_elems(oox_paragraph->RunElems)) list_present = false; //if (oox_paragraph->RunElems.empty() && list_present) list_present = false; // ms не обозначает присутствие списка, libra - показывает значек From e6ebc76ae610e221fa564fcc11af3c6895974666 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 13 Feb 2024 21:17:18 +0300 Subject: [PATCH 186/221] metadata spreadsheets --- .../Sheets/Common/BinReaderWriterDefines.h | 112 ++ OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 559 +++++++++ OOXML/Binary/Sheets/Reader/BinaryWriter.h | 37 + OOXML/Binary/Sheets/Writer/BinaryReader.cpp | 505 ++++++++ OOXML/Binary/Sheets/Writer/BinaryReader.h | 23 + OOXML/Common/SimpleTypes_Drawing.cpp | 2 +- OOXML/Common/SimpleTypes_Spreadsheet.cpp | 102 ++ OOXML/Common/SimpleTypes_Spreadsheet.h | 35 + OOXML/DocxFormat/Drawing/DrawingExt.cpp | 23 + OOXML/DocxFormat/Drawing/DrawingExt.h | 5 + OOXML/DocxFormat/WritingElement.h | 23 +- .../Linux/DocxFormatLib/DocxFormatLib.pro | 8 +- .../Linux/DocxFormatLib/xlsx_format_logic.cpp | 2 + .../DocxFormatLib/DocxFormatLib.vcxproj | 4 + .../DocxFormatLib.vcxproj.filters | 15 + OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp | 18 + OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp | 20 +- OOXML/XlsxFormat/FileTypes_Spreadsheet.h | 7 + OOXML/XlsxFormat/RichData/RdRichValue.cpp | 233 ++++ OOXML/XlsxFormat/RichData/RdRichValue.h | 108 ++ OOXML/XlsxFormat/Workbook/Metadata.cpp | 1063 +++++++++++++++++ OOXML/XlsxFormat/Workbook/Metadata.h | 506 ++++++++ 22 files changed, 3404 insertions(+), 6 deletions(-) create mode 100644 OOXML/XlsxFormat/RichData/RdRichValue.cpp create mode 100644 OOXML/XlsxFormat/RichData/RdRichValue.h create mode 100644 OOXML/XlsxFormat/Workbook/Metadata.cpp create mode 100644 OOXML/XlsxFormat/Workbook/Metadata.h diff --git a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h index e88d7c0c81..d29f7c20f7 100644 --- a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h +++ b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h @@ -238,6 +238,7 @@ namespace BinXlsxRW ExternalLinksAutoRefresh = 26, TimelineCaches = 27, TimelineCache = 28, + Metadata = 29 };} namespace c_oSerWorkbookProtection {enum c_oSerWorkbookProtection{ AlgorithmName = 0, @@ -662,6 +663,7 @@ namespace BinXlsxRW ChildChain = 5, NewThread = 6 };} +//------------------------------------------------------------------------------------------------------------------------------ namespace c_oSer_Timeline {enum c_oSer_Timeline { Name = 0, @@ -717,6 +719,116 @@ namespace BinXlsxRW Name = 0, TabId = 1 };} +//------------------------------------------------------------------------------------------------------------------------------ + namespace c_oSer_Metadata { enum c_oSer_Metadata + { + MetadataTypes = 0, + MetadataStrings = 1, + MdxMetadata = 2, + CellMetadata = 3, + ValueMetadata = 4, + FutureMetadata = 5, + };} + namespace c_oSer_MetadataType { enum c_oSer_MetadataType + { + MetadataType = 0, + Name = 1, + MinSupportedVersion = 2, + GhostRow = 3, + GhostCol = 4, + Edit = 5, + Delete = 6, + Copy = 7, + PasteAll = 8, + PasteFormulas = 9, + PasteValues = 10, + PasteFormats = 11, + PasteComments = 12, + PasteDataValidation = 13, + PasteBorders = 14, + PasteColWidths = 15, + PasteNumberFormats = 16, + Merge = 17, + SplitFirst = 18, + SplitAll = 19, + RowColShift = 30, + ClearAll = 21, + ClearFormats = 22, + ClearContents = 23, + ClearComments = 24, + Assign = 25, + Coerce = 26, + CellMeta = 27, + };} + namespace c_oSer_MetadataString {enum c_oSer_MetadataString + { + MetadataString = 0, + + };} + namespace c_oSer_MetadataBlock {enum c_oSer_MetadataBlock + { + MetadataBlock = 0, + MetadataRecord = 1, + MetadataRecordType = 2, + MetadataRecordValue = 3, + };} + namespace c_oSer_FutureMetadataBlock {enum c_oSer_FutureMetadataBlock + { + Name = 0, + FutureMetadataBlock = 1, + RichValueBlock = 2, + DynamicArrayProperties = 3, + DynamicArray = 4, + CollapsedArray = 5 + };} + namespace c_oSer_MdxMetadata {enum c_oSer_MdxMetadata + { + Mdx = 0, + NameIndex = 1, + FunctionTag = 2, + MdxTuple = 3, + MdxSet = 4, + MdxKPI = 5, + MdxMemeberProp = 6 + };} + namespace c_oSer_MetadataMdxTuple { enum c_oSer_MetadataMdxTuple + { + IndexCount = 0, + CultureCurrency = 1, + StringIndex = 2, + NumFmtIndex = 3, + BackColor = 4, + ForeColor = 5, + Italic = 6, + Underline = 7, + Strike = 8, + Bold = 9, + MetadataStringIndex = 10 + };} + namespace c_oSer_MetadataStringIndex {enum c_oSer_MetadataStringIndex + { + StringIsSet = 0, + IndexValue = 1 + };} + namespace c_oSer_MetadataMdxSet {enum c_oSer_MetadataMdxSet + { + Count = 0, + Index = 1, + SortOrder = 2, + MetadataStringIndex = 3 + };} + namespace c_oSer_MetadataMdxKPI {enum c_oSer_MetadataMdxKPI + { + NameIndex = 0, + Index = 1, + Property = 2 + };} + namespace c_oSer_MetadataMemberProperty {enum c_oSer_MetadataMemberProperty + { + NameIndex = 0, + Index = 1 + };} +//------------------------------------------------------------------------------------------------------------------------------ namespace c_oSerCustoms {enum c_oSerCustoms { Custom = 0, diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index ba79f56c67..bbbb71ad28 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -71,6 +71,7 @@ #include "../../../XlsxFormat/Styles/dxf.h" #include "../../../XlsxFormat/Styles/TableStyles.h" #include "../../../XlsxFormat/Timelines/Timeline.h" +#include "../../../XlsxFormat/Workbook/Metadata.h" #include "../../../../DesktopEditor/common/Directory.h" @@ -2263,6 +2264,14 @@ void BinaryWorkbookTableWriter::WriteWorkbook(OOX::Spreadsheet::CWorkbook& workb m_oBcw.m_oStream.WriteStringW3(*workbook.m_oOleSize); m_oBcw.WriteItemWithLengthEnd(nCurPos); } + pFile = workbook.Find(OOX::Spreadsheet::FileTypes::Metadata); + OOX::Spreadsheet::CMetadataFile* pMetadataFile = dynamic_cast(pFile.GetPointer()); + if ((pMetadataFile) && (pMetadataFile->m_oMetadata.IsInit())) + { + nCurPos = m_oBcw.WriteItemStart(c_oSerWorkbookTypes::Metadata); + WriteMetadata(pMetadataFile->m_oMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } } void BinaryWorkbookTableWriter::WriteFileSharing(const OOX::Spreadsheet::CFileSharing& fileSharing) { @@ -3538,6 +3547,556 @@ void BinaryWorkbookTableWriter::WriteTimelineState(OOX::Spreadsheet::CTimelineSt m_oBcw.WriteItemWithLengthEnd(nCurPos); } } +void BinaryWorkbookTableWriter::WriteMetadata(OOX::Spreadsheet::CMetadata* pMetadata) +{ + if (!pMetadata) return; + + int nCurPos = 0; + if (pMetadata->m_oMetadataTypes.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::MetadataTypes); + WriteMetadataTypes(pMetadata->m_oMetadataTypes.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oMetadataTypes.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::MetadataStrings); + WriteMetadataStrings(pMetadata->m_oMetadataStrings.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oMdxMetadata.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::MdxMetadata); + WriteMdxMetadata(pMetadata->m_oMdxMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oCellMetadata.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::CellMetadata); + WriteMetadataBlocks(pMetadata->m_oCellMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadata->m_oValueMetadata.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::ValueMetadata); + WriteMetadataBlocks(pMetadata->m_oValueMetadata.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pMetadata->m_arFutureMetadata.size(); ++i) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_Metadata::FutureMetadata); + WriteFutureMetadata(pMetadata->m_arFutureMetadata[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataTypes(OOX::Spreadsheet::CMetadataTypes* pMetadataTypes) +{ + if (!pMetadataTypes) return; + + for (size_t i = 0; i < pMetadataTypes->m_arrItems.size(); ++i) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::MetadataType); + WriteMetadataType(pMetadataTypes->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataType(OOX::Spreadsheet::CMetadataType* pMetadataType) +{ + if (!pMetadataType) return; + + if (pMetadataType->m_oName.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Name); + m_oBcw.m_oStream.WriteStringW3(*pMetadataType->m_oName); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oMinSupportedVersion.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::MinSupportedVersion); + m_oBcw.m_oStream.WriteULONG(*pMetadataType->m_oMinSupportedVersion); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oGhostRow.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::GhostRow); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oGhostRow); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oGhostCol.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::GhostCol); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oGhostCol); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oEdit.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Edit); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oEdit); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oDelete.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Delete); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oDelete); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oCopy.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Copy); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oCopy); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteAll.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteAll); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteAll); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteFormulas.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteFormulas); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteFormulas); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteValues.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteValues); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteValues); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteFormats.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteFormats); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteFormats); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteComments.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteComments); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteComments); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteDataValidation.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteDataValidation); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteDataValidation); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteBorders.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteBorders); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteBorders); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteColWidths.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteColWidths); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteColWidths); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oPasteNumberFormats.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::PasteNumberFormats); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oPasteNumberFormats); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oMerge.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Merge); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oMerge); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oSplitFirst.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::SplitFirst); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oSplitFirst); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oSplitAll.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::SplitAll); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oSplitAll); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oRowColShift.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::RowColShift); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oRowColShift); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearAll.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearAll); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearAll); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearFormats.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearFormats); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearFormats); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearContents.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearContents); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearContents); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oClearComments.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::ClearComments); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oClearComments); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oAssign.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Assign); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oAssign); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oCoerce.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::Coerce); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oCoerce); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataType->m_oCellMeta.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataType::CellMeta); + m_oBcw.m_oStream.WriteBOOL(*pMetadataType->m_oCellMeta); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataStrings(OOX::Spreadsheet::CMetadataStrings* pMetadataStrings) +{ + if (!pMetadataStrings) return; + + for (size_t i = 0; i < pMetadataStrings->m_arrItems.size(); ++i) + { + if ((pMetadataStrings->m_arrItems[i]) && (pMetadataStrings->m_arrItems[i]->m_oV.IsInit())) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataString::MetadataString); + m_oBcw.m_oStream.WriteStringW3(pMetadataStrings->m_arrItems[i]->m_oV.get()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + } +} +void BinaryWorkbookTableWriter::WriteMdxMetadata(OOX::Spreadsheet::CMdxMetadata* pMdxMetadata) +{ + if (!pMdxMetadata) return; + + for (size_t i = 0; i < pMdxMetadata->m_arrItems.size(); ++i) + { + if (!pMdxMetadata->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::Mdx); + WriteMdx(pMdxMetadata->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdx(OOX::Spreadsheet::CMdx* pMdx) +{ + if (!pMdx) return; + + if (pMdx->m_oN.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::NameIndex); + m_oBcw.m_oStream.WriteULONG(*pMdx->m_oN); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oF.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::NameIndex); + m_oBcw.m_oStream.WriteBYTE(pMdx->m_oF->GetValue()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oMdxTuple.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxTuple); + WriteMdxTuple(pMdx->m_oMdxTuple.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oMdxSet.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxSet); + WriteMdxSet(pMdx->m_oMdxSet.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oCMdxKPI.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxKPI); + WriteMdxKPI(pMdx->m_oCMdxKPI.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdx->m_oMdxMemeberProp.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::MdxMemeberProp); + WriteMdxMemeberProp(pMdx->m_oMdxMemeberProp.GetPointer()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxTuple(OOX::Spreadsheet::CMdxTuple* pMdxTuple) +{ + if (!pMdxTuple) return; + + if (pMdxTuple->m_oC.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::IndexCount); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oC); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oCt.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::CultureCurrency); + m_oBcw.m_oStream.WriteStringW3(*pMdxTuple->m_oCt); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oSi.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::StringIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oSi); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oFi.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::NumFmtIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oFi); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oBc.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::BackColor); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oBc); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oFc.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::ForeColor); + m_oBcw.m_oStream.WriteULONG(*pMdxTuple->m_oFc); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oI.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Italic); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oI); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oB.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Bold); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oB); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oU.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Underline); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oU); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxTuple->m_oSt.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::Strike); + m_oBcw.m_oStream.WriteBOOL(*pMdxTuple->m_oSt); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pMdxTuple->m_arrItems.size(); ++i) + { + if (!pMdxTuple->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxTuple::MetadataStringIndex); + WriteMetadataStringIndex(pMdxTuple->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataStringIndex(OOX::Spreadsheet::CMetadataStringIndex* pStringIndex) +{ + if (!pStringIndex) return; + + if (pStringIndex->m_oX.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataStringIndex::IndexValue); + m_oBcw.m_oStream.WriteULONG(*pStringIndex->m_oX); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pStringIndex->m_oS.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataStringIndex::StringIsSet); + m_oBcw.m_oStream.WriteULONG(*pStringIndex->m_oS); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxSet(OOX::Spreadsheet::CMdxSet* pMdxSet) +{ + if (!pMdxSet) return; + + if (pMdxSet->m_oC.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::Count); + m_oBcw.m_oStream.WriteULONG(*pMdxSet->m_oC); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxSet->m_oNs.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::Index); + m_oBcw.m_oStream.WriteULONG(*pMdxSet->m_oNs); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxSet->m_oO.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::SortOrder); + m_oBcw.m_oStream.WriteBYTE(pMdxSet->m_oO->GetValue()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pMdxSet->m_arrItems.size(); ++i) + { + if (!pMdxSet->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxSet::MetadataStringIndex); + WriteMetadataStringIndex(pMdxSet->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxKPI(OOX::Spreadsheet::CMdxKPI* pMdxKPI) +{ + if (!pMdxKPI) return; + + if (pMdxKPI->m_oN.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxKPI::NameIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxKPI->m_oN); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxKPI->m_oNp.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxKPI::Index); + m_oBcw.m_oStream.WriteULONG(*pMdxKPI->m_oNp); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxKPI->m_oP.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMdxKPI::Property); + m_oBcw.m_oStream.WriteBYTE(pMdxKPI->m_oP->GetValue()); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMdxMemeberProp(OOX::Spreadsheet::CMdxMemeberProp* pMdxMemeberProp) +{ + if (!pMdxMemeberProp) return; + + if (pMdxMemeberProp->m_oN.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMemberProperty::NameIndex); + m_oBcw.m_oStream.WriteULONG(*pMdxMemeberProp->m_oN); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMdxMemeberProp->m_oNp.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataMemberProperty::Index); + m_oBcw.m_oStream.WriteULONG(*pMdxMemeberProp->m_oNp); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataBlocks(OOX::Spreadsheet::CMetadataBlocks* pMetadataBlocks) +{ + if (!pMetadataBlocks) return; + + for (size_t i = 0; i < pMetadataBlocks->m_arrItems.size(); ++i) + { + if (!pMetadataBlocks->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataBlock); + WriteMetadataBlock(pMetadataBlocks->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataBlock(OOX::Spreadsheet::CMetadataBlock* pMetadataBlock) +{ + if (!pMetadataBlock) return; + + for (size_t i = 0; i < pMetadataBlock->m_arrItems.size(); ++i) + { + if (!pMetadataBlock->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataRecord); + WriteMetadataRecord(pMetadataBlock->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteMetadataRecord(OOX::Spreadsheet::CMetadataRecord* pMetadataRecord) +{ + if (!pMetadataRecord) return; + + if (pMetadataRecord->m_oT.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataRecordType); + m_oBcw.m_oStream.WriteULONG(*pMetadataRecord->m_oT); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if (pMetadataRecord->m_oV.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MetadataBlock::MetadataRecordValue); + m_oBcw.m_oStream.WriteULONG(*pMetadataRecord->m_oV); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} +void BinaryWorkbookTableWriter::WriteFutureMetadataBlock(OOX::Spreadsheet::CFutureMetadataBlock* pFutureMetadataBlock) +{ + if (!pFutureMetadataBlock) return; + if (false == pFutureMetadataBlock->m_oExtLst.IsInit()) return; + + for (size_t i = 0; i < pFutureMetadataBlock->m_oExtLst->m_arrExt.size(); ++i) + { + if (!pFutureMetadataBlock->m_oExtLst->m_arrExt[i]) continue; + + if (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::DynamicArrayProperties); + { + if (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFDynamic.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::DynamicArray); + m_oBcw.m_oStream.WriteBOOL(*pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFDynamic); + m_oBcw.WriteItemWithLengthEnd(nCurPos2); + + } + if (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFCollapsed.IsInit()) + { + int nCurPos2 = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::CollapsedArray); + m_oBcw.m_oStream.WriteBOOL(*pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oDynamicArrayProperties->m_oFCollapsed); + m_oBcw.WriteItemWithLengthEnd(nCurPos2); + } + } + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + if ((pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oRichValueBlock.IsInit()) && + (pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oRichValueBlock->m_oI.IsInit())) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::RichValueBlock); + m_oBcw.m_oStream.WriteULONG(*pFutureMetadataBlock->m_oExtLst->m_arrExt[i]->m_oRichValueBlock->m_oI); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + } +} +void BinaryWorkbookTableWriter::WriteFutureMetadata(OOX::Spreadsheet::CFutureMetadata* pFutureMetadata) +{ + if (!pFutureMetadata) return; + + if (pFutureMetadata->m_oName.IsInit()) + { + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::Name); + m_oBcw.m_oStream.WriteStringW3(*pFutureMetadata->m_oName); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } + for (size_t i = 0; i < pFutureMetadata->m_arrItems.size(); ++i) + { + if (!pFutureMetadata->m_arrItems[i]) continue; + + int nCurPos = m_oBcw.WriteItemStart(c_oSer_FutureMetadataBlock::FutureMetadataBlock); + WriteFutureMetadataBlock(pFutureMetadata->m_arrItems[i]); + m_oBcw.WriteItemWithLengthEnd(nCurPos); + } +} + void BinaryWorkbookTableWriter::WriteTimelineRange(OOX::Spreadsheet::CTimelineRange* pTimelineRange) { if (!pTimelineRange) return; diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.h b/OOXML/Binary/Sheets/Reader/BinaryWriter.h index bead4217d9..f07dd9d740 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.h +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.h @@ -84,6 +84,23 @@ namespace OOX class CTimelineStyle; class CTimelineStyles; class CTimelineStyleElement; + + class CMetadata; + class CFutureMetadata; + class CFutureMetadataBlock; + class CMetadataBlocks; + class CMetadataBlock; + class CMetadataRecord; + class CMetadataTypes; + class CMetadataType; + class CMdxMetadata; + class CMdxKPI; + class CMdxMemeberProp; + class CMdxTuple; + class CMdx; + class CMdxSet; + class CMetadataStrings; + class CMetadataStringIndex; } } @@ -188,6 +205,7 @@ namespace BinXlsxRW void WriteWorkbookView(const OOX::Spreadsheet::CWorkbookView& workbookView); void WriteDefinedNames(const OOX::Spreadsheet::CDefinedNames& definedNames); void WriteCalcPr(const OOX::Spreadsheet::CCalcPr& CCalcPr); + void WriteConnections(const OOX::Spreadsheet::CConnections& connections); void WriteConnection(const OOX::Spreadsheet::CConnection& connection); void WriteConnectionDbPr(const OOX::Spreadsheet::CDbPr& dbPr); @@ -197,6 +215,7 @@ namespace BinXlsxRW void WriteConnectionTextField(const OOX::Spreadsheet::CTextField& textField); void WriteConnectionWebPr(const OOX::Spreadsheet::CWebPr& webPr); void WriteConnectionRangePr(const OOX::Spreadsheet::CRangePr& rangePr); + void WriteExternalReferences(const OOX::Spreadsheet::CExternalReferences& externalReferences, OOX::Spreadsheet::CWorkbook& workbook); void WriteExternalBook(const OOX::Spreadsheet::CExternalBook& externalBook, OOX::Spreadsheet::CExternalLink* pExternalLink); void WriteExternalAlternateUrls(const OOX::Spreadsheet::CAlternateUrls& alternateUrls, OOX::Spreadsheet::CExternalLink* pExternalLink); @@ -207,6 +226,7 @@ namespace BinXlsxRW void WriteExternalSheetData(const OOX::Spreadsheet::CExternalSheetData& sheetData); void WriteExternalRow(const OOX::Spreadsheet::CExternalRow& row); void WriteExternalCell(const OOX::Spreadsheet::CExternalCell& cell); + void WriteOleLink(const OOX::Spreadsheet::COleLink& oleLink, const std::wstring& sLink); void WriteOleItem(const OOX::Spreadsheet::COleItem& oleItem); void WriteDdeLink(const OOX::Spreadsheet::CDdeLink& ddeLink); @@ -216,6 +236,7 @@ namespace BinXlsxRW void WriteDefinedName(const OOX::Spreadsheet::CDefinedName& definedName); void WriteSlicerCaches(OOX::Spreadsheet::CWorkbook& workbook, const OOX::Spreadsheet::CSlicerCaches& oSlicerCaches); void WriteFileSharing(const OOX::Spreadsheet::CFileSharing& fileSharing); + void WriteTimelineCaches(OOX::Spreadsheet::CWorkbook& workbook, const OOX::Spreadsheet::CTimelineCacheRefs& oTimelineCacheRefs); void WriteTimelineCache(OOX::Spreadsheet::CTimelineCacheDefinition* pTimelineCache); void WriteTimelineState(OOX::Spreadsheet::CTimelineState* pState); @@ -224,6 +245,22 @@ namespace BinXlsxRW void WriteTimelineCachePivotTable(OOX::Spreadsheet::CTimelineCachePivotTable* pPivotTable); void WriteTimelineRange(OOX::Spreadsheet::CTimelineRange* pTimelineRange); + void WriteMetadata(OOX::Spreadsheet::CMetadata* pMetadata); + void WriteMetadataTypes(OOX::Spreadsheet::CMetadataTypes* pMetadataTypes); + void WriteMetadataType(OOX::Spreadsheet::CMetadataType* pMetadataType); + void WriteMetadataStrings(OOX::Spreadsheet::CMetadataStrings* pMetadataStrings); + void WriteMdxMetadata(OOX::Spreadsheet::CMdxMetadata* pMdxMetadata); + void WriteMdx(OOX::Spreadsheet::CMdx* pMdx); + void WriteMetadataBlocks(OOX::Spreadsheet::CMetadataBlocks* pMetadataBlocks); + void WriteMetadataBlock(OOX::Spreadsheet::CMetadataBlock* pMetadataBlock); + void WriteMetadataRecord(OOX::Spreadsheet::CMetadataRecord* pMetadataRecord); + void WriteFutureMetadata(OOX::Spreadsheet::CFutureMetadata* pMetadata); + void WriteFutureMetadataBlock(OOX::Spreadsheet::CFutureMetadataBlock* pMetadataBlock); + void WriteMdxTuple(OOX::Spreadsheet::CMdxTuple* pMdxTuple); + void WriteMdxSet(OOX::Spreadsheet::CMdxSet* pMdxSet); + void WriteMdxKPI(OOX::Spreadsheet::CMdxKPI* pMdxKPI); + void WriteMdxMemeberProp(OOX::Spreadsheet::CMdxMemeberProp* pMdxMemeberProp); + void WriteMetadataStringIndex(OOX::Spreadsheet::CMetadataStringIndex* pStringIndex); }; class BinaryPersonTableWriter { diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp index e6024775c7..0990e50d6b 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp @@ -73,6 +73,7 @@ #include "../../../XlsxFormat/Table/Connections.h" #include "../../../XlsxFormat/Controls/Controls.h" #include "../../../XlsxFormat/Timelines/Timeline.h" +#include "../../../XlsxFormat/Workbook/Metadata.h" #include "../../../DocxFormat/Media/VbaProject.h" #include "../../../DocxFormat/Media/JsaProject.h" @@ -2322,6 +2323,15 @@ int BinaryWorkbookTableReader::ReadWorkbookTableContent(BYTE type, long length, m_oWorkbook.m_oExtLst.Init(); m_oWorkbook.m_oExtLst->m_arrExt.push_back(pOfficeArtExtension); } + else if (c_oSerWorkbookTypes::Metadata == type) + { + smart_ptr oMetadataFile(new OOX::Spreadsheet::CMetadataFile(NULL)); + oMetadataFile->m_oMetadata.Init(); + READ1_DEF(length, res, this->ReadMetadata, oMetadataFile->m_oMetadata.GetPointer()); + + smart_ptr oFile = oMetadataFile.smart_dynamic_cast(); + m_oWorkbook.Add(oFile); + } else res = c_oSerConstants::ReadUnknown; return res; @@ -7914,6 +7924,501 @@ int BinaryCustomsReader::ReadCustomContent(BYTE type, long length, void* poResul res = c_oSerConstants::ReadUnknown; return res; } +int BinaryWorkbookTableReader::ReadMetadata(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadata* pMetadata = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_Metadata::MetadataTypes == type) + { + pMetadata->m_oMetadataTypes.Init(); + READ1_DEF(length, res, this->ReadMetadataTypes, pMetadata->m_oMetadataTypes.GetPointer()); + } + else if (c_oSer_Metadata::MetadataStrings == type) + { + pMetadata->m_oMetadataStrings.Init(); + READ1_DEF(length, res, this->ReadMetadataStrings, pMetadata->m_oMetadataStrings.GetPointer()); + } + else if (c_oSer_Metadata::MdxMetadata == type) + { + pMetadata->m_oMdxMetadata.Init(); + READ1_DEF(length, res, this->ReadMdxMetadata, pMetadata->m_oMdxMetadata.GetPointer()); + } + else if (c_oSer_Metadata::CellMetadata == type) + { + pMetadata->m_oCellMetadata.Init(); + READ1_DEF(length, res, this->ReadMetadataBlocks, pMetadata->m_oCellMetadata.GetPointer()); + } + else if (c_oSer_Metadata::ValueMetadata == type) + { + pMetadata->m_oValueMetadata.Init(); + READ1_DEF(length, res, this->ReadMetadataBlocks, pMetadata->m_oValueMetadata.GetPointer()); + } + else if (c_oSer_Metadata::FutureMetadata == type) + { + OOX::Spreadsheet::CFutureMetadata* pFutureMetadata = new OOX::Spreadsheet::CFutureMetadata(); + READ1_DEF(length, res, this->ReadFutureMetadata, pFutureMetadata); + pMetadata->m_arFutureMetadata.push_back(pFutureMetadata); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataTypes(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataTypes* pMetadataTypes = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataType::MetadataType == type) + { + OOX::Spreadsheet::CMetadataType* pMetadataType = new OOX::Spreadsheet::CMetadataType(); + READ1_DEF(length, res, this->ReadMetadataType, pMetadataType); + pMetadataTypes->m_arrItems.push_back(pMetadataType); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataType(BYTE type, long length, void* poResult) +{ + int res = c_oSerConstants::ReadOk; + OOX::Spreadsheet::CMetadataType* pMetadataType = static_cast(poResult); + + if (c_oSer_MetadataType::Name == type) + { + pMetadataType->m_oName = m_oBufferedStream.GetString3(length); + } + else if (c_oSer_MetadataType::MinSupportedVersion == type) + { + pMetadataType->m_oMinSupportedVersion = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataType::GhostRow == type) + { + pMetadataType->m_oGhostRow = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::GhostCol == type) + { + pMetadataType->m_oGhostCol = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Edit == type) + { + pMetadataType->m_oEdit = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Delete == type) + { + pMetadataType->m_oDelete = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Copy == type) + { + pMetadataType->m_oCopy = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteAll == type) + { + pMetadataType->m_oPasteAll = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteFormulas == type) + { + pMetadataType->m_oPasteFormulas = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteValues == type) + { + pMetadataType->m_oPasteValues = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteFormats == type) + { + pMetadataType->m_oPasteFormats = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteComments == type) + { + pMetadataType->m_oPasteComments = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteDataValidation == type) + { + pMetadataType->m_oPasteDataValidation = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteBorders == type) + { + pMetadataType->m_oPasteBorders = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteColWidths == type) + { + pMetadataType->m_oPasteColWidths = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::PasteNumberFormats == type) + { + pMetadataType->m_oPasteNumberFormats = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Merge == type) + { + pMetadataType->m_oMerge = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::SplitFirst == type) + { + pMetadataType->m_oSplitFirst = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::SplitAll == type) + { + pMetadataType->m_oSplitAll = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::RowColShift == type) + { + pMetadataType->m_oRowColShift = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearAll == type) + { + pMetadataType->m_oClearAll = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearFormats == type) + { + pMetadataType->m_oClearFormats = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearContents == type) + { + pMetadataType->m_oClearContents = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::ClearComments == type) + { + pMetadataType->m_oClearComments = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Assign == type) + { + pMetadataType->m_oAssign = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::Coerce == type) + { + pMetadataType->m_oCoerce = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataType::CellMeta == type) + { + pMetadataType->m_oCellMeta = m_oBufferedStream.GetBool(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataStrings(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataStrings* pMetadataStrings = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataString::MetadataString == type) + { + OOX::Spreadsheet::CMetadataString* pMetadataString = new OOX::Spreadsheet::CMetadataString(); + pMetadataString->m_oV = m_oBufferedStream.GetString3(length); + pMetadataStrings->m_arrItems.push_back(pMetadataString); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxMetadata(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxMetadata* pMdxMetadata = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MdxMetadata::Mdx == type) + { + OOX::Spreadsheet::CMdx* pMdx = new OOX::Spreadsheet::CMdx(); + READ1_DEF(length, res, this->ReadMdx, pMdx); + pMdxMetadata->m_arrItems.push_back(pMdx); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdx(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdx* pMdx = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MdxMetadata::NameIndex == type) + { + pMdx->m_oN = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MdxMetadata::FunctionTag == type) + { + pMdx->m_oF.Init(); + pMdx->m_oF->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else if (c_oSer_MdxMetadata::MdxTuple == type) + { + pMdx->m_oMdxTuple.Init(); + READ1_DEF(length, res, this->ReadMdxTuple, pMdx->m_oMdxTuple.GetPointer()); + } + else if (c_oSer_MdxMetadata::MdxSet == type) + { + pMdx->m_oMdxSet.Init(); + READ1_DEF(length, res, this->ReadMdxSet, pMdx->m_oMdxSet.GetPointer()); + } + else if (c_oSer_MdxMetadata::MdxKPI == type) + { + pMdx->m_oCMdxKPI.Init(); + READ1_DEF(length, res, this->ReadMdxKPI, pMdx->m_oCMdxKPI.GetPointer()); + } + else if (c_oSer_MdxMetadata::MdxMemeberProp == type) + { + pMdx->m_oMdxMemeberProp.Init(); + READ1_DEF(length, res, this->ReadMdxMemeberProp, pMdx->m_oMdxMemeberProp.GetPointer()); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataBlocks(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataBlocks* pMetadataBlocks = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataBlock::MetadataBlock == type) + { + OOX::Spreadsheet::CMetadataBlock* pMetadataBlock = new OOX::Spreadsheet::CMetadataBlock(); + READ1_DEF(length, res, this->ReadMetadataBlock, pMetadataBlock); + pMetadataBlocks->m_arrItems.push_back(pMetadataBlock); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataBlock(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataBlock* pMetadataBlock = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataBlock::MetadataRecord == type) + { + OOX::Spreadsheet::CMetadataRecord* pMetadataRecord = new OOX::Spreadsheet::CMetadataRecord(); + READ1_DEF(length, res, this->ReadMetadataRecord, pMetadataRecord); + pMetadataBlock->m_arrItems.push_back(pMetadataRecord); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataRecord(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataRecord* pMetadataRecord = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataBlock::MetadataRecordType == type) + { + pMetadataRecord->m_oT = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataBlock::MetadataRecordValue == type) + { + pMetadataRecord->m_oV = m_oBufferedStream.GetULong(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadDynamicArrayProperties(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CDynamicArrayProperties* pDynamicArrayProperties = static_cast(poResult); + int res = c_oSerConstants::ReadOk; + + if (c_oSer_FutureMetadataBlock::DynamicArray == type) + { + pDynamicArrayProperties->m_oFDynamic = m_oBufferedStream.GetBool(); + } + else if (c_oSer_FutureMetadataBlock::CollapsedArray == type) + { + pDynamicArrayProperties->m_oFCollapsed = m_oBufferedStream.GetBool(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMetadataStringIndex(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMetadataStringIndex* pStringIndex = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataStringIndex::StringIsSet == type) + { + pStringIndex->m_oS = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataStringIndex::IndexValue == type) + { + pStringIndex->m_oX = m_oBufferedStream.GetULong(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxMemeberProp(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxMemeberProp* pMdxMemeberProp = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMemberProperty::NameIndex == type) + { + pMdxMemeberProp->m_oN = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMemberProperty::Index == type) + { + pMdxMemeberProp->m_oNp = m_oBufferedStream.GetULong(); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxKPI(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxKPI* pMdxKPI = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMdxKPI::NameIndex == type) + { + pMdxKPI->m_oN = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxKPI::Index == type) + { + pMdxKPI->m_oNp = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxKPI::Property == type) + { + pMdxKPI->m_oP.Init(); + pMdxKPI->m_oP->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxSet(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxSet* pMdxSet = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMdxSet::Count == type) + { + pMdxSet->m_oC = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxSet::Index == type) + { + pMdxSet->m_oNs = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxSet::SortOrder == type) + { + pMdxSet->m_oO.Init(); + pMdxSet->m_oO->SetValueFromByte(m_oBufferedStream.GetUChar()); + } + else if (c_oSer_MetadataMdxSet::MetadataStringIndex == type) + { + OOX::Spreadsheet::CMetadataStringIndex* pMetadataStringIndex = new OOX::Spreadsheet::CMetadataStringIndex(); + READ1_DEF(length, res, this->ReadMetadataStringIndex, pMetadataStringIndex); + pMdxSet->m_arrItems.push_back(pMetadataStringIndex); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadMdxTuple(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CMdxTuple* pMdxTuple = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_MetadataMdxTuple::IndexCount == type) + { + pMdxTuple->m_oC = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::StringIndex == type) + { + pMdxTuple->m_oSi = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::CultureCurrency == type) + { + pMdxTuple->m_oCt = m_oBufferedStream.GetString3(length); + } + else if (c_oSer_MetadataMdxTuple::NumFmtIndex == type) + { + pMdxTuple->m_oFi = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::BackColor == type) + { + pMdxTuple->m_oBc = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::ForeColor == type) + { + pMdxTuple->m_oFc = m_oBufferedStream.GetULong(); + } + else if (c_oSer_MetadataMdxTuple::Italic == type) + { + pMdxTuple->m_oI = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::Bold == type) + { + pMdxTuple->m_oB = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::Underline == type) + { + pMdxTuple->m_oU = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::Strike == type) + { + pMdxTuple->m_oSt = m_oBufferedStream.GetBool(); + } + else if (c_oSer_MetadataMdxTuple::MetadataStringIndex == type) + { + OOX::Spreadsheet::CMetadataStringIndex* pMetadataStringIndex = new OOX::Spreadsheet::CMetadataStringIndex(); + READ1_DEF(length, res, this->ReadMetadataStringIndex, pMetadataStringIndex); + pMdxTuple->m_arrItems.push_back(pMetadataStringIndex); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadFutureMetadata(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CFutureMetadata* pCFutureMetadata = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + + if (c_oSer_FutureMetadataBlock::Name == type) + { + pCFutureMetadata->m_oName = m_oBufferedStream.GetString3(length); + } + else if (c_oSer_FutureMetadataBlock::FutureMetadataBlock == type) + { + OOX::Spreadsheet::CFutureMetadataBlock* pFutureMetadataBlock = new OOX::Spreadsheet::CFutureMetadataBlock(); + READ1_DEF(length, res, this->ReadFutureMetadataBlock, pFutureMetadataBlock); + pCFutureMetadata->m_arrItems.push_back(pFutureMetadataBlock); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} +int BinaryWorkbookTableReader::ReadFutureMetadataBlock(BYTE type, long length, void* poResult) +{ + OOX::Spreadsheet::CFutureMetadataBlock* pFutureMetadataBlock = static_cast(poResult); + + int res = c_oSerConstants::ReadOk; + if (c_oSer_FutureMetadataBlock::RichValueBlock == type) + { + if (false == pFutureMetadataBlock->m_oExtLst.IsInit()) pFutureMetadataBlock->m_oExtLst.Init(); + + OOX::Drawing::COfficeArtExtension* pExt = new OOX::Drawing::COfficeArtExtension(); + pExt->m_sUri = L"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}"; + pExt->m_oRichValueBlock.Init(); + pExt->m_oRichValueBlock->m_oI = m_oBufferedStream.GetULong(); + + pFutureMetadataBlock->m_oExtLst->m_arrExt.push_back(pExt); + } + else if (c_oSer_FutureMetadataBlock::DynamicArrayProperties == type) + { + if (false == pFutureMetadataBlock->m_oExtLst.IsInit()) pFutureMetadataBlock->m_oExtLst.Init(); + + OOX::Drawing::COfficeArtExtension* pExt = new OOX::Drawing::COfficeArtExtension(); + pExt->m_sUri = L"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}"; + pExt->m_oDynamicArrayProperties.Init(); + + READ1_DEF(length, res, this->ReadDynamicArrayProperties, pExt->m_oDynamicArrayProperties.GetPointer()); + pFutureMetadataBlock->m_oExtLst->m_arrExt.push_back(pExt); + } + else + res = c_oSerConstants::ReadUnknown; + return res; +} + //------------------------------------------------------------------------------------------------------------------------------------ BinaryFileReader::BinaryFileReader() { diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.h b/OOXML/Binary/Sheets/Writer/BinaryReader.h index 3ad6d9a7a9..17ede45e95 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.h +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.h @@ -219,6 +219,7 @@ namespace BinXlsxRW int ReadDefinedNames(BYTE type, long length, void* poResult); int ReadDefinedName(BYTE type, long length, void* poResult); int ReadCalcPr(BYTE type, long length, void* poResult); + int ReadExternalBook(BYTE type, long length, void* poResult); int ReadExternalSheetNames(BYTE type, long length, void* poResult); int ReadExternalDefinedNames(BYTE type, long length, void* poResult); @@ -228,6 +229,7 @@ namespace BinXlsxRW int ReadExternalRow(BYTE type, long length, void* poResult); int ReadExternalCell(BYTE type, long length, void* poResult); int ReadExternalAlternateUrls(BYTE type, long length, void* poResult); + int ReadOleLink(BYTE type, long length, void* poResult); int ReadOleItem(BYTE type, long length, void* poResult); int ReadDdeLink(BYTE type, long length, void* poResult); @@ -236,6 +238,7 @@ namespace BinXlsxRW int ReadDdeValue(BYTE type, long length, void* poResult); int ReadPivotCaches(BYTE type, long length, void* poResult); int ReadPivotCache(BYTE type, long length, void* poResult); + int ReadConnections(BYTE type, long length, void* poResult); int ReadConnection(BYTE type, long length, void* poResult); int ReadConnectionDbPr(BYTE type, long length, void* poResult); @@ -245,7 +248,9 @@ namespace BinXlsxRW int ReadConnectionRangePr(BYTE type, long length, void* poResult); int ReadConnectionTextFields(BYTE type, long length, void* poResult); int ReadConnectionTextField(BYTE type, long length, void* poResult); + int ReadSlicerCaches(BYTE type, long length, void* poResult); + int ReadTimelineCaches(BYTE type, long length, void* poResult); int ReadTimelineCache(BYTE type, long length, void* poResult); int ReadTimelineState(BYTE type, long length, void* poResult); @@ -253,6 +258,24 @@ namespace BinXlsxRW int ReadTimelineCachePivotTables(BYTE type, long length, void* poResult); int ReadTimelineCachePivotTable(BYTE type, long length, void* poResult); int ReadTimelineRange(BYTE type, long length, void* poResult); + + int ReadMetadata(BYTE type, long length, void* poResult); + int ReadMetadataTypes(BYTE type, long length, void* poResult); + int ReadMetadataType(BYTE type, long length, void* poResult); + int ReadMetadataStrings(BYTE type, long length, void* poResult); + int ReadMdxMetadata(BYTE type, long length, void* poResult); + int ReadMdx(BYTE type, long length, void* poResult); + int ReadMetadataBlocks(BYTE type, long length, void* poResult); + int ReadMetadataBlock(BYTE type, long length, void* poResult); + int ReadMetadataRecord(BYTE type, long length, void* poResult); + int ReadFutureMetadata(BYTE type, long length, void* poResult); + int ReadFutureMetadataBlock(BYTE type, long length, void* poResult); + int ReadMdxTuple(BYTE type, long length, void* poResult); + int ReadMdxSet(BYTE type, long length, void* poResult); + int ReadMdxKPI(BYTE type, long length, void* poResult); + int ReadMdxMemeberProp(BYTE type, long length, void* poResult); + int ReadMetadataStringIndex(BYTE type, long length, void* poResult); + int ReadDynamicArrayProperties(BYTE type, long length, void* poResult); }; class BinaryCommentReader : public Binary_CommonReader { diff --git a/OOXML/Common/SimpleTypes_Drawing.cpp b/OOXML/Common/SimpleTypes_Drawing.cpp index f30ec34625..64d8902a90 100644 --- a/OOXML/Common/SimpleTypes_Drawing.cpp +++ b/OOXML/Common/SimpleTypes_Drawing.cpp @@ -5324,7 +5324,7 @@ namespace SimpleTypes EHierBranch CHierBranch::FromString(const std::wstring &sValue) { - if (L"none" == sValue) this->m_eValue = hierBranch_hang; + if (L"hang" == sValue) this->m_eValue = hierBranch_hang; else if (L"init" == sValue) this->m_eValue = hierBranch_init; else if (L"l" == sValue) this->m_eValue = hierBranch_l; else if (L"r" == sValue) this->m_eValue = hierBranch_r; diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.cpp b/OOXML/Common/SimpleTypes_Spreadsheet.cpp index 9373dd4aa6..4df1ea497f 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.cpp +++ b/OOXML/Common/SimpleTypes_Spreadsheet.cpp @@ -3291,5 +3291,107 @@ namespace SimpleTypes } return L"unselectedItemWithData"; } + + EMdxKPIProperty CMdxKPIProperty::FromString(const std::wstring& sValue) + { + if (L"v" == sValue) + this->m_eValue = mdxKPIProperty_v; + else if (L"g" == sValue) + this->m_eValue = mdxKPIProperty_g; + else if (L"s" == sValue) + this->m_eValue = mdxKPIProperty_s; + else if (L"t" == sValue) + this->m_eValue = mdxKPIProperty_t; + else if (L"w" == sValue) + this->m_eValue = mdxKPIProperty_w; + else if (L"m" == sValue) + this->m_eValue = mdxKPIProperty_m; + else + this->m_eValue = mdxKPIProperty_v; + return this->m_eValue; + } + std::wstring CMdxKPIProperty::ToString() const + { + switch (this->m_eValue) + { + case mdxKPIProperty_v: return L"v"; break; + case mdxKPIProperty_g: return L"g"; break; + case mdxKPIProperty_s: return L"s"; break; + case mdxKPIProperty_t: return L"t"; break; + case mdxKPIProperty_w: return L"w"; break; + case mdxKPIProperty_m: return L"m"; break; + } + return L"v"; + } + + EMdxSetOrder CMdxSetOrder::FromString(const std::wstring& sValue) + { + if (L"u" == sValue) + this->m_eValue = mdxSetOrder_u; + else if (L"a" == sValue) + this->m_eValue = mdxSetOrder_a; + else if (L"d" == sValue) + this->m_eValue = mdxSetOrder_d; + else if (L"aa" == sValue) + this->m_eValue = mdxSetOrder_aa; + else if (L"ad" == sValue) + this->m_eValue = mdxSetOrder_ad; + else if (L"na" == sValue) + this->m_eValue = mdxSetOrder_na; + else if (L"nd" == sValue) + this->m_eValue = mdxSetOrder_nd; + else + this->m_eValue = mdxSetOrder_u; + return this->m_eValue; + } + std::wstring CMdxSetOrder::ToString() const + { + switch (this->m_eValue) + { + case mdxSetOrder_u: return L"u"; break; + case mdxSetOrder_a: return L"a"; break; + case mdxSetOrder_d: return L"d"; break; + case mdxSetOrder_aa: return L"aa"; break; + case mdxSetOrder_ad: return L"ad"; break; + case mdxSetOrder_na: return L"na"; break; + case mdxSetOrder_nd: return L"nd"; break; + } + return L"v"; + } + + EMdxFunctionType CMdxFunctionType::FromString(const std::wstring& sValue) + { + if (L"m" == sValue) + this->m_eValue = mdxFunctionType_m; + else if (L"v" == sValue) + this->m_eValue = mdxFunctionType_v; + else if (L"s" == sValue) + this->m_eValue = mdxFunctionType_s; + else if (L"c" == sValue) + this->m_eValue = mdxFunctionType_c; + else if (L"r" == sValue) + this->m_eValue = mdxFunctionType_r; + else if (L"p" == sValue) + this->m_eValue = mdxFunctionType_p; + else if (L"k" == sValue) + this->m_eValue = mdxFunctionType_k; + else + this->m_eValue = mdxFunctionType_m; + return this->m_eValue; + } + std::wstring CMdxFunctionType::ToString() const + { + switch (this->m_eValue) + { + case mdxFunctionType_m: return L"m"; break; + case mdxFunctionType_v: return L"v"; break; + case mdxFunctionType_s: return L"s"; break; + case mdxFunctionType_c: return L"c"; break; + case mdxFunctionType_r: return L"r"; break; + case mdxFunctionType_p: return L"p"; break; + case mdxFunctionType_k: return L"k"; break; + } + return L"v"; + } }// Spreadsheet } // SimpleTypes diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.h b/OOXML/Common/SimpleTypes_Spreadsheet.h index ba71925b99..d132525ca8 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.h +++ b/OOXML/Common/SimpleTypes_Spreadsheet.h @@ -1406,5 +1406,40 @@ namespace SimpleTypes DEFINE_SIMPLE_TYPE(CTimelineStyleType, ETimelineStyleType, timelineStyle_selectionLabel) + enum EMdxKPIProperty + { + mdxKPIProperty_v = 0, + mdxKPIProperty_g = 1, + mdxKPIProperty_s = 2, + mdxKPIProperty_t = 3, + mdxKPIProperty_w = 4, + mdxKPIProperty_m = 5 + }; + DEFINE_SIMPLE_TYPE(CMdxKPIProperty, EMdxKPIProperty, mdxKPIProperty_v) + + enum EMdxSetOrder + { + mdxSetOrder_u = 0, + mdxSetOrder_a = 1, + mdxSetOrder_d = 2, + mdxSetOrder_aa = 3, + mdxSetOrder_ad = 4, + mdxSetOrder_na = 5, + mdxSetOrder_nd = 6 + }; + DEFINE_SIMPLE_TYPE(CMdxSetOrder, EMdxSetOrder, mdxSetOrder_u) + + enum EMdxFunctionType + { + mdxFunctionType_m = 0, + mdxFunctionType_v = 1, + mdxFunctionType_s = 2, + mdxFunctionType_c = 3, + mdxFunctionType_r = 4, + mdxFunctionType_p = 5, + mdxFunctionType_k = 6 + }; + DEFINE_SIMPLE_TYPE(CMdxFunctionType, EMdxFunctionType, mdxFunctionType_m) + }// Spreadsheet } // SimpleTypes diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.cpp b/OOXML/DocxFormat/Drawing/DrawingExt.cpp index a8592dbdbf..a8a2bfb952 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.cpp +++ b/OOXML/DocxFormat/Drawing/DrawingExt.cpp @@ -47,6 +47,7 @@ #include "../../XlsxFormat/Chart/ChartSerialize.h" #include "../../XlsxFormat/Worksheets/WorksheetChildOther.h" #include "../../XlsxFormat/Timelines/Timeline.h" +#include "../../XlsxFormat/Workbook/Metadata.h" #include "../Comments.h" @@ -225,6 +226,8 @@ namespace OOX *m_sUri == L"{7E03D99C-DC04-49d9-9315-930204A7B6E9}" || *m_sUri == L"{D0CA8CA8-9F24-4464-BF8E-62219DCF47F9}" || *m_sUri == L"{9260A510-F301-46a8-8635-F512D64BE5F5}" || + *m_sUri == L"{3e2802c4-a4d2-4d8b-9148-e3be6c30e623}" || + *m_sUri == L"{bdbb8cdc-fa1e-496e-a857-3c3f30c029c3}" || *m_sUri == L"http://schemas.microsoft.com/office/drawing/2008/diagram")) { int nCurDepth = oReader.GetDepth(); @@ -368,6 +371,14 @@ namespace OOX } } } + else if (sName == L"dynamicArrayProperties") + { + m_oDynamicArrayProperties = oReader; + } + else if (sName == L"rvb") + { + m_oRichValueBlock = oReader; + } } } else @@ -591,6 +602,18 @@ namespace OOX writer.EndNode(L"c16r3:dataDisplayOptions16"); sResult += writer.GetData().c_str(); } + if (m_oDynamicArrayProperties.IsInit()) + { + NSStringUtils::CStringBuilder writer; + m_oDynamicArrayProperties->toXML(writer); + sResult += writer.GetData().c_str(); + } + if (m_oRichValueBlock.IsInit()) + { + NSStringUtils::CStringBuilder writer; + m_oRichValueBlock->toXML(writer); + sResult += writer.GetData().c_str(); + } sResult += L""; return sResult; diff --git a/OOXML/DocxFormat/Drawing/DrawingExt.h b/OOXML/DocxFormat/Drawing/DrawingExt.h index be8f59661b..44ce87b907 100644 --- a/OOXML/DocxFormat/Drawing/DrawingExt.h +++ b/OOXML/DocxFormat/Drawing/DrawingExt.h @@ -60,6 +60,8 @@ namespace OOX class CTimelineRefs; class CTimelineCacheRefs; class CTimelineStyles; + class CDynamicArrayProperties; + class CRichValueBlock; } namespace Drawing @@ -160,6 +162,9 @@ namespace OOX std::vector m_arrConditionalFormatting; + nullable < OOX::Spreadsheet::CDynamicArrayProperties> m_oDynamicArrayProperties; + nullable < OOX::Spreadsheet::CRichValueBlock> m_oRichValueBlock; + nullable m_oPresenceInfo; nullable_string m_oFileKey; diff --git a/OOXML/DocxFormat/WritingElement.h b/OOXML/DocxFormat/WritingElement.h index 1a44d49029..32578b01ff 100644 --- a/OOXML/DocxFormat/WritingElement.h +++ b/OOXML/DocxFormat/WritingElement.h @@ -1514,7 +1514,28 @@ namespace OOX et_x_Timeslicer, et_x_TimelineStyles, et_x_TimelineStyle, - et_x_TimelineStyleElement + et_x_TimelineStyleElement, + + et_x_Metadata, + et_x_FutureMetadata, + et_x_FutureMetadataBlock, + et_x_MetadataType, + et_x_MetadataTypes, + et_x_MetadataBlocks, + et_x_MetadataBlock, + et_x_MetadataRecord, + et_x_MetadataString, + et_x_MetadataStrings, + et_x_MdxMetadata, + et_x_Mdx, + et_x_MdxTuple, + et_x_MetadataStringIndex, + et_x_MdxSet, + et_x_MdxMemeberProp, + et_x_MdxKPI, + + et_x_DynamicArrayProperties, + et_x_RichValueBlock }; class File; diff --git a/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro b/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro index 4ce6ae9f76..e5e719c510 100644 --- a/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro +++ b/OOXML/Projects/Linux/DocxFormatLib/DocxFormatLib.pro @@ -183,7 +183,9 @@ SOURCES += \ ../../../XlsxFormat/Drawing/Pos.cpp \ ../../../XlsxFormat/ExternalLinks/ExternalLinkPath.cpp \ ../../../XlsxFormat/ExternalLinks/ExternalLinks.cpp \ - ../../../XlsxFormat/Ole/OleObjects.cpp + ../../../XlsxFormat/Workbook/Metadata.cpp \ + ../../../XlsxFormat/RichData/RdRichValue.cpp \ + ../../../XlsxFormat/Ole/OleObjects.cpp } @@ -375,4 +377,6 @@ HEADERS += \ ../../../XlsxFormat/Slicer/SlicerCacheExt.h \ ../../../XlsxFormat/Slicer/Slicer.h \ ../../../XlsxFormat/NamedSheetViews/NamedSheetViews.h \ - docx_format.h + ../../../XlsxFormat/Workbook/Metadata.h \ + ../../../XlsxFormat/RichData/RdRichValue.h \ + docx_format.h diff --git a/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp b/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp index 0249679a97..a661caff6a 100644 --- a/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp +++ b/OOXML/Projects/Linux/DocxFormatLib/xlsx_format_logic.cpp @@ -95,3 +95,5 @@ #include "../../../XlsxFormat/SharedStrings/XlsxRun.cpp" #include "../../../XlsxFormat/SharedStrings/SharedStrings.cpp" #include "../../../XlsxFormat/Timelines/Timeline.cpp" +#include "../../../XlsxFormat/Workbook/Metadata.cpp" +#include "../../../XlsxFormat/RichData/RdRichValue.cpp" diff --git a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj index d1bea1396c..203228103c 100644 --- a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj +++ b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj @@ -354,6 +354,7 @@ + @@ -383,6 +384,7 @@ + @@ -513,6 +515,7 @@ + @@ -540,6 +543,7 @@ + diff --git a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters index 92b050244f..0320b64eca 100644 --- a/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters +++ b/OOXML/Projects/Windows/DocxFormatLib/DocxFormatLib.vcxproj.filters @@ -85,6 +85,9 @@ {34deda6e-7347-49f2-be67-d088cdd469db} + + {db25162b-705e-4c13-b6c5-f7c018c6f39a} + @@ -538,6 +541,12 @@ XlsxFormat\Timelines + + XlsxFormat\RichData + + + XlsxFormat\Workbook + @@ -948,5 +957,11 @@ XlsxFormat\Timelines + + XlsxFormat\RichData + + + XlsxFormat\Workbook + \ No newline at end of file diff --git a/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp b/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp index fba046b261..8b692b6291 100644 --- a/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp +++ b/OOXML/XlsxFormat/FileFactory_Spreadsheet.cpp @@ -58,6 +58,8 @@ #include "Slicer/Slicer.h" #include "NamedSheetViews/NamedSheetViews.h" #include "Timelines/Timeline.h" +#include "RichData/RdRichValue.h" +#include "Workbook/Metadata.h" #include "Table/Table.h" #include "Table/QueryTable.h" @@ -181,6 +183,14 @@ namespace OOX return smart_ptr(new CTimelineFile(pMain, oRootPath, oFileName)); else if ( oRelation.Type() == FileTypes::TimelineCache) return smart_ptr(new CTimelineCacheFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::Metadata) + return smart_ptr(new CMetadataFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::RdRichValueStructure) + return smart_ptr(new CRdRichValueStructureFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::RdRichValue) + return smart_ptr(new CRdRichValueFile(pMain, oRootPath, oFileName)); + else if (oRelation.Type() == FileTypes::RdRichValueTypes) + return smart_ptr(new CRdRichValueTypesFile(pMain, oRootPath, oFileName)); return smart_ptr( new UnknowTypeFile(pMain) ); } @@ -313,6 +323,14 @@ namespace OOX return smart_ptr(new CTimelineFile(pMain, oRootPath, oFileName)); else if (pRelation->Type() == FileTypes::TimelineCache) return smart_ptr(new CTimelineCacheFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::Metadata) + return smart_ptr(new CMetadataFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::RdRichValueStructure) + return smart_ptr(new CRdRichValueStructureFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::RdRichValue) + return smart_ptr(new CRdRichValueFile(pMain, oRootPath, oFileName)); + else if (pRelation->Type() == FileTypes::RdRichValueTypes) + return smart_ptr(new CRdRichValueTypesFile(pMain, oRootPath, oFileName)); return smart_ptr( new UnknowTypeFile(pMain) ); } diff --git a/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp b/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp index 52076231ba..e5c88368de 100644 --- a/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp +++ b/OOXML/XlsxFormat/FileTypes_Spreadsheet.cpp @@ -155,12 +155,28 @@ namespace OOX L"http://schemas.microsoft.com/office/2011/relationships/timelineCache", L"timelineCaches/timelineCache", true, true); //onlyoffice workbook comments - const FileType WorkbookComments(L"", L"workbookComments.bin", + const FileType WorkbookComments (L"", L"workbookComments.bin", L"", L"http://schemas.onlyoffice.com/workbookComments"); + + const FileType Metadata (L"", L"metadata.xml", + L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml", + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata"); - const FileType SpreadsheetFlat(L"", L"", L"", L""); + const FileType RdRichValue (L"richData", L"rdrichvalue.xml", + L"application/vnd.ms-excel.rdrichvalue+xml", + L"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValue"); + + const FileType RdRichValueStructure(L"richData", L"rdrichvaluestructure.xml", + L"application/vnd.ms-excel.rdrichvaluestructure+xml", + L"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueStructure"); + + const FileType RdRichValueTypes (L"richData", L"rdRichValueTypes..xml", + L"application/vnd.ms-excel.rdrichvaluetypes+xml", + L"http://schemas.microsoft.com/office/2017/06/relationships/rdRichValueTypes"); + + const FileType SpreadsheetFlat (L"", L"", L"", L""); } // namespace FileTypes } diff --git a/OOXML/XlsxFormat/FileTypes_Spreadsheet.h b/OOXML/XlsxFormat/FileTypes_Spreadsheet.h index e73ba16a92..0204c80566 100644 --- a/OOXML/XlsxFormat/FileTypes_Spreadsheet.h +++ b/OOXML/XlsxFormat/FileTypes_Spreadsheet.h @@ -93,6 +93,13 @@ namespace OOX extern const FileType TimelineCache; + extern const FileType Metadata; + + extern const FileType RdRichValue; + + extern const FileType RdRichValueStructure; + + extern const FileType RdRichValueTypes; } // namespace FileTypes } } // namespace OOX diff --git a/OOXML/XlsxFormat/RichData/RdRichValue.cpp b/OOXML/XlsxFormat/RichData/RdRichValue.cpp new file mode 100644 index 0000000000..c0a1148493 --- /dev/null +++ b/OOXML/XlsxFormat/RichData/RdRichValue.cpp @@ -0,0 +1,233 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#include "RdRichValue.h" + +#include "../FileTypes_Spreadsheet.h" + +#include "../../Common/SimpleTypes_Shared.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +#include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../../DesktopEditor/common/File.h" + +#include "../../Binary/Presentation/XmlWriter.h" +#include "../../Binary/Presentation/BinaryFileReaderWriter.h" + +namespace OOX +{ +namespace Spreadsheet +{ + CRdRichValueFile::CRdRichValueFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CRdRichValueFile::CRdRichValueFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CRdRichValueFile::~CRdRichValueFile() + { + } + void CRdRichValueFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CRdRichValueFile::type() const + { + return OOX::Spreadsheet::FileTypes::RdRichValue; + } + const CPath CRdRichValueFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CRdRichValueFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CRdRichValueFile::GetReadPath() + { + return m_oReadPath; + } + void CRdRichValueFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + //m_oMetadata = oReader; + } + void CRdRichValueFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + //if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + //m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +//--------------------------------------------------------------------------------------------------------------------------- + CRdRichValueStructureFile::CRdRichValueStructureFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CRdRichValueStructureFile::CRdRichValueStructureFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CRdRichValueStructureFile::~CRdRichValueStructureFile() + { + } + void CRdRichValueStructureFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CRdRichValueStructureFile::type() const + { + return OOX::Spreadsheet::FileTypes::RdRichValueStructure; + } + const CPath CRdRichValueStructureFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CRdRichValueStructureFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CRdRichValueStructureFile::GetReadPath() + { + return m_oReadPath; + } + void CRdRichValueStructureFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + //m_oMetadata = oReader; + } + void CRdRichValueStructureFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + //if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + //m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +//--------------------------------------------------------------------------------------------------------------------------- + CRdRichValueTypesFile::CRdRichValueTypesFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CRdRichValueTypesFile::CRdRichValueTypesFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CRdRichValueTypesFile::~CRdRichValueTypesFile() + { + } + void CRdRichValueTypesFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CRdRichValueTypesFile::type() const + { + return OOX::Spreadsheet::FileTypes::RdRichValueTypes; + } + const CPath CRdRichValueTypesFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CRdRichValueTypesFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CRdRichValueTypesFile::GetReadPath() + { + return m_oReadPath; + } + void CRdRichValueTypesFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + //m_oMetadata = oReader; + } + void CRdRichValueTypesFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + //if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + //m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +} +} + diff --git a/OOXML/XlsxFormat/RichData/RdRichValue.h b/OOXML/XlsxFormat/RichData/RdRichValue.h new file mode 100644 index 0000000000..1b94966a35 --- /dev/null +++ b/OOXML/XlsxFormat/RichData/RdRichValue.h @@ -0,0 +1,108 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#pragma once + +#include "../Table/Autofilter.h" +#include "../../DocxFormat/IFileContainer.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +namespace OOX +{ + namespace Spreadsheet + { + class CRdRichValueFile : public OOX::File + { + public: + CRdRichValueFile(OOX::Document* pMain); + CRdRichValueFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CRdRichValueFile(); + + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + + //nullable m_oTimelines; + private: + CPath m_oReadPath; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CRdRichValueStructureFile : public OOX::File + { + public: + CRdRichValueStructureFile(OOX::Document* pMain); + CRdRichValueStructureFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CRdRichValueStructureFile(); + + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + + private: + CPath m_oReadPath; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CRdRichValueTypesFile : public OOX::File + { + public: + CRdRichValueTypesFile(OOX::Document* pMain); + CRdRichValueTypesFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CRdRichValueTypesFile(); + + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + private: + CPath m_oReadPath; + }; + } //Spreadsheet +} // namespace OOX diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp new file mode 100644 index 0000000000..40c07935a6 --- /dev/null +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -0,0 +1,1063 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#include "Metadata.h" + +#include "../FileTypes_Spreadsheet.h" + +#include "../../Common/SimpleTypes_Shared.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +#include "../../DocxFormat/Drawing/DrawingExt.h" +#include "../../../DesktopEditor/common/File.h" + +#include "../../Binary/Presentation/XmlWriter.h" +#include "../../Binary/Presentation/BinaryFileReaderWriter.h" + +namespace OOX +{ + namespace Spreadsheet + { + CMdxKPI::CMdxKPI() {} + CMdxKPI::~CMdxKPI() {} + void CMdxKPI::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxKPI::toXML() const + { + return L""; + } + EElementType CMdxKPI::getType() const + { + return et_x_MdxKPI; + } + void CMdxKPI::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L"ToString()); + writer.WriteString(L"/>"); + } + void CMdxKPI::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMdxKPI::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"n", m_oN) + WritingElement_ReadAttributes_Read_else_if(oReader, L"np", m_oNp) + WritingElement_ReadAttributes_Read_else_if(oReader, L"p", m_oP) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdxMemeberProp::CMdxMemeberProp() {} + CMdxMemeberProp::~CMdxMemeberProp() {} + void CMdxMemeberProp::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxMemeberProp::toXML() const + { + return L""; + } + EElementType CMdxMemeberProp::getType() const + { + return et_x_MdxMemeberProp; + } + void CMdxMemeberProp::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMdxMemeberProp::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMdxMemeberProp::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"n", m_oN) + WritingElement_ReadAttributes_Read_else_if(oReader, L"np", m_oNp) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdxSet::CMdxSet() {} + CMdxSet::~CMdxSet() {} + void CMdxSet::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxSet::toXML() const + { + return L""; + } + EElementType CMdxSet::getType() const + { + return et_x_MdxSet; + } + void CMdxSet::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + WritingStringNullableAttrInt2(L"ns", m_oNs); + WritingStringNullableAttrInt2(L"c", m_oC); + WritingStringNullableAttrString(L"o", m_oO, m_oO->ToString()); + writer.WriteString(L">"); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + void CMdxSet::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"n" == sName) + { + CMetadataStringIndex* ind = new CMetadataStringIndex(); + *ind = oReader; + m_arrItems.push_back(ind); + } + } + } + void CMdxSet::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"ns", m_oNs) + WritingElement_ReadAttributes_Read_else_if(oReader, L"c", m_oC) + WritingElement_ReadAttributes_Read_else_if(oReader, L"o", m_oO) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMetadataStringIndex::CMetadataStringIndex() {} + CMetadataStringIndex::~CMetadataStringIndex() {} + void CMetadataStringIndex::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataStringIndex::toXML() const + { + return L""; + } + EElementType CMetadataStringIndex::getType() const + { + return et_x_MetadataStringIndex; + } + void CMetadataStringIndex::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataStringIndex::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataStringIndex::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"x", m_oX) + WritingElement_ReadAttributes_Read_else_if(oReader, L"s", m_oS) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdxTuple::CMdxTuple() {} + CMdxTuple::~CMdxTuple() {} + void CMdxTuple::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxTuple::toXML() const + { + return L""; + } + EElementType CMdxTuple::getType() const + { + return et_x_MdxTuple; + } + void CMdxTuple::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + WritingStringNullableAttrInt2(L"c", m_oC); + WritingStringNullableAttrEncodeXmlString2(L"o", m_oCt); + WritingStringNullableAttrInt2(L"si", m_oSi); + WritingStringNullableAttrInt2(L"fi", m_oFi); + WritingStringNullableAttrInt2(L"bc", m_oBc); + WritingStringNullableAttrInt2(L"fc", m_oFc); + WritingStringNullableAttrBool2(L"i", m_oI); + WritingStringNullableAttrBool2(L"u", m_oU); + WritingStringNullableAttrBool2(L"st", m_oSt); + WritingStringNullableAttrBool2(L"b", m_oB); + writer.WriteString(L">"); + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + void CMdxTuple::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"n" == sName) + { + CMetadataStringIndex* ind = new CMetadataStringIndex(); + *ind = oReader; + m_arrItems.push_back(ind); + } + } + } + void CMdxTuple::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"c", m_oC) + WritingElement_ReadAttributes_Read_else_if(oReader, L"ct", m_oCt) + WritingElement_ReadAttributes_Read_else_if(oReader, L"si", m_oSi) + WritingElement_ReadAttributes_Read_else_if(oReader, L"fi", m_oFi) + WritingElement_ReadAttributes_Read_else_if(oReader, L"bc", m_oBc) + WritingElement_ReadAttributes_Read_else_if(oReader, L"fc", m_oFc) + WritingElement_ReadAttributes_Read_else_if(oReader, L"i", m_oI) + WritingElement_ReadAttributes_Read_else_if(oReader, L"u", m_oU) + WritingElement_ReadAttributes_Read_else_if(oReader, L"st", m_oSt) + WritingElement_ReadAttributes_Read_else_if(oReader, L"b", m_oB) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CMdx::CMdx() {} + CMdx::~CMdx() {} + void CMdx::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdx::toXML() const + { + return L""; + } + EElementType CMdx::getType() const + { + return et_x_Mdx; + } + void CMdx::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + WritingStringNullableAttrInt2(L"n", m_oN); + WritingStringNullableAttrString(L"f", m_oF, m_oF->ToString()); + + if (m_oMdxTuple.IsInit()) + { + m_oMdxTuple->toXML(writer); + } + if (m_oMdxSet.IsInit()) + { + m_oMdxSet->toXML(writer); + } + if (m_oCMdxKPI.IsInit()) + { + m_oCMdxKPI->toXML(writer); + } + if (m_oMdxMemeberProp.IsInit()) + { + m_oMdxMemeberProp->toXML(writer); + } + writer.WriteString(L""); + } + void CMdx::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"t" == sName) + m_oMdxTuple = oReader; + else if (L"ms" == sName) + m_oMdxSet = oReader; + else if (L"p" == sName) + m_oMdxMemeberProp = oReader; + else if (L"k" == sName) + m_oCMdxKPI = oReader; + } + } + void CMdx::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"n", m_oN) + WritingElement_ReadAttributes_Read_else_if(oReader, L"f", m_oF) + WritingElement_ReadAttributes_End(oReader) + } + //------------------------------------------------------------------------------------- + CMdxMetadata::CMdxMetadata() {} + CMdxMetadata::~CMdxMetadata() {} + void CMdxMetadata::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMdxMetadata::toXML() const + { + return L""; + } + EElementType CMdxMetadata::getType() const + { + return et_x_MdxMetadata; + } + void CMdxMetadata::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"mdx" == sName) + { + CMdx* mdx = new CMdx(); + *mdx = oReader; + m_arrItems.push_back(mdx); + } + } + } + void CMdxMetadata::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //------------------------------------------------------------------------------------- + CMetadataStrings::CMetadataStrings() {} + CMetadataStrings::~CMetadataStrings() {} + void CMetadataStrings::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataStrings::toXML() const + { + return L""; + } + EElementType CMetadataStrings::getType() const + { + return et_x_MetadataStrings; + } + void CMetadataStrings::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"s" == sName) + { + CMetadataString* pS = new CMetadataString(); + *pS = oReader; + m_arrItems.push_back(pS); + } + } + } + void CMetadataStrings::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //-------------------------------------------------------------------------------------------------------- + CMetadataString::CMetadataString() {} + CMetadataString::~CMetadataString() {} + void CMetadataString::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataString::toXML() const + { + return L""; + } + EElementType CMetadataString::getType() const + { + return et_x_MetadataString; + } + void CMetadataString::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataString::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataString::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"v", m_oV) + WritingElement_ReadAttributes_End(oReader) + } + // -------------------------------------------------------------------------------------------------------- + CMetadataRecord::CMetadataRecord() {} + CMetadataRecord::~CMetadataRecord() {} + void CMetadataRecord::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataRecord::toXML() const + { + return L""; + } + EElementType CMetadataRecord::getType() const + { + return et_x_MetadataRecord; + } + void CMetadataRecord::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataRecord::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataRecord::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"t", m_oT) + WritingElement_ReadAttributes_Read_else_if(oReader, L"v", m_oV) + WritingElement_ReadAttributes_End(oReader) + } + //------------------------------------------------------------------------------------- + CMetadataBlock::CMetadataBlock() {} + CMetadataBlock::~CMetadataBlock() {} + void CMetadataBlock::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataBlock::toXML() const + { + return L""; + } + EElementType CMetadataBlock::getType() const + { + return et_x_MetadataBlock; + } + void CMetadataBlock::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"rc" == sName) + { + CMetadataRecord* pR = new CMetadataRecord(); + *pR = oReader; + m_arrItems.push_back(pR); + } + } + } + void CMetadataBlock::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //------------------------------------------------------------------------------------- + CMetadataBlocks::CMetadataBlocks() {} + CMetadataBlocks::~CMetadataBlocks() {} + void CMetadataBlocks::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataBlocks::toXML() const + { + return L""; + } + EElementType CMetadataBlocks::getType() const + { + return et_x_MetadataBlocks; + } + void CMetadataBlocks::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + m_sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"bk" == sName) + { + CMetadataBlock* pB = new CMetadataBlock(); + *pB = oReader; + m_arrItems.push_back(pB); + } + } + } + void CMetadataBlocks::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L"<" + m_sName + L">"); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //------------------------------------------------------------------------------------- + CMetadataTypes::CMetadataTypes() {} + CMetadataTypes::~CMetadataTypes() {} + void CMetadataTypes::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataTypes::toXML() const + { + return L""; + } + EElementType CMetadataTypes::getType() const + { + return et_x_MetadataTypes; + } + void CMetadataTypes::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"metadataType" == sName) + { + CMetadataType* pT = new CMetadataType(); + *pT = oReader; + m_arrItems.push_back(pT); + } + } + } + void CMetadataTypes::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //-------------------------------------------------------------------------------------------------------- + CMetadataType::CMetadataType() {} + CMetadataType::~CMetadataType() {} + void CMetadataType::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadataType::toXML() const + { + return L""; + } + EElementType CMetadataType::getType() const + { + return et_x_MetadataType; + } + void CMetadataType::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CMetadataType::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CMetadataType::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) + WritingElement_ReadAttributes_Read_else_if(oReader, L"minSupportedVersion", m_oMinSupportedVersion) + WritingElement_ReadAttributes_Read_else_if(oReader, L"ghostRow", m_oGhostRow) + WritingElement_ReadAttributes_Read_else_if(oReader, L"ghostCol", m_oGhostCol) + WritingElement_ReadAttributes_Read_else_if(oReader, L"edit", m_oEdit) + WritingElement_ReadAttributes_Read_else_if(oReader, L"delete", m_oDelete) + WritingElement_ReadAttributes_Read_else_if(oReader, L"copy", m_oCopy) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteAll", m_oPasteAll) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteFormulas", m_oPasteFormulas) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteValues", m_oPasteValues) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteFormats", m_oPasteFormats) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteComments", m_oPasteComments) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteDataValidation", m_oPasteDataValidation) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteBorders", m_oPasteBorders) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteColWidths", m_oPasteColWidths) + WritingElement_ReadAttributes_Read_else_if(oReader, L"pasteNumberFormats", m_oPasteNumberFormats) + WritingElement_ReadAttributes_Read_else_if(oReader, L"merge", m_oMerge) + WritingElement_ReadAttributes_Read_else_if(oReader, L"splitFirst", m_oSplitFirst) + WritingElement_ReadAttributes_Read_else_if(oReader, L"splitAll", m_oSplitAll) + WritingElement_ReadAttributes_Read_else_if(oReader, L"rowColShift", m_oRowColShift) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearAll", m_oClearAll) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearFormats", m_oClearFormats) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearContents", m_oClearContents) + WritingElement_ReadAttributes_Read_else_if(oReader, L"clearComments", m_oClearComments) + WritingElement_ReadAttributes_Read_else_if(oReader, L"assign", m_oAssign) + WritingElement_ReadAttributes_Read_else_if(oReader, L"coerce", m_oCoerce) + WritingElement_ReadAttributes_Read_else_if(oReader, L"cellMeta", m_oCellMeta) + WritingElement_ReadAttributes_End(oReader) + } + //-------------------------------------------------------------------------------------------------------- + CFutureMetadataBlock::CFutureMetadataBlock() {} + CFutureMetadataBlock::~CFutureMetadataBlock() {} + void CFutureMetadataBlock::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CFutureMetadataBlock::toXML() const + { + return L""; + } + EElementType CFutureMetadataBlock::getType() const + { + return et_x_FutureMetadataBlock; + } + void CFutureMetadataBlock::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + + if (m_oExtLst.IsInit()) + { + writer.WriteString(m_oExtLst->toXMLWithNS(L"")); + } + writer.WriteString(L""); + } + void CFutureMetadataBlock::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"extLst" == sName) + m_oExtLst = oReader; + } + } + //------------------------------------------------------------------------------------- + CFutureMetadata::CFutureMetadata() {} + CFutureMetadata::~CFutureMetadata() + { + } + void CFutureMetadata::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CFutureMetadata::toXML() const + { + return L""; + } + EElementType CFutureMetadata::getType() const + { + return et_x_FutureMetadata; + } + void CFutureMetadata::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"bk" == sName) + { + CFutureMetadataBlock* pT = new CFutureMetadataBlock(); + *pT = oReader; + m_arrItems.push_back(pT); + } + } + } + void CFutureMetadata::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) + WritingElement_ReadAttributes_End(oReader) + } + void CFutureMetadata::toXML(NSStringUtils::CStringBuilder& writer) const + { + if (m_arrItems.empty()) return; + + writer.WriteString(L""); + + for (size_t i = 0; i < m_arrItems.size(); ++i) + { + if (m_arrItems[i]) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + //-------------------------------------------------------------------------------------------------------- + CMetadata::CMetadata() {} + CMetadata::~CMetadata() + { + for (size_t i = 0; i < m_arFutureMetadata.size(); ++i) + { + if (m_arFutureMetadata[i]) delete m_arFutureMetadata[i]; + } + m_arFutureMetadata.clear(); + } + void CMetadata::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CMetadata::toXML() const + { + return L""; + } + EElementType CMetadata::getType() const + { + return et_x_Metadata; + } + void CMetadata::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + + if (m_oMetadataTypes.IsInit()) + { + m_oMetadataTypes->toXML(writer); + } + if (m_oMetadataStrings.IsInit()) + { + m_oMetadataStrings->toXML(writer); + } + if (m_oMdxMetadata.IsInit()) + { + m_oMdxMetadata->toXML(writer); + } + for (size_t i = 0; i < m_arFutureMetadata.size(); ++i) + { + if (m_arFutureMetadata[i]) + { + m_arFutureMetadata[i]->toXML(writer); + } + } + if (m_oCellMetadata.IsInit()) + { + m_oCellMetadata->m_sName = L"cellMetadata"; + m_oCellMetadata->toXML(writer); + } + if (m_oValueMetadata.IsInit()) + { + m_oValueMetadata->m_sName = L"valueMetadata"; + m_oValueMetadata->toXML(writer); + } + if (m_oExtLst.IsInit()) + { + writer.WriteString(m_oExtLst->toXMLWithNS(L"")); + } + writer.WriteString(L""); + } + void CMetadata::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"metadataTypes" == sName) + m_oMetadataTypes = oReader; + else if (L"metadataStrings" == sName) + m_oMetadataStrings = oReader; + else if (L"mdxMetadata" == sName) + m_oMdxMetadata = oReader; + else if (L"cellMetadata" == sName) + m_oCellMetadata = oReader; + else if (L"valueMetadata" == sName) + m_oValueMetadata = oReader; + else if (L"futureMetadata" == sName) + { + CFutureMetadata* pF = new CFutureMetadata(); + *pF = oReader; + m_arFutureMetadata.push_back(pF); + } + else if (L"extLst" == sName) + m_oExtLst = oReader; + } + } + //----------------------------------------------------------------------------------------------------------------------------------------------------- + CMetadataFile::CMetadataFile(OOX::Document* pMain) : OOX::File(pMain) + { + } + CMetadataFile::CMetadataFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath) : OOX::File(pMain) + { + read(oRootPath, oPath); + } + CMetadataFile::~CMetadataFile() + { + } + void CMetadataFile::read(const CPath& oPath) + { + //don't use this. use read(const CPath& oRootPath, const CPath& oFilePath) + CPath oRootPath; + read(oRootPath, oPath); + } + const OOX::FileType CMetadataFile::type() const + { + return OOX::Spreadsheet::FileTypes::Metadata; + } + const CPath CMetadataFile::DefaultDirectory() const + { + return type().DefaultDirectory(); + } + const CPath CMetadataFile::DefaultFileName() const + { + return type().DefaultFileName(); + } + const CPath& CMetadataFile::GetReadPath() + { + return m_oReadPath; + } + void CMetadataFile::read(const CPath& oRootPath, const CPath& oPath) + { + m_oReadPath = oPath; + + XmlUtils::CXmlLiteReader oReader; + + if (!oReader.FromFile(oPath.GetPath())) + return; + + if (!oReader.ReadNextNode()) + return; + + m_oMetadata = oReader; + } + void CMetadataFile::write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const + { + if (false == m_oMetadata.IsInit()) return; + + NSStringUtils::CStringBuilder sXml; + + sXml.WriteString(L""); + m_oMetadata->toXML(sXml); + + std::wstring sPath = oPath.GetPath(); + NSFile::CFileBinary::SaveToFile(sPath, sXml.GetData()); + + oContent.Registration(type().OverrideType(), oDirectory, oPath.GetFilename()); + } +//------------------------------------------------------------------------------------------------------------------------------------- + CDynamicArrayProperties::CDynamicArrayProperties() {} + CDynamicArrayProperties::~CDynamicArrayProperties() {} + void CDynamicArrayProperties::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CDynamicArrayProperties::toXML() const + { + return L""; + } + EElementType CDynamicArrayProperties::getType() const + { + return et_x_DynamicArrayProperties; + } + void CDynamicArrayProperties::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CDynamicArrayProperties::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CDynamicArrayProperties::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"fDynamic", m_oFDynamic) + WritingElement_ReadAttributes_Read_else_if(oReader, L"fCollapsed", m_oFCollapsed) + WritingElement_ReadAttributes_End(oReader) + } +//------------------------------------------------------------------------------------------------------------------------------------- + CRichValueBlock::CRichValueBlock() {} + CRichValueBlock::~CRichValueBlock() {} + void CRichValueBlock::fromXML(XmlUtils::CXmlNode& node) + { + } + std::wstring CRichValueBlock::toXML() const + { + return L""; + } + EElementType CRichValueBlock::getType() const + { + return et_x_RichValueBlock; + } + void CRichValueBlock::toXML(NSStringUtils::CStringBuilder& writer) const + { + writer.WriteString(L""); + } + void CRichValueBlock::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes(oReader); + + if (oReader.IsEmptyNode()) + return; + } + void CRichValueBlock::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"i", m_oI) + WritingElement_ReadAttributes_End(oReader) + } + } + +} // namespace OOX + diff --git a/OOXML/XlsxFormat/Workbook/Metadata.h b/OOXML/XlsxFormat/Workbook/Metadata.h new file mode 100644 index 0000000000..f0b17ae8c5 --- /dev/null +++ b/OOXML/XlsxFormat/Workbook/Metadata.h @@ -0,0 +1,506 @@ +/* + * (c) Copyright Ascensio System SIA 2010-2023 + * + * This program is a free software product. You can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License (AGPL) + * version 3 as published by the Free Software Foundation. In accordance with + * Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect + * that Ascensio System SIA expressly excludes the warranty of non-infringement + * of any third-party rights. + * + * This program is distributed WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For + * details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html + * + * You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish + * street, Riga, Latvia, EU, LV-1050. + * + * The interactive user interfaces in modified source and object code versions + * of the Program must display Appropriate Legal Notices, as required under + * Section 5 of the GNU AGPL version 3. + * + * Pursuant to Section 7(b) of the License you must retain the original Product + * logo when distributing the program. Pursuant to Section 7(e) we decline to + * grant you any rights under trademark law for use of our trademarks. + * + * All the Product's GUI elements, including illustrations and icon sets, as + * well as technical writing content are licensed under the terms of the + * Creative Commons Attribution-ShareAlike 4.0 International. See the License + * terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode + * + */ +#pragma once + +#include "../Table/Autofilter.h" +#include "../../DocxFormat/IFileContainer.h" +#include "../../Common/SimpleTypes_Spreadsheet.h" + +namespace OOX +{ + namespace Drawing + { + class COfficeArtExtensionList; + } + + namespace Spreadsheet + { +//----------------------------------------------------------------------------------------------------------------------- + class CMdxKPI : public WritingElement + { + public: + WritingElement_AdditionMethods(CMdxKPI) + CMdxKPI(); + virtual ~CMdxKPI(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oN; + nullable_uint m_oNp; + nullable m_oP; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//----------------------------------------------------------------------------------------------------------------------- + class CMdxMemeberProp : public WritingElement + { + public: + WritingElement_AdditionMethods(CMdxMemeberProp) + CMdxMemeberProp(); + virtual ~CMdxMemeberProp(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oN; + nullable_uint m_oNp; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//----------------------------------------------------------------------------------------------------------------------- + class CMetadataStringIndex : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataStringIndex) + CMetadataStringIndex(); + virtual ~CMetadataStringIndex(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oX; + nullable_bool m_oS; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdxSet : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMdxSet) + CMdxSet(); + virtual ~CMdxSet(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oNs; + nullable_uint m_oC; + nullable m_oO; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdxTuple : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMdxTuple) + CMdxTuple(); + virtual ~CMdxTuple(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oC; + nullable_string m_oCt; + nullable_uint m_oSi; + nullable_uint m_oFi; + nullable_uint m_oBc; + nullable_uint m_oFc; + nullable_bool m_oI; + nullable_bool m_oU; + nullable_bool m_oSt; + nullable_bool m_oB; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdx : public WritingElement + { + public: + WritingElement_AdditionMethods(CMdx) + CMdx(); + virtual ~CMdx(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable m_oMdxTuple; + nullable m_oMdxSet; + nullable m_oCMdxKPI; + nullable m_oMdxMemeberProp; + + nullable_uint m_oN; + nullable m_oF; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMdxMetadata : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMdxMetadata) + CMdxMetadata(); + virtual ~CMdxMetadata(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataString : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataString) + CMetadataString(); + virtual ~CMetadataString(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_string m_oV; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataRecord : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataRecord) + CMetadataRecord(); + virtual ~CMetadataRecord(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_uint m_oT; + nullable_uint m_oV; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CFutureMetadataBlock : public WritingElement + { + public: + WritingElement_AdditionMethods(CFutureMetadataBlock) + CFutureMetadataBlock(); + virtual ~CFutureMetadataBlock(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable m_oExtLst; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataType : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadataType) + CMetadataType(); + virtual ~CMetadataType(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + public: + nullable_string m_oName; + nullable_uint m_oMinSupportedVersion; + nullable_bool m_oGhostRow; + nullable_bool m_oGhostCol; + nullable_bool m_oEdit; + nullable_bool m_oDelete; + nullable_bool m_oCopy; + nullable_bool m_oPasteAll; + nullable_bool m_oPasteFormulas; + nullable_bool m_oPasteValues; + nullable_bool m_oPasteFormats; + nullable_bool m_oPasteComments; + nullable_bool m_oPasteDataValidation; + nullable_bool m_oPasteBorders; + nullable_bool m_oPasteColWidths; + nullable_bool m_oPasteNumberFormats; + nullable_bool m_oMerge; + nullable_bool m_oSplitFirst; + nullable_bool m_oSplitAll; + nullable_bool m_oRowColShift; + nullable_bool m_oClearAll; + nullable_bool m_oClearFormats; + nullable_bool m_oClearContents; + nullable_bool m_oClearComments; + nullable_bool m_oAssign; + nullable_bool m_oCoerce; + nullable_bool m_oCellMeta; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataTypes : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataTypes) + CMetadataTypes(); + virtual ~CMetadataTypes(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataBlock : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataBlock) + CMetadataBlock(); + virtual ~CMetadataBlock(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataBlocks : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataBlocks) + CMetadataBlocks(); + virtual ~CMetadataBlocks(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + + std::wstring m_sName; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataStrings : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CMetadataStrings) + CMetadataStrings(); + virtual ~CMetadataStrings(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oCount; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CFutureMetadata : public WritingElementWithChilds + { + public: + WritingElement_AdditionMethods(CFutureMetadata) + CFutureMetadata(); + virtual ~CFutureMetadata(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_string m_oName; + nullable_uint m_oCount; + + nullable m_oExtLst; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//-------------------------------------------------------------------------------------------------------------- + class CMetadata : public WritingElement + { + public: + WritingElement_AdditionMethods(CMetadata) + CMetadata(); + virtual ~CMetadata(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + public: + nullable m_oMetadataTypes; + nullable m_oMetadataStrings; + nullable m_oMdxMetadata; + nullable m_oCellMetadata; + nullable m_oValueMetadata; + + std::vector m_arFutureMetadata; + + nullable m_oExtLst; + }; +//------------------------------------------------------------------------------------------------------------------------ + class CMetadataFile : public OOX::File + { + public: + CMetadataFile(OOX::Document* pMain); + CMetadataFile(OOX::Document* pMain, const CPath& oRootPath, const CPath& oPath); + virtual ~CMetadataFile(); + + //void readBin(const CPath& oPath); + //XLS::BaseObjectPtr WriteBin() const; + virtual void read(const CPath& oPath); + virtual void read(const CPath& oRootPath, const CPath& oPath); + + virtual void write(const CPath& oPath, const CPath& oDirectory, CContentTypes& oContent) const; + virtual const OOX::FileType type() const; + + virtual const CPath DefaultDirectory() const; + virtual const CPath DefaultFileName() const; + + const CPath& GetReadPath(); + + nullable m_oMetadata; + private: + CPath m_oReadPath; + }; +//----------------------------------------------------------------------------------------------------------------------- + class CDynamicArrayProperties : public WritingElement + { + public: + WritingElement_AdditionMethods(CDynamicArrayProperties) + CDynamicArrayProperties(); + virtual ~CDynamicArrayProperties(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_bool m_oFDynamic; + nullable_bool m_oFCollapsed; + + nullable m_oExtLst; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; +//----------------------------------------------------------------------------------------------------------------------- + class CRichValueBlock : public WritingElement + { + public: + WritingElement_AdditionMethods(CRichValueBlock) + CRichValueBlock(); + virtual ~CRichValueBlock(); + + virtual void fromXML(XmlUtils::CXmlNode& node); + virtual std::wstring toXML() const; + + virtual void toXML(NSStringUtils::CStringBuilder& writer) const; + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual EElementType getType() const; + + nullable_uint m_oI; + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + }; + } //Spreadsheet +} // namespace OOX From 47a485999fd69ff09db44a1c06aea4bbc2fcf302 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 14 Feb 2024 12:07:35 +0300 Subject: [PATCH 187/221] . --- OOXML/XlsxFormat/Workbook/Metadata.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp index 40c07935a6..6bfa9e37be 100644 --- a/OOXML/XlsxFormat/Workbook/Metadata.cpp +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -431,7 +431,7 @@ namespace OOX { if (m_arrItems.empty()) return; - writer.WriteString(L""); + writer.WriteString(L""); for (size_t i = 0; i < m_arrItems.size(); ++i) { @@ -595,7 +595,7 @@ namespace OOX { if (m_arrItems.empty()) return; - writer.WriteString(L"<" + m_sName + L">"); + writer.WriteString(L"<" + m_sName + L" count=\"" + std::to_wstring(m_arrItems.size()) + L"\">"); for (size_t i = 0; i < m_arrItems.size(); ++i) { @@ -642,7 +642,7 @@ namespace OOX { if (m_arrItems.empty()) return; - writer.WriteString(L""); + writer.WriteString(L""); for (size_t i = 0; i < m_arrItems.size(); ++i) { @@ -824,6 +824,7 @@ namespace OOX writer.WriteString(L""); writer.WriteString(L">"); for (size_t i = 0; i < m_arrItems.size(); ++i) From 9a612d454317f20a9d1a5320cd0fac3c40770dfa Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 14 Feb 2024 16:01:11 +0600 Subject: [PATCH 188/221] Fix ptg list conversion --- .../Logic/Biff_structures/SyntaxPtg.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index 8dc53e4695..e3cce003fc 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -467,6 +467,8 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: static boost::wregex reg_inside_table1(L"\\[#?[\\s\\w\\d.]+\\]"); static boost::wregex reg_inside_table2(L"\\[#\\w[\\s\\w\\d.]*\\],\\[#\\w[\\s\\w\\d.]*\\]"); static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[\\s\\w\\d.]+\\]"); + static boost::wregex reg_inside_table4(L"\\[#?(\\[.+?\\]\\,)?(\\[.+?\\])?.+?\\]"); + static boost::wregex reg_inside_table5(L"^[,;:]?\\[.+?\\]"); first = results[1].second; @@ -567,6 +569,21 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: } } } + else if(boost::regex_search(first, last, results_1, reg_inside_table5)) + { + insider = results_1.str(0); + insider = boost::algorithm::erase_first_copy(insider, L","); + + if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) + { + if (ptgList.colFirst == 65535) + { + ptgList.columns = 0x01; + ptgList.colFirst = indexColumn; + } + } + first = results_1[0].second; + } if (first != last && *first == ']') ++first; @@ -574,6 +591,22 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: return true; } + else if(boost::regex_search(first, last, results_1, reg_inside_table4)) + { + _UINT16 indexColumn = -1; + auto insider = results_1.str(0); + + if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) + { + ptgList.columns = 0x02; + ptgList.colLast = indexColumn; + first = results_1[0].second; + return true; + } + + if (first != last && *first == ']') + ++first; + } } } return false; From c6b3238fa4d5bd6c80fe3cfe017ce177ac7229ec Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 14 Feb 2024 16:02:06 +0600 Subject: [PATCH 189/221] Fix dvals conversion --- .../XlsxFormat/Worksheets/DataValidation.cpp | 149 +++++++++++------- 1 file changed, 90 insertions(+), 59 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp index 36e75317b2..97bacb24ec 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp @@ -216,24 +216,29 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); { auto ptr(new XLSB::DVal); XLS::BaseObjectPtr objectPtr(ptr); - - if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeNone) - ptr->valType = XLS::typeDvNone; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeWhole) - ptr->valType = XLS::typeDvWhole; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDecimal) - ptr->valType = XLS::typeDvDecimal; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeList) - ptr->valType = XLS::typeDvList; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDate) - ptr->valType = XLS::typeDvDate; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTime) - ptr->valType = XLS::typeDvTime; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTextLength) - ptr->valType = XLS::typeDvTextLength; - else if (m_oType == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeCustom) - ptr->valType = XLS::typeDvCustom; - + if(m_oType.IsInit()) + { + if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeNone) + ptr->valType = XLS::typeDvNone; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeWhole) + ptr->valType = XLS::typeDvWhole; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDecimal) + ptr->valType = XLS::typeDvDecimal; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeList) + ptr->valType = XLS::typeDvList; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeDate) + ptr->valType = XLS::typeDvDate; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTime) + ptr->valType = XLS::typeDvTime; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeTextLength) + ptr->valType = XLS::typeDvTextLength; + else if (m_oType->GetValue() == SimpleTypes::Spreadsheet::EDataValidationType::validationTypeCustom) + ptr->valType = XLS::typeDvCustom; + else + ptr->valType = XLS::typeDvNone; + } + else + ptr->valType = XLS::typeDvNone; ptr->fAllowBlank = m_oAllowBlank->GetValue(); if(m_oError.IsInit()) ptr->Error = m_oError.get(); @@ -248,47 +253,64 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); ptr->PromptTitle = m_oPromptTitle.get(); ptr->errStyle = m_oErrorStyle->GetValue(); + if(m_oImeMode.IsInit()) + { + if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOn) + { + ptr->mdImeMode = 0x01; + } + else if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOff) + { + ptr->mdImeMode = 0x02; + } + else + { + ptr->mdImeMode = m_oImeMode->GetValue(); + } + } + else + ptr->mdImeMode = 0; + if(m_oOperator.IsInit()) + { + if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorBetween) + ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotBetween) + ptr->typOperator = XLS::_typOperatorDv::operatorDvNotBetween; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvEquals; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvNotEquals; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThan) + ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThan; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThan) + ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThan; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThanOrEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThanOrEqual; + else if (m_oOperator->GetValue() == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThanOrEqual) + ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThanOrEqual; + } - if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOn) - { - ptr->mdImeMode = 0x01; - } - else if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOff) - { - ptr->mdImeMode = 0x02; - } - else - { - ptr->mdImeMode = m_oImeMode->GetValue(); - } - - if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorBetween) - ptr->typOperator = XLS::_typOperatorDv::operatorDvBetween; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotBetween) - ptr->typOperator = XLS::_typOperatorDv::operatorDvNotBetween; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorEqual) - ptr->typOperator = XLS::_typOperatorDv::operatorDvEquals; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorNotEqual) - ptr->typOperator = XLS::_typOperatorDv::operatorDvNotEquals; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThan) - ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThan; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThan) - ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThan; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorGreaterThanOrEqual) - ptr->typOperator = XLS::_typOperatorDv::operatorDvGreaterThanOrEqual; - else if (m_oOperator == SimpleTypes::Spreadsheet::EDataValidationOperator::operatorLessThanOrEqual) - ptr->typOperator = XLS::_typOperatorDv::operatorDvLessThanOrEqual; - - ptr->fSuppressCombo = m_oShowDropDown->GetValue(); - ptr->fShowErrorMsg = m_oShowErrorMessage->GetValue(); - ptr->fShowInputMsg = m_oShowInputMessage->GetValue(); - + if(m_oShowDropDown.IsInit()) + ptr->fSuppressCombo = m_oShowDropDown->GetValue(); + else + ptr->fSuppressCombo = false; + if(m_oShowErrorMessage.IsInit()) + ptr->fShowErrorMsg = m_oShowErrorMessage->GetValue(); + else + ptr->fShowErrorMsg = false; + if(m_oShowInputMessage.IsInit()) + ptr->fShowInputMsg = m_oShowInputMessage->GetValue(); + else + ptr->fShowInputMsg = false; + if(m_oSqRef.IsInit()) ptr->sqrfx.strValue = m_oSqRef.get(); - ptr->formula1 = m_oFormula1->m_sText; - ptr->formula2 = m_oFormula2->m_sText; + if(m_oFormula1.IsInit()) + ptr->formula1 = m_oFormula1->m_sText; + if(m_oFormula2.IsInit()) + ptr->formula2 = m_oFormula2->m_sText; - return objectPtr; + return objectPtr; } void CDataValidation::fromBin(XLS::BaseObjectPtr& obj) { @@ -602,10 +624,19 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); auto beginPtr(new XLSB::BeginDVals); ptr->m_BrtBeginDVals = XLS::BaseObjectPtr{beginPtr}; - beginPtr->dVals.idvMac = m_oCount.get() ; - beginPtr->dVals.fWnClosed = m_oDisablePrompts->GetValue(); - beginPtr->dVals.xLeft = m_oXWindow->GetValue(); - beginPtr->dVals.yTop = m_oYWindow->GetValue(); + beginPtr->dVals.idvMac = m_arrItems.size(); + if(m_oDisablePrompts.IsInit()) + beginPtr->dVals.fWnClosed = m_oDisablePrompts->GetValue(); + else + beginPtr->dVals.fWnClosed = false; + if(m_oXWindow.IsInit()) + beginPtr->dVals.xLeft = m_oXWindow->GetValue(); + else + beginPtr->dVals.xLeft = 0; + if(m_oYWindow.IsInit()) + beginPtr->dVals.yTop = m_oYWindow->GetValue(); + else + beginPtr->dVals.yTop = false; for(auto i:m_arrItems) { From 3d3daed65590c0c344ef4f863d8f231e87d0ce6b Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 14 Feb 2024 16:03:24 +0600 Subject: [PATCH 190/221] Add table and column names to global info for formulas --- OOXML/XlsxFormat/Table/Tables.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 1a434f5638..6982bba32b 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -610,6 +610,18 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") else if ((L"extLst") == sName) m_oExtLst = oReader; } + if(!m_oName.IsInit() && m_oDisplayName.IsInit()) + m_oName = m_oDisplayName.get(); + + if(m_oTableColumns.IsInit() && !m_oTableColumns->m_arrItems.empty()) + { + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.emplace(m_oId->GetValue(), + std::vector(m_oTableColumns->m_arrItems.size()+1, L"")); + for(auto i:m_oTableColumns->m_arrItems) + if(i->m_oName.IsInit() && i->m_oId.IsInit()) + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(i->m_oId->GetValue()) = i->m_oName.get(); + } + XLS::GlobalWorkbookInfo::mapTableNames_static.emplace(m_oId->GetValue(), m_oName.get()); } void CTable::fromBin(XLS::BaseObjectPtr& obj) { From fa90923000d3aab39195a5ebe0938facb6ca5a71 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 14 Feb 2024 16:03:53 +0600 Subject: [PATCH 191/221] Fix table styles conversion --- OOXML/XlsxFormat/Styles/TableStyles.cpp | 30 +++++++++++++++++++------ 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/OOXML/XlsxFormat/Styles/TableStyles.cpp b/OOXML/XlsxFormat/Styles/TableStyles.cpp index f0a6174117..7e99b76c8f 100644 --- a/OOXML/XlsxFormat/Styles/TableStyles.cpp +++ b/OOXML/XlsxFormat/Styles/TableStyles.cpp @@ -84,8 +84,14 @@ namespace OOX { auto ptr(new XLSB::TableStyleElement); XLS::BaseObjectPtr objectPtr(ptr); - ptr->index = m_oDxfId->GetValue(); - ptr->size = m_oSize->GetValue(); + if(m_oDxfId.IsInit()) + ptr->index = m_oDxfId->GetValue(); + else + ptr->index = 0; + if(m_oSize.IsInit()) + ptr->size = m_oSize->GetValue(); + else + ptr->size = 0; if(m_oType.IsInit()) { @@ -148,6 +154,8 @@ namespace OOX else ptr->tseType = 19; } + else + ptr->tseType = 19; return objectPtr; } @@ -314,11 +322,19 @@ namespace OOX auto beginStyle(new XLSB::BeginTableStyle); ptr->m_BrtBeginTableStyle = XLS::BaseObjectPtr{beginStyle}; - beginStyle->ctse = m_oCount->GetValue(); - beginStyle->fIsPivot = m_oPivot->GetValue(); - beginStyle->fIsTable = m_oTable->GetValue(); - beginStyle->rgchName = m_oName.get(); - beginStyle->rgchName = m_oDisplayName.get(); + beginStyle->ctse = m_arrItems.size(); + if(m_oPivot.IsInit()) + beginStyle->fIsPivot = m_oPivot->GetValue(); + else + beginStyle->fIsPivot = false; + if(m_oTable.IsInit()) + beginStyle->fIsTable = m_oTable->GetValue(); + else + beginStyle->fIsTable = false; + if(m_oName.IsInit()) + beginStyle->rgchName = m_oName.get(); + else if(m_oDisplayName.IsInit()) + beginStyle->rgchName = m_oDisplayName.get(); for(auto i:m_arrItems) ptr->m_arBrtTableStyleElement.push_back(i->toBin()); From 95146474ffe9ad116bd344a16e0ed1372514ebb6 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 14 Feb 2024 16:15:37 +0600 Subject: [PATCH 192/221] Fix comma processing --- .../XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 55d5a2c65a..892bab3481 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -265,7 +265,8 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R } if(!ptg_stack.size() || !left_p) { - // EXCEPT::RT::WrongParenthesisSequence(assembled_formula); + operand_expected = true; + continue;// EXCEPT::RT::WrongParenthesisSequence(assembled_formula); } left_p->incrementParametersNum(); // The count of parameters will be transferred to PtgFuncVar last_ptg = left_p; // PtgParen. Mostly to differ unary and binary minuses and pluses From 17a217267307d871ffb2b4e81e55e73d814067ec Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 15 Feb 2024 12:27:23 +0300 Subject: [PATCH 193/221] for bug #66495 --- OOXML/Binary/Document/BinReader/Readers.cpp | 5 +++++ OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h | 3 ++- OOXML/Binary/Document/BinWriter/BinWriters.cpp | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/OOXML/Binary/Document/BinReader/Readers.cpp b/OOXML/Binary/Document/BinReader/Readers.cpp index 297b16a8ea..fda1072622 100644 --- a/OOXML/Binary/Document/BinReader/Readers.cpp +++ b/OOXML/Binary/Document/BinReader/Readers.cpp @@ -1036,6 +1036,11 @@ int Binary_pPrReader::ReadContent(BYTE type, long length, void* poResult) pPPr->m_oCnfStyle.Init(); READ1_DEF(length, res, this->ReadCnfStyle, pPPr->m_oCnfStyle.GetPointer()); }break; + case c_oSerProp_pPrType::SnapToGrid: + { + pPPr->m_oSnapToGrid.Init(); + pPPr->m_oSnapToGrid->m_oVal.FromBool(m_oBufferedStream.GetBool()); + }break; default: res = c_oSerConstants::ReadUnknown; break; diff --git a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h index fa5219571e..ba1246ee42 100644 --- a/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h +++ b/OOXML/Binary/Document/BinWriter/BinReaderWriterDefines.h @@ -356,7 +356,8 @@ extern int g_nCurFormatVersion; Tab_Item_PosTwips = 42, Tab_Item_Val = 43, SuppressLineNumbers = 44, - CnfStyle = 45 + CnfStyle = 45, + SnapToGrid = 46 };} namespace c_oSerProp_rPrType{enum c_oSerProp_rPrType { diff --git a/OOXML/Binary/Document/BinWriter/BinWriters.cpp b/OOXML/Binary/Document/BinWriter/BinWriters.cpp index de701a62a3..f6ac759c38 100644 --- a/OOXML/Binary/Document/BinWriter/BinWriters.cpp +++ b/OOXML/Binary/Document/BinWriter/BinWriters.cpp @@ -1132,6 +1132,12 @@ void Binary_pPrWriter::Write_pPr(const OOX::Logic::CParagraphProperty& pPr) WriteCnfStyle(pPr.m_oCnfStyle.GetPointer()); m_oBcw.WriteItemWithLengthEnd(nCurPos2); } + if (pPr.m_oSnapToGrid.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSerProp_pPrType::SnapToGrid); + m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + m_oBcw.m_oStream.WriteBOOL(pPr.m_oSnapToGrid->m_oVal.ToBool()); + } } void Binary_pPrWriter::WritePPrChange(const OOX::Logic::CPPrChange& pPrChange) { From b9a11bc30deac160319e3c07b7e66a388f140afd Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Thu, 15 Feb 2024 13:11:19 +0300 Subject: [PATCH 194/221] Add ID with MetaOForm --- PdfFile/SrcWriter/Document.cpp | 16 ++++++++++++++++ PdfFile/SrcWriter/Metadata.cpp | 6 ++++++ PdfFile/SrcWriter/Metadata.h | 1 + PdfFile/test/test.cpp | 24 ++++-------------------- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/PdfFile/SrcWriter/Document.cpp b/PdfFile/SrcWriter/Document.cpp index 7310379f5b..94097d7d41 100644 --- a/PdfFile/SrcWriter/Document.cpp +++ b/PdfFile/SrcWriter/Document.cpp @@ -437,6 +437,22 @@ namespace PdfWriter { if (!m_pMetaData) return false; + + CArrayObject* pID = (CArrayObject*)m_pTrailer->Get("ID"); + if (!pID) + { + BYTE arrId[16]; + CEncryptDict::CreateId(m_pInfo, m_pXref, (BYTE*)arrId); + + pID = new CArrayObject(); + m_pTrailer->Add("ID", pID); + + pID->Add(new CBinaryObject(arrId, 16)); + pID->Add(new CBinaryObject(arrId, 16)); + + m_pMetaData->SetID(new CBinaryObject(arrId, 16)); + } + return m_pMetaData->AddMetaData(sMetaName, pMetaData, nMetaLength); } CDictObject* CDocument::CreatePageLabel(EPageNumStyle eStyle, unsigned int unFirstPage, const char* sPrefix) diff --git a/PdfFile/SrcWriter/Metadata.cpp b/PdfFile/SrcWriter/Metadata.cpp index 57d56629bd..d0cd8ebab7 100644 --- a/PdfFile/SrcWriter/Metadata.cpp +++ b/PdfFile/SrcWriter/Metadata.cpp @@ -179,6 +179,12 @@ namespace PdfWriter m_nLengthBegin = 0; m_nLengthEnd = 0; } + void CStreamData::SetID(CBinaryObject* pID) + { + if (!pID) + return; + Add("ID", pID); + } bool CStreamData::AddMetaData(const std::wstring& sMetaName, BYTE* pMetaData, DWORD nMetaLength) { if (sMetaName == L"Length") diff --git a/PdfFile/SrcWriter/Metadata.h b/PdfFile/SrcWriter/Metadata.h index 8e5d0da737..ea3673035d 100644 --- a/PdfFile/SrcWriter/Metadata.h +++ b/PdfFile/SrcWriter/Metadata.h @@ -62,6 +62,7 @@ namespace PdfWriter return dict_type_STREAM; } + void SetID(CBinaryObject* pID); bool AddMetaData(const std::wstring& sMetaName, BYTE* pMetaData, DWORD nMetaLength); void WriteToStream(CStream* pStream, CEncrypt* pEncrypt) override; void AfterWrite(CStream* pStream) override; diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index 0ddac403bb..7c176ad48c 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -149,21 +149,10 @@ TEST_F(CPdfFileTest, GetMetaData) BYTE* pMetaData = NULL; DWORD nMetaLength = 0; - if (pdfFile->GetMetaData(wsSrcFile, L"Test0", &pMetaData, nMetaLength)) + if (pdfFile->GetMetaData(wsSrcFile, L"ONLYOFFICEFORM", &pMetaData, nMetaLength)) { NSFile::CFileBinary oFile; - if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/resGetMetaData0.png")) - oFile.WriteFile(pMetaData, nMetaLength); - oFile.CloseFile(); - - EXPECT_TRUE(pMetaData); - } - RELEASEARRAYOBJECTS(pMetaData); - - if (pdfFile->GetMetaData(wsSrcFile, L"Test1", &pMetaData, nMetaLength)) - { - NSFile::CFileBinary oFile; - if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/resGetMetaData1.png")) + if (oFile.CreateFileW(NSFile::GetProcessDirectory() + L"/ONLYOFFICEFORM.docxf")) oFile.WriteFile(pMetaData, nMetaLength); oFile.CloseFile(); @@ -215,14 +204,9 @@ TEST_F(CPdfFileTest, SetMetaData) BYTE* pFileData = NULL; DWORD nFileSize; - std::wstring sFile = NSFile::GetProcessDirectory() + L"/res0.png"; + std::wstring sFile = NSFile::GetProcessDirectory() + L"/ONLYOFFICEFORM.docxf"; EXPECT_TRUE(NSFile::CFileBinary::ReadAllBytes(sFile, &pFileData, nFileSize)); - pdfFile->AddMetaData(L"Test0", pFileData, nFileSize); - RELEASEARRAYOBJECTS(pFileData); - - sFile = NSFile::GetProcessDirectory() + L"/res1.png"; - EXPECT_TRUE(NSFile::CFileBinary::ReadAllBytes(sFile, &pFileData, nFileSize)); - pdfFile->AddMetaData(L"Test1", pFileData, nFileSize); + pdfFile->AddMetaData(L"ONLYOFFICEFORM", pFileData, nFileSize); RELEASEARRAYOBJECTS(pFileData); EXPECT_HRESULT_SUCCEEDED(pdfFile->OnlineWordToPdfFromBinary(NSFile::GetProcessDirectory() + L"/pdf.bin", wsDstFile)); From ebc94a2615e288f5c1c81720705e3738d83093ef Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 15 Feb 2024 17:54:17 +0600 Subject: [PATCH 195/221] Add new string removing from column names --- .../Logic/Biff_structures/StringPtgParser.cpp | 22 ++++++++--------- .../Logic/Biff_structures/SyntaxPtg.cpp | 24 +++++++++++++++---- OOXML/XlsxFormat/Table/Tables.cpp | 5 ++++ 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp index 892bab3481..1245cd1c0f 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/StringPtgParser.cpp @@ -365,17 +365,6 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R { rgce.addPtg(found_operand = OperandPtgPtr(new PtgNum(operand_str))); } - - else if(SyntaxPtg::extract_UndefinedName(it, itEnd)) // Shall be placed strongly after extract_PtgName - { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgErr(L"#REF!"))); - } - - else if(SyntaxPtg::extract_PtgArray(it, itEnd, operand_str)) - { - rgce.addPtg(found_operand = OperandPtgPtr(new PtgArray(OperandPtg::ptg_ARRAY))); - rgb.addPtg(PtgPtr(new PtgExtraArray(operand_str))); - } else if(SyntaxPtg::extract_PtgFunc(it, itEnd, operand_str)) { PtgPtr func; @@ -395,6 +384,17 @@ const bool StringPtgParser::parseToPtgs(const std::wstring& assembled_formula, R rgce.addPtg(PtgPtr(new PtgNameX(operand_str, OperandPtg::ptg_VALUE))); } } + else if(SyntaxPtg::extract_UndefinedName(it, itEnd)) // Shall be placed strongly after extract_PtgName + { + rgce.addPtg(found_operand = OperandPtgPtr(new PtgErr(L"#REF!"))); + } + + else if(SyntaxPtg::extract_PtgArray(it, itEnd, operand_str)) + { + rgce.addPtg(found_operand = OperandPtgPtr(new PtgArray(OperandPtg::ptg_ARRAY))); + rgb.addPtg(PtgPtr(new PtgExtraArray(operand_str))); + } + else { // EXCEPT::RT::WrongFormulaString("Unknown operand format in formula.", assembled_formula); diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index e3cce003fc..36c8c51950 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -483,6 +483,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (insider == L"[#Data]") { if (boost::regex_search(first, last, results_1, reg_inside_table2)) @@ -520,7 +521,6 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: { ptgList.rowType = 0x10; } - else if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { ptgList.rowType = 0x00; @@ -534,6 +534,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: if (boost::regex_search(first, last, results_1, reg_inside_table3)) { insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (!insider.empty() && insider[0] != '[') insider.erase(0, 1); @@ -550,6 +551,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: if (boost::regex_search(first, last, results_1, reg_inside_table3)) { insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (!insider.empty() && insider[0] != '[') insider.erase(0, 1); @@ -561,6 +563,19 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: first = results_1[0].second; } } + else if(boost::regex_search(first, last, results_1, reg_inside_table5)) + { + insider = results_1.str(0); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); + insider = boost::algorithm::erase_first_copy(insider, L":"); + + if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) + { + ptgList.columns = 0x02; + ptgList.colLast = indexColumn; + } + first = results_1[0].second; + } } else { @@ -573,6 +588,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: { insider = results_1.str(0); insider = boost::algorithm::erase_first_copy(insider, L","); + insider = boost::algorithm::erase_all_copy(insider, L"\n"); if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { @@ -594,12 +610,12 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: else if(boost::regex_search(first, last, results_1, reg_inside_table4)) { _UINT16 indexColumn = -1; - auto insider = results_1.str(0); + auto insider = boost::algorithm::erase_all_copy(results_1.str(0), L"\n"); if (XMLSTUFF::isColumn(boost::algorithm::erase_last_copy(boost::algorithm::erase_first_copy(insider, L"["), L"]"), indexTable, indexColumn)) { - ptgList.columns = 0x02; - ptgList.colLast = indexColumn; + ptgList.columns = 0x01; + ptgList.colFirst = indexColumn; first = results_1[0].second; return true; } diff --git a/OOXML/XlsxFormat/Table/Tables.cpp b/OOXML/XlsxFormat/Table/Tables.cpp index 6982bba32b..aaa15cc6ff 100644 --- a/OOXML/XlsxFormat/Table/Tables.cpp +++ b/OOXML/XlsxFormat/Table/Tables.cpp @@ -619,7 +619,12 @@ xmlns:xr3=\"http://schemas.microsoft.com/office/spreadsheetml/2016/revision3\"") std::vector(m_oTableColumns->m_arrItems.size()+1, L"")); for(auto i:m_oTableColumns->m_arrItems) if(i->m_oName.IsInit() && i->m_oId.IsInit()) + { + if(i->m_oId->GetValue()+1 > XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).size()) + XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).resize(i->m_oId->GetValue()+1); + i->m_oName = boost::algorithm::erase_all_copy(i->m_oName.get(), L"_x000a_"); XLS::GlobalWorkbookInfo::mapTableColumnNames_static.at(m_oId->GetValue()).at(i->m_oId->GetValue()) = i->m_oName.get(); + } } XLS::GlobalWorkbookInfo::mapTableNames_static.emplace(m_oId->GetValue(), m_oName.get()); } From d1da32b9227718ee5a902d9038246365eb42f5de Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 15 Feb 2024 17:54:50 +0600 Subject: [PATCH 196/221] add error style initialization check --- OOXML/XlsxFormat/Worksheets/DataValidation.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp index 97bacb24ec..fb9b99a69e 100644 --- a/OOXML/XlsxFormat/Worksheets/DataValidation.cpp +++ b/OOXML/XlsxFormat/Worksheets/DataValidation.cpp @@ -251,8 +251,10 @@ xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\">"); if (m_oPromptTitle.IsInit()) ptr->PromptTitle = m_oPromptTitle.get(); - - ptr->errStyle = m_oErrorStyle->GetValue(); + if(m_oErrorStyle.IsInit()) + ptr->errStyle = m_oErrorStyle->GetValue(); + else + ptr->errStyle = 0; if(m_oImeMode.IsInit()) { if(m_oImeMode == SimpleTypes::Spreadsheet::EDataValidationImeMode::imeModeOn) From 8eee4d470c917eefd4a8381c5fc638c7602b8a6a Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 15 Feb 2024 19:29:51 +0600 Subject: [PATCH 197/221] Fix sparkline conversion --- OOXML/XlsxFormat/Worksheets/Sparkline.cpp | 143 ++++++++++++++++------ 1 file changed, 106 insertions(+), 37 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp index 64ec4da5b8..ca5d524267 100644 --- a/OOXML/XlsxFormat/Worksheets/Sparkline.cpp +++ b/OOXML/XlsxFormat/Worksheets/Sparkline.cpp @@ -401,54 +401,123 @@ namespace OOX auto ptr(new XLSB::BeginSparklineGroup); ptr1->m_BrtBeginSparklineGroup = XLS::BaseObjectPtr{ptr}; - ptr->dManualMax.data.value = m_oManualMax->GetValue(); - ptr->dManualMin.data.value = m_oManualMin->GetValue(); - ptr->dLineWeight.data.value = m_oLineWeight->GetValue(); - ptr->isltype = static_castisltype)>(m_oType->GetValue()); - ptr->fDateAxis = m_oDateAxis->GetValue(); - ptr->fShowEmptyCellAsZero = (m_oDisplayEmptyCellsAs == OOX::Spreadsheet::ST_DispBlanksAs::st_dispblanksasZERO) ? 0x01 : 0x00; - ptr->fMarkers = m_oMarkers->GetValue(); - ptr->fHigh = m_oHigh->GetValue(); - ptr->fLow = m_oLow->GetValue(); - ptr->fFirst = m_oFirst->GetValue(); - ptr->fLast = m_oLast->GetValue(); - ptr->fNegative = m_oNegative->GetValue(); - ptr->fAxis = m_oDisplayXAxis->GetValue(); - ptr->fDisplayHidden = m_oDisplayHidden->GetValue(); - ptr->fRTL = m_oRightToLeft->GetValue(); - - if(m_oMaxAxisType == SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Individual) + if(m_oManualMax.IsInit()) + ptr->dManualMax.data.value = m_oManualMax->GetValue(); + else + ptr->dManualMax.data.value = 0; + if(m_oManualMin.IsInit()) + ptr->dManualMin.data.value = m_oManualMin->GetValue(); + else + ptr->dManualMin.data.value = 0; + if(m_oLineWeight.IsInit()) + ptr->dLineWeight.data.value = m_oLineWeight->GetValue(); + else + ptr->dLineWeight.data.value = 0; + if(m_oType.IsInit()) + ptr->isltype = static_castisltype)>(m_oType->GetValue()); + else + ptr->isltype = 0; + if(m_oDateAxis.IsInit()) + ptr->fDateAxis = m_oDateAxis->GetValue(); + else + ptr->fDateAxis = 0; + if(m_oDisplayEmptyCellsAs.IsInit()) + ptr->fShowEmptyCellAsZero = (m_oDisplayEmptyCellsAs == OOX::Spreadsheet::ST_DispBlanksAs::st_dispblanksasZERO) ? 0x01 : 0x00; + else + ptr->fShowEmptyCellAsZero = false; + if(m_oMarkers.IsInit()) + ptr->fMarkers = m_oMarkers->GetValue(); + else + ptr->fMarkers = false; + if(m_oHigh.IsInit()) + ptr->fHigh = m_oHigh->GetValue(); + else + ptr->fHigh = false; + if(m_oLow.IsInit()) + ptr->fLow = m_oLow->GetValue(); + else + ptr->fLow = false; + if(m_oFirst.IsInit()) + ptr->fFirst = m_oFirst->GetValue(); + else + ptr->fFirst = false; + if(m_oLast.IsInit()) + ptr->fLast = m_oLast->GetValue(); + else + ptr->fLast = false; + if(m_oNegative.IsInit()) + ptr->fNegative = m_oNegative->GetValue(); + else + ptr->fNegative = false; + if(m_oDisplayXAxis.IsInit()) + ptr->fAxis = m_oDisplayXAxis->GetValue(); + else + ptr->fAxis = false; + if(m_oDisplayHidden.IsInit()) + ptr->fDisplayHidden = m_oDisplayHidden->GetValue(); + else + ptr->fDisplayHidden = false; + if(m_oRightToLeft.IsInit()) + ptr->fRTL = m_oRightToLeft->GetValue(); + else + ptr->fRTL = false; + if(m_oMaxAxisType.IsInit() && m_oMaxAxisType == SimpleTypes::Spreadsheet::ESparklineAxisMinMax::Individual) ptr->fIndividualAutoMax = true; + else + ptr->fIndividualAutoMax = false; - if(m_oColorSeries.IsInit()) - ptr->brtcolorSeries = m_oColorSeries->toColor(); + if(m_oColorSeries.IsInit()) + ptr->brtcolorSeries = m_oColorSeries->toColor(); + else + ptr->brtcolorSeries = m_oColorSeries->GetDefaultColor(); - if(m_oColorNegative.IsInit()) - ptr->brtcolorNegative = m_oColorNegative->toColor(); + if(m_oColorNegative.IsInit()) + ptr->brtcolorNegative = m_oColorNegative->toColor(); + else + ptr->brtcolorNegative = m_oColorSeries->GetDefaultColor(); - if(m_oColorAxis.IsInit()) - ptr->brtcolorAxis = m_oColorAxis->toColor(); + if(m_oColorAxis.IsInit()) + ptr->brtcolorAxis = m_oColorAxis->toColor(); + else + ptr->brtcolorAxis = m_oColorSeries->GetDefaultColor(); - if(m_oColorMarkers.IsInit()) - ptr->brtcolorMarkers = m_oColorMarkers->toColor(); + if(m_oColorMarkers.IsInit()) + ptr->brtcolorMarkers = m_oColorMarkers->toColor(); + else + ptr->brtcolorMarkers = m_oColorSeries->GetDefaultColor(); - if(m_oColorFirst.IsInit()) - ptr->brtcolorFirst = m_oColorFirst->toColor(); + if(m_oColorFirst.IsInit()) + ptr->brtcolorFirst = m_oColorFirst->toColor(); + else + ptr->brtcolorFirst = m_oColorSeries->GetDefaultColor(); - if(m_oColorLast.IsInit()) - ptr->brtcolorLast = m_oColorLast->toColor(); + if(m_oColorLast.IsInit()) + ptr->brtcolorLast = m_oColorLast->toColor(); + else + ptr->brtcolorLast = m_oColorSeries->GetDefaultColor(); - if(m_oColorHigh.IsInit()) - ptr->brtcolorHigh = m_oColorHigh->toColor(); + if(m_oColorHigh.IsInit()) + ptr->brtcolorHigh = m_oColorHigh->toColor(); + else + ptr->brtcolorHigh = m_oColorHigh->GetDefaultColor(); - if(m_oColorLow.IsInit()) - ptr->brtcolorLow = m_oColorLow->toColor(); + if(m_oColorLow.IsInit()) + ptr->brtcolorLow = m_oColorLow->toColor(); + else + ptr->brtcolorLow = m_oColorLow->GetDefaultColor(); - if(ptr->FRTheader.rgFormulas.array.size() > 0) - { - ptr->FRTheader.rgFormulas.array[0].formula = m_oRef.get(); - } + ptr->FRTheader.fFormula = false; + ptr->FRTheader.fRef = false; + ptr->FRTheader.fSqref = false; + ptr->FRTheader.fRelID = false; + if(m_oRef.IsInit()) + { + XLSB::FRTFormula fmla; + ptr->FRTheader.rgFormulas.array.push_back(fmla); + ptr->FRTheader.rgFormulas.array[0].formula = m_oRef.get(); + ptr->FRTheader.fFormula = true; + } return objectPtr; } From b7bc83f37d76a00df601c89ca620bce9d445ec98 Mon Sep 17 00:00:00 2001 From: Svetlana Kulikova Date: Fri, 16 Feb 2024 10:47:08 +0300 Subject: [PATCH 198/221] Create ValidMetaData --- PdfFile/PdfFile.cpp | 6 ++++++ PdfFile/PdfFile.h | 1 + PdfFile/PdfReader.cpp | 27 +++++++++++++++++++++++++++ PdfFile/PdfReader.h | 1 + PdfFile/test/test.cpp | 9 +++++++++ 5 files changed, 44 insertions(+) diff --git a/PdfFile/PdfFile.cpp b/PdfFile/PdfFile.cpp index 7d4d916ad3..f9f228bac7 100644 --- a/PdfFile/PdfFile.cpp +++ b/PdfFile/PdfFile.cpp @@ -1525,6 +1525,12 @@ int CPdfFile::GetMaxRefID() return m_pInternal->pReader->GetMaxRefID(); } +bool CPdfFile::ValidMetaData() +{ + if (!m_pInternal->pReader) + return false; + return m_pInternal->pReader->ValidMetaData(); +} void CPdfFile::DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak) { if (!m_pInternal->pReader) diff --git a/PdfFile/PdfFile.h b/PdfFile/PdfFile.h index 46c9a2aab4..0e436b0dcb 100644 --- a/PdfFile/PdfFile.h +++ b/PdfFile/PdfFile.h @@ -128,6 +128,7 @@ public: virtual std::wstring GetInfo(); virtual BYTE* GetStructure(); virtual BYTE* GetLinks(int nPageIndex); + bool ValidMetaData(); int GetRotate(int nPageIndex); int GetMaxRefID(); BYTE* GetWidgets(); diff --git a/PdfFile/PdfReader.cpp b/PdfFile/PdfReader.cpp index a18fb80e68..6a6e4b0eb8 100644 --- a/PdfFile/PdfReader.cpp +++ b/PdfFile/PdfReader.cpp @@ -461,6 +461,33 @@ int CPdfReader::GetMaxRefID() return 0; return m_pPDFDocument->getXRef()->getNumObjects(); } +bool CPdfReader::ValidMetaData() +{ + if (!m_pPDFDocument) + return false; + + XRef* xref = m_pPDFDocument->getXRef(); + Object oMeta, oType, oID; + if (!xref->fetch(1, 0, &oMeta)->isStream() || !oMeta.streamGetDict()->lookup("Type", &oType)->isName("MetaOForm") || !oMeta.streamGetDict()->lookup("ID", &oID)->isString()) + { + oMeta.free(); oType.free(); oID.free(); + return false; + } + oMeta.free(); oType.free(); + + Object oTID, oID2; + Object* pTrailerDict = xref->getTrailerDict(); + if (!pTrailerDict || !pTrailerDict->dictLookup("ID", &oTID)->isArray() || !oTID.arrayGet(1, &oID2)->isString()) + { + oID.free(); oTID.free(); oID2.free(); + return false; + } + oTID.free(); + + bool bRes = oID2.getString()->cmp(oID.getString()) == 0; + oID.free(); oID2.free(); + return bRes; +} void CPdfReader::DrawPageOnRenderer(IRenderer* pRenderer, int _nPageIndex, bool* pbBreak) { if (m_pPDFDocument && pRenderer) diff --git a/PdfFile/PdfReader.h b/PdfFile/PdfReader.h index 03a22536d0..0b869e1b83 100644 --- a/PdfFile/PdfReader.h +++ b/PdfFile/PdfReader.h @@ -61,6 +61,7 @@ public: int GetError(); int GetRotate(int nPageIndex); int GetMaxRefID(); + bool ValidMetaData(); void GetPageInfo(int nPageIndex, double* pdWidth, double* pdHeight, double* pdDpiX, double* pdDpiY); void DrawPageOnRenderer(IRenderer* pRenderer, int nPageIndex, bool* pBreak); std::wstring GetInfo(); diff --git a/PdfFile/test/test.cpp b/PdfFile/test/test.cpp index 7c176ad48c..6eab94b8e3 100644 --- a/PdfFile/test/test.cpp +++ b/PdfFile/test/test.cpp @@ -161,6 +161,15 @@ TEST_F(CPdfFileTest, GetMetaData) RELEASEARRAYOBJECTS(pMetaData); } +TEST_F(CPdfFileTest, ValidMetaData) +{ + GTEST_SKIP(); + + LoadFromFile(); + + std::cout << "ValidMetaData " << (pdfFile->ValidMetaData() ? "true" : "false") << std::endl; +} + TEST_F(CPdfFileTest, PdfBinToPng) { GTEST_SKIP(); From 4ee1d598036fd4d8d8a3bd05c7c4df682f5bfde0 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 16 Feb 2024 15:56:48 +0600 Subject: [PATCH 199/221] Fix default values setting up --- OOXML/XlsxFormat/Table/Autofilter.cpp | 52 +++++++++++-------- OOXML/XlsxFormat/Table/Connections.cpp | 35 ++++++++++++- .../Worksheets/ConditionalFormatting.cpp | 27 +++++++--- 3 files changed, 83 insertions(+), 31 deletions(-) diff --git a/OOXML/XlsxFormat/Table/Autofilter.cpp b/OOXML/XlsxFormat/Table/Autofilter.cpp index e9fba5c921..c21590a25e 100644 --- a/OOXML/XlsxFormat/Table/Autofilter.cpp +++ b/OOXML/XlsxFormat/Table/Autofilter.cpp @@ -109,31 +109,39 @@ namespace OOX auto ptr(new XLSB::BeginSortCond); XLS::BaseObjectPtr objectPtr(ptr); - ptr->fSortDes = m_oDescending->GetValue(); - ptr->rfx = m_oRef->GetValue(); - - if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyValue) - { - ptr->sortOn = 0; - } - else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyCellColor) - { - ptr->sortOn = 1; - ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); - } - else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyFontColor) - { - ptr->sortOn = 2; - ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); - } - else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyIcon) - { - ptr->sortOn = 3; - } + if(m_oDescending.IsInit()) + ptr->fSortDes = m_oDescending->GetValue(); else + ptr->fSortDes = 0; + if(m_oRef.IsInit()) + ptr->rfx = m_oRef->GetValue(); + if(m_oSortBy.IsInit()) { - ptr->sortOn = 0; + if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyValue) + { + ptr->sortOn = 0; + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyCellColor) + { + ptr->sortOn = 1; + ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyFontColor) + { + ptr->sortOn = 2; + ptr->condDataValue.condDataValue = m_oDxfId->GetValue(); + } + else if(m_oSortBy == SimpleTypes::Spreadsheet::ESortBy::sortbyIcon) + { + ptr->sortOn = 3; + } + else + ptr->sortOn = 0; } + else + ptr->sortOn = 0; + + ptr->stSslist = L""; return objectPtr; } diff --git a/OOXML/XlsxFormat/Table/Connections.cpp b/OOXML/XlsxFormat/Table/Connections.cpp index 1eca709bf4..f1211d7066 100644 --- a/OOXML/XlsxFormat/Table/Connections.cpp +++ b/OOXML/XlsxFormat/Table/Connections.cpp @@ -464,20 +464,42 @@ namespace OOX if(m_oLocalConnection.IsInit()) ptr->stConnLocal = m_oLocalConnection.get(); + else + { + ptr->bLoadConnLocal = false; + ptr->stConnLocal = L""; + } if(m_oRowDrillCount.IsInit()) ptr->nDrillthroughRows = m_oRowDrillCount.get(); + else + ptr->nDrillthroughRows = 0; if(m_oLocal.IsInit()) ptr->fLocalConn = m_oLocal.get(); + else + { + ptr->fLocalConn = false; + ptr->bLoadConnLocal = false; + } if(m_oLocalRefresh.IsInit()) ptr->fNoRefreshCube = m_oLocalRefresh.get(); + else + ptr->fNoRefreshCube = false; if(m_oSendLocale.IsInit()) - ptr->fUseOfficeLcid = m_oSendLocale.get(); + ptr->fUseOfficeLcid = m_oSendLocale.get(); + else + ptr->fUseOfficeLcid = false; if(m_oServerNumberFormat.IsInit()) ptr->fSrvFmtNum = m_oServerNumberFormat.get(); + else + ptr->fSrvFmtNum = false; if(m_oServerFont.IsInit()) ptr->fSrvFmtFlags = m_oServerFont.get(); + else + ptr->fSrvFmtFlags = false; if(m_oServerFontColor.IsInit()) ptr->fSrvFmtFore = m_oServerFontColor.get(); + else + ptr->fSrvFmtFore = false; return XLS::BaseObjectPtr{ptr1}; } EElementType COlapPr::getType() const @@ -943,6 +965,15 @@ namespace OOX auto ptr(new XLSB::EXTCONN15); objectPtr = XLS::BaseObjectPtr{ptr}; auto ptr1(new XLSB::BeginExtConn15); + ptr1->fAutoDelete = false; + ptr1->fExcludeFromRefreshAll = false; + ptr1->fSandbox = false; + ptr1->fUsedByAddin = false; + if(m_oId.IsInit()) + ptr1->irstId = m_oId->GetValue(); + else + ptr1->irstId = false; + ptr->m_BrtBeginExtConn15 = XLS::BaseObjectPtr{ptr1}; ptr->m_source = m_oRangePr->toBin(); } @@ -968,6 +999,8 @@ namespace OOX ptr1->idbtype = m_oType.get(); if(m_oName.IsInit()) ptr1->stConnName = m_oName.get(); + else + ptr1->stConnName = L""; if(m_oId.IsInit()) ptr1->dwConnID = m_oId->GetValue(); if(m_oCredentials.IsInit()) diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index f0cd4e2671..f8ea392135 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -247,8 +247,10 @@ XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() auto ptr1(new XLSB::CFVO); ptr->m_BrtCFVO = XLS::BaseObjectPtr{ptr1}; - ptr1->fGTE = m_oGte->GetValue(); - + if(m_oGte.IsInit()) + ptr1->fGTE = m_oGte->GetValue(); + else + ptr1->fGTE = false; if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Number) ptr1->iType = XLSB::CFVOtype::CFVONUM; else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Minimum) @@ -262,7 +264,8 @@ XLS::BaseObjectPtr CConditionalFormatValueObject::toBin() else if (m_oType == SimpleTypes::Spreadsheet::ECfvoType::Formula) ptr1->iType = XLSB::CFVOtype::CFVOFMLA; - ptr1->numParam.data.value = std::stod(m_oVal.get()); + if(m_oVal.IsInit()) + ptr1->numParam.data.value = std::stod(m_oVal.get()); if(m_oFormula.IsInit()) { @@ -887,15 +890,23 @@ XLS::BaseObjectPtr CDataBar::toBin() auto ptr1(new XLSB::BeginDatabar); ptr->m_BrtBeginDatabar = XLS::BaseObjectPtr{ptr1}; - ptr1->bLenMax = m_oMaxLength->GetValue(); - ptr1->bLenMin = m_oMinLength->GetValue(); - ptr1->fShowValue = m_oShowValue->GetValue(); + if(m_oMaxLength.IsInit()) + ptr1->bLenMax = m_oMaxLength->GetValue(); + else + m_oMaxLength = 100; + if(m_oMinLength.IsInit()) + ptr1->bLenMin = m_oMinLength->GetValue(); + else + ptr1->bLenMin = 0; + if(m_oShowValue.IsInit()) + ptr1->fShowValue = m_oShowValue->GetValue(); + else + ptr1->fShowValue = false; for(auto i:m_arrValues) ptr->m_arCFVO.push_back(i->toBin()); if(m_oColor.IsInit()) - - ptr->m_BrtColor = m_oColor->toBin(); + ptr->m_BrtColor = m_oColor->toBin(); return objectPtr; } From 84425963721d2558591135022294c61dbc5067ba Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Fri, 16 Feb 2024 15:58:57 +0600 Subject: [PATCH 200/221] Fix conversion table formulas with empty square brackets --- .../XlsFile/Format/Auxiliary/HelpFunc.cpp | 16 +++++++++++++++- .../XlsFile/Format/Auxiliary/HelpFunc.h | 1 + .../Logic/Biff_structures/SyntaxPtg.cpp | 19 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp index 88bfd184ea..d1b3cbb4e7 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.cpp @@ -736,6 +736,20 @@ bool isColumn(const std::wstring& columnName, _UINT32 listIndex, _UINT16& indexC } return false; } - +unsigned int getColumnsCount(_UINT32 listIndex) +{ + auto arrColumn = XLS::GlobalWorkbookInfo::mapTableColumnNames_static.find(listIndex); + if(arrColumn != XLS::GlobalWorkbookInfo::mapTableColumnNames_static.end()) + { + auto counter = 0; + for(auto i:arrColumn->second) + { + if(!i.empty()) + counter++; + } + return counter; + } + return 0; +} } //namespace XMLSTUFF diff --git a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h index e1d902b868..a7a06f1e93 100644 --- a/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h +++ b/MsBinaryFile/XlsFile/Format/Auxiliary/HelpFunc.h @@ -95,5 +95,6 @@ unsigned short sheetsnames2ixti(std::wstring name); unsigned int definenames2index(std::wstring name); bool isTableFmla(const std::wstring& tableName, _UINT32& listIndex); bool isColumn(const std::wstring& columnName, _UINT32 listIndex, _UINT16& indexColumn); +unsigned int getColumnsCount(_UINT32 listIndex); } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp index 36c8c51950..fdd9920eec 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/SyntaxPtg.cpp @@ -469,6 +469,7 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: static boost::wregex reg_inside_table3(L"^[,;:]?\\[#?[\\s\\w\\d.]+\\]"); static boost::wregex reg_inside_table4(L"\\[#?(\\[.+?\\]\\,)?(\\[.+?\\])?.+?\\]"); static boost::wregex reg_inside_table5(L"^[,;:]?\\[.+?\\]"); + static boost::wregex reg_inside_table6(L"\\[\\]"); first = results[1].second; @@ -607,6 +608,24 @@ const bool SyntaxPtg::extract_PtgList(std::wstring::const_iterator& first, std:: return true; } + else if (boost::regex_search(first, last, results_1, reg_inside_table6)) + { + auto colCount = XMLSTUFF::getColumnsCount(indexTable); + if(colCount>1) + { + ptgList.columns = 0x02; + ptgList.colFirst = 0; + ptgList.colLast = colCount-1; + first = results_1[0].second; + } + else + { + ptgList.columns = 0x01; + ptgList.colFirst = 0; + first = results_1[0].second; + } + return true; + } else if(boost::regex_search(first, last, results_1, reg_inside_table4)) { _UINT16 indexColumn = -1; From 30fa4b0ea4e81d388ad5d6f4b051dc4a61d2992b Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Fri, 16 Feb 2024 20:05:07 +0300 Subject: [PATCH 201/221] [x2t] For vsdx printing --- X2tConverter/src/ASCConverters.cpp | 38 +++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index cb47269d81..f4c6938576 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1330,6 +1330,36 @@ namespace NExtractTools else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } + else if ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo)) + { + if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_DRAW_VSDX)) + { + std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; + if (sToRender.empty()) + { + sToRender = combinePath(convertParams.m_sTempDir, L"toRender.vsdx"); + nRes = dir2zip(sFrom, sToRender); + } + NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); + } + else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) + { + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); + } + else + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + } + else + { + //There is no Editor.bin for vsdx + nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + } + } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; return nRes; @@ -1347,7 +1377,7 @@ namespace NExtractTools std::wstring sVsdxDir = combinePath(convertParams.m_sTempDir, L"xsdx_unpacked"); NSDirectory::CreateDirectory(sVsdxDir); - if (AVS_OFFICESTUDIO_FILE_PRESENTATION_PPTX == nFormatFrom) + if (0 != (AVS_OFFICESTUDIO_FILE_DRAW & nFormatFrom)) { convertParams.m_sTempParamOOXMLFile = sFrom; if (params.getFromChanges()) @@ -1361,6 +1391,12 @@ namespace NExtractTools nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; if (SUCCEEDED_X2T(nRes)) { + std::wstring sFileToCurrent = *params.m_sFileTo; + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + + if (NULL != params.m_nFormatTo) + nFormatTo = *params.m_nFormatTo; + nRes = fromVsdxDir(sVsdxDir, sTo, nFormatTo, params, convertParams); } return nRes; From 22508420d86c1c398f8b76b88ff1e8bdba5f1c0f Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Fri, 16 Feb 2024 23:30:42 +0300 Subject: [PATCH 202/221] [x2t] To fix build --- X2tConverter/src/ASCConverters.cpp | 40 ++++++++++++------------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index f4c6938576..c57329846f 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1330,35 +1330,27 @@ namespace NExtractTools else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; } - else if ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo)) + else if ((0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) || AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) { - if (params.needConvertToOrigin(AVS_OFFICESTUDIO_FILE_DRAW_VSDX)) + std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; + if (sToRender.empty()) { - std::wstring sToRender = convertParams.m_sTempParamOOXMLFile; - if (sToRender.empty()) - { - sToRender = combinePath(convertParams.m_sTempDir, L"toRender.vsdx"); - nRes = dir2zip(sFrom, sToRender); - } - NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT; - if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) - { - convertParams.m_sInternalMediaDirectory = sFrom; - nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); - } - else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) - { - convertParams.m_sInternalMediaDirectory = sFrom; - nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); - } - else - nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; + sToRender = combinePath(convertParams.m_sTempDir, L"toRender.vsdx"); + nRes = dir2zip(sFrom, sToRender); + } + NSDoctRenderer::DoctRendererFormat::FormatFile eFromType = NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT; + if (AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF == nFormatTo) + { + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2pdf(eFromType, sToRender, sTo, params, convertParams); + } + else if (0 != (AVS_OFFICESTUDIO_FILE_IMAGE & nFormatTo)) + { + convertParams.m_sInternalMediaDirectory = sFrom; + nRes = doct_bin2image(eFromType, sToRender, sTo, params, convertParams); } else - { - //There is no Editor.bin for vsdx nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; - } } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; From 49f5df9f88aeefa051e626447bf55d8e692a7433 Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Sun, 18 Feb 2024 12:42:42 +0300 Subject: [PATCH 203/221] [x2t] Fix COfficeFileFormatChecker::isOOXFormatFile for vsdx --- Common/OfficeFileFormatChecker2.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Common/OfficeFileFormatChecker2.cpp b/Common/OfficeFileFormatChecker2.cpp index bfaba2dbdc..1fdb6b6f34 100644 --- a/Common/OfficeFileFormatChecker2.cpp +++ b/Common/OfficeFileFormatChecker2.cpp @@ -900,12 +900,12 @@ bool COfficeFileFormatChecker::isOOXFormatFile(const std::wstring &fileName, boo const char *ppsmFormatLine = "application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"; const char *potmFormatLine = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml"; - const char *vsdxFormatLine = "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml"; - const char *vssxFormatLine = "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml"; - const char *vstxFormatLine = "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml"; - const char *vsdmFormatLine = "application/vnd.ms-powerpoint.presentation.macroEnabled.main+xml"; - const char *vssmFormatLine = "application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml"; - const char *vstmFormatLine = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml"; + const char *vsdxFormatLine = "application/vnd.ms-visio.drawing.main+xml"; + const char *vssxFormatLine = "application/vnd.ms-visio.stencil.main+xml"; + const char *vstxFormatLine = "application/vnd.ms-visio.template.main+xml"; + const char *vsdmFormatLine = "application/vnd.ms-visio.drawing.macroEnabled.main+xml"; + const char *vssmFormatLine = "application/vnd.ms-visio.stencil.macroEnabled.main+xml"; + const char *vstmFormatLine = "application/vnd.ms-visio.template.macroEnabled.main+xml"; std::string strContentTypes((char*)pBuffer, nBufferSize); From efb18b58641e7c4a600e232f6af4dcd74d85de01 Mon Sep 17 00:00:00 2001 From: Sergey Konovalov Date: Mon, 19 Feb 2024 01:52:06 +0300 Subject: [PATCH 204/221] [x2t] Fix fromDraw --- X2tConverter/src/ASCConverters.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index c57329846f..54a22070bc 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -1365,7 +1365,6 @@ namespace NExtractTools nFormatTo = *params.m_nFormatTo; _UINT32 nRes = 0; - std::wstring sVsdxFile; std::wstring sVsdxDir = combinePath(convertParams.m_sTempDir, L"xsdx_unpacked"); NSDirectory::CreateDirectory(sVsdxDir); @@ -1377,7 +1376,7 @@ namespace NExtractTools params.setFromChanges(false); nRes = apply_changes(sFrom, sTo, NSDoctRenderer::DoctRendererFormat::FormatFile::VSDT, convertParams.m_sTempParamOOXMLFile, params, convertParams); } - nRes = zip2dir(sVsdxFile, sVsdxDir); + nRes = zip2dir(sFrom, sVsdxDir); } else nRes = AVS_FILEUTILS_ERROR_CONVERT_PARAMS; From 91e5fae5def541ff39e7004b726daf279c58b794 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 19 Feb 2024 10:55:23 +0300 Subject: [PATCH 205/221] fix bug #62141 --- .../Records/Drawing/ShapeContainer.cpp | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp index 7a4728febc..49caf34ca4 100644 --- a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp +++ b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp @@ -222,22 +222,28 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn for (size_t i = 0; i < lCount; ++i) { SetUpPropertyVideo(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } + } + }break; case PPT::etPicture: { if (reset_default) { - pElement->m_oBrush.Type = c_BrushTypeTexture; + pElement->m_oBrush.Type = c_BrushTypeTexture; // or 3000 set ??? pElement->m_bLine = false; } for (size_t i = 0; i < lCount; ++i) { SetUpPropertyImage(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); } - break; - } + if (false == pElement->m_bIsFilled) + { + pElement->m_oBrush.Type = c_BrushTypeNoFill; + } + else if (pElement->m_oBrush.Type == c_BrushTypeTexture) + { + pElement->m_oBrush.Type = c_BrushTypeSolid; + } + }break; case PPT::etAudio: { if (reset_default) @@ -247,9 +253,8 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn for (size_t i = 0; i < lCount; ++i) { SetUpPropertyAudio(pElement, pTheme, pWrapper, pSlide, &pProperties->m_arProperties[i]); - } - break; - } + } + }break; case PPT::etGroup: { if (reset_default) @@ -282,7 +287,7 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn pElement->m_oBrush.Type = c_BrushTypeNoFill; } else if (pElement->m_oBrush.Type == c_BrushTypeNotSet && - (pElement->m_lPlaceholderType == 0 && pElement->m_lPlaceholderID < 0 )) + (pElement->m_lPlaceholderType == 0 && pElement->m_lPlaceholderID < 0)) { pElement->m_oBrush.Type = c_BrushTypeSolid; } @@ -292,8 +297,7 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn pPPTShape->m_oCustomVML.ToCustomShape(pPPTShape, pPPTShape->m_oManager); pPPTShape->ReCalculate(); } - break; - } + }break; default: break; } From f672fcc665440c550c34276fb45087d71e59de2d Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 19 Feb 2024 20:07:17 +0300 Subject: [PATCH 206/221] oleObjects from ppt --- MsBinaryFile/PptFile/Drawing/Attributes.h | 49 ++++- MsBinaryFile/PptFile/Drawing/Element.h | 15 +- MsBinaryFile/PptFile/Drawing/Elements.cpp | 17 ++ MsBinaryFile/PptFile/Drawing/Elements.h | 12 ++ MsBinaryFile/PptFile/PPTXWriter/Converter.cpp | 13 +- .../PptFile/PPTXWriter/ImageManager.cpp | 106 ++++++++-- .../PptFile/PPTXWriter/ImageManager.h | 42 ++-- .../PptFile/PPTXWriter/ShapeWriter.cpp | 196 +++++++++++++----- MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h | 3 +- .../PptFile/Reader/PPTDocumentInfo.cpp | 3 +- MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h | 5 + .../PptFile/Reader/PPTDocumentInfoOneUser.cpp | 119 +++++++---- .../PptFile/Reader/PPTDocumentInfoOneUser.h | 6 +- MsBinaryFile/PptFile/Reader/Records.cpp | 3 +- .../Records/Drawing/ShapeContainer.cpp | 22 +- .../PptFile/Records/ExObjListContainer.cpp | 60 ++++++ .../PptFile/Records/ExObjListContainer.h | 12 ++ .../PptFile/Records/ExOleEmbedAtom.cpp | 5 + MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h | 8 +- MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp | 50 ----- MsBinaryFile/PptFile/Records/VBAInfoAtom.h | 12 -- 21 files changed, 550 insertions(+), 208 deletions(-) diff --git a/MsBinaryFile/PptFile/Drawing/Attributes.h b/MsBinaryFile/PptFile/Drawing/Attributes.h index f504f1be85..701ef71cf0 100644 --- a/MsBinaryFile/PptFile/Drawing/Attributes.h +++ b/MsBinaryFile/PptFile/Drawing/Attributes.h @@ -83,22 +83,26 @@ namespace PPT eftHyperlink = 3, eftObject = 4, eftSlide = 5, - eftFile = 6 + eftFile = 6, + eftOleObject = 7 }; - ExFilesType m_type = eftNone; - _UINT32 m_dwID = 0; - std::wstring m_strFilePath = L""; - std::wstring m_name; + ExFilesType m_type = ExFilesType::eftNone; + + _UINT32 m_dwID = 0; + std::wstring m_strFilePath; + + std::wstring m_name; + std::wstring m_progName; // clip - double m_dStartTime = 0.0; - double m_dEndTime = 1.0; + double m_dStartTime = 0.0; + double m_dEndTime = 1.0; // loop - bool m_bLoop = false; - bool m_fNarration = false; // isNarration pptx - bool m_fRewind = false; + bool m_bLoop = false; + bool m_fNarration = false; // isNarration pptx + bool m_fRewind = false; CExFilesInfo() { @@ -168,6 +172,7 @@ namespace PPT std::vector m_arHyperlinks; std::vector m_arSlides; std::vector m_arFiles; + std::vector m_arOleObjects; std::vector m_arAudioCollection; @@ -177,9 +182,10 @@ namespace PPT m_arImages.clear(); m_arAudios.clear(); m_arAudioCollection.clear(); + m_arOleObjects.clear(); } - CExMedia() : m_arVideos(), m_arImages(), m_arAudios() + CExMedia() { } @@ -198,6 +204,8 @@ namespace PPT m_arImages.push_back(oSrc.m_arImages[i]); for (size_t i = 0; i < oSrc.m_arVideos.size(); i++) m_arAudios.push_back(oSrc.m_arAudios[i]); + for (size_t i = 0; i < oSrc.m_arOleObjects.size(); i++) + m_arOleObjects.push_back(oSrc.m_arOleObjects[i]); return *this; } @@ -266,6 +274,19 @@ namespace PPT return NULL; } + CExFilesInfo* LockOleObject(_UINT32 dwID) + { + size_t nCount = m_arOleObjects.size(); + for (size_t i = 0; i < nCount; ++i) + { + if (dwID == m_arOleObjects[i].m_dwID) + { + return &m_arOleObjects[i]; + } + } + + return NULL; + } CExFilesInfo* LockAudioFromCollection(_UINT32 dwID) { size_t nCount = m_arAudioCollection.size(); @@ -302,6 +323,12 @@ namespace PPT eType = CExFilesInfo::eftAudio; return pInfo; } + pInfo = LockOleObject(dwID); + if (NULL != pInfo) + { + eType = CExFilesInfo::eftOleObject; + return pInfo; + } pInfo = LockSlide(dwID); if (NULL != pInfo) { diff --git a/MsBinaryFile/PptFile/Drawing/Element.h b/MsBinaryFile/PptFile/Drawing/Element.h index a36fc9c275..3ca24b614a 100644 --- a/MsBinaryFile/PptFile/Drawing/Element.h +++ b/MsBinaryFile/PptFile/Drawing/Element.h @@ -38,13 +38,14 @@ namespace PPT { enum ElementType { - etGroup = 0, - etVideo = 1, - etAudio = 2, - etPicture = 3, - etShape = 4, - etText = 5, - etTable = 6 + etGroup = 0, + etVideo = 1, + etAudio = 2, + etPicture = 3, + etShape = 4, + etText = 5, + etTable = 6, + etOleObject = 7 }; class CTheme; diff --git a/MsBinaryFile/PptFile/Drawing/Elements.cpp b/MsBinaryFile/PptFile/Drawing/Elements.cpp index 4c8bfa4ecf..bcbae43ce2 100644 --- a/MsBinaryFile/PptFile/Drawing/Elements.cpp +++ b/MsBinaryFile/PptFile/Drawing/Elements.cpp @@ -490,7 +490,24 @@ namespace PPT strXmlPPTX += L""; return strXmlPPTX; } + COleObjectElement::COleObjectElement() : CImageElement() + { + m_etType = etOleObject; + } + COleObjectElement::~COleObjectElement() + { + } + CElementPtr COleObjectElement::CreateDublicate() + { + COleObjectElement* pOleObjectElement = new COleObjectElement(); + CElementPtr pElement = CElementPtr(pOleObjectElement); + SetProperiesToDublicate(pElement); + + pOleObjectElement->m_strOleName = m_strOleName; + pOleObjectElement->m_strProgId = m_strProgId; + return pElement; + } CAudioElement::CAudioElement() : CImageElement() { m_etType = etAudio; diff --git a/MsBinaryFile/PptFile/Drawing/Elements.h b/MsBinaryFile/PptFile/Drawing/Elements.h index 3e813fd677..34e4bdd5cd 100644 --- a/MsBinaryFile/PptFile/Drawing/Elements.h +++ b/MsBinaryFile/PptFile/Drawing/Elements.h @@ -101,7 +101,19 @@ public: std::wstring ConvertPPTShapeToPPTX(bool bIsNamespace = false); std::wstring ConvertPPTtoPPTX(CPPTShape* pPPTShape, const NSGuidesVML::CFormParam& pCoef, bool bIsNamespace = false); }; +class COleObjectElement : public CImageElement +{ +public: + std::wstring m_strBinFileName; + std::wstring m_strOleName; + std::wstring m_strProgId; + + COleObjectElement(); + virtual ~COleObjectElement(); + + virtual CElementPtr CreateDublicate(); +}; class CAudioElement : public CImageElement { public: diff --git a/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp b/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp index a2b6a03c20..f68adec4da 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/Converter.cpp @@ -118,6 +118,8 @@ namespace PPT m_oManager.Clear(); m_oManager.SetDstMedia(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR); + m_oManager.SetDstEmbeddings(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"embeddings" + FILE_SEPARATOR_STR); + m_oManager.SetTempMedia(m_pUserInfo->m_pDocumentInfo->m_pCommonInfo->tempPath); m_pShapeWriter->InitNextId(); @@ -164,6 +166,7 @@ namespace PPT m_pDocument = pDocument; m_oManager.Clear(); m_oManager.SetDstMedia(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"media" + FILE_SEPARATOR_STR); + m_oManager.SetDstEmbeddings(m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR + L"embeddings" + FILE_SEPARATOR_STR); m_pShapeWriter->InitNextId(); @@ -589,7 +592,6 @@ namespace PPT { std::wstring strPptDirectory = m_strDestPath + FILE_SEPARATOR_STR + L"ppt" + FILE_SEPARATOR_STR; - NSDirectory::CreateDirectory(strPptDirectory + L"media"); NSDirectory::CreateDirectory(strPptDirectory + L"theme"); NSDirectory::CreateDirectory(strPptDirectory + L"slideMasters"); NSDirectory::CreateDirectory(strPptDirectory + L"slideMasters" + FILE_SEPARATOR_STR + L"_rels"); @@ -1544,7 +1546,14 @@ namespace PPT } oWriter.WriteString(std::wstring(L"")); - oWriter.WriteString(std::wstring(L"m_bShowMasterShapes) oWriter.WriteString(std::wstring(L" showMasterSp=\"0\"")); if (pSlide->m_bHidden) diff --git a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp index b8a2601462..6bee2915ff 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.cpp @@ -32,8 +32,9 @@ #include "ImageManager.h" #include #include "../../../OOXML/SystemUtility/SystemUtility.h" +#include "../../../DesktopEditor/common/Directory.h" -CMediaManager::CMediaManager() : m_lIndexNextImage(0), m_lIndexNextAudio(0), m_lIndexNextVideo(0) +CMediaManager::CMediaManager() : m_lIndexNextImage(0), m_lIndexNextAudio(0), m_lIndexNextVideo(0), m_lIndexNextOleObject(0) { } CMediaManager::~CMediaManager() @@ -46,6 +47,7 @@ void CMediaManager::Clear() m_lIndexNextImage = 0; m_lIndexNextAudio = 0; m_lIndexNextVideo = 0; + m_lIndexNextOleObject = 0; } std::wstring CMediaManager::FindMedia(const std::wstring &strInput) @@ -57,6 +59,10 @@ std::wstring CMediaManager::FindMedia(const std::wstring &strInput) } return L""; } +void CMediaManager::SetDstEmbeddings(const std::wstring& strDst) +{ + m_strDstEmbeddings = strDst; +} void CMediaManager::SetDstMedia(const std::wstring &strDst) { m_strDstMedia = strDst; @@ -80,13 +86,69 @@ std::wstring CMediaManager::GenerateImage(const std::wstring &strInput) { return GenerateMedia(strInput, L"image", m_lIndexNextImage, L".png"); } - +std::wstring CMediaManager::GenerateOleObject(const std::wstring& strInput) +{ + return GenerateEmbedding(strInput, L"oleObject", m_lIndexNextOleObject, L".bin"); +} std::wstring CMediaManager::GenerateImageJPEG(const std::wstring &strInput) { return GenerateMedia(strInput, L"image", m_lIndexNextImage, L".jpeg"); } -std::wstring CMediaManager::GenerateMedia(const std::wstring &strInput, const std::wstring &Template, long &Indexer, const std::wstring &strDefaultExt) +std::wstring CMediaManager::GenerateEmbedding(const std::wstring &strInput, const std::wstring &Template, long &Indexer, const std::wstring &strDefaultExt) +{ + std::map::iterator pPair = m_mapMedia.find(strInput); + if (m_mapMedia.end() != pPair) + { + return pPair->second; + } + +// if (IsNeedDownload(strInput)) +// { +//#ifndef DISABLE_FILE_DOWNLOADER +// NSNetwork::NSFileTransport::CFileDownloader oDownloader(strInput, TRUE); +// if ( oDownloader.DownloadSync() ) +// { +// std::wstring file_name = oDownloader.GetFilePath(); +// +// //todooo - check media file +// return GenerateEmbedding(file_name , Template, Indexer, strDefaultExt); +// } +//#endif +// } + + std::wstring strExts = strDefaultExt; + int nIndexExt = strInput.rfind(wchar_t('.')); + if (-1 != nIndexExt) + strExts = strInput.substr(nIndexExt); + + if (strExts == L".tmp" || strExts.empty()) strExts = strDefaultExt; + + std::wstring strMediaName = Template + std::to_wstring(++Indexer); + + std::wstring strOutput = m_strDstEmbeddings + strMediaName + strExts; + strMediaName = L"../embeddings/" + strMediaName + strExts; + + OOX::CPath pathInput(strInput); + std::wstring strPathInput = pathInput.GetPath(); + + if (std::wstring::npos == strPathInput.find(m_strTempMedia)) + { + return L""; + } + if (strOutput != strInput) + { + NSDirectory::CreateDirectory(m_strDstEmbeddings); + + if (NSFile::CFileBinary::Copy(strInput, strOutput) == false) + { + return L""; + } + } + m_mapMedia[strInput] = strMediaName; + return strMediaName; +} +std::wstring CMediaManager::GenerateMedia(const std::wstring& strInput, const std::wstring& Template, long& Indexer, const std::wstring& strDefaultExt) { std::map::iterator pPair = m_mapMedia.find(strInput); if (m_mapMedia.end() != pPair) @@ -98,12 +160,12 @@ std::wstring CMediaManager::GenerateMedia(const std::wstring &strInput, const st { #ifndef DISABLE_FILE_DOWNLOADER NSNetwork::NSFileTransport::CFileDownloader oDownloader(strInput, TRUE); - if ( oDownloader.DownloadSync() ) + if (oDownloader.DownloadSync()) { std::wstring file_name = oDownloader.GetFilePath(); //todooo - check media file - return GenerateMedia(file_name , Template, Indexer, strDefaultExt); + return GenerateMedia(file_name, Template, Indexer, strDefaultExt); } #endif } @@ -117,24 +179,26 @@ std::wstring CMediaManager::GenerateMedia(const std::wstring &strInput, const st { std::wstring strInput1 = strInput.substr(0, nIndexExt); nIndexExt = strInput1.rfind(wchar_t('.')); - strExts = nIndexExt < 0 ? L"" : strInput1.substr(nIndexExt); + strExts = nIndexExt < 0 ? L"" : strInput1.substr(nIndexExt); } if (strExts == L".tmp" || strExts.empty()) strExts = strDefaultExt; std::wstring strMediaName = Template + std::to_wstring(++Indexer); std::wstring strOutput = m_strDstMedia + strMediaName + strExts; - strMediaName = L"../media/" + strMediaName + strExts; + strMediaName = L"../media/" + strMediaName + strExts; - OOX::CPath pathInput(strInput); + OOX::CPath pathInput(strInput); std::wstring strPathInput = pathInput.GetPath(); - + if (std::wstring::npos == strPathInput.find(m_strTempMedia)) { return L""; } if (strOutput != strInput) { + NSDirectory::CreateDirectory(m_strDstMedia); + if (NSFile::CFileBinary::Copy(strInput, strOutput) == false) { return L""; @@ -359,19 +423,24 @@ std::wstring CRelsGenerator::WriteHyperlinkMedia(const std::wstring &strMedia, b return strRid; } -std::wstring CRelsGenerator::WriteHyperlinkImage(const std::wstring &strImage, bool bExternal) +std::wstring CRelsGenerator::WriteHyperlinkImage(const std::wstring & strFileName, bool bExternal) { - return WriteHyperlinkMedia(strImage, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"); } -std::wstring CRelsGenerator::WriteHyperlinkAudio(const std::wstring &strImage, bool bExternal) +std::wstring CRelsGenerator::WriteHyperlinkAudio(const std::wstring & strFileName, bool bExternal) { - return WriteHyperlinkMedia(strImage, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio"); + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio"); } -std::wstring CRelsGenerator::WriteHyperlinkVideo(const std::wstring &strImage, bool bExternal) +std::wstring CRelsGenerator::WriteHyperlinkVideo(const std::wstring & strFileName, bool bExternal) { - return WriteHyperlinkMedia(strImage, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video"); +} + +std::wstring CRelsGenerator::WriteHyperlinkOleObject(const std::wstring &strFileName, bool bExternal) +{ + return WriteHyperlinkMedia(strFileName, bExternal, false, L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); } std::wstring CRelsGenerator::WriteMedia(const std::wstring &strMediaPath) @@ -389,7 +458,14 @@ std::wstring CRelsGenerator::WriteImage(const std::wstring &strImagePath) if (strImage.empty()) return WriteHyperlinkImage(CorrectXmlString3(strImagePath), true); return WriteHyperlinkImage(strImage, false); } +std::wstring CRelsGenerator::WriteOleObject(const std::wstring& strOleObjectPath) +{ + std::wstring strOleObject = m_pManager->GenerateOleObject(strOleObjectPath); + if (strOleObject.empty()) + return WriteHyperlinkOleObject(CorrectXmlString3(strOleObjectPath), true); + return WriteHyperlinkOleObject(strOleObject, false); +} std::wstring CRelsGenerator::WriteSlideRef(const std::wstring &strLocation) { int sldNum = PPT::CExFilesInfo::GetSlideNumber(strLocation); diff --git a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h index bcb71b8a8d..bf0bcae024 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h +++ b/MsBinaryFile/PptFile/PPTXWriter/ImageManager.h @@ -43,27 +43,36 @@ class CMediaManager { private: - std::map m_mapMedia; + std::map m_mapMedia; - long m_lIndexNextAudio; - long m_lIndexNextVideo; - long m_lIndexNextImage; + long m_lIndexNextAudio; + long m_lIndexNextVideo; + long m_lIndexNextImage; + long m_lIndexNextOleObject; - std::wstring m_strDstMedia; + std::wstring m_strDstMedia; std::wstring m_strTempMedia; + std::wstring m_strDstEmbeddings; public: CMediaManager(); ~CMediaManager(); void Clear(); std::wstring FindMedia(const std::wstring& strInput); + + void SetDstEmbeddings(const std::wstring& strDst); void SetDstMedia(const std::wstring& strDst); void SetTempMedia(const std::wstring& strSrc); + std::wstring GenerateVideo(const std::wstring& strInput); std::wstring GenerateAudio(const std::wstring& strInput); + std::wstring GenerateOleObject(const std::wstring& strInput); std::wstring GenerateImage(const std::wstring& strInput); std::wstring GenerateImageJPEG(const std::wstring& strInput); - std::wstring GenerateMedia(const std::wstring& strInput, const std::wstring& Template, long & Indexer, const std::wstring& strDefaultExt); + + std::wstring GenerateMedia(const std::wstring& strInput, const std::wstring& Template, long& Indexer, const std::wstring& strDefaultExt); + std::wstring GenerateEmbedding(const std::wstring& strInput, const std::wstring& Template, long& Indexer, const std::wstring& strDefaultExt); + void WriteAudioCollection(const std::vector& audioCont); bool IsNeedDownload(const std::wstring& strFile); }; @@ -72,11 +81,11 @@ std::wstring CorrectXmlString3(const std::wstring & str); class CRelsGenerator { private: - PPT::CStringWriter m_oWriter; - int m_lNextRelsID; - std::map m_mapMediaRelsID; - CMediaManager* m_pManager; - std::map m_mapHyperlinks; + PPT::CStringWriter m_oWriter; + int m_lNextRelsID; + std::map m_mapMediaRelsID; + CMediaManager* m_pManager; + std::map m_mapHyperlinks; public: CRelsGenerator(CMediaManager* pManager); @@ -90,20 +99,21 @@ public: void StartNotes(int nIndexSlide, bool bMaster); void StartSlide(int nIndexLayout, int nIndexNotes); void CloseRels(); - void SaveRels(const std::wstring &strFile); - std::wstring WriteHyperlink(const std::wstring &strHyperlink, bool isExternal = false); + void SaveRels(const std::wstring& strFile); + std::wstring WriteHyperlink(const std::wstring& strHyperlink, bool isExternal = false); void StartLayout(int nIndexTheme); - std::wstring WriteHyperlinkMedia(const std::wstring& strMedia, bool bExternal = true, bool newRIdAlways = false, std::wstring strRelsType = L"http://schemas.microsoft.com/office/2007/relationships/media"); std::wstring WriteHyperlinkImage(const std::wstring& strImage, bool bExternal = true); std::wstring WriteHyperlinkAudio(const std::wstring& strImage, bool bExternal = true); std::wstring WriteHyperlinkVideo(const std::wstring& strImage, bool bExternal = true); + std::wstring WriteHyperlinkOleObject(const std::wstring& strImage, bool bExternal = true); std::wstring WriteMedia(const std::wstring& strMediaPath); std::wstring WriteImage(const std::wstring& strImagePath); std::wstring WriteSlideRef(const std::wstring& strLocation); - std::wstring WriteAudio(const std::wstring& strAudioPath, bool & bExternal); - std::wstring WriteVideo(const std::wstring& strVideoPath, bool & bExternal); + std::wstring WriteAudio(const std::wstring& strAudioPath, bool& bExternal); + std::wstring WriteVideo(const std::wstring& strVideoPath, bool& bExternal); + std::wstring WriteOleObject(const std::wstring& strOleObjectPath); int getRId()const { return m_lNextRelsID; } }; diff --git a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp index f9b19860a2..c22e19b8f0 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp +++ b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.cpp @@ -552,7 +552,8 @@ void PPT::CShapeWriter::WriteImageInfo() if (pImageElement->m_lID < 0) pImageElement->m_lID = m_lNextShapeID; - std::wstring strShapeID = std::to_wstring(pImageElement->m_lID); + COleObjectElement* pOleObjectElement = dynamic_cast(m_pElement.get()); + std::wstring strShapeID = std::to_wstring(pOleObjectElement ? 0 : pImageElement->m_lID); m_oWriter.WriteString(std::wstring(L"")); - WriteHyperlink(m_pElement->m_arrActions); m_oWriter.WriteString(std::wstring(L""; m_oWriter.WriteString(str2); } +void PPT::CShapeWriter::WriteOleObjectInfo(const std::wstring& strRid, const std::wstring& xfrm) +{ + COleObjectElement* pOleObjectElement = dynamic_cast(m_pElement.get()); + if (!pOleObjectElement) return; + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + if (pOleObjectElement->m_lID < 0) + pOleObjectElement->m_lID = m_lNextShapeID; + + std::wstring strTableID = std::to_wstring(pOleObjectElement->m_lID); + + m_oWriter.WriteString(std::wstring(L"m_sName.empty()) pOleObjectElement->m_sName = std::wstring(L"Group ") + strTableID; + + if (pOleObjectElement->m_bHidden) m_oWriter.WriteString(std::wstring(L" hidden=\"1\"")); + + m_oWriter.WriteString(std::wstring(L" name=\"")); + m_oWriter.WriteStringXML(pOleObjectElement->m_sName); + m_oWriter.WriteString(std::wstring(L"\"")); + + if (!pOleObjectElement->m_sDescription.empty()) + { + m_oWriter.WriteString(std::wstring(L" descr=\"")); + m_oWriter.WriteStringXML(XmlUtils::EncodeXmlStringExtend(pOleObjectElement->m_sDescription)); + m_oWriter.WriteString(std::wstring(L"\"")); + } + m_oWriter.WriteString(std::wstring(L">")); + if (!pOleObjectElement->m_sHyperlink.empty()) + { + std::wstring rId = m_pRels->WriteHyperlink(pOleObjectElement->m_sHyperlink); + + if (false == rId.empty()) + { + m_oWriter.WriteString(std::wstring(L"")); + } + } + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + ++m_lNextShapeID; + + m_oWriter.WriteString(std::wstring(L"")); + + m_oWriter.WriteString(std::wstring(L"")); + + if (pOleObjectElement->m_bChildAnchorEnabled || pOleObjectElement->m_bAnchorEnabled) + { + m_oWriter.WriteString(std::wstring(L"")); + } + + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"m_strOleName.empty()) + { + m_oWriter.WriteString(std::wstring(L" name=\"") + pOleObjectElement->m_strOleName + L"\""); + } + m_oWriter.WriteString(std::wstring(L" r:id=\"") + strRid + L"\""); + + _INT64 width = (_INT64)(pOleObjectElement->m_bChildAnchorEnabled ? pOleObjectElement->m_rcChildAnchor.GetWidth() : pOleObjectElement->m_rcAnchor.GetWidth()) / 1.78; + _INT64 height = (_INT64)(pOleObjectElement->m_bChildAnchorEnabled ? pOleObjectElement->m_rcChildAnchor.GetHeight() : pOleObjectElement->m_rcAnchor.GetHeight()) / 1.78; + + m_oWriter.WriteString(std::wstring(L" imgW=\"") + std::to_wstring(width) + L"\""); + m_oWriter.WriteString(std::wstring(L" imgH=\"") + std::to_wstring(height) + L"\""); + + if (false == pOleObjectElement->m_strProgId.empty()) + { + m_oWriter.WriteString(std::wstring(L" progId=\"") + pOleObjectElement->m_strProgId + L"\""); + } + m_oWriter.WriteString(std::wstring(L">")); +} void PPT::CShapeWriter::WriteTableInfo() { CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); @@ -1725,7 +1804,7 @@ std::vector CShapeWriter::getActionsByNum(const int num) } // TODO! Not work correct -std::wstring PPT::CShapeWriter::ConvertTable () +std::wstring PPT::CShapeWriter::ConvertTable() { CGroupElement* pGroupElement = dynamic_cast(m_pElement.get()); if (!pGroupElement) return L""; @@ -2001,12 +2080,11 @@ void PPT::CShapeWriter::ParseXmlAlternative(const std::wstring & xml) } } - std::wstring PPT::CShapeWriter::ConvertImage() -{ +{ CImageElement* pImageElement = dynamic_cast(m_pElement.get()); if (!pImageElement) return L""; - + if (pImageElement->m_bImagePresent == false) { if (pImageElement->m_sName.empty()) return L""; @@ -2027,21 +2105,69 @@ std::wstring PPT::CShapeWriter::ConvertImage() if (strRid.empty()) return L""; - m_oWriter.WriteString(std::wstring(L"")); - - WriteImageInfo(); + std::wstring strAnchor; CGeomShapeInfo oInfo; - oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); - oInfo.m_lOriginalHeight = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetHeight() : (LONG)m_pElement->m_rcAnchor.GetHeight(); + oInfo.m_lOriginalWidth = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetWidth() : (LONG)m_pElement->m_rcAnchor.GetWidth(); + oInfo.m_lOriginalHeight = m_pElement->m_bChildAnchorEnabled ? (LONG)m_pElement->m_rcChildAnchor.GetHeight() : (LONG)m_pElement->m_rcAnchor.GetHeight(); m_pElement->NormalizeCoordsByMetric(); oInfo.SetBounds(m_pElement->m_bChildAnchorEnabled ? m_pElement->m_rcChildAnchor : m_pElement->m_rcAnchor); oInfo.m_dRotate = pImageElement->m_dRotate; - oInfo.m_bFlipH = pImageElement->m_bFlipH; - oInfo.m_bFlipV = pImageElement->m_bFlipV; + oInfo.m_bFlipH = pImageElement->m_bFlipH; + oInfo.m_bFlipV = pImageElement->m_bFlipV; + + if (pImageElement->m_bChildAnchorEnabled || pImageElement->m_bAnchorEnabled) + { + if (0 != pImageElement->m_dRotate) + { + strAnchor += L" rot=\"" + std::to_wstring((int)(pImageElement->m_dRotate * 60000)) + L"\""; + } + if (pImageElement->m_bFlipH) + { + strAnchor += L" flipH=\"1\""; + } + if (pImageElement->m_bFlipV) + { + strAnchor += L" flipV=\"1\""; + } + strAnchor += L">"; + + strAnchor += L"m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.left : (int)pImageElement->m_rcAnchor.left) + + L"\" y=\"" + + std::to_wstring(pImageElement->m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.top : (int)pImageElement->m_rcAnchor.top) + + L"\"/>"; + + _INT64 width = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth()); + _INT64 height = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight()); + + if ((width > 0 && height > 0) && ((_UINT64)width) < 0xffffffffffff && ((_UINT64)height) < 0xffffffffffff) + { + strAnchor += L""; + } + else + { + strAnchor += L""; + } + } + + COleObjectElement* pOleObjectElement = dynamic_cast(m_pElement.get()); + if (pOleObjectElement) + { + std::wstring strRidOleObject = m_pRels->WriteOleObject(pOleObjectElement->m_strBinFileName); + if (false == strRidOleObject.empty()) + { + WriteOleObjectInfo(strRidOleObject, strAnchor); + } + else pOleObjectElement = NULL; + } + + m_oWriter.WriteString(std::wstring(L"")); + + WriteImageInfo(); m_oWriter.WriteString(std::wstring(L"")); @@ -2107,41 +2233,7 @@ std::wstring PPT::CShapeWriter::ConvertImage() if (pImageElement->m_bChildAnchorEnabled || pImageElement->m_bAnchorEnabled) { - std::wstring str; - - m_oWriter.WriteString(std::wstring(L"m_dRotate) - { - m_oWriter.WriteString(L" rot=\"" + std::to_wstring((int)(pImageElement->m_dRotate * 60000)) + L"\""); - } - if (pImageElement->m_bFlipH) - { - m_oWriter.WriteString(std::wstring(L" flipH=\"1\"")); - } - if (pImageElement->m_bFlipV) - { - m_oWriter.WriteString(std::wstring(L" flipV=\"1\"")); - } - m_oWriter.WriteString(std::wstring(L">")); - - m_oWriter.WriteString(L"m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.left : (int)pImageElement->m_rcAnchor.left) - + L"\" y=\"" + - std::to_wstring(pImageElement->m_bChildAnchorEnabled ? (int)pImageElement->m_rcChildAnchor.top : (int)pImageElement->m_rcAnchor.top) + - L"\"/>"); - - _INT64 width = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetWidth() : pImageElement->m_rcAnchor.GetWidth()); - _INT64 height = (_INT64)(pImageElement->m_bChildAnchorEnabled ? pImageElement->m_rcChildAnchor.GetHeight() : pImageElement->m_rcAnchor.GetHeight()); - - if (( width > 0 && height > 0 ) && ((_UINT64)width) < 0xffffffffffff && ((_UINT64)height) < 0xffffffffffff) - { - m_oWriter.WriteString(L""); - } - else - { - m_oWriter.WriteString(L""); - } - m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); } m_oWriter.WriteString(std::wstring(L"")); @@ -2155,6 +2247,14 @@ std::wstring PPT::CShapeWriter::ConvertImage() m_oWriter.WriteString(std::wstring(L"")); m_oWriter.WriteString(std::wstring(L"")); + + if (pOleObjectElement) + { + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + m_oWriter.WriteString(std::wstring(L"")); + } pImageElement = NULL; return m_oWriter.GetData(); diff --git a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h index f97df3fe0e..76cebf1e0f 100644 --- a/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h +++ b/MsBinaryFile/PptFile/PPTXWriter/ShapeWriter.h @@ -457,7 +457,8 @@ namespace PPT std::wstring ConvertTableCell(); void WriteShapeInfo(); void WriteImageInfo(); - void WriteTextInfo(CTextCFRun *pLastCF = nullptr); + void WriteOleObjectInfo(const std::wstring& strRid, const std::wstring& xfrm); + void WriteTextInfo(CTextCFRun *pLastCF = nullptr); static std::wstring WriteBullets(CTextPFRun* pPF, CRelsGenerator *pRels); void Write3dShape(); std::wstring getOWriterStr() const; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp index 408ff9eb5e..54e0eb5f52 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.cpp @@ -33,7 +33,7 @@ using namespace PPT; -CPPTDocumentInfo::CPPTDocumentInfo() : m_oCurrentUser(), m_bMacros(true) +CPPTDocumentInfo::CPPTDocumentInfo() : m_oCurrentUser(), m_bMacros(true), m_pStream(NULL) { } @@ -57,6 +57,7 @@ void CPPTDocumentInfo::Clear() bool CPPTDocumentInfo::ReadFromStream(CRecordCurrentUserAtom *pCurrentUser, POLE::Stream *pStream) { + m_pStream = pStream; m_oCurrentUser.FromAtom(pCurrentUser); _UINT32 offsetToEdit = m_oCurrentUser.m_nOffsetToCurrentEdit; diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h index bc29978a11..880447f4ee 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfo.h @@ -39,6 +39,8 @@ namespace PPT class CPPTDocumentInfo { public: + friend class CPPTUserInfo; + _commonInfo* m_pCommonInfo = NULL; CCurrentUser m_oCurrentUser; @@ -57,5 +59,8 @@ public: bool ReadFromStream(CRecordCurrentUserAtom* pCurrentUser, POLE::Stream* pStream); bool LoadDocument(); + +private: + POLE::Stream* m_pStream; }; } diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp index 7efa111bd3..39c18081a2 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.cpp @@ -55,7 +55,6 @@ m_pStorageDecrypt(NULL), m_pDecryptor(NULL), m_arOffsetPictures() { - m_VbaProjectStg = NULL; m_pDocumentInfo = NULL; m_lIndexThisUser = -1; @@ -90,7 +89,6 @@ void CPPTUserInfo::Clear() RELEASEOBJECT(m_pDecryptor); RELEASEOBJECT(m_pStorageDecrypt); - RELEASEOBJECT(m_VbaProjectStg); for (std::map<_UINT32, CRecordSlide*>::iterator pPair = m_mapSlides.begin(); pPair != m_mapSlides.end(); ++pPair) { @@ -425,39 +423,47 @@ bool CPPTUserInfo::ReadDocumentPersists(POLE::Stream* pStream) { if (pVbaAtom->m_nHasMacros) { - nIndexPsrRef = m_mapOffsetInPIDs.find(pVbaAtom->m_nObjStgDataRef); - - if (m_mapOffsetInPIDs.end() != nIndexPsrRef) - { - offset_stream = nIndexPsrRef->second; - StreamUtils::StreamSeek(offset_stream, pStream); - - POLE::Stream* pStreamTmp = pStream; - if (m_pDecryptor) - { - DecryptStream(pStream, pVbaAtom->m_nObjStgDataRef); - pStreamTmp = m_arStreamDecrypt.back()->stream_; - } - oHeader.ReadFromStream(pStreamTmp); - - m_VbaProjectStg = new CRecordVbaProjectStg(m_pDocumentInfo->m_pCommonInfo->tempPath); - m_VbaProjectStg->ReadFromStream(oHeader, pStreamTmp); - - if (m_VbaProjectStg->m_sFileName.empty()) - { - RELEASEOBJECT(m_VbaProjectStg); - } - else - { - m_sVbaProjectFile = m_VbaProjectStg->m_sFileName; - m_bMacros = true; - } - } + m_sVbaProjectFile = GetBinFromStg(L"vbaProject.bin", pVbaAtom->m_nObjStgDataRef); + + m_bMacros = (false == m_sVbaProjectFile.empty()); } } } return true; } +std::wstring CPPTUserInfo::GetBinFromStg(const std::wstring& name, _UINT32 nRef) +{ + POLE::Stream* pStream = m_pDocumentInfo->m_pStream; + + std::map<_UINT32, _UINT32>::iterator nIndexPsrRef = m_mapOffsetInPIDs.find(nRef); + + std::wstring result; + if (m_mapOffsetInPIDs.end() != nIndexPsrRef) + { + _UINT32 offset_stream = nIndexPsrRef->second; + StreamUtils::StreamSeek(offset_stream, pStream); + + POLE::Stream* pStreamTmp = pStream; + if (m_pDecryptor) + { + DecryptStream(pStream, nRef); + pStreamTmp = m_arStreamDecrypt.back()->stream_; + } + SRecordHeader oHeader; + oHeader.ReadFromStream(pStreamTmp); + + CRecordExObjStg *pExObjStg = new CRecordExObjStg(name, m_pDocumentInfo->m_pCommonInfo->tempPath); + + if (pExObjStg) + { + pExObjStg->ReadFromStream(oHeader, pStreamTmp); + result = pExObjStg->m_sFileName; + + RELEASEOBJECT(pExObjStg); + } + } + return result; +} //-------------------------------------------------------------------------------------------- void CPPTUserInfo::ReadExtenalObjects() { @@ -2394,15 +2400,22 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects) return; // читаем видео ---------------------------------------------- - std::vector oArray; - pExObjects->GetRecordsByType(&oArray, true); + std::vector oArrayVideo; + pExObjects->GetRecordsByType(&oArrayVideo, true); - for (size_t nIndex = 0; nIndex < oArray.size(); ++nIndex) + for (size_t nIndex = 0; nIndex < oArrayVideo.size(); ++nIndex) { - LoadExVideo(oArray[nIndex]); + LoadExVideo(oArrayVideo[nIndex]); } + // читаем ole ---------------------------------------------- + std::vector oArrayObj; + pExObjects->GetRecordsByType(&oArrayObj, true); - oArray.clear(); + for (size_t nIndex = 0; nIndex < oArrayObj.size(); ++nIndex) + { + LoadExOleObject(oArrayObj[nIndex]); + } + oArrayObj.clear(); // ----------------------------------------------------------- // читаем аудио ---------------------------------------------- @@ -2528,8 +2541,44 @@ void CPPTUserInfo::LoadExternal(CRecordExObjListContainer* pExObjects) } } +void CPPTUserInfo::LoadExOleObject(CRecordsContainer* pExObject) +{ + //exOleEmbedAtom + //exOleObjAtom + //menuNameAtom + //progIdAtom + //clipboardNameAtom + //metafile(variable) + std::vector oArrayExOleEmbed; + std::vector oArrayExOleObj; + std::vector oArrayCString; + pExObject->GetRecordsByType(&oArrayExOleEmbed, false); + pExObject->GetRecordsByType(&oArrayExOleObj, false); + pExObject->GetRecordsByType(&oArrayCString, false); + + if (1 == oArrayExOleObj.size()) + { + PPT::CExFilesInfo oInfo; + + oInfo.m_dwID = oArrayExOleObj[0]->m_nExObjID; + + if (oArrayCString.size() > 0) + oInfo.m_name = oArrayCString[0]->m_strText; + + if (oArrayCString.size() > 1) + oInfo.m_progName = oArrayCString[1]->m_strText; + + oInfo.m_strFilePath = GetBinFromStg(L"", oArrayExOleObj[0]->m_nPersistID); // ExOleObjStg || ExControlStg + + m_oExMedia.m_arOleObjects.push_back(oInfo); + } + + oArrayExOleEmbed.clear(); + oArrayExOleObj.clear(); + oArrayCString.clear(); +} void CPPTUserInfo::LoadExVideo(CRecordsContainer* pExObject) { diff --git a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h index 18221edeef..d8c584403a 100644 --- a/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h +++ b/MsBinaryFile/PptFile/Reader/PPTDocumentInfoOneUser.h @@ -100,8 +100,7 @@ public: bool m_bHasFooter; int m_nFormatDate; - CRecordVbaProjectStg* m_VbaProjectStg; - int m_lIndexThisUser; + int m_lIndexThisUser; double m_nWriteSlideTimeOffset; double m_nWriteSlideTime; @@ -133,6 +132,8 @@ public: bool ReadDocumentPersists(POLE::Stream* pStream); void ReadExtenalObjects(); + std::wstring GetBinFromStg(const std::wstring& name, _UINT32 nRef); + void DecryptStream(POLE::Stream *pStream, int block); void FromDocument(); @@ -161,6 +162,7 @@ public: void LoadExVideo(CRecordsContainer* pExObject); void LoadExAudio(CRecordsContainer* pExObject); + void LoadExOleObject(CRecordsContainer* pExObject); void LoadAutoNumbering(CRecordGroupShapeContainer* pGroupContainer, CTheme* pTheme); void LoadBulletBlip(CShapeElement* pShape); diff --git a/MsBinaryFile/PptFile/Reader/Records.cpp b/MsBinaryFile/PptFile/Reader/Records.cpp index b8769b8018..c8cf143fa5 100644 --- a/MsBinaryFile/PptFile/Reader/Records.cpp +++ b/MsBinaryFile/PptFile/Reader/Records.cpp @@ -624,8 +624,10 @@ IRecord* CreateByType(SRecordHeader oHeader, _commonInfo* commonInfo) //CREATE_BY_TYPE(RECORD_TYPE_METAFILE , CRecordMetafileBlob) CREATE_BY_TYPE(RT_CString, CRecordCString) CREATE_BY_TYPE(RT_SoundCollectionAtom, CRecordSoundCollAtom) + CREATE_BY_TYPE(RT_ExternalOleObjectAtom, CRecordExOleObjAtom) CREATE_BY_TYPE(RT_ExternalOleEmbedAtom, CRecordExOleEmbedAtom) + CREATE_BY_TYPE(RT_ExternalOleEmbed, CRecordExOleEmbedContainer) //CREATE_BY_TYPE(RECORD_TYPE_BOOKMARK_ENTITY_ATOM , CRecordBookmarkEntityAtom) //CREATE_BY_TYPE(RECORD_TYPE_EXLINK_ATOM , CRecordExOleLinkAtom) @@ -672,7 +674,6 @@ IRecord* CreateByType(SRecordHeader oHeader, _commonInfo* commonInfo) CREATE_BY_TYPE(RTE_CLIENTDATA, CRecordOfficeArtClientData) CREATE_BY_TYPE(RTE_CLIENTTEXTBOX, CRecordOfficeArtClientTextbox) - CREATE_BY_TYPE(RT_ExternalCdAudio, CRecordExCDAudioContainer) CREATE_BY_TYPE(RT_ExternalWavAudioLink, CRecordWAVAudioLinkContainer) CREATE_BY_TYPE(RT_ExternalWavAudioEmbedded, CRecordWAVAudioEmbeddedContainer) diff --git a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp index 49caf34ca4..ba8932f0f3 100644 --- a/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp +++ b/MsBinaryFile/PptFile/Records/Drawing/ShapeContainer.cpp @@ -225,6 +225,7 @@ void CPPTElement::SetUpProperties(CElementPtr pElement, CTheme* pTheme, CSlideIn } }break; case PPT::etPicture: + case PPT::etOleObject: { if (reset_default) { @@ -1645,10 +1646,10 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, if (CExFilesInfo::eftVideo == exType) { - CVideoElement* pVideoElem = new CVideoElement(); + CVideoElement* pVideoElem = new CVideoElement(); - pVideoElem->m_strVideoFileName = oInfo.m_strFilePath ; - pVideoElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; + pVideoElem->m_strVideoFileName = oInfo.m_strFilePath ; + pVideoElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; pElement = CElementPtr(pVideoElem); } @@ -1678,9 +1679,20 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, } } + else if (CExFilesInfo::eftOleObject == exType) + { + COleObjectElement* pOleObjectElem = new COleObjectElement(); + pOleObjectElem->m_strBinFileName = oInfo.m_strFilePath; + pOleObjectElem->m_strImageFileName = oInfoDefault.m_strFilePath + FILE_SEPARATOR_STR; + + pOleObjectElem->m_strProgId = oInfo.m_progName; + pOleObjectElem->m_strOleName = oInfo.m_name; + + pElement = CElementPtr(pOleObjectElem); + } else { - CImageElement* pImageElem = new CImageElement(); + CImageElement* pImageElem = new CImageElement(); pImageElem->m_strImageFileName = oInfo.m_strFilePath + FILE_SEPARATOR_STR; pElement = CElementPtr(pImageElem); @@ -1782,7 +1794,7 @@ CElementPtr CRecordShapeContainer::GetElement (bool inGroup, CExMedia* pMapIDs, GetRecordsByType(&oArrayFooterMeta, true, true); if (0 < oArrayFooterMeta.size()) { - pElement->m_lPlaceholderType = PT_MasterFooter; + pElement->m_lPlaceholderType = PT_MasterFooter; pElement->m_lPlaceholderUserStr = oArrayFooterMeta[0]->m_nPosition; } std::vector oArraySlideNumberMeta; diff --git a/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp b/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp index a104ea3a11..cb00e75544 100644 --- a/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp +++ b/MsBinaryFile/PptFile/Records/ExObjListContainer.cpp @@ -37,3 +37,63 @@ void CRecordExObjListContainer::ReadFromStream(SRecordHeader &oHeader, POLE::Str { CRecordsContainer::ReadFromStream(oHeader, pStream); } + +CRecordExObjStg::CRecordExObjStg(const std::wstring& name, const std::wstring& tempPath) +{ + if (name.empty()) + { + m_sFileName = NSFile::CFileBinary::CreateTempFileWithUniqueName(tempPath, L"bin"); + } + else + { + m_sFileName = tempPath + FILE_SEPARATOR_STR + name; + } +} + +CRecordExObjStg::~CRecordExObjStg() +{ +} + +void CRecordExObjStg::ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) +{ + m_oHeader = oHeader; + + ULONG decompressedSize = m_oHeader.RecLen, compressedSize = m_oHeader.RecLen; + + BYTE* pData = new BYTE[compressedSize]; + if (!pData) return; + + if (m_oHeader.RecInstance == 0x01) + { + decompressedSize = StreamUtils::ReadDWORD(pStream) + 64; + compressedSize -= 4; + } + pStream->read(pData, compressedSize); + + //if (pDecryptor) + //{ + // pDecryptor->Decrypt((char*)pData, compressedSize, 0); + //} + + if (m_oHeader.RecInstance == 0x01) + { + BYTE* pDataUncompress = new BYTE[decompressedSize]; + NSZip::Decompress(pData, compressedSize, pDataUncompress, decompressedSize); + + delete[]pData; + pData = pDataUncompress; + } + + NSFile::CFileBinary file; + if (file.CreateFileW(m_sFileName)) + { + file.WriteFile(pData, decompressedSize); + file.CloseFile(); + } + else + { + m_sFileName.clear(); + } + delete[] pData; + pData = NULL; +} diff --git a/MsBinaryFile/PptFile/Records/ExObjListContainer.h b/MsBinaryFile/PptFile/Records/ExObjListContainer.h index c7194504d5..03ebd9bd36 100644 --- a/MsBinaryFile/PptFile/Records/ExObjListContainer.h +++ b/MsBinaryFile/PptFile/Records/ExObjListContainer.h @@ -39,4 +39,16 @@ class CRecordExObjListContainer : public CRecordsContainer public: virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) override; }; + + +class CRecordExObjStg : public CUnknownRecord +{ +public: + std::wstring m_sFileName; + + CRecordExObjStg(const std::wstring& name, const std::wstring& tempPath); + ~CRecordExObjStg(); + + virtual void ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) override; +}; } diff --git a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp index 5f84e0ab3a..db9d45029c 100644 --- a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp +++ b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.cpp @@ -43,3 +43,8 @@ void CRecordExOleEmbedAtom::ReadFromStream(SRecordHeader &oHeader, POLE::Stream m_nIsTable = StreamUtils::ReadBYTE(pStream); StreamUtils::StreamSkip(1, pStream); } + +void CRecordExOleEmbedContainer::ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) +{ + CRecordsContainer::ReadFromStream(oHeader, pStream); +} \ No newline at end of file diff --git a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h index 683e56c590..ec5d5bcea8 100644 --- a/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h +++ b/MsBinaryFile/PptFile/Records/ExOleEmbedAtom.h @@ -41,8 +41,12 @@ public: BOOL1 m_nCantLockServer; BOOL1 m_nNoSizeToServer; BOOL1 m_nIsTable; - - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) override; }; + +class CRecordExOleEmbedContainer : public CRecordsContainer +{ +public: + virtual void ReadFromStream(SRecordHeader& oHeader, POLE::Stream* pStream) override; +}; } diff --git a/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp b/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp index 28139b6b77..31f73d3b40 100644 --- a/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp +++ b/MsBinaryFile/PptFile/Records/VBAInfoAtom.cpp @@ -61,53 +61,3 @@ void CRecordVBAInfoContainer::ReadFromStream(SRecordHeader &oHeader, POLE::Strea m_oHeader = oHeader; CRecordsContainer::ReadFromStream(oHeader, pStream); } - -CRecordVbaProjectStg::CRecordVbaProjectStg(std::wstring strTemp) : m_strTmpDirectory(strTemp) -{ -} - -CRecordVbaProjectStg::~CRecordVbaProjectStg() -{ -} - -void CRecordVbaProjectStg::ReadFromStream(SRecordHeader &oHeader, POLE::Stream *pStream) -{ - m_oHeader = oHeader; - - ULONG decompressedSize = m_oHeader.RecLen, compressedSize = m_oHeader.RecLen; - - BYTE* pData = new BYTE[compressedSize]; - if (!pData) return; - - if (m_oHeader.RecInstance == 0x01) - { - decompressedSize = StreamUtils::ReadDWORD(pStream) + 64; - compressedSize -= 4; - } - pStream->read(pData, compressedSize); - - //if (pDecryptor) - //{ - // pDecryptor->Decrypt((char*)pData, compressedSize, 0); - //} - - if (m_oHeader.RecInstance == 0x01) - { - BYTE* pDataUncompress = new BYTE[decompressedSize]; - NSZip::Decompress(pData, compressedSize, pDataUncompress, decompressedSize); - - delete []pData; - pData = pDataUncompress; - } - - m_sFileName = m_strTmpDirectory + FILE_SEPARATOR_STR + L"vbaProject.bin"; - - NSFile::CFileBinary file; - if (file.CreateFileW(m_sFileName)) - { - file.WriteFile(pData, decompressedSize); - file.CloseFile(); - } - delete[] pData; - pData = NULL; -} diff --git a/MsBinaryFile/PptFile/Records/VBAInfoAtom.h b/MsBinaryFile/PptFile/Records/VBAInfoAtom.h index 68c477b2d8..b71d2dea60 100644 --- a/MsBinaryFile/PptFile/Records/VBAInfoAtom.h +++ b/MsBinaryFile/PptFile/Records/VBAInfoAtom.h @@ -57,16 +57,4 @@ public: virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream); }; -class CRecordVbaProjectStg : public CUnknownRecord -{ -public: - std::wstring m_sFileName; - std::wstring m_strTmpDirectory; - - - CRecordVbaProjectStg(std::wstring strTemp); - ~CRecordVbaProjectStg(); - - virtual void ReadFromStream(SRecordHeader & oHeader, POLE::Stream* pStream) override; -}; } From ef0e18e1c9f3920bea03efba0f5f12a52b62f3a3 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Tue, 20 Feb 2024 23:24:20 +0600 Subject: [PATCH 207/221] Fix conditional formating refs conversion --- .../Logic/Biff_structures/CFParsedFormula.cpp | 2 +- .../Format/Logic/Biff_structures/PtgRefN.cpp | 1 + .../Worksheets/ConditionalFormatting.cpp | 15 ++++++++------- .../XlsxFormat/Worksheets/ConditionalFormatting.h | 5 +++-- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp index ec714649e1..c64c045e87 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CFParsedFormula.cpp @@ -42,7 +42,7 @@ CFParsedFormula::CFParsedFormula(const CellRef& cell_base_ref) : ParsedFormula(c CFParsedFormula& CFParsedFormula::operator=(const std::wstring& value) { - ParsedFormula::operator = (value); + parseStringFormula(value, L"CFParsedFormulaNoCCE"); return *this; } diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp index 1bf92087bd..c673267f0e 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgRefN.cpp @@ -48,6 +48,7 @@ PtgRefN::PtgRefN(const std::wstring& word, const PtgDataType data_type, const Ce cell_base_ref(cell_base_ref_init) { loc -= cell_base_ref; + loc_xlsb -= cell_base_ref; bUseLocInit = true; } diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp index f8ea392135..954ac25be5 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.cpp @@ -1718,13 +1718,12 @@ void CConditionalFormattingRule::fromBin(XLS::BaseObjectPtr& obj) } } -XLS::BaseObjectPtr CConditionalFormattingRule::toBin() +XLS::BaseObjectPtr CConditionalFormattingRule::toBin(const XLS::CellRef &cellRef) { - XLS::CellRef cellRef; auto ptr(new XLSB::CFRULE(cellRef)); XLS::BaseObjectPtr objPtr(ptr); - ptr->m_BrtBeginCFRule = WriteAttributes(); + ptr->m_BrtBeginCFRule = WriteAttributes(cellRef); if(m_oColorScale.IsInit()) { @@ -1741,9 +1740,9 @@ XLS::BaseObjectPtr CConditionalFormattingRule::toBin() return objPtr; } -XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes() +XLS::BaseObjectPtr CConditionalFormattingRule::WriteAttributes(const XLS::CellRef &cellRef) { - XLS::CellRef cellRef; + auto ptr(new XLSB::BeginCFRule(cellRef)); BaseObjectPtr objectPtr(ptr); @@ -2640,9 +2639,10 @@ XLS::BaseObjectPtr CConditionalFormatting::toBin() auto ptr(new XLSB::CONDITIONALFORMATTING); objectPtr = XLS::BaseObjectPtr{ptr}; + XLS::CellRef formatingfirstCell; if(m_oSqRef.IsInit()) { - auto conditionPtr(new XLSB::BeginConditionalFormatting); + auto conditionPtr(new XLSB::BeginConditionalFormatting);// ptr->m_BrtBeginConditionalFormatting = XLS::BaseObjectPtr{conditionPtr}; conditionPtr->ccf = m_arrItems.size(); conditionPtr->sqrfx.strValue = m_oSqRef.get(); @@ -2650,11 +2650,12 @@ XLS::BaseObjectPtr CConditionalFormatting::toBin() conditionPtr->fPivot = m_oPivot->GetValue(); else conditionPtr->fPivot = false; + formatingfirstCell = conditionPtr->sqrfx.getLocationFirstCell(); } for(auto i: m_arrItems) { - ptr->m_arCFRULE.push_back(i->toBin()); + ptr->m_arCFRULE.push_back(i->toBin(formatingfirstCell)); } return objectPtr; diff --git a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h index acda290e53..cb0ab73bc6 100644 --- a/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h +++ b/OOXML/XlsxFormat/Worksheets/ConditionalFormatting.h @@ -33,6 +33,7 @@ #include "../WritingElement.h" #include "../../Base/Nullable.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/Biff_structures/CellRef.h" namespace SimpleTypes { @@ -299,7 +300,7 @@ namespace OOX virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); void fromBin(XLS::BaseObjectPtr& obj); - XLS::BaseObjectPtr toBin(); + XLS::BaseObjectPtr toBin(const XLS::CellRef &cellRef); virtual EElementType getType () const; bool isValid () const; @@ -311,7 +312,7 @@ namespace OOX private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); void ReadAttributes(XLS::BaseObjectPtr& obj); - XLS::BaseObjectPtr WriteAttributes(); + XLS::BaseObjectPtr WriteAttributes(const XLS::CellRef &cellRef); public: From 3d2ebf31b35c1cede884eca8c5b3c46f5f55082e Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Wed, 21 Feb 2024 14:32:01 +0600 Subject: [PATCH 208/221] Fix sheet protection conversion --- .../Worksheets/WorksheetChildOther.cpp | 94 +++++++++++++------ 1 file changed, 63 insertions(+), 31 deletions(-) diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index 499f308933..c5dde243d3 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -2664,72 +2664,72 @@ namespace OOX ptr->protpwd = 0; if (m_oAutoFilter.IsInit()) - ptr->fAutoFilter = m_oAutoFilter->GetValue(); + ptr->fAutoFilter = !m_oAutoFilter->GetValue(); else ptr->fAutoFilter = true; if (m_oDeleteColumns.IsInit()) - ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + ptr->fDeleteColumns = !m_oDeleteColumns->GetValue(); else ptr->fDeleteColumns= true; if (m_oDeleteRows.IsInit()) - ptr->fDeleteRows = m_oDeleteRows->GetValue(); + ptr->fDeleteRows = !m_oDeleteRows->GetValue(); else ptr->fDeleteRows = true; if (m_oFormatCells.IsInit()) - ptr->fFormatCells = m_oFormatCells->GetValue(); + ptr->fFormatCells = !m_oFormatCells->GetValue(); else ptr->fFormatCells = true; if (m_oFormatColumns.IsInit()) - ptr->fFormatColumns = m_oFormatColumns->GetValue(); + ptr->fFormatColumns = !m_oFormatColumns->GetValue(); else ptr->fFormatColumns = true; if (m_oFormatRows.IsInit()) - ptr->fFormatRows = m_oFormatRows->GetValue(); + ptr->fFormatRows = !m_oFormatRows->GetValue(); else ptr->fFormatRows = true; if (m_oInsertColumns.IsInit()) - ptr->fInsertColumns = m_oInsertColumns->GetValue(); + ptr->fInsertColumns = !m_oInsertColumns->GetValue(); else ptr->fInsertColumns = true; if (m_oInsertHyperlinks.IsInit()) - ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + ptr->fInsertHyperlinks = !m_oInsertHyperlinks->GetValue(); else ptr->fInsertHyperlinks = true; if (m_oInsertRows.IsInit()) - ptr->fInsertRows = m_oInsertRows->GetValue(); + ptr->fInsertRows = !m_oInsertRows->GetValue(); else ptr->fInsertRows = true; if (m_oObjects.IsInit()) - ptr->fObjects = m_oObjects->GetValue(); + ptr->fObjects = !m_oObjects->GetValue(); else ptr->fObjects = true; if (m_oPivotTables.IsInit()) - ptr->fPivotTables = m_oPivotTables->GetValue(); + ptr->fPivotTables = !m_oPivotTables->GetValue(); else ptr->fPivotTables = true; if (m_oScenarios.IsInit()) - ptr->fScenarios = m_oScenarios->GetValue(); + ptr->fScenarios = !m_oScenarios->GetValue(); else ptr->fScenarios = true; if (m_oSelectLockedCells.IsInit()) - ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + ptr->fSelLockedCells = !m_oSelectLockedCells->GetValue(); else ptr->fSelLockedCells = true; if (m_oSelectUnlockedCells.IsInit()) - ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + ptr->fSelUnlockedCells = !m_oSelectUnlockedCells->GetValue(); else ptr->fSelUnlockedCells = true; @@ -2739,7 +2739,7 @@ namespace OOX ptr->fLocked = false; if (m_oSort.IsInit()) - ptr->fSort = m_oSort->GetValue(); + ptr->fSort = !m_oSort->GetValue(); else ptr->fSort = true; @@ -2771,53 +2771,85 @@ namespace OOX ptr->ipdPasswordData.rgbSalt.cbLength = tempSize2; } - if(m_oAutoFilter.IsInit()) - ptr->fAutoFilter = m_oAutoFilter->GetValue(); + if (m_oAutoFilter.IsInit()) + ptr->fAutoFilter = !m_oAutoFilter->GetValue(); + else + ptr->fAutoFilter = true; if (m_oDeleteColumns.IsInit()) - ptr->fDeleteColumns = m_oDeleteColumns->GetValue(); + ptr->fDeleteColumns = !m_oDeleteColumns->GetValue(); + else + ptr->fDeleteColumns= true; if (m_oDeleteRows.IsInit()) - ptr->fDeleteRows = m_oDeleteRows->GetValue(); + ptr->fDeleteRows = !m_oDeleteRows->GetValue(); + else + ptr->fDeleteRows = true; if (m_oFormatCells.IsInit()) - ptr->fFormatCells = m_oFormatCells->GetValue(); + ptr->fFormatCells = !m_oFormatCells->GetValue(); + else + ptr->fFormatCells = true; if (m_oFormatColumns.IsInit()) - ptr->fFormatColumns = m_oFormatColumns->GetValue(); + ptr->fFormatColumns = !m_oFormatColumns->GetValue(); + else + ptr->fFormatColumns = true; if (m_oFormatRows.IsInit()) - ptr->fFormatRows = m_oFormatRows->GetValue(); + ptr->fFormatRows = !m_oFormatRows->GetValue(); + else + ptr->fFormatRows = true; if (m_oInsertColumns.IsInit()) - ptr->fInsertColumns = m_oInsertColumns->GetValue(); + ptr->fInsertColumns = !m_oInsertColumns->GetValue(); + else + ptr->fInsertColumns = true; if (m_oInsertHyperlinks.IsInit()) - ptr->fInsertHyperlinks = m_oInsertHyperlinks->GetValue(); + ptr->fInsertHyperlinks = !m_oInsertHyperlinks->GetValue(); + else + ptr->fInsertHyperlinks = true; if (m_oInsertRows.IsInit()) - ptr->fInsertRows = m_oInsertRows->GetValue(); + ptr->fInsertRows = !m_oInsertRows->GetValue(); + else + ptr->fInsertRows = true; if (m_oObjects.IsInit()) - ptr->fObjects = m_oObjects->GetValue(); + ptr->fObjects = !m_oObjects->GetValue(); + else + ptr->fObjects = true; if (m_oPivotTables.IsInit()) - ptr->fPivotTables = m_oPivotTables->GetValue(); + ptr->fPivotTables = !m_oPivotTables->GetValue(); + else + ptr->fPivotTables = true; if (m_oScenarios.IsInit()) - ptr->fScenarios = m_oScenarios->GetValue(); + ptr->fScenarios = !m_oScenarios->GetValue(); + else + ptr->fScenarios = true; if (m_oSelectLockedCells.IsInit()) - ptr->fSelLockedCells = m_oSelectLockedCells->GetValue(); + ptr->fSelLockedCells = !m_oSelectLockedCells->GetValue(); + else + ptr->fSelLockedCells = true; if (m_oSelectUnlockedCells.IsInit()) - ptr->fSelUnlockedCells = m_oSelectUnlockedCells->GetValue(); + ptr->fSelUnlockedCells = !m_oSelectUnlockedCells->GetValue(); + else + ptr->fSelUnlockedCells = true; if (m_oSheet.IsInit()) ptr->fLocked = m_oSheet->GetValue(); + else + ptr->fLocked = false; if (m_oSort.IsInit()) - ptr->fSort = m_oSort->GetValue(); + ptr->fSort = !m_oSort->GetValue(); + else + ptr->fSort = true; return castedPtr; } From c1f1c3a68301600a74da1707b1a7b022d1e25581 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 21 Feb 2024 20:45:07 +0300 Subject: [PATCH 209/221] add support oleObjects from Word 2003 XML --- .../Document/DocWrapper/DocxSerializer.cpp | 10 +- .../Document/DocWrapper/DocxSerializer.h | 2 +- OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 45 ++-- OOXML/Common/SimpleTypes_Vml.cpp | 6 +- OOXML/DocxFormat/CustomXml.cpp | 2 +- OOXML/DocxFormat/Document.cpp | 36 ++- OOXML/DocxFormat/Document.h | 23 +- OOXML/DocxFormat/DocxFlat.cpp | 115 +++++++-- OOXML/DocxFormat/DocxFlat.h | 8 +- OOXML/DocxFormat/FileTypes.cpp | 14 +- OOXML/DocxFormat/Logic/Pict.cpp | 235 +++++++++++------- OOXML/DocxFormat/Logic/Pict.h | 2 +- OOXML/DocxFormat/Logic/Vml.cpp | 10 +- OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp | 38 ++- OOXML/DocxFormat/WritingElement.h | 2 + OdfFile/Writer/Converter/ConvertDrawing.cpp | 3 +- OdfFile/Writer/Converter/XlsxConverter.cpp | 6 +- X2tConverter/src/ASCConverters.cpp | 9 +- X2tConverter/src/cextracttools.h | 1 - X2tConverter/src/lib/docx.h | 6 +- 20 files changed, 401 insertions(+), 172 deletions(-) diff --git a/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp b/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp index 0f48a2e1e7..b4d887a3e6 100644 --- a/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp +++ b/OOXML/Binary/Document/DocWrapper/DocxSerializer.cpp @@ -623,9 +623,12 @@ bool BinDocxRW::CDocxSerializer::unpackageFile(const std::wstring& sSrcFileName, return file.unpackage(sSrcFileName, sDstPath); } -bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath) +bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath, bool &bMacro, const std::wstring& sTempPath) { - OOX::CDocxFlat docxflat(sSrcFileName); + OOX::CDocxFlat docxflat; + + docxflat.m_sTempPath = sTempPath; + docxflat.read(sSrcFileName); if (false == docxflat.m_pDocument.IsInit()) return false; @@ -637,6 +640,8 @@ bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, c NSCommon::smart_ptr file = docxflat.m_pDocument.GetPointer(); file.AddRef(); docx.Add(file); docx.m_oMain.document = docxflat.m_pDocument.GetPointer(); + + bMacro = bMacro && docxflat.m_pDocument->m_bMacroEnabled; } if (docxflat.m_pApp.IsInit()) { @@ -648,6 +653,7 @@ bool BinDocxRW::CDocxSerializer::convertFlat(const std::wstring& sSrcFileName, c NSCommon::smart_ptr file(docxflat.m_pCore.GetPointer()); file.AddRef(); docx.Add(file); } + //docxflat.m_oBgPict.GetPointer(); return docx.Write(sDstPath); diff --git a/OOXML/Binary/Document/DocWrapper/DocxSerializer.h b/OOXML/Binary/Document/DocWrapper/DocxSerializer.h index 9f0223cec6..57d7935976 100644 --- a/OOXML/Binary/Document/DocWrapper/DocxSerializer.h +++ b/OOXML/Binary/Document/DocWrapper/DocxSerializer.h @@ -67,7 +67,7 @@ namespace BinDocxRW bool saveToFile (const std::wstring& sSrcFileName, const std::wstring& sDstPath, const std::wstring& sXMLOptions, const std::wstring& sTempPath); bool unpackageFile(const std::wstring& sSrcFileName, const std::wstring& sDstPath); - bool convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath); + bool convertFlat(const std::wstring& sSrcFileName, const std::wstring& sDstPath, bool& bMacro, const std::wstring& sTempPath); bool CreateDocxFolders(std::wstring strDirectory, std::wstring& sThemePath, std::wstring& sMediaPath, std::wstring& sEmbedPath); diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index bbbb71ad28..c8573981b2 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -3031,8 +3031,11 @@ void BinaryWorkbookTableWriter::WriteExternalReferences(const OOX::Spreadsheet:: smart_ptr pFile = pExternalLink->Find(OOX::RId(pExternalLink->m_oOleLink->m_oRid.get().GetValue())); if (pFile.IsInit() && OOX::FileTypes::OleObject == pFile->type()) { - OOX::OleObject* pLinkFile = static_cast(pFile.operator ->()); - sLink = pLinkFile->filename().GetPath(); + smart_ptr pLinkFile = pFile.smart_dynamic_cast(); + if (pLinkFile.IsInit()) + { + sLink = pLinkFile->filename().GetPath(); + } } } if (!sLink.empty()) @@ -4573,18 +4576,21 @@ void BinaryWorksheetTableWriter::WriteWorksheet(OOX::Spreadsheet::CSheet* pSheet smart_ptr pFile = oWorksheet.Find(oWorksheet.m_oPicture->m_oId->GetValue()); if (pFile.IsInit() && ( OOX::FileTypes::Image == pFile->type())) { - OOX::Image* pImageFileCache = static_cast(pFile.GetPointer()); - OOX::CPath pathImage = pImageFileCache->filename(); - std::wstring additionalPath; - int additionalType = 0; - double dX = -1.0; //mm - double dY = -1.0; - double dW = -1.0; //mm - double dH = -1.0; - NSShapeImageGen::CMediaInfo oId = m_pOfficeDrawingConverter->m_pBinaryWriter->m_pCommon->m_pMediaManager->WriteImage(pathImage.GetPath(), dX, dY, dW, dH, additionalPath, additionalType); - nCurPos = m_oBcw.WriteItemStart(c_oSerWorksheetsTypes::Picture); - m_oBcw.m_oStream.WriteStringW3(oId.GetPath2()); - m_oBcw.WriteItemEnd(nCurPos); + smart_ptr pImageFileCache = pFile.smart_dynamic_cast(); + if (pImageFileCache.IsInit()) + { + OOX::CPath pathImage = pImageFileCache->filename(); + std::wstring additionalPath; + int additionalType = 0; + double dX = -1.0; //mm + double dY = -1.0; + double dW = -1.0; //mm + double dH = -1.0; + NSShapeImageGen::CMediaInfo oId = m_pOfficeDrawingConverter->m_pBinaryWriter->m_pCommon->m_pMediaManager->WriteImage(pathImage.GetPath(), dX, dY, dW, dH, additionalPath, additionalType); + nCurPos = m_oBcw.WriteItemStart(c_oSerWorksheetsTypes::Picture); + m_oBcw.m_oStream.WriteStringW3(oId.GetPath2()); + m_oBcw.WriteItemEnd(nCurPos); + } } } if (oWorksheet.m_oSortState.IsInit()) @@ -5823,7 +5829,8 @@ void BinaryWorksheetTableWriter::WriteOleObjects(const OOX::Spreadsheet::CWorksh olePic->blipFill.blip->oleFilepathBin = olePic->oleObject->m_OleObjectFile->filename().GetPath(); } - OOX::Image* pImageFileCache = NULL; + smart_ptr pImageFileCache; + std::wstring sIdImageFileCache; if ((NULL != pShapeElem) && (OOX::et_v_shapetype != pShapeElem->getType())) { @@ -5854,23 +5861,23 @@ void BinaryWorksheetTableWriter::WriteOleObjects(const OOX::Spreadsheet::CWorksh if (pFile.IsInit() && (OOX::FileTypes::Image == pFile->type())) { - pImageFileCache = static_cast(pFile.GetPointer()); + pImageFileCache = pFile.smart_dynamic_cast(); } } } } } - if (pImageFileCache == NULL && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) + if (pImageFileCache.IsInit() && pOleObject->m_oObjectPr.IsInit() && pOleObject->m_oObjectPr->m_oRid.IsInit()) { sIdImageFileCache = pOleObject->m_oObjectPr->m_oRid->GetValue(); smart_ptr pFile = oWorksheet.Find(sIdImageFileCache); if (pFile.IsInit() && (OOX::FileTypes::Image == pFile->type())) { - pImageFileCache = static_cast(pFile.GetPointer()); + pImageFileCache = pFile.smart_dynamic_cast(); } } - if (pImageFileCache) + if (pImageFileCache.IsInit()) { OOX::CPath pathImage = pImageFileCache->filename(); diff --git a/OOXML/Common/SimpleTypes_Vml.cpp b/OOXML/Common/SimpleTypes_Vml.cpp index 7c530164e8..a88d23fd14 100644 --- a/OOXML/Common/SimpleTypes_Vml.cpp +++ b/OOXML/Common/SimpleTypes_Vml.cpp @@ -1224,9 +1224,9 @@ namespace SimpleTypes { switch (this->m_eValue) { - case oletypeEmbed : return L"embed"; - case oletypeLink : return L"link"; - default : return L"embed"; + case oletypeEmbed : return L"Embed"; + case oletypeLink : return L"Link"; + default : return L"Embed"; } } diff --git a/OOXML/DocxFormat/CustomXml.cpp b/OOXML/DocxFormat/CustomXml.cpp index 49f96d5e5c..0abb012daf 100644 --- a/OOXML/DocxFormat/CustomXml.cpp +++ b/OOXML/DocxFormat/CustomXml.cpp @@ -155,7 +155,7 @@ namespace OOX CCustomXMLProps::CCustomXMLProps(OOX::Document *pMain) : OOX::FileGlobalEnumerated(pMain) { } - CCustomXMLProps::CCustomXMLProps(OOX::Document *pMain, const OOX::CPath& oFilePath): OOX::FileGlobalEnumerated(pMain) + CCustomXMLProps::CCustomXMLProps(OOX::Document *pMain, const OOX::CPath& oFilePath) : OOX::FileGlobalEnumerated(pMain) { read( oFilePath ); } diff --git a/OOXML/DocxFormat/Document.cpp b/OOXML/DocxFormat/Document.cpp index 588a809522..d887148c67 100644 --- a/OOXML/DocxFormat/Document.cpp +++ b/OOXML/DocxFormat/Document.cpp @@ -144,7 +144,42 @@ namespace OOX WritingElement_ReadAttributes_Read_else_if(oReader, L"w:themeTint", m_oThemeTint) WritingElement_ReadAttributes_End(oReader) } +//------------------------------------------------------------------------------------------------------------------------------------------------ + CDocSuppData::CDocSuppData(OOX::Document* pMain) : WritingElement(pMain) + { + } + CDocSuppData::~CDocSuppData() + { + } + void CDocSuppData::fromXML(XmlUtils::CXmlNode& oNode) + { + } + std::wstring CDocSuppData::toXML() const + { + return L""; + } + EElementType CDocSuppData::getType() const + { + return et_w_docSuppData; + } + void CDocSuppData::fromXML(XmlUtils::CXmlLiteReader& oReader) + { + if (oReader.IsEmptyNode()) + return; + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if (L"binData" == sName) + m_oBinData = oReader; + } + } + void CDocSuppData::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + } +//------------------------------------------------------------------------------------------------------------------------------------------------ CBgPict::CBgPict(OOX::Document *pMain) : WritingElement(pMain) { } @@ -401,7 +436,6 @@ namespace OOX pItem->fromXML(oReader); m_arrItems.push_back(pItem); } - if ( pItem ) { pItem->fromXML(oReader); diff --git a/OOXML/DocxFormat/Document.h b/OOXML/DocxFormat/Document.h index 206ac8e45e..bc804c04c5 100644 --- a/OOXML/DocxFormat/Document.h +++ b/OOXML/DocxFormat/Document.h @@ -80,10 +80,28 @@ namespace OOX nullable m_oDrawing; nullable m_oBackground; }; + + class CDocSuppData : public WritingElement + {//Word 2003 XML Reference + public: + WritingElement_AdditionMethods(CDocSuppData) + CDocSuppData(OOX::Document* pMain = NULL); + virtual ~CDocSuppData(); - //Word 2003 XML Reference + virtual void fromXML(XmlUtils::CXmlNode& oNode); + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader); + + virtual std::wstring toXML() const; + virtual EElementType getType() const; + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); + + public: + nullable m_oBinData; + }; class CBgPict : public WritingElement - { + {//Word 2003 XML Reference public: WritingElement_AdditionMethods(CBgPict) CBgPict(OOX::Document *pMain = NULL); @@ -104,7 +122,6 @@ namespace OOX nullable_string m_oBackgroundType; nullable m_oBackground; }; - } //-------------------------------------------------------------------------------- diff --git a/OOXML/DocxFormat/DocxFlat.cpp b/OOXML/DocxFormat/DocxFlat.cpp index 75037c6a83..f83f95cca9 100644 --- a/OOXML/DocxFormat/DocxFlat.cpp +++ b/OOXML/DocxFormat/DocxFlat.cpp @@ -46,6 +46,8 @@ #include "Settings/Settings.h" #include "Logic/SectionProperty.h" +#include "../../OfficeUtils/src/OfficeUtils.h" + namespace OOX { CDocxFlat::CDocxFlat() : File(dynamic_cast(this)) @@ -53,19 +55,21 @@ namespace OOX } CDocxFlat::CDocxFlat(const CPath& oFilePath) : File(dynamic_cast(this)) { - read( oFilePath ); + read(oFilePath); } CDocxFlat::~CDocxFlat() { } void CDocxFlat::read(const CPath& oFilePath) { + m_sDocumentPath = oFilePath.GetPath(); + XmlUtils::CXmlLiteReader oReader; - if ( !oReader.FromFile( oFilePath.GetPath() ) ) + if (!oReader.FromFile(oFilePath.GetPath())) return; - if ( !oReader.ReadNextNode() ) + if (!oReader.ReadNextNode()) return; fromXML(oReader); @@ -96,15 +100,15 @@ namespace OOX } void CDocxFlat::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { - WritingElement_ReadAttributes_Start( oReader ) - WritingElement_ReadAttributes_Read_if ( oReader, L"xml:space", m_oSpace ) - WritingElement_ReadAttributes_End( oReader ) + WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if(oReader, L"xml:space", m_oSpace) + WritingElement_ReadAttributes_End(oReader) } void CDocxFlat::fromXML(XmlUtils::CXmlLiteReader& oReader) { - ReadAttributes( oReader ); + ReadAttributes(oReader); - if ( oReader.IsEmptyNode() ) + if (oReader.IsEmptyNode()) return; m_pComments = new OOX::CComments(this); @@ -112,24 +116,25 @@ namespace OOX m_pEndnotes = new OOX::CEndnotes(this); int nDepth = oReader.GetDepth(); - while ( oReader.ReadNextSiblingNode(nDepth) ) + while (oReader.ReadNextSiblingNode(nDepth)) { std::wstring sName = oReader.GetName(); - if ( L"w:body" == sName ) + if (L"w:body" == sName) { m_pDocument = new CDocument(dynamic_cast(this)); m_currentContainer = dynamic_cast(m_pDocument.GetPointer()); m_pDocument->fromXML(oReader); + m_pDocument->m_bMacroEnabled = false; } - else if ( L"w:fonts" == sName ) + else if (L"w:fonts" == sName) m_pFontTable = oReader; else if (L"w:lists" == sName) { m_pNumbering = new CNumbering(dynamic_cast(this)); m_pNumbering->fromXML(oReader); } - else if ( L"w:styles" == sName ) + else if (L"w:styles" == sName) m_pStyles = oReader; else if (L"w:docPr" == sName) { @@ -145,8 +150,26 @@ namespace OOX { ReadDocumentProperties(oReader); } + else if (L"w:docOleData" == sName && !oReader.IsEmptyNode()) + { + m_oDocOleData = new OOX::Logic::CDocSuppData(WritingElement::m_pMainDocument); + m_oDocOleData->fromXML(oReader); + + ParsingOleData(); + } + else if (L"w:docSuppData" == sName && !oReader.IsEmptyNode()) + { + m_oDocSuppData = new OOX::Logic::CDocSuppData(WritingElement::m_pMainDocument); + m_oDocSuppData->fromXML(oReader); + + ParsingSuppData(); + } } + if ((m_oDocSuppData.IsInit()) && (m_oDocSuppData->m_oBinData.IsInit()) && (m_pDocument.IsInit())) + { + m_pDocument->m_bMacroEnabled = true; + } if (false == m_pStyles->m_oDocDefaults.IsInit()) m_pStyles->m_oDocDefaults.Init(); @@ -211,7 +234,7 @@ namespace OOX { if (oReader.IsEmptyNode()) return; - + m_pApp = new OOX::CApp(this); m_pCore = new OOX::CCore(this); @@ -296,7 +319,7 @@ namespace OOX m_pApp->m_nWords = oReader.GetText2(); } } - OOX::CHdrFtr *CDocxFlat::GetHeaderOrFooter(const OOX::RId& rId) const + OOX::CHdrFtr* CDocxFlat::GetHeaderOrFooter(const OOX::RId& rId) const { OOX::IFileContainer* pDocumentContainer = (OOX::IFileContainer*)m_pDocument.GetPointer(); @@ -307,4 +330,68 @@ namespace OOX return NULL; } + void CDocxFlat::ParsingOleData() + { + if (false == m_oDocOleData.IsInit()) return; + if (false == m_oDocOleData->m_oBinData.IsInit()) return; + + std::vector pData = m_oDocOleData->m_oBinData->GetBytes(); + + NSFile::CFileBinary fileTest; + + std::wstring tempOleData = m_sTempPath + FILE_SEPARATOR_STR + L"DocOleData.bin"; + + if (false == fileTest.CreateFileW(tempOleData)) return; + + fileTest.WriteFile(pData.data(), pData.size()); + fileTest.CloseFile(); + + POLE::Storage storage(tempOleData.c_str()); + if (false == storage.open()) return; + + std::list msoStores = storage.entries(); + + int index = 0; + for (std::list::iterator it = msoStores.begin(); it != msoStores.end(); ++it) + { + POLE::Stream stream(&storage, *it); + if (stream.fail()) continue; + + smart_ptr pOleObjectFile = smart_ptr(new OOX::OleObject(this, false, true)); + OOX::CPath filename(L"oleObject.bin"); + pOleObjectFile->set_filename(filename, false, true); + + pOleObjectFile->m_Data.resize(stream.size()); + _UINT64 size = stream.read(pOleObjectFile->m_Data.data(), stream.size()); + pOleObjectFile->m_Data.resize(size); + + COfficeUtils oCOfficeUtils(NULL); + if (oCOfficeUtils.IsArchive(pOleObjectFile->m_Data.data(), pOleObjectFile->m_Data.size())) + {//gzip + ULONG nBytesUncompress = (std::max)((_UINT32)pOleObjectFile->m_Data.size() * 10, ((_UINT32*)pOleObjectFile->m_Data.data())[0]); + BYTE* pDataUncompress = new BYTE[nBytesUncompress]; + + if (S_OK == oCOfficeUtils.Uncompress(pDataUncompress, &nBytesUncompress, pOleObjectFile->m_Data.data() + 4, pOleObjectFile->m_Data.size() - 4)) + { + pOleObjectFile->m_Data.resize(nBytesUncompress); + memcpy(pOleObjectFile->m_Data.data(), pDataUncompress, nBytesUncompress); + delete[]pDataUncompress; + } + } + + NSCommon::smart_ptr file = pOleObjectFile.smart_dynamic_cast(); + m_mapOleData[*it] = file; + } + + } + void CDocxFlat::ParsingSuppData() + { + if (false == m_oDocSuppData.IsInit()) return; + if (false == m_oDocSuppData->m_oBinData.IsInit()) return; + + std::vector pData = m_oDocSuppData->m_oBinData->GetBytes(); + //COfficeUtils oCOfficeUtils(NULL); + + + } } diff --git a/OOXML/DocxFormat/DocxFlat.h b/OOXML/DocxFormat/DocxFlat.h index aaa04e5bc7..410509b289 100644 --- a/OOXML/DocxFormat/DocxFlat.h +++ b/OOXML/DocxFormat/DocxFlat.h @@ -52,12 +52,12 @@ namespace OOX namespace Logic { class CBgPict; + class CDocSuppData; } class CDocxFlat : public Document, public File, public WritingElement { public: - CDocxFlat(); CDocxFlat(const CPath& oFilePath); virtual ~CDocxFlat(); @@ -89,6 +89,8 @@ namespace OOX nullable m_pNumbering; nullable m_pSettings; nullable m_pBgPict; + nullable m_oDocSuppData; + nullable m_oDocOleData; nullable m_pComments; nullable m_pFootnotes; @@ -97,8 +99,12 @@ namespace OOX nullable m_pCore; //----------------------------------------------------------- std::map> m_mapImages; + std::map> m_mapOleData; OOX::IFileContainer *m_currentContainer = NULL; + private: + void ParsingOleData(); + void ParsingSuppData(); }; diff --git a/OOXML/DocxFormat/FileTypes.cpp b/OOXML/DocxFormat/FileTypes.cpp index 6edef1f661..103b3fc628 100644 --- a/OOXML/DocxFormat/FileTypes.cpp +++ b/OOXML/DocxFormat/FileTypes.cpp @@ -167,23 +167,23 @@ namespace OOX const FileType Image (L"media", L"image", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true, true); const FileType Audio (L"media", L"audio", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio", L"audio", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio", L"audio", true, true); const FileType Video (L"media", L"video", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video", L"video", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/video", L"video", true, true); const FileType Media (L"media", L"media", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/media", L"media", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/media", L"media", true, true); const FileType SvgBlip (L"media", L"image", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image", L"image", true, true); const FileType DiagramData (L"diagrams", L"data.xml", @@ -279,7 +279,7 @@ namespace OOX const FileType MicrosoftOfficeUnknown(L"embeddings", L"", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package", L"embeddings/package", true, true); const FileType MicrosoftOfficeExcelWorksheet(L"embeddings", L"Microsoft_Office_Excel_Worksheet.xlsx", L"", @@ -346,7 +346,7 @@ namespace OOX const FileType OleObject (L"embeddings", L"oleObject.bin", L"", - L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"); + L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject", L"embeddings/oleObject", true, true); const FileType VmlDrawing (L"drawings", L"vmlDrawing.vml", L"application/vnd.openxmlformats-officedocument.vmlDrawing", diff --git a/OOXML/DocxFormat/Logic/Pict.cpp b/OOXML/DocxFormat/Logic/Pict.cpp index 6280d49362..11368b1881 100644 --- a/OOXML/DocxFormat/Logic/Pict.cpp +++ b/OOXML/DocxFormat/Logic/Pict.cpp @@ -37,6 +37,7 @@ //#include "Vml.h" #include "VmlOfficeDrawing.h" +#include "../../../OfficeUtils/src/OfficeUtils.h" #include "../../../DesktopEditor/raster/ImageFileFormatChecker.h" #include "../../../OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.h" @@ -104,6 +105,31 @@ namespace OOX oReader.MoveToElement(); } + std::vector CBinData::GetBytes() + { + std::vector result; + if (!m_sData.IsInit()) return result; + + int dstLen = Base64::Base64DecodeGetRequiredLength((int)m_sData->size()); + result.resize(dstLen); + Base64::Base64Decode(m_sData->c_str(), (int)m_sData->size(), result.data(), &dstLen); + result.resize(dstLen); + + //COfficeUtils oCOfficeUtils(NULL); + //if (oCOfficeUtils.IsArchive(result.data(), result.size())) + //{//gzip + // ULONG nBytesUncompress = result.size() * 10; + // BYTE* pDataUncompress = new BYTE[nBytesUncompress]; + // if (S_OK == oCOfficeUtils.Uncompress(pDataUncompress, &nBytesUncompress, result.data(), result.size())) + // { + // result.resize(nBytesUncompress); + // memcpy(result.data(), pDataUncompress, nBytesUncompress); + // delete[]pDataUncompress; + // } + //} + + return result; + } CControl::CControl(OOX::Document *pMain) : WritingElement(pMain) {} CControl::~CControl() {} @@ -206,84 +232,84 @@ namespace OOX switch (wChar2) { case 'b': - if (_T("o:bottom") == sName) + if (L"o:bottom" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); break; case 'c': - if (_T("o:callout") == sName) + if (L"o:callout" == sName) pItem = new OOX::VmlOffice::CCallout(m_pMainDocument); - else if (_T("o:clippath") == sName) + else if (L"o:clippath" == sName) pItem = new OOX::VmlOffice::CClipPath(m_pMainDocument); - else if (_T("o:column") == sName) + else if (L"o:column" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); - else if (_T("o:complex") == sName) + else if (L"o:complex" == sName) pItem = new OOX::VmlOffice::CComplex(m_pMainDocument); break; case 'd': - if (_T("o:diagram") == sName) + if (L"o:diagram" == sName) pItem = new OOX::VmlOffice::CDiagram(m_pMainDocument); break; case 'e': - if (_T("o:equationxml") == sName) + if (L"o:equationxml" == sName) pItem = new OOX::VmlOffice::CEquationXml(m_pMainDocument); - else if (_T("o:extrusion") == sName) + else if (L"o:extrusion" == sName) pItem = new OOX::VmlOffice::CExtrusion(m_pMainDocument); break; case 'f': - if (_T("o:fill") == sName) + if (L"o:fill" == sName) pItem = new OOX::VmlOffice::CFill(m_pMainDocument); break; case 'i': - if (_T("o:ink") == sName) + if (L"o:ink" == sName) pItem = new OOX::VmlOffice::CInk(m_pMainDocument); break; case 'l': - if (_T("o:left") == sName) + if (L"o:left" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); - else if (_T("o:lock") == sName) + else if (L"o:lock" == sName) pItem = new OOX::VmlOffice::CLock(m_pMainDocument); break; case 'O': - if (_T("o:OLEObject") == sName) + if (L"o:OLEObject" == sName) { m_oOLEObject = new OOX::VmlOffice::COLEObject(m_pMainDocument); m_oOLEObject->fromXML(oSubReader); }break; case 'r': - if (_T("o:right") == sName) + if (L"o:right" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); break; case 's': - if (_T("o:shapedefaults") == sName) + if (L"o:shapedefaults" == sName) pItem = new OOX::VmlOffice::CShapeDefaults(m_pMainDocument); - else if (_T("o:shapelayout") == sName) + else if (L"o:shapelayout" == sName) pItem = new OOX::VmlOffice::CShapeLayout(m_pMainDocument); - else if (_T("o:signatureline") == sName) + else if (L"o:signatureline" == sName) pItem = new OOX::VmlOffice::CSignatureLine(m_pMainDocument); - else if (_T("o:skew") == sName) + else if (L"o:skew" == sName) pItem = new OOX::VmlOffice::CSkew(m_pMainDocument); break; case 't': - if (_T("o:top") == sName) + if (L"o:top" == sName) pItem = new OOX::VmlOffice::CStrokeChild(m_pMainDocument); break; @@ -298,59 +324,59 @@ namespace OOX switch (wChar2) { case 'a': - if (_T("v:arc") == sName) + if (L"v:arc" == sName) { m_oShapeElement = new OOX::Vml::CArc(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); }break; case 'b': - if (_T("v:background") == sName) + if (L"v:background" == sName) pItem = new OOX::Vml::CBackground(m_pMainDocument); break; case 'c': - if (_T("v:curve") == sName) + if (L"v:curve" == sName) { m_oShapeElement = new OOX::Vml::CCurve(m_pMainDocument);//??? m_oShapeElement->fromXML(oSubReader); }break; case 'f': - if (_T("v:fill") == sName) + if (L"v:fill" == sName) pItem = new OOX::Vml::CFill(m_pMainDocument); - else if (_T("v:formulas") == sName) + else if (L"v:formulas" == sName) pItem = new OOX::Vml::CFormulas(m_pMainDocument); break; case 'g': - if (_T("v:group") == sName) + if (L"v:group" == sName) { m_oShapeElement = new OOX::Vml::CGroup(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); }break; case 'h': - if (_T("v:handles") == sName) + if (L"v:handles" == sName) pItem = new OOX::Vml::CHandles(m_pMainDocument); break; case 'i': - if (_T("v:image") == sName) + if (L"v:image" == sName) { m_oShapeElement = new OOX::Vml::CImage(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); } - else if (_T("v:imagedata") == sName) + else if (L"v:imagedata" == sName) { pItem = pImageData = new OOX::Vml::CImageData(m_pMainDocument); } break; case 'l': - if (_T("v:line") == sName) + if (L"v:line" == sName) { m_oShapeElement = new OOX::Vml::CLine(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -358,7 +384,7 @@ namespace OOX break; case 'o': - if (_T("v:oval") == sName) + if (L"v:oval" == sName) { m_oShapeElement = new OOX::Vml::COval(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -366,9 +392,9 @@ namespace OOX break; case 'p': - if (_T("v:path") == sName) + if (L"v:path" == sName) pItem = new OOX::Vml::CPath(m_pMainDocument); - else if (_T("v:polyline") == sName) + else if (L"v:polyline" == sName) { m_oShapeElement = new OOX::Vml::CPolyLine(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -377,12 +403,12 @@ namespace OOX break; case 'r': - if (_T("v:rect") == sName) + if (L"v:rect" == sName) { m_oShapeElement = new OOX::Vml::CRect(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); } - else if (_T("v:roundrect") == sName) + else if (L"v:roundrect" == sName) { m_oShapeElement = new OOX::Vml::CRoundRect(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); @@ -390,27 +416,27 @@ namespace OOX break; case 's': - if (_T("v:shadow") == sName) + if (L"v:shadow" == sName) pItem = new OOX::Vml::CShadow(m_pMainDocument); - else if (_T("v:shape") == sName) + else if (L"v:shape" == sName) { m_oShapeElement = new OOX::Vml::CShape(m_pMainDocument); m_oShapeElement->fromXML(oSubReader); } - else if (_T("v:shapetype") == sName) + else if (L"v:shapetype" == sName) { m_oShapeType = new OOX::Vml::CShapeType(m_pMainDocument); m_oShapeType->fromXML(oSubReader); } - else if (_T("v:stroke") == sName) + else if (L"v:stroke" == sName) pItem = new OOX::Vml::CStroke(m_pMainDocument); break; case 't': - if (_T("v:textbox") == sName) + if (L"v:textbox" == sName) pItem = new OOX::Vml::CTextbox(m_pMainDocument); - else if (_T("v:textpath") == sName) + else if (L"v:textpath" == sName) pItem = new OOX::Vml::CTextPath(m_pMainDocument); break; @@ -434,19 +460,36 @@ namespace OOX if (docx_flat) { smart_ptr pImageFile = smart_ptr(new OOX::Image(m_pMainDocument, true)); - - int dstLen = Base64::Base64DecodeGetRequiredLength((int)m_oBinData->m_sData->size()); - pImageFile->m_Data.resize(dstLen); - Base64::Base64Decode(m_oBinData->m_sData->c_str(), (int)m_oBinData->m_sData->size(), pImageFile->m_Data.data(), &dstLen); - pImageFile->m_Data.resize(dstLen); + pImageFile->m_Data = m_oBinData->GetBytes(); CImageFileFormatChecker fileChecker; - std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), dstLen); + std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), pImageFile->m_Data.size()); + + if (ext.empty()) + { + COfficeUtils oCOfficeUtils(NULL); + if (oCOfficeUtils.IsArchive(pImageFile->m_Data.data(), pImageFile->m_Data.size())) + {//gzip + ULONG nBytesUncompress = pImageFile->m_Data.size() * 10; + BYTE* pDataUncompress = new BYTE[nBytesUncompress]; + if (S_OK == oCOfficeUtils.Uncompress(pDataUncompress, &nBytesUncompress, pImageFile->m_Data.data(), pImageFile->m_Data.size())) + { + ext = fileChecker.DetectFormatByData(pDataUncompress, nBytesUncompress); + + if (false == ext.empty()) + { + pImageFile->m_Data.resize(nBytesUncompress); + memcpy(pImageFile->m_Data.data(), pDataUncompress, nBytesUncompress); + delete []pDataUncompress; + } + } + } + } if (false == ext.empty()) { OOX::CPath filename(L"image." + ext); pImageFile->set_filename(filename, false, true); - + NSCommon::smart_ptr file = pImageFile.smart_dynamic_cast(); const OOX::RId rId = docx_flat->m_currentContainer->Add(file); @@ -458,7 +501,6 @@ namespace OOX } } } - break; } @@ -471,7 +513,7 @@ namespace OOX } std::wstring CPicture::toXML() const { - std::wstring sResult = _T(""); + std::wstring sResult = m_oOLEObject.IsInit() ? L"" : L""; for (size_t i = 0; i < m_arrItems.size(); ++i) { @@ -489,10 +531,12 @@ namespace OOX if (m_oControl.IsInit()) sResult += m_oControl->toXML(); - //if (m_oBinData.IsInit()) - // sResult += m_oBinData->toXML(); + if (m_oOLEObject.IsInit()) + { + sResult += m_oOLEObject->toXML(); + } - sResult += _T(""); + sResult += m_oOLEObject.IsInit() ? L"" : L""; return sResult; } @@ -518,9 +562,24 @@ namespace OOX //альтернатива pptx std::wstring sXml; //??? + ole наверно что то (лень ...) - sXml += _T(""); + sXml += L""; sXml += m_sXml.get(); - sXml += _T(""); + sXml += L""; XmlUtils::CXmlLiteReader oSubReader; oSubReader.FromString(sXml); @@ -545,79 +604,79 @@ namespace OOX switch (wChar2) { case 'b': - if (_T("o:bottom") == sName) + if (L"o:bottom" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) break; case 'c': - if (_T("o:callout") == sName) + if (L"o:callout" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CCallout, oSubReader) - else if (_T("o:clippath") == sName) + else if (L"o:clippath" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CClipPath, oSubReader) - else if (_T("o:column") == sName) + else if (L"o:column" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) - else if (_T("o:complex") == sName) + else if (L"o:complex" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CComplex, oSubReader) break; case 'd': - if (_T("o:diagram") == sName) + if (L"o:diagram" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CDiagram, oSubReader) break; case 'e': - if (_T("o:equationxml") == sName) + if (L"o:equationxml" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CEquationXml, oSubReader) - else if (_T("o:extrusion") == sName) + else if (L"o:extrusion" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CExtrusion, oSubReader) break; case 'f': - if (_T("o:fill") == sName) + if (L"o:fill" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CFill, oSubReader) break; case 'i': - if (_T("o:ink") == sName) + if (L"o:ink" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CInk, oSubReader) break; case 'l': - if (_T("o:left") == sName) + if (L"o:left" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) - else if (_T("o:lock") == sName) + else if (L"o:lock" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CLock, oSubReader) break; case 'O':// собственно это и есть самый главный под-объект - if (_T("o:OLEObject") == sName) + if (L"o:OLEObject" == sName) m_oOleObject = oSubReader; break; case 'r': - if (_T("o:right") == sName) + if (L"o:right" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) break; case 's': - if (_T("o:shapedefaults") == sName) + if (L"o:shapedefaults" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CShapeDefaults, oSubReader) - else if (_T("o:shapelayout") == sName) + else if (L"o:shapelayout" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CShapeLayout, oSubReader) - else if (_T("o:signatureline") == sName) + else if (L"o:signatureline" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CSignatureLine, oSubReader) - else if (_T("o:skew") == sName) + else if (L"o:skew" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CSkew, oSubReader) break; case 't': - if (_T("o:top") == sName) + if (L"o:top" == sName) AssignPtrXmlContent(pItem, OOX::VmlOffice::CStrokeChild, oSubReader) break; } @@ -631,51 +690,51 @@ namespace OOX switch (wChar2) { case 'b': - if (_T("v:background") == sName) + if (L"v:background" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CBackground, oSubReader) break; case 'f': - if (_T("v:fill") == sName) + if (L"v:fill" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CFill, oSubReader) - else if (_T("v:formulas") == sName) + else if (L"v:formulas" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CFormulas, oSubReader) break; case 'h': - if (_T("v:handles") == sName) + if (L"v:handles" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CHandles, oSubReader) break; case 'i': - if (_T("v:image") == sName) + if (L"v:image" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CImage, oSubReader) - else if (_T("v:imagedata") == sName) + else if (L"v:imagedata" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CImageData, oSubReader) break; case 'p': - if (_T("v:path") == sName) + if (L"v:path" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CPath, oSubReader) break; case 'r': - if (_T("v:rect") == sName) + if (L"v:rect" == sName) m_oShape = oSubReader; break; case 's': - if (_T("v:shadow") == sName) + if (L"v:shadow" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CShadow, oSubReader) - else if (_T("v:shape") == sName) + else if (L"v:shape" == sName) m_oShape = oSubReader; - else if (_T("v:shapetype") == sName) + else if (L"v:shapetype" == sName) m_oShapeType = oSubReader; - else if (_T("v:stroke") == sName) + else if (L"v:stroke" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CStroke, oSubReader) break; case 't': - if (_T("v:textbox") == sName) + if (L"v:textbox" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CTextbox, oSubReader) - else if (_T("v:textpath") == sName) + else if (L"v:textpath" == sName) AssignPtrXmlContent(pItem, OOX::Vml::CTextPath, oSubReader) break; } @@ -700,7 +759,7 @@ namespace OOX } std::wstring CObject::toXML() const { - return _T(""); + return L""; } EElementType CObject::getType() const { diff --git a/OOXML/DocxFormat/Logic/Pict.h b/OOXML/DocxFormat/Logic/Pict.h index 44f4c367e4..a0973e18fe 100644 --- a/OOXML/DocxFormat/Logic/Pict.h +++ b/OOXML/DocxFormat/Logic/Pict.h @@ -62,9 +62,9 @@ namespace OOX virtual std::wstring toXML() const; virtual EElementType getType() const; + std::vector GetBytes(); private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader); - public: nullable m_sName; nullable m_sData; diff --git a/OOXML/DocxFormat/Logic/Vml.cpp b/OOXML/DocxFormat/Logic/Vml.cpp index 1e22b501d4..01aa049fc4 100644 --- a/OOXML/DocxFormat/Logic/Vml.cpp +++ b/OOXML/DocxFormat/Logic/Vml.cpp @@ -195,14 +195,10 @@ namespace OOX if (docx_flat) { smart_ptr pImageFile = smart_ptr(new OOX::Image(document, true)); - - int dstLen = Base64::Base64DecodeGetRequiredLength((int)oBinData.m_sData->size()); - pImageFile->m_Data.resize(dstLen); - Base64::Base64Decode(oBinData.m_sData->c_str(), (int)oBinData.m_sData->size(), pImageFile->m_Data.data(), &dstLen); - pImageFile->m_Data.resize(dstLen); + pImageFile->m_Data = oBinData.GetBytes(); CImageFileFormatChecker fileChecker; - std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), dstLen); + std::wstring ext = fileChecker.DetectFormatByData(pImageFile->m_Data.data(), pImageFile->m_Data.size()); if (false == ext.empty()) { OOX::CPath filename(L"image." + ext); @@ -557,7 +553,7 @@ namespace OOX if (m_oOleIcon.get_value_or(false)) sResult += L"o:oleicon=\"t\" "; - if (m_oOle.get_value_or(false)) + if (m_oOle.IsInit()) sResult += L"o:ole=\"t\" "; if (m_oPreferRelative.get_value_or(false)) diff --git a/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp b/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp index 96ba90ad76..7434f5faf8 100644 --- a/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp +++ b/OOXML/DocxFormat/Logic/VmlOfficeDrawing.cpp @@ -30,6 +30,7 @@ * */ +#include "../DocxFlat.h" #include "VmlOfficeDrawing.h" namespace OOX @@ -1268,19 +1269,32 @@ namespace OOX { ReadAttributes( oReader ); - if ( oReader.IsEmptyNode() ) - return; - - int nCurDepth = oReader.GetDepth(); - while ( oReader.ReadNextSiblingNode( nCurDepth ) ) + if (false == oReader.IsEmptyNode()) { - std::wstring sName = oReader.GetName(); - if ( L"o:FieldCodes" == sName ) - m_oFieldCodes = oReader; - else if ( L"o:LinkType" == sName ) - m_oLinkType = oReader; - else if ( L"o:LockedField" == sName ) - m_oLockedField = oReader; + int nCurDepth = oReader.GetDepth(); + while (oReader.ReadNextSiblingNode(nCurDepth)) + { + std::wstring sName = oReader.GetName(); + if (L"o:FieldCodes" == sName) + m_oFieldCodes = oReader; + else if (L"o:LinkType" == sName) + m_oLinkType = oReader; + else if (L"o:LockedField" == sName) + m_oLockedField = oReader; + } + } + + OOX::CDocxFlat* docx_flat = dynamic_cast(m_pMainDocument); + if (docx_flat && false == m_oId.IsInit() && m_sObjectId.IsInit()) + { + std::map>::iterator pFind = docx_flat->m_mapOleData.find(*m_sObjectId); + + if (pFind != docx_flat->m_mapOleData.end()) + { + const OOX::RId rId = docx_flat->m_currentContainer->Add(pFind->second); + m_oId.Init(); + m_oId->SetValue(rId.get()); + } } } std::wstring COLEObject::toXML() const diff --git a/OOXML/DocxFormat/WritingElement.h b/OOXML/DocxFormat/WritingElement.h index 32578b01ff..9a941aeeae 100644 --- a/OOXML/DocxFormat/WritingElement.h +++ b/OOXML/DocxFormat/WritingElement.h @@ -788,6 +788,7 @@ namespace OOX et_w_bdo, // et_w_binData, // et_w_bgPict, // + et_w_docSuppData, // et_w_bookmarkEnd, // et_w_bookmarkStart, // et_w_br, // @@ -1547,6 +1548,7 @@ namespace OOX virtual ~Document(); std::wstring m_sDocumentPath; + std::wstring m_sTempPath; std::map> m_mapContent; }; diff --git a/OdfFile/Writer/Converter/ConvertDrawing.cpp b/OdfFile/Writer/Converter/ConvertDrawing.cpp index 8b071518da..7f9ee702cb 100644 --- a/OdfFile/Writer/Converter/ConvertDrawing.cpp +++ b/OdfFile/Writer/Converter/ConvertDrawing.cpp @@ -433,8 +433,7 @@ void OoxConverter::convert(PPTX::Logic::Pic *oox_picture) if (pFile.IsInit() && (OOX::FileTypes::Image == pFile->type())) { - OOX::Image* pImageFileCache = static_cast(pFile.GetPointer()); - + smart_ptr pImageFileCache = pFile.smart_dynamic_cast(); pathImage = pImageFileCache->filename().GetPath(); } } diff --git a/OdfFile/Writer/Converter/XlsxConverter.cpp b/OdfFile/Writer/Converter/XlsxConverter.cpp index 7b7dc84846..31edbefe00 100644 --- a/OdfFile/Writer/Converter/XlsxConverter.cpp +++ b/OdfFile/Writer/Converter/XlsxConverter.cpp @@ -3018,9 +3018,9 @@ void XlsxConverter::convert(OOX::Spreadsheet::COleObjects *oox_objects, OOX::Spr if (pFile.IsInit() && ( OOX::FileTypes::Image == pFile->type())) { - OOX::Image* pImageFileCache = static_cast(pFile.GetPointer()); - - if (pImageFileCache && odf_ref_image.empty()) + smart_ptr pImageFileCache = pFile.smart_dynamic_cast(); + + if (pImageFileCache.IsInit() && odf_ref_image.empty()) { odf_ref_image = odf_context()->add_imageobject(pImageFileCache->filename().GetPath()); } diff --git a/X2tConverter/src/ASCConverters.cpp b/X2tConverter/src/ASCConverters.cpp index 54a22070bc..bd83aeae93 100644 --- a/X2tConverter/src/ASCConverters.cpp +++ b/X2tConverter/src/ASCConverters.cpp @@ -503,7 +503,9 @@ namespace NExtractTools { nRes = docxflat2odt(sFrom, sTo, params, convertParams); } - else if (AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo) + else if ( AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX == nFormatTo || + AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCM == nFormatTo || + AVS_OFFICESTUDIO_FILE_OTHER_OOXML == nFormatTo) { nRes = docxflat2docx(sFrom, sTo, params, convertParams); } @@ -1398,8 +1400,9 @@ namespace NExtractTools _UINT32 fromInputParams(InputParams& oInputParams) { TConversionDirection conversion = oInputParams.getConversionDirection(); - std::wstring sFileFrom = *oInputParams.m_sFileFrom; - std::wstring sFileTo = *oInputParams.m_sFileTo; + + std::wstring sFileFrom = oInputParams.m_sFileFrom ? *oInputParams.m_sFileFrom : L""; + std::wstring sFileTo = oInputParams.m_sFileTo ? *oInputParams.m_sFileTo : L""; int nFormatFrom = AVS_OFFICESTUDIO_FILE_UNKNOWN; if (NULL != oInputParams.m_nFormatFrom) diff --git a/X2tConverter/src/cextracttools.h b/X2tConverter/src/cextracttools.h index 25b961f8d3..f88553afb0 100644 --- a/X2tConverter/src/cextracttools.h +++ b/X2tConverter/src/cextracttools.h @@ -1176,7 +1176,6 @@ namespace NExtractTools formatFrom == AVS_OFFICESTUDIO_FILE_DOCUMENT_FB2 || formatFrom == AVS_OFFICESTUDIO_FILE_DOCUMENT_MOBI || formatFrom == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOC_FLAT || - formatFrom == AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_FLAT || formatFrom == AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML_IN_CONTAINER || formatFrom == AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF) { diff --git a/X2tConverter/src/lib/docx.h b/X2tConverter/src/lib/docx.h index 0c84b853fb..66148a5f70 100644 --- a/X2tConverter/src/lib/docx.h +++ b/X2tConverter/src/lib/docx.h @@ -206,7 +206,6 @@ namespace NExtractTools m_oCDocxSerializer.setIsNoBase64(params.getIsNoBase64()); m_oCDocxSerializer.setFontDir(params.getFontPath()); - // bool bRes = m_oCDocxSerializer.saveToFile (sResDoct, sSrcDocx, sTemp); _UINT32 nRes = m_oCDocxSerializer.saveToFile(sTo, sFrom, params.getXmlOptions(), convertParams.m_sTempDir) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; return nRes; @@ -220,9 +219,10 @@ namespace NExtractTools BinDocxRW::CDocxSerializer m_oCDocxSerializer; _UINT32 nRes = 0; - if (m_oCDocxSerializer.convertFlat(sFrom, sTempUnpackedDOCX)) + if (m_oCDocxSerializer.convertFlat(sFrom, sTempUnpackedDOCX, params.m_bMacro, convertParams.m_sTempDir)) { - nRes = dir2zipMscrypt(sTempUnpackedDOCX, sTo, params, convertParams); + params.changeFormatFromPost(*params.m_nFormatFrom, params.m_bMacro); + nRes = dir2zipMscrypt(sTempUnpackedDOCX, *params.m_sFileTo, params, convertParams); } else { From 620827ad5355d595a224a72e5705c37d59daebbd Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 22 Feb 2024 10:28:49 +0300 Subject: [PATCH 210/221] . --- OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index c8573981b2..324e608fbb 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -3809,7 +3809,7 @@ void BinaryWorkbookTableWriter::WriteMdx(OOX::Spreadsheet::CMdx* pMdx) } if (pMdx->m_oF.IsInit()) { - int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::NameIndex); + int nCurPos = m_oBcw.WriteItemStart(c_oSer_MdxMetadata::FunctionTag); m_oBcw.m_oStream.WriteBYTE(pMdx->m_oF->GetValue()); m_oBcw.WriteItemWithLengthEnd(nCurPos); } From 0bc356ebff84bdac0ce0b86440e37c52304b3562 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Thu, 22 Feb 2024 13:13:37 +0300 Subject: [PATCH 211/221] fix bug #66057 --- OOXML/DocxFormat/DocxFlat.cpp | 21 +++++++++++--- OOXML/DocxFormat/DocxFlat.h | 2 ++ OOXML/DocxFormat/Settings/Settings.cpp | 39 ++++++++++++++++++++++++-- OOXML/XlsxFormat/Workbook/Metadata.cpp | 2 +- 4 files changed, 56 insertions(+), 8 deletions(-) diff --git a/OOXML/DocxFormat/DocxFlat.cpp b/OOXML/DocxFormat/DocxFlat.cpp index f83f95cca9..9496e53909 100644 --- a/OOXML/DocxFormat/DocxFlat.cpp +++ b/OOXML/DocxFormat/DocxFlat.cpp @@ -159,11 +159,24 @@ namespace OOX } else if (L"w:docSuppData" == sName && !oReader.IsEmptyNode()) { - m_oDocSuppData = new OOX::Logic::CDocSuppData(WritingElement::m_pMainDocument); - m_oDocSuppData->fromXML(oReader); - - ParsingSuppData(); + //m_oDocSuppData = new OOX::Logic::CDocSuppData(WritingElement::m_pMainDocument); + //m_oDocSuppData->fromXML(oReader); + // + //ParsingSuppData(); } + //CustomDocumentProperties + } + + if (!m_sCompatibilityMode.IsInit() && m_pCore.IsInit() && (m_pCore->m_sVersion.IsInit())) + { + if (false == m_pSettings.IsInit()) m_pSettings = new CSettings(this); + if (m_pSettings->m_oCompat.IsInit()) m_pSettings->m_oCompat.Init(); + + Settings::CCompatSetting* pSett = new Settings::CCompatSetting(); + pSett->m_sName = L"compatibilityMode"; + pSett->m_sUri = L"http://schemas.microsoft.com/office/word"; + pSett->m_sVal = m_pCore->m_sVersion; + m_pSettings->m_oCompat->m_arrCompatSettings.push_back(pSett); } if ((m_oDocSuppData.IsInit()) && (m_oDocSuppData->m_oBinData.IsInit()) && (m_pDocument.IsInit())) diff --git a/OOXML/DocxFormat/DocxFlat.h b/OOXML/DocxFormat/DocxFlat.h index 410509b289..2bc52d14cf 100644 --- a/OOXML/DocxFormat/DocxFlat.h +++ b/OOXML/DocxFormat/DocxFlat.h @@ -98,6 +98,8 @@ namespace OOX nullable m_pApp; nullable m_pCore; //----------------------------------------------------------- + nullable_string m_sCompatibilityMode; + std::map> m_mapImages; std::map> m_mapOleData; diff --git a/OOXML/DocxFormat/Settings/Settings.cpp b/OOXML/DocxFormat/Settings/Settings.cpp index 26f088d2b1..91072ee0d0 100644 --- a/OOXML/DocxFormat/Settings/Settings.cpp +++ b/OOXML/DocxFormat/Settings/Settings.cpp @@ -516,7 +516,6 @@ namespace Settings } void CCompatSetting::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { - // Читаем атрибуты if ( oReader.GetAttributesCount() <= 0 ) return; @@ -554,6 +553,15 @@ namespace Settings wsName = oReader.GetName(); } oReader.MoveToElement(); + + if (m_sName.IsInit() && (*m_sName == L"compatibilityMode") && m_sVal.IsInit()) + { + CDocxFlat* flat_docx = dynamic_cast(m_pMainDocument); + if (flat_docx) + { + flat_docx->m_sCompatibilityMode = *m_sVal; + } + } } //-------------------------------------------------------------------------------- @@ -669,24 +677,49 @@ namespace Settings m_oLayoutRawTableWidth = oReader; else if ( L"w:layoutTableRowsApart" == sName ) m_oLayoutTableRowsApart = oReader; - else if ( L"w:useWord97LineBreakRules" == sName ) + else if ( L"w:useWord97LineBreakRules" == sName ) m_oUseWord97LineBreakRules = oReader; + else if (L"w:breakWrappedTables" == sName) + { + m_oDoNotBreakWrappedTables = oReader; + m_oDoNotBreakWrappedTables->m_oVal.FromBool(!m_oDoNotBreakWrappedTables->m_oVal.ToBool()); + } else if ( L"w:doNotBreakWrappedTables" == sName ) m_oDoNotBreakWrappedTables = oReader; + else if (L"w:snapToGridInCell" == sName) + { + m_oDoNotSnapToGridInCell = oReader; + m_oDoNotSnapToGridInCell->m_oVal.FromBool(!m_oDoNotSnapToGridInCell->m_oVal.ToBool()); + } else if ( L"w:doNotSnapToGridInCell" == sName ) m_oDoNotSnapToGridInCell = oReader; else if ( L"w:selectFldWithFirstOrLastChar" == sName ) m_oSelectFldWithFirstOrLastChar = oReader; else if ( L"w:applyBreakingRules" == sName ) m_oApplyBreakingRules = oReader; + else if (L"w:wrapTextWithPunct" == sName) + { + m_oDoNotWrapTextWithPunct = oReader; + m_oDoNotWrapTextWithPunct->m_oVal.FromBool(!m_oDoNotWrapTextWithPunct->m_oVal.ToBool()); + } else if ( L"w:doNotWrapTextWithPunct" == sName ) m_oDoNotWrapTextWithPunct = oReader; + else if (L"w:useAsianBreakRules" == sName) + { + m_oDoNotUseEastAsianBreakRules = oReader; + m_oDoNotUseEastAsianBreakRules->m_oVal.FromBool(!m_oDoNotUseEastAsianBreakRules->m_oVal.ToBool()); + } else if ( L"w:doNotUseEastAsianBreakRules" == sName ) m_oDoNotUseEastAsianBreakRules = oReader; else if ( L"w:useWord2002TableStyleRules" == sName ) m_oUseWord2002TableStyleRules = oReader; else if ( L"w:growAutofit" == sName ) m_oGrowAutofit = oReader; + else if (L"w:dontGrowAutofit" == sName) + { + m_oGrowAutofit = oReader; + m_oGrowAutofit->m_oVal.FromBool(!m_oGrowAutofit->m_oVal.ToBool()); + } else if ( L"w:useFELayout" == sName ) m_oUseFELayout = oReader; else if ( L"w:useNormalStyleForList" == sName ) @@ -724,7 +757,7 @@ namespace Settings OOX::Settings::CCompatSetting *oCS = new OOX::Settings::CCompatSetting(); *oCS = oReader; - if (oCS)m_arrCompatSettings.push_back( oCS ); + if (oCS) m_arrCompatSettings.push_back( oCS ); } } } diff --git a/OOXML/XlsxFormat/Workbook/Metadata.cpp b/OOXML/XlsxFormat/Workbook/Metadata.cpp index 6bfa9e37be..7da7a64c2c 100644 --- a/OOXML/XlsxFormat/Workbook/Metadata.cpp +++ b/OOXML/XlsxFormat/Workbook/Metadata.cpp @@ -824,7 +824,7 @@ namespace OOX writer.WriteString(L""); + writer.WriteString(L" count=\"" + std::to_wstring(m_arrItems.size())); writer.WriteString(L">"); for (size_t i = 0; i < m_arrItems.size(); ++i) From 0c998e318b36f74b4050ac980a79ad517c901c24 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Sat, 24 Feb 2024 12:10:57 +0300 Subject: [PATCH 212/221] fix bug #34418 --- X2tConverter/src/lib/common.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/X2tConverter/src/lib/common.h b/X2tConverter/src/lib/common.h index 889e31a866..4e17ab999d 100644 --- a/X2tConverter/src/lib/common.h +++ b/X2tConverter/src/lib/common.h @@ -453,7 +453,7 @@ namespace NExtractTools else { COfficeUtils oCOfficeUtils(NULL); - hRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sOOXMLDir, sTo, true)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; + hRes = (S_OK == oCOfficeUtils.CompressFileOrDirectory(sOOXMLDir, sTo, false)) ? 0 : AVS_FILEUTILS_ERROR_CONVERT; } } else if (AVS_ERROR_DRM == hRes) From 7733825458b5156f0fee456cfc1ae6da60a856bd Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Mon, 26 Feb 2024 11:56:48 +0300 Subject: [PATCH 213/221] Fix compile --- OOXML/XlsxFormat/Worksheets/SheetData.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/OOXML/XlsxFormat/Worksheets/SheetData.cpp b/OOXML/XlsxFormat/Worksheets/SheetData.cpp index fc00ce1b7a..5bb3bc109e 100644 --- a/OOXML/XlsxFormat/Worksheets/SheetData.cpp +++ b/OOXML/XlsxFormat/Worksheets/SheetData.cpp @@ -71,6 +71,12 @@ #include #include +#ifndef MININT32 +#define MAXUINT32 ((uint32_t)~((uint32_t)0)) +#define MAXINT32 ((int32_t)(MAXUINT32 >> 1)) +#define MININT32 ((int32_t)~MAXINT32) +#endif + using namespace XLS; namespace OOX From 147d8ca783bd98992b30574ca98e44c4228c0d00 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Mon, 26 Feb 2024 16:14:04 +0300 Subject: [PATCH 214/221] for bug #66596 --- .../Presentation/BinaryFileReaderWriter.cpp | 34 +++++++++---------- .../Presentation/BinaryFileReaderWriter.h | 2 +- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp index 1c8ac5ae10..8c0481f39c 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp @@ -231,7 +231,7 @@ namespace NSBinPptxRW if (IsNeedDownload(strInput)) return DownloadImage(strInput); - std::map::const_iterator pPair = m_mapImages.find ((strBase64Image.empty()) ? strInput : strBase64Image); + std::map::const_iterator pPair = m_mapImages.find ((strBase64Image.empty()) ? strInput + oleData : strBase64Image + oleData); if (pPair != m_mapImages.end()) { @@ -386,9 +386,9 @@ namespace NSBinPptxRW } if (strBase64Image.empty()) - m_mapImages[strInput] = oImageManagerInfo; + m_mapImages[strInput + oleData] = oImageManagerInfo; else - m_mapImages [strBase64Image] = oImageManagerInfo; + m_mapImages [strBase64Image + oleData] = oImageManagerInfo; return oImageManagerInfo; } bool CImageManager2::WriteOleData(const std::wstring& sFilePath, const std::wstring& sData) @@ -1399,7 +1399,7 @@ namespace NSBinPptxRW } - CRelsGenerator::CRelsGenerator(CImageManager2* pManager) : m_lNextRelsID(1), m_mapImages() + CRelsGenerator::CRelsGenerator(CImageManager2* pManager) : m_lNextRelsID(1), m_mapRelsImages() { m_pManager = pManager; m_pWriter = new NSStringUtils::CStringBuilder(); @@ -1412,7 +1412,7 @@ namespace NSBinPptxRW { m_pWriter->ClearNoAttack(); m_lNextRelsID = 1; - m_mapImages.clear(); + m_mapRelsImages.clear(); m_mapLinks.clear(); } @@ -1614,20 +1614,20 @@ namespace NSBinPptxRW { _imageManager2Info oImageManagerInfo = m_pManager->GenerateMedia(strImage); - std::wstring strImageRelsPath; + std::wstring strMediaRelsPath; - if (m_pManager->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX) strImageRelsPath = L"media/"; - else strImageRelsPath = L"../media/"; + if (m_pManager->m_nDocumentType == XMLWRITER_DOC_TYPE_DOCX) strMediaRelsPath = L"media/"; + else strMediaRelsPath = L"../media/"; _relsGeneratorInfo oRelsGeneratorInfo; if (!oImageManagerInfo.sFilepathImage.empty()) { - strImageRelsPath += OOX::CPath(oImageManagerInfo.sFilepathImage).GetFilename(); + strMediaRelsPath += OOX::CPath(oImageManagerInfo.sFilepathImage).GetFilename(); - std::map::iterator pPair = m_mapImages.find(strImageRelsPath); + std::map::iterator pPair = m_mapRelsImages.find(strMediaRelsPath); - if (m_mapImages.end() != pPair) + if (m_mapRelsImages.end() != pPair) { return pPair->second; } @@ -1640,16 +1640,16 @@ namespace NSBinPptxRW if (type == 0) { m_pWriter->WriteString( L""); + L"\" Type=\"http://schemas.microsoft.com/office/2007/relationships/media\" Target=\"" + strMediaRelsPath + L"\"/>"); } else if (type == 1) { m_pWriter->WriteString( L""); + L"\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/audio\" Target=\"" + strMediaRelsPath + L"\"/>"); } } - m_mapImages.insert(std::pair(strImageRelsPath, oRelsGeneratorInfo)); + m_mapRelsImages.insert(std::pair(strMediaRelsPath, oRelsGeneratorInfo)); return oRelsGeneratorInfo; } @@ -1668,9 +1668,9 @@ namespace NSBinPptxRW { strImageRelsPath += OOX::CPath(oImageManagerInfo.sFilepathImage).GetFilename(); - std::map::iterator pPair = m_mapImages.find(strImageRelsPath); + std::map::iterator pPair = m_mapRelsImages.find(strImageRelsPath); - if (m_mapImages.end() != pPair) + if (m_mapRelsImages.end() != pPair) { return pPair->second; } @@ -1756,7 +1756,7 @@ namespace NSBinPptxRW } } } - m_mapImages.insert(std::pair(strImageRelsPath, oRelsGeneratorInfo)); + m_mapRelsImages.insert(std::pair(strImageRelsPath, oRelsGeneratorInfo)); return oRelsGeneratorInfo; } diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h index 8d4338d794..7ac79d1fab 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h @@ -468,7 +468,7 @@ namespace NSBinPptxRW { private: NSStringUtils::CStringBuilder* m_pWriter; - std::map m_mapImages; + std::map m_mapRelsImages; std::map m_mapLinks; public: unsigned int m_lNextRelsID; From 9bb45aa05d9cbc1c79e80304bfa047bc0a9fc60d Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 27 Feb 2024 14:15:20 +0300 Subject: [PATCH 215/221] fix bug #66622 --- .../Converter/docx_conversion_context.cpp | 27 +++++++++++++++++++ .../Converter/docx_conversion_context.h | 1 + OdfFile/Reader/Converter/oox_package.cpp | 7 ++++- OdfFile/Reader/Converter/oox_package.h | 2 ++ OdfFile/Reader/Format/paragraph_elements.cpp | 5 +++- .../Reader/Format/styles_lite_container.cpp | 23 ++++++++++++++++ OdfFile/Reader/Format/styles_lite_container.h | 1 + 7 files changed, 64 insertions(+), 2 deletions(-) diff --git a/OdfFile/Reader/Converter/docx_conversion_context.cpp b/OdfFile/Reader/Converter/docx_conversion_context.cpp index 3f43a5fbd5..647bcf01ce 100644 --- a/OdfFile/Reader/Converter/docx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/docx_conversion_context.cpp @@ -751,6 +751,15 @@ void docx_conversion_context::end_document() output_document_->get_docProps_files().set_app(package::simple_element::create(L"app.xml", dump_settings_app())); output_document_->get_docProps_files().set_core(package::simple_element::create(L"core.xml", dump_settings_core())); + std::wstring settings_custom = dump_settings_custom(); + if (false == settings_custom.empty()) + { + output_document_->get_docProps_files().set_custom(package::simple_element::create(L"custom.xml", settings_custom)); + output_document_->get_content_types_file().content()->add_override(L"/docProps/custom.xml", L"application/vnd.openxmlformats-officedocument.custom-properties+xml"); + output_document_->get_rels_files().add( + relationship(L"rCstmId", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties", L"docProps/custom.xml")); + } + for (size_t i = 0; i < charts_.size(); i++) { package::chart_content_ptr content = package::chart_content::create(); @@ -899,6 +908,24 @@ std::wstring docx_conversion_context::dump_settings_app() } return output.str(); } +std::wstring docx_conversion_context::dump_settings_custom() +{ + std::wstring user_defined = odf_document_->odf_context().DocProps().dump_user_defined(); + if (user_defined.empty()) return L""; + + std::wstringstream output; + CP_XML_WRITER(output) + { + CP_XML_NODE(L"Properties") + { + CP_XML_ATTR(L"xmlns", L"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties"); + CP_XML_ATTR(L"xmlns:vt", L"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + + CP_XML_STREAM() << user_defined; + } + } + return output.str(); +} std::wstring docx_conversion_context::dump_settings_core() { std::wstringstream output; diff --git a/OdfFile/Reader/Converter/docx_conversion_context.h b/OdfFile/Reader/Converter/docx_conversion_context.h index 895252b8e5..8ae7c5c4f9 100644 --- a/OdfFile/Reader/Converter/docx_conversion_context.h +++ b/OdfFile/Reader/Converter/docx_conversion_context.h @@ -803,6 +803,7 @@ public: std::wstring dump_settings_document(); std::wstring dump_settings_app(); std::wstring dump_settings_core(); + std::wstring dump_settings_custom(); bool next_dump_page_properties_; bool next_dump_section_; diff --git a/OdfFile/Reader/Converter/oox_package.cpp b/OdfFile/Reader/Converter/oox_package.cpp index 73f71f9cb2..c7ae4fc7f2 100644 --- a/OdfFile/Reader/Converter/oox_package.cpp +++ b/OdfFile/Reader/Converter/oox_package.cpp @@ -314,7 +314,6 @@ simple_element_ptr simple_element::create(const std::wstring & FileName, const s //----------------------------------------------------------------------------------------------- docProps_files::docProps_files() { - } std::wstring docProps_files::create_core() { @@ -358,6 +357,10 @@ void docProps_files::set_core(element_ptr Element) { core_ = Element; } +void docProps_files::set_custom(element_ptr Element) +{ + custom_ = Element; +} void docProps_files::write(const std::wstring & RootPath) { std::wstring path = RootPath + FILE_SEPARATOR_STR + L"docProps"; @@ -368,6 +371,8 @@ void docProps_files::write(const std::wstring & RootPath) core_->write(path); app_->write(path); + + if (custom_) custom_->write(path); } //--------------------------------------------------------------------------------------------------- media::media(mediaitems_ptr & _mediaitems, NSFonts::IApplicationFonts *pAppFonts) : mediaItems_(_mediaitems), appFonts_(pAppFonts) diff --git a/OdfFile/Reader/Converter/oox_package.h b/OdfFile/Reader/Converter/oox_package.h index 314537181a..38169628f6 100644 --- a/OdfFile/Reader/Converter/oox_package.h +++ b/OdfFile/Reader/Converter/oox_package.h @@ -203,6 +203,7 @@ public: void set_app(element_ptr Element); void set_core(element_ptr Element); + void set_custom(element_ptr Element); virtual void write(const std::wstring & RootPath); @@ -212,6 +213,7 @@ private: element_ptr core_; element_ptr app_; + element_ptr custom_; }; class document : public element { diff --git a/OdfFile/Reader/Format/paragraph_elements.cpp b/OdfFile/Reader/Format/paragraph_elements.cpp index 455e28aefe..dd5bc730bf 100644 --- a/OdfFile/Reader/Format/paragraph_elements.cpp +++ b/OdfFile/Reader/Format/paragraph_elements.cpp @@ -1874,7 +1874,10 @@ void text_user_defined::docx_convert(oox::docx_conversion_context & Context) if (!value.empty()) text_ = text::create(value) ; - docx_serialize_run(text_, Context); + if (text_name_) + docx_serialize_field(XmlUtils::EncodeXmlString(L"DOCPROPERTY \"" + *text_name_ + L"\""), text_, Context, false); + else + docx_serialize_run(text_, Context); } //----------------------------------------------------------------------------------------------- // text:bibliography-mark diff --git a/OdfFile/Reader/Format/styles_lite_container.cpp b/OdfFile/Reader/Format/styles_lite_container.cpp index 59e80fe20f..a6552526ae 100644 --- a/OdfFile/Reader/Format/styles_lite_container.cpp +++ b/OdfFile/Reader/Format/styles_lite_container.cpp @@ -35,6 +35,7 @@ #include "styles_lite_container.h" #include "office_settings.h" +#include "..\..\Common\xml\simple_xml_writer.h" namespace cpdoccore { @@ -107,6 +108,28 @@ std::wstring doc_props_container::get_user_defined(const std::wstring & name) return pFind != impl_->map_user_defineds.end() ? pFind->second : L""; } +std::wstring doc_props_container::dump_user_defined() +{ + std::wstringstream output; + + CP_XML_WRITER(output) + { + for (std::map::iterator it = impl_->map_user_defineds.begin(); it != impl_->map_user_defineds.end(); ++it) + { + CP_XML_NODE(L"property") + { + CP_XML_ATTR(L"fmtid", L"{D5CDD505-2E9C-101B-9397-08002B2CF9AE}"); + CP_XML_ATTR(L"name", it->first); + CP_XML_ATTR(L"pid", 2); + CP_XML_NODE(L"vt:lpwstr") + { + CP_XML_STREAM() << it->second; + } + } + } + } + return output.str(); +} //---------------------------------------------------------------------------------- struct settings_value diff --git a/OdfFile/Reader/Format/styles_lite_container.h b/OdfFile/Reader/Format/styles_lite_container.h index 3d5dedbb2c..06fc5f3484 100644 --- a/OdfFile/Reader/Format/styles_lite_container.h +++ b/OdfFile/Reader/Format/styles_lite_container.h @@ -64,6 +64,7 @@ public: void add_user_defined(const std::wstring & name, const std::wstring & value); std::wstring get_user_defined(const std::wstring & name); + std::wstring dump_user_defined(); std::wstring dc_creator_; std::wstring dc_date_; From 8ebd23defb09e35eba4cfa4f0d2662f55816bb23 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 27 Feb 2024 17:17:35 +0300 Subject: [PATCH 216/221] UserProtectedRangeType --- .../Sheets/Common/BinReaderWriterDefines.h | 6 +++-- OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 12 ++++++++++ OOXML/Binary/Sheets/Writer/BinaryReader.cpp | 10 +++++++++ OOXML/Common/SimpleTypes_Spreadsheet.cpp | 22 +++++++++++++++++++ OOXML/Common/SimpleTypes_Spreadsheet.h | 8 +++++++ .../Worksheets/WorksheetChildOther.cpp | 6 +++++ .../Worksheets/WorksheetChildOther.h | 3 +++ 7 files changed, 65 insertions(+), 2 deletions(-) diff --git a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h index d29f7c20f7..b83bf9c7ea 100644 --- a/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h +++ b/OOXML/Binary/Sheets/Common/BinReaderWriterDefines.h @@ -1353,12 +1353,14 @@ namespace BinXlsxRW Name = 2, Text = 3, User = 4, - UsersGroup = 5 + UsersGroup = 5, + Type = 6 };} namespace c_oSer_UserProtectedRangeDesc {enum c_oSer_UserProtectedRangeDesc { Id = 0, - Name = 1 + Name = 1, + Type = 2 };} namespace c_oSer_DataValidation{enum c_oSer_DataValidation { diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index 324e608fbb..310abf4fb2 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -8003,6 +8003,12 @@ void BinaryWorksheetTableWriter::WriteUserProtectedRangeDesc(const OOX::Spreadsh m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Variable); m_oBcw.m_oStream.WriteStringW(*desc.name); } + if (desc.type.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_UserProtectedRangeDesc::Type); + m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + m_oBcw.m_oStream.WriteBYTE(desc.type->GetValue()); + } } void BinaryWorksheetTableWriter::WriteUserProtectedRange(const OOX::Spreadsheet::CUserProtectedRange& oUserProtectedRange) { @@ -8024,6 +8030,12 @@ void BinaryWorksheetTableWriter::WriteUserProtectedRange(const OOX::Spreadsheet: m_oBcw.m_oStream.WriteStringW(*oUserProtectedRange.m_oText); m_oBcw.WriteItemEnd(nCurPos); } + if (oUserProtectedRange.m_oType.IsInit()) + { + m_oBcw.m_oStream.WriteBYTE(c_oSer_UserProtectedRange::Type); + m_oBcw.m_oStream.WriteBYTE(c_oSerPropLenType::Byte); + m_oBcw.m_oStream.WriteBYTE(oUserProtectedRange.m_oType->GetValue()); + } for (size_t i = 0; i < oUserProtectedRange.m_arUsers.size(); ++i) { int nCurPos = m_oBcw.WriteItemStart(c_oSer_UserProtectedRange::User); diff --git a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp index dad8a2faca..95fb29a792 100644 --- a/OOXML/Binary/Sheets/Writer/BinaryReader.cpp +++ b/OOXML/Binary/Sheets/Writer/BinaryReader.cpp @@ -6844,6 +6844,11 @@ int BinaryWorksheetsTableReader::ReadUserProtectedRangeDesc(BYTE type, long leng { desc->id = m_oBufferedStream.GetString4(length); } + else if (c_oSer_UserProtectedRangeDesc::Type == type) + { + desc->type.Init(); + desc->type->SetValueFromByte(m_oBufferedStream.GetUChar()); + } else res = c_oSerConstants::ReadUnknown; return res; @@ -6864,6 +6869,11 @@ int BinaryWorksheetsTableReader::ReadUserProtectedRange(BYTE type, long length, { pUserProtectedRange->m_oText = m_oBufferedStream.GetString4(length); } + else if (c_oSer_UserProtectedRange::Type == type) + { + pUserProtectedRange->m_oType.Init(); + pUserProtectedRange->m_oType->SetValueFromByte(m_oBufferedStream.GetUChar()); + } else if (c_oSer_UserProtectedRange::User == type) { OOX::Spreadsheet::CUserProtectedRange::_UsersGroupsDesc desc; diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.cpp b/OOXML/Common/SimpleTypes_Spreadsheet.cpp index 4df1ea497f..24d91f3e28 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.cpp +++ b/OOXML/Common/SimpleTypes_Spreadsheet.cpp @@ -3393,5 +3393,27 @@ namespace SimpleTypes } return L"v"; } + EUserProtectedRangeType CUserProtectedRangeType::FromString(const std::wstring& sValue) + { + if (L"notView" == sValue) + this->m_eValue = typeNotView; + else if (L"view" == sValue) + this->m_eValue = typeView; + else if (L"edit" == sValue) + this->m_eValue = typeEdit; + else + this->m_eValue = typeEdit; + return this->m_eValue; + } + std::wstring CUserProtectedRangeType::ToString() const + { + switch (this->m_eValue) + { + case typeNotView: return L"notView"; break; + case typeView: return L"view"; break; + case typeEdit: return L"edit"; break; + } + return L"edit"; + } }// Spreadsheet } // SimpleTypes diff --git a/OOXML/Common/SimpleTypes_Spreadsheet.h b/OOXML/Common/SimpleTypes_Spreadsheet.h index d132525ca8..97c7808f93 100644 --- a/OOXML/Common/SimpleTypes_Spreadsheet.h +++ b/OOXML/Common/SimpleTypes_Spreadsheet.h @@ -1441,5 +1441,13 @@ namespace SimpleTypes }; DEFINE_SIMPLE_TYPE(CMdxFunctionType, EMdxFunctionType, mdxFunctionType_m) + enum EUserProtectedRangeType + { + typeNotView = 0, + typeView = 1, + typeEdit = 2 + }; + DEFINE_SIMPLE_TYPE(CUserProtectedRangeType, EUserProtectedRangeType, typeView) + }// Spreadsheet } // SimpleTypes diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp index c5dde243d3..8fd1f88385 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.cpp @@ -3332,6 +3332,7 @@ namespace OOX WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"name", m_oName) WritingElement_ReadAttributes_Read_else_if(oReader, L"sqref", m_oSqref) + WritingElement_ReadAttributes_Read_else_if(oReader, L"type", m_oType) WritingElement_ReadAttributes_End(oReader) } void CUserProtectedRange::fromXML(XmlUtils::CXmlLiteReader& oReader) @@ -3362,6 +3363,7 @@ namespace OOX WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"id", desc.id) WritingElement_ReadAttributes_Read_else_if(oReader, L"name", desc.name) + WritingElement_ReadAttributes_Read_else_if(oReader, L"type", desc.type) WritingElement_ReadAttributes_End(oReader) m_arUsers.push_back(desc); } @@ -3379,6 +3381,7 @@ namespace OOX WritingElement_ReadAttributes_Start(oReader) WritingElement_ReadAttributes_Read_if(oReader, L"id", desc.id) WritingElement_ReadAttributes_Read_else_if(oReader, L"name", desc.name) + WritingElement_ReadAttributes_Read_else_if(oReader, L"type", desc.type) WritingElement_ReadAttributes_End(oReader) m_arUsersGroups.push_back(desc); } @@ -3391,6 +3394,7 @@ namespace OOX writer.WriteString(L"ToString()) writer.WriteString(L">"); if (m_oText.IsInit()) @@ -3407,6 +3411,7 @@ namespace OOX writer.WriteString(L"ToString()) writer.WriteString(L"/>"); } writer.WriteString(L""); @@ -3419,6 +3424,7 @@ namespace OOX writer.WriteString(L"ToString()) writer.WriteString(L"/>"); } writer.WriteString(L""); diff --git a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h index f6b7c54bcd..201fea2061 100644 --- a/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/OOXML/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -55,6 +55,7 @@ namespace SimpleTypes class CPaneState; class CSheetViewType; class CDataConsolidateFunction; + class CUserProtectedRangeType; } } @@ -870,6 +871,7 @@ namespace OOX { nullable_string id; nullable_string name; + nullable type; }; WritingElement_AdditionMethods(CUserProtectedRange) @@ -889,6 +891,7 @@ namespace OOX nullable_string m_oName; nullable_string m_oSqref; nullable_string m_oText; + nullable m_oType; std::vector<_UsersGroupsDesc> m_arUsers; std::vector<_UsersGroupsDesc> m_arUsersGroups; From 163e21acf4ddaa9d5c4a41a734d919b284bac570 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Tue, 27 Feb 2024 17:56:13 +0300 Subject: [PATCH 217/221] fix bug #53909 --- .../DocFile/TableRowPropertiesMapping.cpp | 263 ++++++++++-------- 1 file changed, 150 insertions(+), 113 deletions(-) diff --git a/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp b/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp index a74ba36dda..e322590c9f 100644 --- a/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp +++ b/MsBinaryFile/DocFile/TableRowPropertiesMapping.cpp @@ -60,7 +60,9 @@ namespace DocFileFormat std::shared_ptr brcHorz; std::shared_ptr brcVert; - //delete infos + XMLTools::XMLElement* _tcMar = NULL; + + //delete infos RevisionData rev( _rowEndChpx ); if ( ( _rowEndChpx != NULL ) && ( rev.Type == Deleted ) ) @@ -72,133 +74,162 @@ namespace DocFileFormat XMLTools::XMLElement rowHeight(L"w:trHeight"); for ( std::vector::iterator iter = tapx->grpprl->begin(); iter != tapx->grpprl->end(); iter++ ) { - switch ( iter->OpCode ) + switch (iter->OpCode) { - case sprmOldTDefTable: - case sprmTDefTable: + case sprmOldTDefTable: + case sprmTDefTable: + { + //SprmTDefTable tdef = new SprmTDefTable(sprm.Arguments); + }break; + case sprmOldTTableHeader: + case sprmTTableHeader: + { //header row + + bool fHeader = (iter->Arguments[0] != 0) ? (true) : (false); + + if (fHeader) { - //SprmTDefTable tdef = new SprmTDefTable(sprm.Arguments); - }break; - case sprmOldTTableHeader: - case sprmTTableHeader: - { //header row - - bool fHeader = ( iter->Arguments[0] != 0 ) ? (true) : (false); - - if ( fHeader ) - { - XMLTools::XMLElement header( L"w:tblHeader" ); - _trPr->AppendChild( header ); - } - }break; - case sprmTWidthAfter: - { //width after - XMLTools::XMLElement wAfter( L"w:wAfter" ); - XMLTools::XMLAttribute wAfterValue( L"w:w", FormatUtils::IntToWideString( FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize ) ) ); - wAfter.AppendAttribute( wAfterValue ); - - XMLTools::XMLAttribute wAfterType( L"w:type", L"dxa" ); - wAfter.AppendAttribute( wAfterType ); - _trPr->AppendChild( wAfter, true ); - }break; - case sprmTWidthBefore: - { //width before - short before = FormatUtils::BytesToInt16( iter->Arguments, 1, iter->argumentsSize ); - - if ( before != 0 ) - { - XMLTools::XMLElement wBefore( L"w:wBefore" ); - XMLTools::XMLAttribute wBeforeValue( L"w:w", FormatUtils::IntToWideString( before ) ); - wBefore.AppendAttribute( wBeforeValue ); - - XMLTools::XMLAttribute wBeforeType( L"w:type", L"dxa" ); - wBefore.AppendAttribute( wBeforeType ); - _trPr->AppendChild( wBefore, true ); - } - }break; - case sprmOldTDyaRowHeight: - case sprmTDyaRowHeight: - { //row height - XMLTools::XMLAttribute rowHeightVal( L"w:val" ); - XMLTools::XMLAttribute rowHeightRule( L"w:hRule" ); - - short rH = FormatUtils::BytesToInt16( iter->Arguments, 0, iter->argumentsSize ); - - if ( rH > 0 ) - { - rowHeightRule.SetValue( L"atLeast" ); - rowHeightVal.SetValue( FormatUtils::IntToWideString( rH ) ); - rowHeight.AppendAttribute( rowHeightVal ); - } - else if( rH == 0 ) - { - rowHeightRule.SetValue( L"auto" ); - } - else - { - rowHeightRule.SetValue( L"exact" ); - rH *= -1; - rowHeightVal.SetValue( FormatUtils::IntToWideString( rH ) ); - rowHeight.AppendAttribute( rowHeightVal ); - } - rowHeight.AppendAttribute( rowHeightRule ); + XMLTools::XMLElement header(L"w:tblHeader"); + _trPr->AppendChild(header); } + }break; + case sprmTWidthAfter: + { //width after + XMLTools::XMLElement wAfter(L"w:wAfter"); + XMLTools::XMLAttribute wAfterValue(L"w:w", FormatUtils::IntToWideString(FormatUtils::BytesToInt16(iter->Arguments, 1, iter->argumentsSize))); + wAfter.AppendAttribute(wAfterValue); + + XMLTools::XMLAttribute wAfterType(L"w:type", L"dxa"); + wAfter.AppendAttribute(wAfterType); + _trPr->AppendChild(wAfter, true); + }break; + case sprmTWidthBefore: + { //width before + short before = FormatUtils::BytesToInt16(iter->Arguments, 1, iter->argumentsSize); + + if (before != 0) + { + XMLTools::XMLElement wBefore(L"w:wBefore"); + XMLTools::XMLAttribute wBeforeValue(L"w:w", FormatUtils::IntToWideString(before)); + wBefore.AppendAttribute(wBeforeValue); + + XMLTools::XMLAttribute wBeforeType(L"w:type", L"dxa"); + wBefore.AppendAttribute(wBeforeType); + _trPr->AppendChild(wBefore, true); + } + }break; + case sprmOldTDyaRowHeight: + case sprmTDyaRowHeight: + { //row height + XMLTools::XMLAttribute rowHeightVal(L"w:val"); + XMLTools::XMLAttribute rowHeightRule(L"w:hRule"); + + short rH = FormatUtils::BytesToInt16(iter->Arguments, 0, iter->argumentsSize); + + if (rH > 0) + { + rowHeightRule.SetValue(L"atLeast"); + rowHeightVal.SetValue(FormatUtils::IntToWideString(rH)); + rowHeight.AppendAttribute(rowHeightVal); + } + else if (rH == 0) + { + rowHeightRule.SetValue(L"auto"); + } + else + { + rowHeightRule.SetValue(L"exact"); + rH *= -1; + rowHeightVal.SetValue(FormatUtils::IntToWideString(rH)); + rowHeight.AppendAttribute(rowHeightVal); + } + rowHeight.AppendAttribute(rowHeightRule); + } + break; + case sprmOldTFCantSplit: + case sprmTFCantSplit: break; - case sprmOldTFCantSplit: - case sprmTFCantSplit: - break; - case sprmTFCantSplit90: - { //can't split - if (iter->argumentsSize > 0 && iter->Arguments[0] != 0) - appendFlagElement( _trPr, *iter, L"cantSplit", true ); - }break; - case sprmTIpgp:// = PGPInfo.ipgpSelf (PGPInfo structure describes the border and margin properties) - { //div id - }break; - case sprmTCellSpacing: - case sprmTCellSpacingDefault: + case sprmTFCantSplit90: + { //can't split + if (iter->argumentsSize > 0 && iter->Arguments[0] != 0) + appendFlagElement(_trPr, *iter, L"cantSplit", true); + }break; + case sprmTIpgp:// = PGPInfo.ipgpSelf (PGPInfo structure describes the border and margin properties) + { //div id + }break; + case sprmTCellSpacing: + case sprmTCellSpacingDefault: + { + unsigned char grfbrc = iter->Arguments[2]; + short wSpc = FormatUtils::BytesToInt16(iter->Arguments, 4, iter->argumentsSize); + std::wstring strValue = FormatUtils::IntToWideString(wSpc); + if (FormatUtils::BitmaskToBool((int)grfbrc, 0x01)) { - unsigned char grfbrc = iter->Arguments[2]; - short wSpc = FormatUtils::BytesToInt16(iter->Arguments, 4, iter->argumentsSize); - std::wstring strValue = FormatUtils::IntToWideString(wSpc); - if (FormatUtils::BitmaskToBool((int)grfbrc, 0x01)) - { - appendDxaElement(_trPr, L"tblCellSpacing", strValue, true); - } - }break; - case sprmTTableBorders80: + appendDxaElement(_trPr, L"tblCellSpacing", strValue, true); + } + }break; + case sprmTTableBorders80: + { + const int size = 4; + unsigned char brc80[size]; + + memcpy(brc80, iter->Arguments, size); + brcTop = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 4), size); + brcLeft = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 8), size); + brcBottom = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 12), size); + brcRight = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 16), size); + brcHorz = std::shared_ptr(new BorderCode(brc80, size)); + + memcpy(brc80, (iter->Arguments + 20), size); + brcVert = std::shared_ptr(new BorderCode(brc80, size)); + }break; + case sprmTCellPaddingDefault: + case sprmTCellPadding: + case sprmTCellPaddingOuter: + { + unsigned char first = iter->Arguments[0]; + unsigned char lim = iter->Arguments[1]; + unsigned char ftsMargin = iter->Arguments[3]; + short wMargin = FormatUtils::BytesToInt16(iter->Arguments, 4, iter->argumentsSize); + + if (!_tcMar) _tcMar = new XMLTools::XMLElement(L"w:tblCellMar"); + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 0) == true) { - const int size = 4; - unsigned char brc80[size]; + appendDxaElement(_tcMar, L"top", FormatUtils::IntToWideString(wMargin), true); + } - memcpy(brc80, iter->Arguments, size); - brcTop = std::shared_ptr(new BorderCode(brc80, size)); + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 1) == true) + { + appendDxaElement(_tcMar, L"left", FormatUtils::IntToWideString(wMargin), true); + } - memcpy(brc80, (iter->Arguments + 4), size); - brcLeft = std::shared_ptr(new BorderCode(brc80, size)); + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 2) == true) + { + appendDxaElement(_tcMar, L"bottom", FormatUtils::IntToWideString(wMargin), true); + } - memcpy(brc80, (iter->Arguments + 8), size); - brcBottom = std::shared_ptr(new BorderCode(brc80, size)); - - memcpy(brc80, (iter->Arguments + 12), size); - brcRight = std::shared_ptr(new BorderCode(brc80, size)); - - memcpy(brc80, (iter->Arguments + 16), size); - brcHorz = std::shared_ptr(new BorderCode(brc80, size)); - - memcpy(brc80, (iter->Arguments + 20), size); - brcVert = std::shared_ptr(new BorderCode(brc80, size)); - }break; - default: - break; + if (FormatUtils::GetBitFromInt(iter->Arguments[2], 3) == true) + { + appendDxaElement(_tcMar, L"right", FormatUtils::IntToWideString(wMargin), true); + } + } + default: + break; } } if (rowHeight.GetAttributeCount() > 0) { _trPr->AppendChild(rowHeight); } - - //set borders + //set borders XMLTools::XMLElement* _tblBorders = new XMLTools::XMLElement(L"w:tblBorders"); if (brcTop) { @@ -240,6 +271,10 @@ namespace DocFileFormat { _tblPrEx->AppendChild(*_tblBorders); } + if (_tcMar && _tcMar->GetChildCount() > 0) + { + _tblPrEx->AppendChild(*(_tcMar)); + } //--------------------------------------------------------------------------- if ( _tblPrEx->GetChildCount() > 0 ) { @@ -249,5 +284,7 @@ namespace DocFileFormat { m_pXmlWriter->WriteString( _trPr->GetXMLString() ); } + + RELEASEOBJECT(_tcMar); } } From 63c38399ad17a9d4df4a035cb16710b51a987497 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 28 Feb 2024 14:50:08 +0300 Subject: [PATCH 218/221] fix build --- OdfFile/Reader/Format/styles_lite_container.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OdfFile/Reader/Format/styles_lite_container.cpp b/OdfFile/Reader/Format/styles_lite_container.cpp index a6552526ae..0b74c34cd9 100644 --- a/OdfFile/Reader/Format/styles_lite_container.cpp +++ b/OdfFile/Reader/Format/styles_lite_container.cpp @@ -35,7 +35,7 @@ #include "styles_lite_container.h" #include "office_settings.h" -#include "..\..\Common\xml\simple_xml_writer.h" +#include "../../Common/xml/simple_xml_writer.h" namespace cpdoccore { From 6a628a21fb92cc4b1da8d54359469e2cce1219e6 Mon Sep 17 00:00:00 2001 From: Oleg Korshul Date: Wed, 28 Feb 2024 17:08:44 +0300 Subject: [PATCH 219/221] Add 3dParty list --- 3DPARTY.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 3DPARTY.md diff --git a/3DPARTY.md b/3DPARTY.md new file mode 100644 index 0000000000..c4fb68308e --- /dev/null +++ b/3DPARTY.md @@ -0,0 +1,18 @@ + +## Third-party + +- boost ([BSL](https://raw.githubusercontent.com/boostorg/boost/master/LICENSE_1_0.txt)) +- icu ([UNICODE LICENSE V3](https://raw.githubusercontent.com/unicode-org/icu/main/LICENSE)) +- freetype ([FTL](https://raw.githubusercontent.com/freetype/freetype/master/docs/FTL.TXT)) +- harfbuzz ([MIT](https://raw.githubusercontent.com/harfbuzz/harfbuzz/main/COPYING)) +- hyphen ([MPL](https://raw.githubusercontent.com/hunspell/hyphen/master/COPYING)) +- hunspell ([MPL](https://raw.githubusercontent.com/hunspell/hunspell/master/COPYING.MPL)) +- gumbo ([Apache-2.0](https://raw.githubusercontent.com/google/gumbo-parser/master/COPYING)) +- katana ([MIT](https://raw.githubusercontent.com/jasenhuang/katana-parser/master/LICENSE)) +- cximage ([CXIMAGE LICENCE](https://raw.githubusercontent.com/movableink/cximage/master/license.txt)) +- openjpeg ([2-clause BSD License](https://raw.githubusercontent.com/uclouvain/openjpeg/master/LICENSE)) +- socket.io-client-cpp ([MIT](https://raw.githubusercontent.com/socketio/socket.io-client-cpp/master/LICENSE)) +- curl ([CURL LICENCE](https://raw.githubusercontent.com/curl/curl/master/COPYING)) +- cryptopp ([BSL](https://raw.githubusercontent.com/weidai11/cryptopp/master/License.txt)) +- openssl ([Apache-2.0](https://raw.githubusercontent.com/openssl/openssl/master/LICENSE.txt)) +- v8 ([3-clause BSD License](https://raw.githubusercontent.com/v8/v8/main/LICENSE)) From f973a0a952abc155a651f7dcc7e1068bfff7ef34 Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 28 Feb 2024 21:13:35 +0300 Subject: [PATCH 220/221] fix bug #66651 --- .../Document/BinReader/ReaderClasses.cpp | 2 +- OOXML/DocxFormat/Logic/ParagraphProperty.cpp | 2 +- OOXML/DocxFormat/Logic/RunProperty.cpp | 2 +- OOXML/DocxFormat/Logic/SectionProperty.cpp | 6 +++--- OOXML/DocxFormat/Logic/Table.cpp | 6 +++--- OOXML/DocxFormat/Logic/TableProperty.cpp | 16 +++++++-------- .../Converter/docx_conversion_context.cpp | 4 ++-- OdfFile/Reader/Converter/docx_package.cpp | 2 +- RtfFile/Format/RtfChar.cpp | 12 +++++------ RtfFile/Format/RtfField.cpp | 4 ++-- RtfFile/Format/RtfOle.cpp | 4 ++-- RtfFile/Format/RtfProperty.cpp | 20 +++++++++---------- RtfFile/Format/RtfSection.cpp | 2 +- RtfFile/Format/RtfShape.cpp | 4 ++-- RtfFile/OOXml/Writer/OOXCommentsWriter.cpp | 2 +- 15 files changed, 44 insertions(+), 44 deletions(-) diff --git a/OOXML/Binary/Document/BinReader/ReaderClasses.cpp b/OOXML/Binary/Document/BinReader/ReaderClasses.cpp index cb770c5835..b7821ba0f7 100644 --- a/OOXML/Binary/Document/BinReader/ReaderClasses.cpp +++ b/OOXML/Binary/Document/BinReader/ReaderClasses.cpp @@ -681,7 +681,7 @@ namespace BinDocxRW { { std::wstring sUserName = XmlUtils::EncodeXmlString(pComment->UserName); sRes += L" w:author=\""; - sRes += (sUserName); + sRes += XmlUtils::EncodeXmlString(sUserName); sRes += L"\""; } if (false == pComment->Date.empty()) diff --git a/OOXML/DocxFormat/Logic/ParagraphProperty.cpp b/OOXML/DocxFormat/Logic/ParagraphProperty.cpp index f278206127..5f4d01af35 100644 --- a/OOXML/DocxFormat/Logic/ParagraphProperty.cpp +++ b/OOXML/DocxFormat/Logic/ParagraphProperty.cpp @@ -310,7 +310,7 @@ namespace OOX if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } diff --git a/OOXML/DocxFormat/Logic/RunProperty.cpp b/OOXML/DocxFormat/Logic/RunProperty.cpp index fbee069b42..aa1fac8740 100644 --- a/OOXML/DocxFormat/Logic/RunProperty.cpp +++ b/OOXML/DocxFormat/Logic/RunProperty.cpp @@ -170,7 +170,7 @@ namespace OOX if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/SectionProperty.cpp b/OOXML/DocxFormat/Logic/SectionProperty.cpp index 9c8e661353..7b285e12f0 100644 --- a/OOXML/DocxFormat/Logic/SectionProperty.cpp +++ b/OOXML/DocxFormat/Logic/SectionProperty.cpp @@ -1438,9 +1438,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/Table.cpp b/OOXML/DocxFormat/Logic/Table.cpp index 3928acf049..0ffabd11e5 100644 --- a/OOXML/DocxFormat/Logic/Table.cpp +++ b/OOXML/DocxFormat/Logic/Table.cpp @@ -228,9 +228,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OOXML/DocxFormat/Logic/TableProperty.cpp b/OOXML/DocxFormat/Logic/TableProperty.cpp index a9ea47665f..5ee91e757f 100644 --- a/OOXML/DocxFormat/Logic/TableProperty.cpp +++ b/OOXML/DocxFormat/Logic/TableProperty.cpp @@ -68,7 +68,7 @@ namespace ComplexTypes if ( m_sAuthor.IsInit() ) { sResult += L"w:author=\""; - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += L"\" "; } @@ -1004,7 +1004,7 @@ namespace OOX if ( m_sAuthor.IsInit() ) { sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); sResult += _T("\" "); } @@ -1263,9 +1263,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) @@ -1742,9 +1742,9 @@ namespace OOX if ( m_sAuthor.IsInit() ) { - sResult += _T("w:author=\""); - sResult += m_sAuthor.get2(); - sResult += _T("\" "); + sResult += L"w:author=\""; + sResult += XmlUtils::EncodeXmlString(m_sAuthor.get2()); + sResult += L"\" "; } if ( m_oDate.IsInit() ) diff --git a/OdfFile/Reader/Converter/docx_conversion_context.cpp b/OdfFile/Reader/Converter/docx_conversion_context.cpp index 647bcf01ce..344f467955 100644 --- a/OdfFile/Reader/Converter/docx_conversion_context.cpp +++ b/OdfFile/Reader/Converter/docx_conversion_context.cpp @@ -2404,7 +2404,7 @@ void docx_conversion_context::start_text_changes (const std::wstring &id) if (state_.in_paragraph_) { - std::wstring format_change = L" w:date=\"" + state.date + L"\" w:author=\"" + state.author + L"\""; + std::wstring format_change = L" w:date=\"" + state.date + L"\" w:author=\"" + XmlUtils::EncodeXmlString(state.author) + L"\""; finish_run(); state.in_drawing = get_drawing_state_content(); @@ -2465,7 +2465,7 @@ void docx_conversion_context::start_changes(bool in_para) std::wstring change_attr; change_attr += L" w:date=\"" + state.date + L"\""; - change_attr += L" w:author=\"" + state.author + L"\""; + change_attr += L" w:author=\"" + XmlUtils::EncodeXmlString(state.author) + L"\""; if (state.oox_id == 0) { diff --git a/OdfFile/Reader/Converter/docx_package.cpp b/OdfFile/Reader/Converter/docx_package.cpp index 63570d4cf4..45916a33dc 100644 --- a/OdfFile/Reader/Converter/docx_package.cpp +++ b/OdfFile/Reader/Converter/docx_package.cpp @@ -461,7 +461,7 @@ void comments_elements::write(const std::wstring & RootPath) { content << L"0) - content << L"w:author=\""<< elm.author << "\" "; + content << L"w:author=\""<< XmlUtils::EncodeXmlString(elm.author) << "\" "; if (elm.date.length()>0) content << L"w:date=\""<< elm.date << "\" "; content<< L">"; diff --git a/RtfFile/Format/RtfChar.cpp b/RtfFile/Format/RtfChar.cpp index 47f322b4ad..8bed868948 100644 --- a/RtfFile/Format/RtfChar.cpp +++ b/RtfFile/Format/RtfChar.cpp @@ -132,7 +132,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nRevised = PROP_DEF; } if (m_oProperty.m_nDeleted != PROP_DEF) @@ -142,7 +142,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nDeleted = PROP_DEF; } sResult += L""; @@ -173,7 +173,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nRevised = PROP_DEF; } if (m_oProperty.m_nDeleted != PROP_DEF) @@ -183,7 +183,7 @@ std::wstring RtfChar::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nDeleted = PROP_DEF; } sResult += m_oProperty.RenderToOOX(oRenderParameter);//w:rPr внутри @@ -415,7 +415,7 @@ std::wstring RtfCharSpecial::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nRevised = PROP_DEF; } if (m_oProperty.m_nDeleted != PROP_DEF) @@ -425,7 +425,7 @@ std::wstring RtfCharSpecial::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oProperty.m_nDeleted = PROP_DEF; } sResult += L""; diff --git a/RtfFile/Format/RtfField.cpp b/RtfFile/Format/RtfField.cpp index 7efac19245..a18d902e84 100644 --- a/RtfFile/Format/RtfField.cpp +++ b/RtfFile/Format/RtfField.cpp @@ -289,7 +289,7 @@ std::wstring RtfField::RenderToOOX(RenderParameter oRenderParameter) sAuthor = pRtfDocument->m_oRevisionTable.GetAuthor(m_pInsert->m_oCharProperty.m_nRevauth); sDate = std::wstring(RtfUtility::convertDateTime(m_pInsert->m_oCharProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_pInsert->m_oCharProperty.m_nRevised = PROP_DEF; } if (m_pInsert->m_oCharProperty.m_nDeleted != PROP_DEF) @@ -299,7 +299,7 @@ std::wstring RtfField::RenderToOOX(RenderParameter oRenderParameter) sAuthor = pRtfDocument->m_oRevisionTable.GetAuthor(m_pInsert->m_oCharProperty.m_nRevauthDel); sDate = std::wstring(RtfUtility::convertDateTime(m_pInsert->m_oCharProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_pInsert->m_oCharProperty.m_nDeleted = PROP_DEF; } //поверяем на наличие гиперссылки diff --git a/RtfFile/Format/RtfOle.cpp b/RtfFile/Format/RtfOle.cpp index bab4dd3daa..7a9f018036 100644 --- a/RtfFile/Format/RtfOle.cpp +++ b/RtfFile/Format/RtfOle.cpp @@ -82,7 +82,7 @@ std::wstring RtfOle::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(pCharProps->m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(pCharProps->m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; pCharProps->m_nRevised = PROP_DEF; } if (pCharProps->m_nDeleted != PROP_DEF) @@ -92,7 +92,7 @@ std::wstring RtfOle::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(pCharProps->m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(pCharProps->m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; pCharProps->m_nDeleted = PROP_DEF; } //---------- diff --git a/RtfFile/Format/RtfProperty.cpp b/RtfFile/Format/RtfProperty.cpp index a286cb60ab..f81ac1d476 100644 --- a/RtfFile/Format/RtfProperty.cpp +++ b/RtfFile/Format/RtfProperty.cpp @@ -1530,7 +1530,7 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime( m_nRevdttm ).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_nRevised = PROP_DEF; } if (m_nDeleted != PROP_DEF) @@ -1540,7 +1540,7 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime( m_nRevdttmDel ).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_nDeleted = PROP_DEF; } sResult += L""; @@ -1551,14 +1551,14 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; } if ( PROP_DEF != m_nRevised ) { std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; } if( PROP_DEF != m_nCharStyle ) { @@ -1793,7 +1793,7 @@ std::wstring RtfCharProperty::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oRenderParameterNew = oRenderParameter; oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN; - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += L""; sResult += m_pOldCharProp->RenderToOOX(oRenderParameterNew); sResult += L""; @@ -3921,7 +3921,7 @@ std::wstring RtfParagraphProperty::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oRenderParameterNew = oRenderParameter; oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN; - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += L""; sResult += m_pOldParagraphProp->RenderToOOX(oRenderParameterNew); sResult += L""; @@ -5060,14 +5060,14 @@ std::wstring RtfRowProperty::RenderToOOX(RenderParameter oRenderParameter) // std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(oReader.m_oState->m_oCharProp.m_nRevauthDel); // std::wstring sDate(RtfUtility::convertDateTime(oReader.m_oState->m_oCharProp.m_nRevdttmDel).c_str()); - // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; //} //if ( PROP_DEF != oReader.m_oState->m_oCharProp.m_nRevised ) //{ // std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(oReader.m_oState->m_oCharProp.m_nRevauth); // std::wstring sDate(RtfUtility::convertDateTime(oReader.m_oState->m_oCharProp.m_nRevdttm).c_str()); // - // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + // sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; //} std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_nTrAuth); std::wstring sDate(RtfUtility::convertDateTime(m_nTrDate).c_str()); @@ -5078,11 +5078,11 @@ std::wstring RtfRowProperty::RenderToOOX(RenderParameter oRenderParameter) if (rowChangeProps.empty()) { - sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\"/>"; } else { - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += L""; sResult += rowChangeProps; sResult += L""; diff --git a/RtfFile/Format/RtfSection.cpp b/RtfFile/Format/RtfSection.cpp index f4cddef819..50b69589a8 100644 --- a/RtfFile/Format/RtfSection.cpp +++ b/RtfFile/Format/RtfSection.cpp @@ -1000,7 +1000,7 @@ std::wstring RtfSectionProperty::RenderToOOX(RenderParameter oRenderParameter) RenderParameter oRenderParameterNew = oRenderParameter; oRenderParameterNew.nType = RENDER_TO_OOX_PARAM_UNKNOWN; - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; sResult += m_pOldSectionProp->RenderToOOX(oRenderParameterNew); sResult += L""; } diff --git a/RtfFile/Format/RtfShape.cpp b/RtfFile/Format/RtfShape.cpp index f9cbec4508..c5243517a4 100644 --- a/RtfFile/Format/RtfShape.cpp +++ b/RtfFile/Format/RtfShape.cpp @@ -867,7 +867,7 @@ std::wstring RtfShape::RenderToOOXBegin(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oCharProperty.m_nRevauth); std::wstring sDate(RtfUtility::convertDateTime(m_oCharProperty.m_nRevdttm).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oCharProperty.m_nRevised = PROP_DEF; } if (m_oCharProperty.m_nDeleted != PROP_DEF) @@ -877,7 +877,7 @@ std::wstring RtfShape::RenderToOOXBegin(RenderParameter oRenderParameter) std::wstring sAuthor = poRtfDocument->m_oRevisionTable.GetAuthor(m_oCharProperty.m_nRevauthDel); std::wstring sDate(RtfUtility::convertDateTime(m_oCharProperty.m_nRevdttmDel).c_str()); - sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; + sResult += L"m_nCurTrackChangesId++).c_str() + L"\">"; m_oCharProperty.m_nDeleted = PROP_DEF; } std::wstring sCharProp = m_oCharProperty.RenderToOOX(oRenderParameter); diff --git a/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp b/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp index 7b576c52a7..2007ce82a7 100644 --- a/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp +++ b/RtfFile/OOXml/Writer/OOXCommentsWriter.cpp @@ -153,7 +153,7 @@ mc:Ignorable=\"w14 w15 wp14\">"; for (std::map::iterator it = m_mapComments.begin(); it != m_mapComments.end(); ++it) { sResult += L"second.nID) + L"\" w:author=\"" + - it->second.author + L"\" w:date=\"" + it->second.date + L"\" w:initials=\"" + it->second.authorId + L"\">"; + XmlUtils::EncodeXmlString(it->second.author) + L"\" w:date=\"" + it->second.date + L"\" w:initials=\"" + it->second.authorId + L"\">"; sResult += it->second.content; sResult += L""; From ec2687e5d151666b31e7cd4fa153e95cde1fca7e Mon Sep 17 00:00:00 2001 From: "Elena.Subbotina" Date: Wed, 28 Feb 2024 21:29:46 +0300 Subject: [PATCH 221/221] for bug #57082 --- DesktopEditor/graphics/pro/Image.h | 3 +- DesktopEditor/raster/Metafile/MetaFile.cpp | 4 ++ DesktopEditor/raster/Metafile/MetaFile.h | 1 + .../Binary/Document/BinWriter/BinWriters.cpp | 24 +++++++ .../Presentation/BinaryFileReaderWriter.cpp | 32 ++++++---- .../Presentation/BinaryFileReaderWriter.h | 10 +-- OOXML/Binary/Presentation/imagemanager.cpp | 4 +- OOXML/Binary/Sheets/Reader/BinaryWriter.cpp | 5 ++ .../ASCOfficeDrawingConverter.cpp | 64 ++++++++++--------- OOXML/PPTXFormat/Logic/GrpSpPr.cpp | 3 + OOXML/PPTXFormat/Logic/Pic.cpp | 2 +- OOXML/PPTXFormat/Logic/SpTree.cpp | 19 +++++- OOXML/PPTXFormat/Logic/Xfrm.cpp | 10 +++ 13 files changed, 130 insertions(+), 51 deletions(-) diff --git a/DesktopEditor/graphics/pro/Image.h b/DesktopEditor/graphics/pro/Image.h index 9bb1f8d776..38606d11d6 100644 --- a/DesktopEditor/graphics/pro/Image.h +++ b/DesktopEditor/graphics/pro/Image.h @@ -121,7 +121,8 @@ namespace MetaFile IMetaFile(NSFonts::IApplicationFonts *pAppFonts) {} virtual ~IMetaFile() {} - virtual bool LoadFromFile(const wchar_t* wsFilePath) = 0; + virtual void SetImageSize(int nWidth, int nHeight) = 0; + virtual bool LoadFromFile(const wchar_t* wsFilePath) = 0; virtual bool LoadFromBuffer(BYTE* pBuffer, unsigned int unSize) = 0; virtual bool DrawOnRenderer(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight) = 0; virtual void Close() = 0; diff --git a/DesktopEditor/raster/Metafile/MetaFile.cpp b/DesktopEditor/raster/Metafile/MetaFile.cpp index c482571d39..2ed522173d 100644 --- a/DesktopEditor/raster/Metafile/MetaFile.cpp +++ b/DesktopEditor/raster/Metafile/MetaFile.cpp @@ -81,6 +81,10 @@ namespace MetaFile Close(); RELEASEINTERFACE(m_pFontManager); } + void CMetaFile::SetImageSize(int nWidth, int nHeight) + { + // for meta with empty size + } std::wstring CMetaFile::ConvertToSvg(unsigned int unWidth, unsigned int unHeight) { diff --git a/DesktopEditor/raster/Metafile/MetaFile.h b/DesktopEditor/raster/Metafile/MetaFile.h index 74738c1251..94bcf37823 100644 --- a/DesktopEditor/raster/Metafile/MetaFile.h +++ b/DesktopEditor/raster/Metafile/MetaFile.h @@ -62,6 +62,7 @@ namespace MetaFile CMetaFile(NSFonts::IApplicationFonts *pAppFonts); virtual ~CMetaFile(); + void SetImageSize(int nWidth, int nHeight); bool LoadFromFile(const wchar_t* wsFilePath); bool LoadFromBuffer(BYTE* pBuffer, unsigned int unSize); bool DrawOnRenderer(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight); diff --git a/OOXML/Binary/Document/BinWriter/BinWriters.cpp b/OOXML/Binary/Document/BinWriter/BinWriters.cpp index f6ac759c38..e4f0b698e4 100644 --- a/OOXML/Binary/Document/BinWriter/BinWriters.cpp +++ b/OOXML/Binary/Document/BinWriter/BinWriters.cpp @@ -6625,6 +6625,8 @@ void BinaryDocumentTableWriter::WriteDrawing(std::wstring* pXml, OOX::Logic::CDr int nCurPos = 0; bool bDeleteDrawing = false; + + m_oBcw.m_oStream.m_dCxCurShape = m_oBcw.m_oStream.m_dCyCurShape = 0; //pptxdata if (pXml) { @@ -6657,6 +6659,28 @@ void BinaryDocumentTableWriter::WriteDrawing(std::wstring* pXml, OOX::Logic::CDr } else if (pGraphic) { + if (NULL != pDrawing) + { + OOX::Logic::CDrawing& img = *pDrawing; + if (img.m_oInline.IsInit()) + { + const OOX::Drawing::CInline& pInline = img.m_oInline.get(); + if (pInline.m_oExtent.IsInit()) + { + m_oBcw.m_oStream.m_dCxCurShape = pInline.m_oExtent->m_oCx.GetValue(); + m_oBcw.m_oStream.m_dCyCurShape = pInline.m_oExtent->m_oCy.GetValue(); + } + } + else if (img.m_oAnchor.IsInit()) + { + const OOX::Drawing::CAnchor& pAnchor = img.m_oAnchor.get(); + if (pAnchor.m_oExtent.IsInit()) + { + m_oBcw.m_oStream.m_dCxCurShape = pAnchor.m_oExtent->m_oCx.GetValue(); + m_oBcw.m_oStream.m_dCyCurShape = pAnchor.m_oExtent->m_oCy.GetValue(); + } + } + } if (pGraphic->chartRec.IsInit() && pGraphic->chartRec->id_data.IsInit() ) { m_oBcw.m_oStream.WriteBYTE(pGraphic->chartRec->m_bChartEx ? c_oSerImageType2::ChartEx : c_oSerImageType2::Chart); diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp index 8c0481f39c..bbc786c582 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.cpp @@ -695,31 +695,33 @@ namespace NSBinPptxRW } double CBinaryFileWriter::GetShapeHeight() { - if (m_lCyCurShape == 0) + if (m_dCyCurShape < 0.001) return -1; - return (double)m_lCyCurShape / 36000; //mm + return m_dCyCurShape / 36000; //mm } double CBinaryFileWriter::GetShapeWidth() { - if (m_lCyCurShape == 0) + if (m_dCyCurShape < 0.001) return -1; - return (double)m_lCxCurShape / 36000; + return m_dCxCurShape / 36000; } double CBinaryFileWriter::GetShapeY() { - return (double)m_lYCurShape / 36000; + return m_dYCurShape / 36000; } double CBinaryFileWriter::GetShapeX() { - return (double)m_lXCurShape / 36000; //mm + return m_dXCurShape / 36000; //mm } void CBinaryFileWriter::ClearCurShapePositionAndSizes() { - m_lXCurShape = 0; - m_lYCurShape = 0; + m_dXCurShape = 0; + m_dYCurShape = 0; - m_lCxCurShape = 0; - m_lCyCurShape = 0; + m_dCxCurShape = 0; + m_dCyCurShape = 0; + + m_bInGroup = false; } void CBinaryFileWriter::Clear() { @@ -732,11 +734,13 @@ namespace NSBinPptxRW m_lStackPosition = 0; memset(m_arStack, 0, MAX_STACK_SIZE * sizeof(_UINT32)); - m_lCxCurShape = 0; - m_lCyCurShape = 0; + m_dCxCurShape = 0; + m_dCyCurShape = 0; - m_lXCurShape = 0; - m_lYCurShape = 0; + m_dXCurShape = 0; + m_dYCurShape = 0; + + m_bInGroup = false; } void CBinaryFileWriter::SetMainDocument(BinDocxRW::CDocxSerializer* pMainDoc) diff --git a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h index 7ac79d1fab..3c52744369 100644 --- a/OOXML/Binary/Presentation/BinaryFileReaderWriter.h +++ b/OOXML/Binary/Presentation/BinaryFileReaderWriter.h @@ -273,11 +273,13 @@ namespace NSBinPptxRW std::vector m_arMainTables; public: - _INT32 m_lCxCurShape; //emu - _INT32 m_lCyCurShape; + double m_dCxCurShape; //emu + double m_dCyCurShape; - _INT32 m_lXCurShape; - _INT32 m_lYCurShape; + double m_dXCurShape; + double m_dYCurShape; + + bool m_bInGroup = false; BYTE* GetBuffer(); virtual _UINT32 GetPosition(); diff --git a/OOXML/Binary/Presentation/imagemanager.cpp b/OOXML/Binary/Presentation/imagemanager.cpp index b058280f4a..b450431349 100644 --- a/OOXML/Binary/Presentation/imagemanager.cpp +++ b/OOXML/Binary/Presentation/imagemanager.cpp @@ -527,10 +527,12 @@ namespace NSShapeImageGen CDirectory::CopyFile(strFileName, pathSaveItem.GetPath()); ::MetaFile::IMetaFile* pMetafile = MetaFile::Create(m_pFontManager->GetApplication()); + + pMetafile->SetImageSize(lWidth, lHeight); if (pMetafile->LoadFromFile(strFileName.c_str())) { // пробуем сохранить в svg напрямую из метафайлов - std::wstring sInternalSvg = pMetafile->ConvertToSvg(); + std::wstring sInternalSvg = pMetafile->ConvertToSvg(/*lWidth, lHeight*/); if (!sInternalSvg.empty()) { diff --git a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp index 310abf4fb2..71ec17e991 100644 --- a/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp +++ b/OOXML/Binary/Sheets/Reader/BinaryWriter.cpp @@ -6450,6 +6450,11 @@ void BinaryWorksheetTableWriter::WriteDrawing(const OOX::Spreadsheet::CWorksheet WriteCellAnchor(pCellAnchor); + if (pCellAnchor->m_oExt.IsInit()) + { + m_oBcw.m_oStream.m_dCxCurShape = pCellAnchor->m_oExt->m_oCx.IsInit() ? pCellAnchor->m_oExt->m_oCx->GetValue() : 0; + m_oBcw.m_oStream.m_dCyCurShape = pCellAnchor->m_oExt->m_oCy.IsInit() ? pCellAnchor->m_oExt->m_oCy->GetValue() : 0; + } if (pCellAnchor->m_sVmlSpId.IsInit() && pVmlDrawing) { std::map::iterator pFind = pVmlDrawing->m_mapShapes.find(pCellAnchor->m_sVmlSpId.get2()); diff --git a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp index bb27d86df0..6fd1940e89 100644 --- a/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp +++ b/OOXML/PPTXFormat/DrawingConverter/ASCOfficeDrawingConverter.cpp @@ -2074,10 +2074,16 @@ bool CDrawingConverter::ParceObject(const std::wstring& strXml, std::wstring** p pPicture->spPr.Fill = PPTX::Logic::UniFill(); pShape = NULL; - pElem->InitElem(pPicture); + pElem->InitElem(pPicture); + } if ((pPicture) && (pPicture->blipFill.blip.IsInit())) { + if (pPicture->spPr.xfrm.IsInit()) + {// for bad replacemant image for ole + m_pBinaryWriter->m_dCxCurShape = pPicture->spPr.xfrm->extX.get_value_or(0); + m_pBinaryWriter->m_dCyCurShape = pPicture->spPr.xfrm->extY.get_value_or(0); + } if (pOle->m_OleObjectFile.IsInit()) { pPicture->blipFill.blip->oleFilepathBin = pOle->m_OleObjectFile->filename().GetPath(); @@ -2200,26 +2206,26 @@ void CDrawingConverter::ConvertDiagram(PPTX::Logic::SpTreeElem *result, XmlUtils { _pElem.grpSpPr.xfrm = new PPTX::Logic::Xfrm(); - _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_lXCurShape; - _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_lYCurShape; - _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_lCxCurShape; - _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_lCyCurShape; + _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_dXCurShape; + _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_dYCurShape; + _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_dCxCurShape; + _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_dCyCurShape; _pElem.grpSpPr.xfrm->chOffX = (int)0; _pElem.grpSpPr.xfrm->chOffY = (int)0; - _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_lCxCurShape; - _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_lCyCurShape; + _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_dCxCurShape; + _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_dCyCurShape; } else { - if (!_pElem.grpSpPr.xfrm->offX.is_init()) _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_lXCurShape; - if (!_pElem.grpSpPr.xfrm->offY.is_init()) _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_lYCurShape; - if (!_pElem.grpSpPr.xfrm->extX.is_init()) _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_lCxCurShape; - if (!_pElem.grpSpPr.xfrm->extY.is_init()) _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_lCyCurShape; + if (!_pElem.grpSpPr.xfrm->offX.is_init()) _pElem.grpSpPr.xfrm->offX = m_pBinaryWriter->m_dXCurShape; + if (!_pElem.grpSpPr.xfrm->offY.is_init()) _pElem.grpSpPr.xfrm->offY = m_pBinaryWriter->m_dYCurShape; + if (!_pElem.grpSpPr.xfrm->extX.is_init()) _pElem.grpSpPr.xfrm->extX = m_pBinaryWriter->m_dCxCurShape; + if (!_pElem.grpSpPr.xfrm->extY.is_init()) _pElem.grpSpPr.xfrm->extY = m_pBinaryWriter->m_dCyCurShape; if (!_pElem.grpSpPr.xfrm->chOffX.is_init()) _pElem.grpSpPr.xfrm->chOffX = (int)0; if (!_pElem.grpSpPr.xfrm->chOffY.is_init()) _pElem.grpSpPr.xfrm->chOffY = (int)0; - if (!_pElem.grpSpPr.xfrm->chExtX.is_init()) _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_lCxCurShape; - if (!_pElem.grpSpPr.xfrm->chExtY.is_init()) _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_lCyCurShape; + if (!_pElem.grpSpPr.xfrm->chExtX.is_init()) _pElem.grpSpPr.xfrm->chExtX = m_pBinaryWriter->m_dCxCurShape; + if (!_pElem.grpSpPr.xfrm->chExtY.is_init()) _pElem.grpSpPr.xfrm->chExtY = m_pBinaryWriter->m_dCyCurShape; } } @@ -2238,13 +2244,13 @@ void CDrawingConverter::ConvertDrawing(PPTX::Logic::SpTreeElem *elem, XmlUtils:: { XmlUtils::CXmlNode oNodeExt; - m_pBinaryWriter->m_lXCurShape = 0; - m_pBinaryWriter->m_lYCurShape = 0; + m_pBinaryWriter->m_dXCurShape = 0; + m_pBinaryWriter->m_dYCurShape = 0; if (oNodeAnchorInline.GetNode(L"wp:extent", oNodeExt)) { - m_pBinaryWriter->m_lCxCurShape = oNodeExt.ReadAttributeInt(L"cx"); - m_pBinaryWriter->m_lCyCurShape = oNodeExt.ReadAttributeInt(L"cy"); + m_pBinaryWriter->m_dCxCurShape = oNodeExt.ReadAttributeInt(L"cx"); + m_pBinaryWriter->m_dCyCurShape = oNodeExt.ReadAttributeInt(L"cy"); } XmlUtils::CXmlNode oNodeDocPr; if (oNodeAnchorInline.GetNode(L"wp:docPr", oNodeDocPr)) @@ -2275,10 +2281,10 @@ void CDrawingConverter::ConvertDrawing(PPTX::Logic::SpTreeElem *elem, XmlUtils:: PPTX::Logic::SpTree* pTree = new PPTX::Logic::SpTree(); pTree->grpSpPr.xfrm = new PPTX::Logic::Xfrm(); - pTree->grpSpPr.xfrm->offX = m_pBinaryWriter->m_lXCurShape; - pTree->grpSpPr.xfrm->offY = m_pBinaryWriter->m_lYCurShape; - pTree->grpSpPr.xfrm->extX = m_pBinaryWriter->m_lCxCurShape; - pTree->grpSpPr.xfrm->extY = m_pBinaryWriter->m_lCyCurShape; + pTree->grpSpPr.xfrm->offX = m_pBinaryWriter->m_dXCurShape; + pTree->grpSpPr.xfrm->offY = m_pBinaryWriter->m_dYCurShape; + pTree->grpSpPr.xfrm->extX = m_pBinaryWriter->m_dCxCurShape; + pTree->grpSpPr.xfrm->extY = m_pBinaryWriter->m_dCyCurShape; pTree->fromXML(oNodeContent); elem->InitElem(pTree); @@ -2922,11 +2928,11 @@ void CDrawingConverter::ConvertShape(PPTX::Logic::SpTreeElem *elem, XmlUtils::CX } else { - m_pBinaryWriter->m_lXCurShape = 0; - m_pBinaryWriter->m_lYCurShape = 0; + m_pBinaryWriter->m_dXCurShape = 0; + m_pBinaryWriter->m_dYCurShape = 0; - m_pBinaryWriter->m_lCxCurShape = 0; - m_pBinaryWriter->m_lCyCurShape = 0; + m_pBinaryWriter->m_dCxCurShape = 0; + m_pBinaryWriter->m_dCyCurShape = 0; pSpPr->xfrm = new PPTX::Logic::Xfrm(); pSpPr->xfrm->offX = oProps.X; @@ -4122,11 +4128,11 @@ std::wstring CDrawingConverter::GetDrawingMainProps(XmlUtils::CXmlNode& oNode, P oProps.Width = width; oProps.Height = height; - m_pBinaryWriter->m_lXCurShape = left; - m_pBinaryWriter->m_lYCurShape = top; + m_pBinaryWriter->m_dXCurShape = left; + m_pBinaryWriter->m_dYCurShape = top; - m_pBinaryWriter->m_lCxCurShape = width; - m_pBinaryWriter->m_lCyCurShape = height; + m_pBinaryWriter->m_dCxCurShape = width; + m_pBinaryWriter->m_dCyCurShape = height; bool bExtendedSize = false; XmlUtils::CXmlNode oNodeShadow = oNode.ReadNode(L"v:shadow"); diff --git a/OOXML/PPTXFormat/Logic/GrpSpPr.cpp b/OOXML/PPTXFormat/Logic/GrpSpPr.cpp index 7354751380..4066a8e098 100644 --- a/OOXML/PPTXFormat/Logic/GrpSpPr.cpp +++ b/OOXML/PPTXFormat/Logic/GrpSpPr.cpp @@ -184,6 +184,9 @@ namespace PPTX pWriter->WriteLimit2(0, bwMode); pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeEnd); + pWriter->m_dCxCurShape = pWriter->m_dCyCurShape = 1; + pWriter->m_bInGroup = true; + pWriter->WriteRecord2(0, xfrm); pWriter->WriteRecord1(1, Fill); pWriter->WriteRecord1(2, EffectList); diff --git a/OOXML/PPTXFormat/Logic/Pic.cpp b/OOXML/PPTXFormat/Logic/Pic.cpp index 63eb8f616f..225dc85395 100644 --- a/OOXML/PPTXFormat/Logic/Pic.cpp +++ b/OOXML/PPTXFormat/Logic/Pic.cpp @@ -865,8 +865,8 @@ namespace PPTX pWriter->WriteRecord2(4, oleObject); pWriter->WriteRecord1(0, nvPicPr); - pWriter->WriteRecord1(1, blipFill); pWriter->WriteRecord1(2, spPr); + pWriter->WriteRecord1(1, blipFill); pWriter->WriteRecord2(3, style); if (macro.IsInit()) diff --git a/OOXML/PPTXFormat/Logic/SpTree.cpp b/OOXML/PPTXFormat/Logic/SpTree.cpp index 6c4078b804..16178058be 100644 --- a/OOXML/PPTXFormat/Logic/SpTree.cpp +++ b/OOXML/PPTXFormat/Logic/SpTree.cpp @@ -400,8 +400,25 @@ namespace PPTX pWriter->WriteRecord1(0, nvGrpSpPr); pWriter->WriteRecord1(1, grpSpPr); - pWriter->WriteRecordArray(2, 0, SpTreeElems); +//--------------------------------------------------------------------------------------- + //pWriter->WriteRecordArray(2, 0, SpTreeElems); + pWriter->StartRecord(2); + _UINT32 len = (_UINT32)SpTreeElems.size(); + pWriter->WriteULONG(len); + + double oldCxCurShape = pWriter->m_dCxCurShape; + double oldCyCurShape = pWriter->m_dCyCurShape; + + for (_UINT32 i = 0; i < len; ++i) + { + pWriter->WriteRecord1(0, SpTreeElems[i]); + + pWriter->m_dCxCurShape = oldCxCurShape; + pWriter->m_dCyCurShape = oldCyCurShape; + } + pWriter->EndRecord(); +//--------------------------------------------------------------------------------------- pWriter->EndRecord(); } void SpTree::fromPPTY(NSBinPptxRW::CBinaryFileReader* pReader) diff --git a/OOXML/PPTXFormat/Logic/Xfrm.cpp b/OOXML/PPTXFormat/Logic/Xfrm.cpp index 7370e76518..c45f861ad6 100644 --- a/OOXML/PPTXFormat/Logic/Xfrm.cpp +++ b/OOXML/PPTXFormat/Logic/Xfrm.cpp @@ -291,6 +291,16 @@ namespace PPTX } void Xfrm::toPPTY(NSBinPptxRW::CBinaryFileWriter* pWriter) const { + if (chExtX.IsInit() && extX.IsInit()) + pWriter->m_dCxCurShape = pWriter->m_dCyCurShape * (double)*extX / (double)*chExtX; + else if (extX.IsInit()) + pWriter->m_dCxCurShape = (pWriter->m_bInGroup ? pWriter->m_dCxCurShape : 1) * *extX; + + if (chExtY.IsInit() && extY.IsInit()) + pWriter->m_dCyCurShape = pWriter->m_dCyCurShape * (double)*extY / (double)*chExtY; + else if (extY.IsInit()) + pWriter->m_dCyCurShape = (pWriter->m_bInGroup ? pWriter->m_dCyCurShape : 1) * *extY; + pWriter->WriteBYTE(NSBinPptxRW::g_nodeAttributeStart); pWriter->WriteInt2(0, offX); pWriter->WriteInt2(1, offY);