From cf5458c761e4f1d8cc3fc68dcd769cc9bfa6cce2 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Thu, 13 Jul 2017 18:09:17 +0300 Subject: [PATCH] XlsFormat - pivot tables --- .../XlsFormatTest/XlsFormatTest.cpp | 31 ++++++- .../Logic/Biff_records/AutoFilter.cpp | 5 +- .../XlsFormat/Logic/Biff_records/BOF.cpp | 2 +- .../XlsFormat/Logic/Biff_records/BookExt.cpp | 22 ++--- .../XlsFormat/Logic/Biff_records/ColInfo.cpp | 1 + .../Logic/Biff_records/DbOrParamQry.cpp | 2 + .../XlsFormat/Logic/Biff_records/Dv.cpp | 4 +- .../Logic/Biff_records/ExternName.cpp | 2 +- .../XlsFormat/Logic/Biff_records/Lbl.cpp | 2 +- .../XlsFormat/Logic/Biff_records/Qsir.cpp | 1 + .../XlsFormat/Logic/Biff_records/Row.cpp | 1 + .../XlsFormat/Logic/Biff_records/SXEx.cpp | 1 + .../XlsFormat/Logic/Biff_records/SXLI.cpp | 2 +- .../XlsFormat/Logic/Biff_records/SXVI.cpp | 4 +- .../XlsFormat/Logic/Biff_records/Setup.cpp | 21 ++--- .../XlsFormat/Logic/Biff_records/SheetExt.cpp | 3 +- .../XlsFormat/Logic/Biff_records/Style.cpp | 1 + .../XlsFormat/Logic/Biff_records/SxFilt.cpp | 8 +- .../XlsFormat/Logic/Biff_records/SxFilt.h | 6 +- .../XlsFormat/Logic/Biff_records/SxItm.h | 2 +- .../XlsFormat/Logic/Biff_records/SxSelect.cpp | 1 + .../XlsFormat/Logic/Biff_records/Text.cpp | 6 +- .../XlsFormat/Logic/Biff_records/Tick.cpp | 11 +-- .../XlsFormat/Logic/Biff_records/TxO.cpp | 4 +- .../source/XlsFormat/Logic/Biff_records/TxO.h | 2 + .../XlsFormat/Logic/Biff_records/TxtQry.cpp | 2 + .../XlsFormat/Logic/Biff_records/XF.cpp | 3 +- .../Logic/Biff_structures/CellXF.cpp | 3 +- .../ODRAW/OfficeArtCOLORREF.cpp | 6 +- .../Logic/Biff_structures/PtgSxName.cpp | 86 ++++++++++++------- .../Logic/Biff_structures/StyleXF.cpp | 8 +- .../XlsFormat/Logic/Biff_unions/DREF.cpp | 51 ++++------- .../XlsFormat/Logic/Biff_unions/FDB.cpp | 8 +- .../source/XlsFormat/Logic/Biff_unions/FDB.h | 1 + .../Biff_unions/PIVOTCACHEDEFINITION.cpp | 5 ++ .../XlsFormat/Logic/Biff_unions/PIVOTRULE.cpp | 5 +- .../XlsFormat/Logic/Biff_unions/PIVOTVD.cpp | 3 +- .../XlsFormat/Logic/Biff_unions/PRFILTER.cpp | 17 ++-- .../XlsFormat/Logic/Biff_unions/PRFILTER.h | 7 +- .../XlsFormat/Logic/Biff_unions/SXFMLA_bu.cpp | 18 +++- .../XlsFormat/Logic/Biff_unions/SXFMLA_bu.h | 8 +- .../Logic/Biff_unions/SXFORMULA_bu.cpp | 55 +++++++++--- .../XlsFormat/Logic/Biff_unions/SXOPER.cpp | 31 +++++++ .../XlsFormat/Logic/Biff_unions/SXOPER.h | 2 + .../XlsFormat/Logic/Biff_unions/SXTBL.h | 11 +++ .../XlsFormat/Logic/Biff_unions/SXTBL_bu.cpp | 47 +++++++++- .../XlsFormat/Logic/GlobalWorkbookInfo.cpp | 2 + .../XlsFormat/Logic/GlobalWorkbookInfo.h | 4 + 48 files changed, 371 insertions(+), 157 deletions(-) diff --git a/ASCOfficeXlsFile2/XlsFormatTest/XlsFormatTest.cpp b/ASCOfficeXlsFile2/XlsFormatTest/XlsFormatTest.cpp index 74733a51bf..444dc13e97 100644 --- a/ASCOfficeXlsFile2/XlsFormatTest/XlsFormatTest.cpp +++ b/ASCOfficeXlsFile2/XlsFormatTest/XlsFormatTest.cpp @@ -51,12 +51,12 @@ #pragma comment(lib, "../../build/bin/icu/win_32/icuuc.lib") #endif -int _tmain(int argc, _TCHAR* argv[]) +HRESULT convert_single(std::wstring fileName) { HRESULT hr = S_OK; -////////////////////////////////////////////////////////////////////////// - std::wstring srcFileName = argv[1]; - std::wstring dstPath = argc > 2 ? argv[2] : srcFileName + L"-my.xlsx"; + + std::wstring srcFileName = fileName; + std::wstring dstPath = srcFileName + L"-my.xlsx"; std::wstring outputDir = NSDirectory::GetFolderPath(dstPath); std::wstring dstTempPath = NSDirectory::CreateDirectoryWithUniqueName(outputDir); @@ -73,3 +73,26 @@ int _tmain(int argc, _TCHAR* argv[]) return hr; } + +HRESULT convert_directory(std::wstring pathName) +{ + HRESULT hr = S_OK; + + std::vector arFiles = NSDirectory::GetFiles(pathName, false); + + for (size_t i = 0; i < arFiles.size(); i++) + { + convert_single(arFiles[i]); + } + return S_OK; +} + +int _tmain(int argc, _TCHAR* argv[]) +{ + if (argc < 2) return 1; + + HRESULT hr = convert_single(argv[1]); + + //HRESULT hr = convert_directory(argv[1]); + return hr; +} \ No newline at end of file diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/AutoFilter.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/AutoFilter.cpp index 207dae1aef..cbc50f7a25 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/AutoFilter.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/AutoFilter.cpp @@ -66,6 +66,7 @@ static inline void/*std::wstring &*/trim(std::wstring &s) AutoFilter::AutoFilter() { + wTopN = wJoin = 0; } @@ -86,7 +87,7 @@ void AutoFilter::readFields(CFRecord& record) unsigned short flags; record >> iEntry >> flags; - wJoin = static_cast(GETBITS(flags, 0, 1)); + wJoin = GETBITS(flags, 0, 1); fSimple1 = GETBIT(flags, 2); fSimple2 = GETBIT(flags, 3); @@ -94,7 +95,7 @@ void AutoFilter::readFields(CFRecord& record) fTop = GETBIT(flags, 5); //top(1) or bottom(0) fPercent = GETBIT(flags, 6); - wTopN = static_cast(GETBITS(flags, 7, 15)); + wTopN = GETBITS(flags, 7, 15); unsigned short _iEntry = iEntry; unsigned char _wJoin = wJoin; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BOF.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BOF.cpp index e4c0cca176..d0af05bd8d 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BOF.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BOF.cpp @@ -87,7 +87,7 @@ void BOF::readFields(CFRecord& record) fGlJmp = GETBIT(flags, 10); fFontLimit = GETBIT(flags, 13); - verXLHigh = static_cast(GETBITS(flags, 14, 17)); + verXLHigh = GETBITS(flags, 14, 17); record >> verLowestBiff; unsigned char flags2; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BookExt.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BookExt.cpp index a774ce4854..9c0a2f7ab6 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BookExt.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/BookExt.cpp @@ -36,9 +36,9 @@ namespace XLS { -BookExt::BookExt() -: cb(22) +BookExt::BookExt() : cb(22) { + mdFactoidDisplay = 0; } @@ -62,15 +62,15 @@ void BookExt::readFields(CFRecord& record) if (record.loadAnyData(flags)) { - fDontAutoRecover = GETBIT(flags, 0); - fHidePivotList = GETBIT(flags, 1); - fFilterPrivacy = GETBIT(flags, 2); - fEmbedFactoids = GETBIT(flags, 3); - mdFactoidDisplay = static_cast(GETBITS(flags, 4, 5)); - fSavedDuringRecovery = GETBIT(flags, 6); - fCreatedViaMinimalSave = GETBIT(flags, 7); - fOpenedViaDataRecovery = GETBIT(flags, 8); - fOpenedViaSafeLoad = GETBIT(flags, 9); + fDontAutoRecover = GETBIT(flags, 0); + fHidePivotList = GETBIT(flags, 1); + fFilterPrivacy = GETBIT(flags, 2); + fEmbedFactoids = GETBIT(flags, 3); + mdFactoidDisplay = GETBITS(flags, 4, 5); + fSavedDuringRecovery = GETBIT(flags, 6); + fCreatedViaMinimalSave = GETBIT(flags, 7); + fOpenedViaDataRecovery = GETBIT(flags, 8); + fOpenedViaSafeLoad = GETBIT(flags, 9); } else return; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ColInfo.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ColInfo.cpp index dac7f7c021..cb7f092243 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ColInfo.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ColInfo.cpp @@ -37,6 +37,7 @@ namespace XLS ColInfo::ColInfo() { + iOutLevel = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/DbOrParamQry.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/DbOrParamQry.cpp index d6d4845e79..38fee7c73b 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/DbOrParamQry.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/DbOrParamQry.cpp @@ -38,6 +38,8 @@ namespace XLS DbOrParamQry::DbOrParamQry(int typeRecord_) { typeRecord = typeRecord_; + + param.pbt = query.dbt = 0; } DbOrParamQry::~DbOrParamQry() diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Dv.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Dv.cpp index 9c349e822a..8d8574de78 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Dv.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Dv.cpp @@ -71,12 +71,12 @@ void Dv::readFields(CFRecord& record) record >> flags; valType = static_cast<_valTypeDv>(GETBITS(flags, 0, 3)); - errStyle = static_cast(GETBITS(flags, 4, 6)); + errStyle = GETBITS(flags, 4, 6); fStrLookup = GETBIT(flags, 7); fAllowBlank = GETBIT(flags, 8); fSuppressCombo = GETBIT(flags, 9); - mdImeMode = static_cast(GETBITS(flags, 10, 17)); + mdImeMode = GETBITS(flags, 10, 17); fShowInputMsg = GETBIT(flags, 18); fShowErrorMsg = GETBIT(flags, 19); typOperator = static_cast<_typOperatorDv>(GETBITS(flags, 20, 23)); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ExternName.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ExternName.cpp index 2de6f94cb5..ffb258e9f5 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ExternName.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/ExternName.cpp @@ -36,7 +36,7 @@ namespace XLS { ExternName::ExternName(const unsigned short supporting_link_type) -: supbook_cch(supporting_link_type) +: supbook_cch(supporting_link_type), cf(0) { } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Lbl.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Lbl.cpp index fcd9ddd6c4..d462fd9b81 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Lbl.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Lbl.cpp @@ -45,7 +45,7 @@ const wchar_t* const AutoFilterDefineNames[] = Lbl::Lbl() -: rgce(false) +: rgce(false), fGrp(0) { } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Qsir.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Qsir.cpp index 8bd03bdd19..236ba58883 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Qsir.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Qsir.cpp @@ -37,6 +37,7 @@ namespace XLS Qsir::Qsir() { + wVerBeforeRefreshAlert = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Row.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Row.cpp index 3b7c6fd5ae..35e07c02a1 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Row.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Row.cpp @@ -37,6 +37,7 @@ namespace XLS Row::Row() { + iOutLevel = ixfe_val = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXEx.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXEx.cpp index 417965a7cf..3285e49d69 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXEx.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXEx.cpp @@ -37,6 +37,7 @@ namespace XLS SXEx::SXEx() { + cWrapPage = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXLI.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXLI.cpp index 19f9f89448..bca7a7c9a7 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXLI.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXLI.cpp @@ -60,7 +60,7 @@ void SXLI::readFields(CFRecord& record) { break; } - SXLIItem item; + SXLIItem item = {}; unsigned short flags; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXVI.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXVI.cpp index 9a29a7e7ed..9da178acc9 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXVI.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SXVI.cpp @@ -74,12 +74,12 @@ int SXVI::serialize(std::wostream & strm) CP_XML_NODE(L"item") { if (fMissing) CP_XML_ATTR(L"m", 1); - if (fHidden) CP_XML_ATTR(L"h", 1); - if (fHideDetail)CP_XML_ATTR(L"sd", 1); + if (fHideDetail)CP_XML_ATTR(L"sd", 0); if (fFormula) CP_XML_ATTR(L"f", 1); if (itmType == 0) { + if (fHidden) CP_XML_ATTR(L"h", 1); CP_XML_ATTR(L"x", iCache); } switch(itmType) diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Setup.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Setup.cpp index a18b1165e4..ce2df2391c 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Setup.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Setup.cpp @@ -37,7 +37,7 @@ namespace XLS Setup::Setup() // the following may appear uninitialized but we have to store them -: iPaperSize(0), iScale(255), iRes(0), iVRes(0), iCopies(0), fNoOrient(false), fPortrait(false), iPageStart(1) +: iPaperSize(0), iScale(255), iRes(0), iVRes(0), iCopies(0), fNoOrient(false), fPortrait(false), iPageStart(1), iErrors(0) { } @@ -56,16 +56,17 @@ void Setup::readFields(CFRecord& record) { unsigned short flags; record >> iPaperSize >> iScale >> iPageStart >> iFitWidth >> iFitHeight >> flags; + fLeftToRight = GETBIT(flags, 0); - fPortrait = GETBIT(flags, 1); - fNoPls = GETBIT(flags, 2); - fNoColor = GETBIT(flags, 3); - fDraft = GETBIT(flags, 4); - fNotes = GETBIT(flags, 5); - fNoOrient = GETBIT(flags, 6); - fUsePage = GETBIT(flags, 7); - fEndNotes = GETBIT(flags, 9); - iErrors = GETBITS(flags, 10, 11); + fPortrait = GETBIT(flags, 1); + fNoPls = GETBIT(flags, 2); + fNoColor = GETBIT(flags, 3); + fDraft = GETBIT(flags, 4); + fNotes = GETBIT(flags, 5); + fNoOrient = GETBIT(flags, 6); + fUsePage = GETBIT(flags, 7); + fEndNotes = GETBIT(flags, 9); + iErrors = GETBITS(flags, 10, 11); record >> iRes >> iVRes >> numHdr >> numFtr >> iCopies; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SheetExt.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SheetExt.cpp index 2e77732376..f0ec6870a2 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SheetExt.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SheetExt.cpp @@ -38,6 +38,7 @@ namespace XLS SheetExt::SheetExt() { + icvPlain = 0; } @@ -61,7 +62,7 @@ void SheetExt::readFields(CFRecord& record) _UINT32 flags; record >> flags; - icvPlain = static_cast(GETBITS(flags, 0, 6)); + icvPlain = GETBITS(flags, 0, 6); if(0x00000028 == cb) { diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Style.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Style.cpp index e4f8b1dea2..467a52ada0 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Style.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Style.cpp @@ -37,6 +37,7 @@ namespace XLS Style::Style() { + ixfe = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.cpp index 964663c778..dd15ce5273 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.cpp @@ -37,6 +37,7 @@ namespace XLS SxFilt::SxFilt() { + isxvd = iDim = cisxvi = grbitSbt = 0; } @@ -52,16 +53,15 @@ BaseObjectPtr SxFilt::clone() void SxFilt::readFields(CFRecord& record) { - unsigned short flags1; - unsigned short flags2; + unsigned short flags1, flags2; - record >> flags1 >> isxvd >> flags2 >> grbitSbt >> cisxvi; + record >> flags1 >> flags2 >> grbitSbt >> cisxvi; sxaxisRw = GETBIT(flags1, 0); sxaxisCol = GETBIT(flags1, 1); sxaxisPage = GETBIT(flags1, 2); sxaxisData = GETBIT(flags1, 3); - iDim = GETBITS(flags1, 4, 15); + iDim = GETBITS(flags1, 6, 15); isxvd = GETBITS(flags2, 0, 9); fSelected = GETBIT(flags2, 10); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.h index 3ab70a9db5..1a083278b4 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxFilt.h @@ -54,8 +54,10 @@ public: bool sxaxisCol; bool sxaxisPage; bool sxaxisData; - unsigned short iDim; - unsigned short isxvd; + + char iDim; + char isxvd; + bool fSelected; short grbitSbt; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxItm.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxItm.h index f389d743cc..d1b842ceda 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxItm.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxItm.h @@ -36,7 +36,7 @@ namespace XLS { - class SxItm: public BiffRecordContinued +class SxItm: public BiffRecordContinued { BIFF_RECORD_DEFINE_TYPE_INFO(SxItm) BASE_OBJECT_DEFINE_CLASS_NAME(SxItm) diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxSelect.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxSelect.cpp index 902e9d0ee4..93cce9884a 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxSelect.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/SxSelect.cpp @@ -37,6 +37,7 @@ namespace XLS SxSelect::SxSelect() { + cClick = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Text.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Text.cpp index 454ee4c4b9..f6311454aa 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Text.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Text.cpp @@ -62,7 +62,7 @@ void Text::readFields(CFRecord& record) if (record.getGlobalWorkbookInfo()->Version < 0x0600) { - int orient = GETBITS(flags1, 8, 10); + unsigned char orient = GETBITS(flags1, 8, 10); switch(orient) { case 0: trot = 0; break; // Text orientation: not rotated. @@ -75,8 +75,8 @@ void Text::readFields(CFRecord& record) { record >> icvText >> flags2 >> trot; //icv -> from Palette - dlp = static_cast(GETBITS(flags2, 0, 3)); - iReadingOrder = static_cast(GETBITS(flags2, 14, 15)); + dlp = GETBITS(flags2, 0, 3); + iReadingOrder = GETBITS(flags2, 14, 15); } fAutoColor = GETBIT(flags1, 0); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Tick.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Tick.cpp index 1defb9ea13..146899d769 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Tick.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Tick.cpp @@ -37,6 +37,7 @@ namespace XLS Tick::Tick() { + iReadingOrder = 0; } @@ -59,11 +60,11 @@ void Tick::readFields(CFRecord& record) record.skipNunBytes(16); // reserved record >> flags >> icv >> trot; - fAutoCo = GETBIT(flags, 0); - fAutoMode = GETBIT(flags, 1); - rot = GETBITS(flags, 2, 4); - fAutoRot = GETBIT(flags, 5); - iReadingOrder = GETBITS(flags, 14, 15); + fAutoCo = GETBIT(flags, 0); + fAutoMode = GETBIT(flags, 1); + rot = GETBITS(flags, 2, 4); + fAutoRot = GETBIT(flags, 5); + iReadingOrder = GETBITS(flags, 14, 15); _rott = rot; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp index 1c829e1eff..944f691064 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp @@ -146,8 +146,8 @@ void TxO::readFields(CFRecord& record) } } - hAlignment = static_cast(GETBITS(flags, 1, 3)); - vAlignment = static_cast(GETBITS(flags, 4, 6)); // reserved2 (2 bits) + hAlignment = GETBITS(flags, 1, 3); + vAlignment = GETBITS(flags, 4, 6); // reserved2 (2 bits) fLockText = GETBIT(flags, 9); // reserved3 (4 bits) fJustLast = GETBIT(flags, 14); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.h index b4d3049c63..493200e351 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.h @@ -55,6 +55,8 @@ public: cbRuns = 0; sp_enabled = false; preserve_enabled = false; + hAlignment = 0; + vAlignment = 0; } ~TxO(); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxtQry.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxtQry.cpp index 6acd3b4289..59fe94f269 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxtQry.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxtQry.cpp @@ -37,6 +37,8 @@ namespace XLS TxtQry::TxtQry() { + iCpidNew = 0; + iTextDelm = 0; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/XF.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/XF.cpp index 967009a10a..fa197b3e2e 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/XF.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/XF.cpp @@ -37,7 +37,8 @@ namespace XLS XF::XF(size_t& cell_xf_current_id, size_t& style_xf_current_id) : cell(cell_xf_current_id, style_xf_current_id), - style(cell_xf_current_id, style_xf_current_id) + style(cell_xf_current_id, style_xf_current_id), + ixfParent(0) { } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/CellXF.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/CellXF.cpp index 09c00f1a2a..34340d1aff 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/CellXF.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/CellXF.cpp @@ -41,6 +41,7 @@ namespace XLS CellXF::CellXF(size_t& cell_xf_current_id, size_t& style_xf_current_id) : cell_xf_current_id_(cell_xf_current_id), style_xf_current_id_(style_xf_current_id), font_id(0xFFFF) { + alc = alcV = 0; } @@ -70,7 +71,7 @@ void CellXF::load(CFRecord& record) fShrinkToFit = 0;//GETBIT(flags1, 20); iReadOrder = 0;//static_cast(GETBITS(flags1, 22, 23)); - char orient = GETBITS(flags1, 8, 10); + char orient = static_cast(GETBITS(flags1, 8, 10)); switch(orient) { diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtCOLORREF.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtCOLORREF.cpp index d8d2961b8e..73a6bc0b47 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtCOLORREF.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtCOLORREF.cpp @@ -44,9 +44,9 @@ OfficeArtCOLORREF::OfficeArtCOLORREF() OfficeArtCOLORREF::OfficeArtCOLORREF(const int raw_data) { - red = static_cast(GETBITS(raw_data, 0, 7)); - green = static_cast(GETBITS(raw_data, 8, 15)); - blue = static_cast(GETBITS(raw_data, 16, 23)); + red = GETBITS(raw_data, 0, 7); + green = GETBITS(raw_data, 8, 15); + blue = GETBITS(raw_data, 16, 23); fPaletteIndex = GETBIT(raw_data, 24); fPaletteRGB = GETBIT(raw_data, 25); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/PtgSxName.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/PtgSxName.cpp index ce3357d230..8ea3e04582 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/PtgSxName.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/PtgSxName.cpp @@ -31,7 +31,14 @@ */ #include "PtgSxName.h" -#include + +#include "../Biff_unions/PIVOTCACHE.h" +#include "../Biff_unions/FDB.h" +#include "../Biff_unions/SXOPER.h" + +#include "../Biff_records/SXFDB.h" +#include "../Biff_records/SxName.h" +#include "../Biff_records/SXPair.h" namespace XLS { @@ -51,38 +58,59 @@ void PtgSxName::loadFields(CFRecord& record) void PtgSxName::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool full_ref) { - //RevNamePtr tab_id; - //if(!extra_data.empty() && (tab_id = boost::dynamic_pointer_cast(extra_data.front()))) - //{ - // Log::error("PtgNameX struct for revisions is not assemble."); - // ptg_stack.push(L"#REF!"); - // extra_data.pop(); - // return; - //} - std::wstring _Name; - if(sxIndex > 0 && sxIndex <= global_info->AddinUdfs.size() && !(_Name = global_info->AddinUdfs[sxIndex - 1]).empty()) + + if (sxIndex < global_info->arPivotSxNames.size()) { + SxName *name = dynamic_cast(global_info->arPivotSxNames[sxIndex].name.get()); + + if ((name) && (name->ifdb >= 0 && name->ifdb < global_info->arPivotCacheSxNames.size())) + { + _Name = global_info->arPivotCacheSxNames[name->ifdb]; + } + else if (!global_info->arPivotSxNames[sxIndex].pair.empty()) + { + SXPair *pair = dynamic_cast(global_info->arPivotSxNames[sxIndex].pair[0].get()); + if (pair) + { + std::map::iterator pFind = global_info->mapPivotCache.find(global_info->idPivotCache); + if (pFind != global_info->mapPivotCache.end()) + { + PIVOTCACHE* pivot_cache = dynamic_cast(pFind->second.get()); + if (pivot_cache) + { + if (pair->isxvd >= 0 && pair->isxvd < pivot_cache->m_arFDB.size()) + { + FDB* field = dynamic_cast(pivot_cache->m_arFDB[pair->isxvd].get()); + if (field) + { + + SXFDB* field_db= dynamic_cast(field->m_SXFDB.get()); + if (field_db) + { + _Name = field_db->stFieldName.value(); + + if (std::wstring::npos != _Name.find(L" ")) + { + _Name = L"'" + _Name + L"'"; + } + } + if (pair->iCache >= 0 && pair->iCache < field->m_arSRCSXOPER.size()) + { + SXOPER* cache = dynamic_cast(field->m_arSRCSXOPER[pair->iCache].get()); + if (cache) + { + _Name += L"[" + cache->get_value() + L"]"; + } + } + } + } + } + } + } + } ptg_stack.push(_Name); } - else if(sxIndex > 0 && sxIndex <= global_info->xti_parsed.size()) - { - std::wstring sheet = global_info->xti_parsed[sxIndex-1]; - - if (!sheet.empty()) sheet += L"!"; - - if (sxIndex > 0 && sxIndex <= global_info->arDefineNames.size()) - { - _Name = global_info->arDefineNames[sxIndex - 1]; - } - - if (sheet.empty() && _Name.empty() && sxIndex <= global_info->arExternalNames.size() && sxIndex > 0) - { - _Name = global_info->arExternalNames[sxIndex - 1]; - } - - ptg_stack.push(sheet + _Name); - } else { Log::warning("PtgSxName structure is not assemble."); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/StyleXF.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/StyleXF.cpp index 86c156a9ed..1967be28d0 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/StyleXF.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/StyleXF.cpp @@ -41,9 +41,11 @@ namespace XLS StyleXF::StyleXF(size_t& cell_xf_current_id, size_t& style_xf_current_id) : cell_xf_current_id_(cell_xf_current_id), style_xf_current_id_(style_xf_current_id), font_id(0xFFFF) { - font_id = -1; + font_id = -1; border_x_id = -1; fill_x_id = -1; + + fill.fls = 0; } @@ -83,7 +85,7 @@ void StyleXF::load(CFRecord& record) case 3: trot = 270; break; // Text orientation: 90 deg clockwise. } - fill.fls = static_cast(GETBITS(flags2, 16, 21)); + fill.fls = GETBITS(flags2, 16, 21); fill.icvFore = GETBITS(flags2, 0, 6); fill.icvBack = GETBITS(flags2, 7, 13); @@ -132,7 +134,7 @@ void StyleXF::load(CFRecord& record) border.icvBottom = (0 != border.dgBottom)? static_cast(GETBITS(flags3, 7, 13)) : 0; border.icvDiag = (0 != border.dgDiag) ? static_cast(GETBITS(flags3, 14, 20)) : 0; - fill.fls = static_cast(GETBITS(flags3, 26, 31)); + fill.fls = GETBITS(flags3, 26, 31); fill.icvFore = GETBITS(flags4, 0, 6); fill.icvBack = GETBITS(flags4, 7, 13); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/DREF.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/DREF.cpp index cf9fc782a5..909c2c7019 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/DREF.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/DREF.cpp @@ -92,41 +92,26 @@ int DREF::serialize(std::wostream & strm) } else if(bin) { - switch(bin->nBuiltin) + CP_XML_ATTR(L"type", L"worksheet"); + CP_XML_NODE(L"worksheetSource") { - - case 0x0004:/*Database*/ - case 0x000d:/*_FilterDatabase*/ + switch(bin->nBuiltin) { - CP_XML_ATTR(L"type", L"external"); - //connectionId in connections(root) - }break; - case 0x0000:/*Consolidate_Area*/ - //{ - // CP_XML_ATTR(L"type", L"consolidation"); - // CP_XML_NODE(L"consolidation") - // { - // CP_XML_ATTR(L"name", bin->stFile.value()); - // } - //}break; - case 0x0001:/*Auto_Open*/ - case 0x0002:/*Auto_Close*/ - case 0x0003:/*Extract*/ - case 0x0005:/*Criteria*/ - case 0x0006:/*Print_Area*/ - case 0x0007:/*Print_Titles*/ - case 0x0008:/*Recorder*/ - case 0x0009:/*Data_Form*/ - case 0x000a:/*Auto_Activate*/ - case 0x000b:/*Auto_Deactivate*/ - case 0x000c:/*Sheet_Title*/ - { - CP_XML_ATTR(L"type", L"scenario"); - CP_XML_NODE(L"worksheetSource") - { - CP_XML_ATTR(L"name", bin->stFile.value()); - } - }break; + case 0x0000: CP_XML_ATTR(L"name", L"_xlnm.Consolidate_Area"); break; + case 0x0001: CP_XML_ATTR(L"name", L"_xlnm.Auto_Open"); break; + case 0x0002: CP_XML_ATTR(L"name", L"_xlnm.Auto_Close"); break; + case 0x0003: CP_XML_ATTR(L"name", L"_xlnm.Extract"); break; + case 0x0004: CP_XML_ATTR(L"name", L"_xlnm.Database"); break; + case 0x0005: CP_XML_ATTR(L"name", L"_xlnm.Criteria"); break; + case 0x0006: CP_XML_ATTR(L"name", L"_xlnm.Print_Area"); break; + case 0x0007: CP_XML_ATTR(L"name", L"_xlnm.Print_Titles"); break; + case 0x0008: CP_XML_ATTR(L"name", L"_xlnm.Recorder"); break; + case 0x0009: CP_XML_ATTR(L"name", L"_xlnm.Data_Form"); break; + case 0x000a: CP_XML_ATTR(L"name", L"_xlnm.Auto_Activate"); break; + case 0x000b: CP_XML_ATTR(L"name", L"_xlnm.Auto_Deactivate"); break; + case 0x000c: CP_XML_ATTR(L"name", L"_xlnm.Sheet_Title"); break; + case 0x000d: CP_XML_ATTR(L"name", L"_xlnm._FilterDatabase"); break; //?? + } } } else if(ref) diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.cpp index 2dc8be67fa..78b47fa90b 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.cpp @@ -97,6 +97,8 @@ BaseObjectPtr FDB::clone() const bool FDB::loadContent(BinProcessor& proc) { + global_info = proc.getGlobalWorkbookInfo(); + if(!proc.mandatory()) { return false; @@ -179,6 +181,8 @@ int FDB::serialize(std::wostream & strm) SXFDBType* fdb_type = dynamic_cast(m_SXFDBType.get()); if (!fdb || !fdb_type) return 0; + + global_info->arPivotCacheSxNames.push_back(fdb->stFieldName.value()); CP_XML_WRITER(strm) { @@ -214,7 +218,9 @@ int FDB::serialize(std::wostream & strm) } if(m_SXFMLA) { - //{formula + SXFMLA* Formula = dynamic_cast(m_SXFMLA.get()); + if (Formula) + Formula->serialize_attr(CP_GET_XML_NODE()); } if (m_arSRCSXOPER.empty() == false) diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.h index 9f9809b74d..cf521b1ed0 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/FDB.h @@ -67,6 +67,7 @@ public: bool bInteger; bool bBool; + GlobalWorkbookInfoPtr global_info; }; } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTCACHEDEFINITION.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTCACHEDEFINITION.cpp index 518bf30846..52860606e2 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTCACHEDEFINITION.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTCACHEDEFINITION.cpp @@ -91,12 +91,17 @@ const bool PIVOTCACHEDEFINITION::loadContent(BinProcessor& proc) } int PIVOTCACHEDEFINITION::serialize_definitions(std::wostream & strm) { + global_info_->arPivotCacheSxNames.clear(); + global_info_->arPivotSxNames.clear(); + SXStreamID* streamId = dynamic_cast(m_SXStreamID.get()); if (!streamId) return 0; std::map::iterator pFind = global_info_->mapPivotCache.find(streamId->idStm); if (pFind == global_info_->mapPivotCache.end()) return 0; + global_info_->idPivotCache = streamId->idStm; + PIVOTCACHE* pivot_cache = dynamic_cast(pFind->second.get()); if (!pivot_cache) return 0; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTRULE.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTRULE.cpp index 1448e89128..f90cb62380 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTRULE.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTRULE.cpp @@ -31,8 +31,8 @@ */ #include "PIVOTRULE.h" -#include -#include +#include "PRFILTER.h" +#include "../Biff_records/SxRule.h" namespace XLS { @@ -49,7 +49,6 @@ BaseObjectPtr PIVOTRULE::clone() return BaseObjectPtr(new PIVOTRULE(*this)); } - // PIVOTRULE = SxRule *PRFILTER const bool PIVOTRULE::loadContent(BinProcessor& proc) { diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTVD.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTVD.cpp index 43ea22dfb9..44a75289ff 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTVD.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PIVOTVD.cpp @@ -89,7 +89,8 @@ int PIVOTVD::serialize(std::wostream & strm) if (vd->sxaxis.bRw) CP_XML_ATTR(L"axis", L"axisRow"); else if (vd->sxaxis.bCol) CP_XML_ATTR(L"axis", L"axisCol"); else if (vd->sxaxis.bPage) CP_XML_ATTR(L"axis", L"axisPage"); - else if (vd->sxaxis.bData) + + if (vd->sxaxis.bData) { CP_XML_ATTR(L"dataField", 1); } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.cpp index 356760d9a2..d7c7efc383 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.cpp @@ -31,30 +31,26 @@ */ #include "PRFILTER.h" -#include -#include -#include +#include "../Biff_records/SxFilt.h" +#include "../Biff_records/SxItm.h" +#include "../Biff_records/Continue.h" namespace XLS { - PRFILTER::PRFILTER() { } - PRFILTER::~PRFILTER() { } - BaseObjectPtr PRFILTER::clone() { return BaseObjectPtr(new PRFILTER(*this)); } - // PRFILTER = SxFilt [SxItm *Continue] const bool PRFILTER::loadContent(BinProcessor& proc) { @@ -62,11 +58,16 @@ const bool PRFILTER::loadContent(BinProcessor& proc) { return false; } + m_SxFilt = elements_.back(); + elements_.pop_back(); + if(proc.optional()) { + m_SxItm = elements_.back(); + elements_.pop_back(); + int count = proc.repeated(0, 0); } - return true; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.h index 9685b423f6..82a91be0f7 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/PRFILTER.h @@ -36,8 +36,6 @@ namespace XLS { - -// Logical representation of PRFILTER union of records class PRFILTER: public CompositeObject { BASE_OBJECT_DEFINE_CLASS_NAME(PRFILTER) @@ -49,7 +47,10 @@ public: virtual const bool loadContent(BinProcessor& proc); - static const ElementType type = typePRFILTER; + static const ElementType type = typePRFILTER; + + BaseObjectPtr m_SxFilt; + BaseObjectPtr m_SxItm; }; } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.cpp index 7064f665ce..81700af29d 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.cpp @@ -79,7 +79,7 @@ BaseObjectPtr SXFMLA::clone() // SXFMLA = SxFmla *(SxName *SXPair) const bool SXFMLA::loadContent(BinProcessor& proc) { - GlobalWorkbookInfoPtr global_info = proc.getGlobalWorkbookInfo(); + global_info = proc.getGlobalWorkbookInfo(); if(!proc.mandatory()) { @@ -97,7 +97,7 @@ const bool SXFMLA::loadContent(BinProcessor& proc) _sx_name sx_name; sx_name.name = elements_.front(); elements_.pop_front(); - global_info->arPivotSxNames.push_back(sx_name); + m_arPivotSxNames.push_back(sx_name); } else { @@ -109,7 +109,7 @@ const bool SXFMLA::loadContent(BinProcessor& proc) } else { - global_info->arPivotSxNames.back().pair.push_back(elements_.front()); + m_arPivotSxNames.back().pair.push_back(elements_.front()); elements_.pop_front(); } } @@ -119,5 +119,17 @@ const bool SXFMLA::loadContent(BinProcessor& proc) return true; } +void SXFMLA::serialize_attr(CP_ATTR_NODE) +{ + if (!m_SxFmla) return; + + SxFmla* sx_fmla = dynamic_cast(m_SxFmla.get()); + + global_info->arPivotSxNames = m_arPivotSxNames; + + CP_XML_ATTR(L"formula", sx_fmla->fmla.getAssembledFormula()); +} + + } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.h index 3975c2560e..e0c5273729 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFMLA_bu.h @@ -35,6 +35,7 @@ namespace XLS { + class SXFMLA: public CompositeObject { BASE_OBJECT_DEFINE_CLASS_NAME(SXFMLA) @@ -46,10 +47,15 @@ public: BaseObjectPtr clone(); virtual const bool loadContent(BinProcessor& proc); + + void serialize_attr(CP_ATTR_NODE); - static const ElementType type = typeSXFMLA; + static const ElementType type = typeSXFMLA; BaseObjectPtr m_SxFmla; + std::vector<_sx_name> m_arPivotSxNames; +//------------------------------------------------------------------------- + GlobalWorkbookInfoPtr global_info; }; } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFORMULA_bu.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFORMULA_bu.cpp index 95386b30b7..cf4cc0d117 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFORMULA_bu.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXFORMULA_bu.cpp @@ -34,11 +34,15 @@ #include "SXFMLA_bu.h" #include "PIVOTRULE.h" +#include "PRFILTER.h" #include "../Biff_records/SXFormula.h" #include "../Biff_records/SxFmla.h" #include "../Biff_records/SxName.h" #include "../Biff_records/SXPair.h" +#include "../Biff_records/SxItm.h" +#include "../Biff_records/SxFilt.h" +#include "../Biff_records/SxRule.h" namespace XLS { @@ -85,21 +89,52 @@ int SXFORMULA::serialize(std::wostream & strm) SXFMLA* fmla = dynamic_cast(m_SXFMLA.get()); if (!fmla) return 0; - SxFmla* sx_fmla = dynamic_cast(fmla->m_SxFmla.get()); + PIVOTRULE* pivot_rule = dynamic_cast(m_PIVOTRULE.get()); CP_XML_WRITER(strm) { CP_XML_NODE(L"calculatedItem") { - CP_XML_ATTR(L"formula", sx_fmla->fmla.getAssembledFormula()); - - //for (size_t j = 0; j < global_info->arPivotSxNames.size(); j++)//??? - //{ - // SxName *name = dynamic_cast(global_info->arPivotSxNames[j].m_SxName.get()); - // CP_XML_NODE(L"pivotArea") - // { - // } - //} + fmla->serialize_attr(CP_GET_XML_NODE()); + + if (pivot_rule) + { + SxRule* rule = dynamic_cast(pivot_rule->m_SxRule.get()); + + for (size_t j = 0; j < pivot_rule->m_arPRFILTER.size(); j++)//multi in pivotAreas !!! todooo ??? + { + PRFILTER* filter = dynamic_cast(pivot_rule->m_arPRFILTER[j].get()); + + SxItm* item = dynamic_cast(filter->m_SxItm.get()); + SxFilt* filt = dynamic_cast(filter->m_SxFilt.get()); + + CP_XML_NODE(L"pivotArea") + { + CP_XML_ATTR(L"cacheIndex", 1);//true + CP_XML_ATTR(L"outline", 0); + CP_XML_ATTR(L"fieldPosition", (int)rule->iDim); + + CP_XML_NODE(L"references") + { + CP_XML_ATTR(L"count", item->rgisxvi.size()); + + for (size_t i = 0; i < item->rgisxvi.size(); i++) + { + CP_XML_NODE(L"reference") + { + CP_XML_ATTR(L"field", (int)filt->isxvd); + CP_XML_ATTR(L"count", (int)filt->iDim); + + CP_XML_NODE(L"x") + { + CP_XML_ATTR(L"v", item->rgisxvi[i]); + } + } + } + } + } + } + } } } return 0; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.cpp index 21ecb860dc..78df2240ec 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.cpp @@ -111,5 +111,36 @@ int SXOPER::serialize(std::wostream & strm) m_element->serialize(strm); return 0; } + +std::wstring SXOPER::get_value() +{ + std::wstring value; + SXNum *num = dynamic_cast(m_element.get()); + if (num) + { + value = std::to_wstring(num->num.data.value); + } + else + { + SXString *str = dynamic_cast(m_element.get()); + if (str) + { + value = str->segment.value(); + } + else + { + SXDtr *dtr = dynamic_cast(m_element.get()); + if (dtr) + { + value = dtr->get_string_date(); + } + else + { + } + } + } + return value; +} + } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.h index 4d960574aa..fac98f264b 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXOPER.h @@ -49,6 +49,8 @@ public: int serialize(std::wostream & strm); + std::wstring get_value(); + static const ElementType type = typeSXOPER; BaseObjectPtr m_element; diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL.h index 71b863af64..81966fe2cb 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL.h @@ -35,6 +35,11 @@ namespace XLS { + struct _sxtbl_item + { + BaseObjectPtr item; + std::vector strings; + }; class SXTBL: public CompositeObject { @@ -47,8 +52,14 @@ public: virtual const bool loadContent(BinProcessor& proc); + int serialize(std::wostream & stream); + static const ElementType type = typeSXTBL; + BaseObjectPtr m_SXTbl; + std::vector m_arDREF; + std::vector m_arSxTbpg; + std::vector<_sxtbl_item> m_arSXTBRGIITM; }; } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL_bu.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL_bu.cpp index 2ba98fa742..41d72ce387 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL_bu.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/SXTBL_bu.cpp @@ -65,6 +65,7 @@ public: { return false; } + proc.repeated(0, 0); return true; }; @@ -80,17 +81,55 @@ BaseObjectPtr SXTBL::clone() // SXTBL = SXTbl *DREF *SxTbpg *(SXTBRGIITM *SXString) const bool SXTBL::loadContent(BinProcessor& proc) { - if(!proc.mandatory()) { return false; } - proc.repeated(0, 0); - proc.repeated(0, 0); - proc.repeated(0, 0); + m_SXTbl = elements_.back(); + elements_.pop_back(); + + int count =0; + + count = proc.repeated(0, 0); + while(!elements_.empty()) + { + m_arDREF.push_back(elements_.front()); + elements_.pop_front(); + } + + count = proc.repeated(0, 0); + while(!elements_.empty()) + { + m_arSxTbpg.push_back(elements_.front()); + elements_.pop_front(); + } + + count = proc.repeated(0, 0); + while(!elements_.empty()) + { + SXTBRGIITM* item = dynamic_cast(elements_.front().get()); + + if (item) + { + _sxtbl_item it; + it.item = elements_.front(); + m_arSXTBRGIITM.push_back(it); + } + else + { + m_arSXTBRGIITM.back().strings.push_back(elements_.front()); + } + elements_.pop_front(); + } return true; } +int SXTBL::serialize(std::wostream & stream) +{ + if (!m_SXTbl) return 0; + + return 0; +} } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.cpp index e3c8225d37..6ea67c3166 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.cpp @@ -118,6 +118,8 @@ GlobalWorkbookInfo::GlobalWorkbookInfo(const unsigned short code_page, XlsConver defaultDigitFontSize = std::pair(0, 0); applicationFonts = NULL; + + idPivotCache = 0; } GlobalWorkbookInfo::~GlobalWorkbookInfo() diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.h index c8cf551174..3f3ef72ad2 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/GlobalWorkbookInfo.h @@ -105,10 +105,14 @@ public: unsigned int last_AXES_id; const static unsigned int initial_AXES_id = 0x2000000; + short idPivotCache; std::map mapPivotCache; std::vector arPivotCacheFields; std::vector arPivotCacheFieldShortSize; + std::vector<_sx_name> arPivotSxNames; + std::vector arPivotCacheSxNames; + std::vector arPivotCacheReferences; std::map> mapDefineNames; std::vector arDefineNames;