From 0288ee87bde619d4aab09507726f17841b2f3514 Mon Sep 17 00:00:00 2001 From: Viktor Andreev Date: Thu, 28 Dec 2023 19:08:09 +0600 Subject: [PATCH] fix bug #65621 --- .../Logic/Biff_structures/PtgSxName.cpp | 14 ++ OOXML/XlsbFormat/Biff12_unions/PCDFIELD.cpp | 1 + OOXML/XlsbFormat/Biff12_unions/PCDFIELD.h | 2 + OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.cpp | 1 + OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.h | 2 + OOXML/XlsxFormat/Pivot/Pivots.cpp | 152 ++++++++++++------ 6 files changed, 124 insertions(+), 48 deletions(-) diff --git a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgSxName.cpp b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgSxName.cpp index 1928b98c46..cacfbc3c18 100644 --- a/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgSxName.cpp +++ b/MsBinaryFile/XlsFile/Format/Logic/Biff_structures/PtgSxName.cpp @@ -39,6 +39,8 @@ #include "../Biff_records/SXFDB.h" #include "../Biff_records/SxName.h" #include "../Biff_records/SXPair.h" +#include "../../../../../OOXML/XlsbFormat/Biff12_records/BeginPName.h" + namespace XLS { @@ -127,6 +129,18 @@ void PtgSxName::assemble(AssemblerStack& ptg_stack, PtgQueue& extra_data, bool f } } } + else if(static_cast(global_info->arPivotSxNames[sxIndex].name.get())) + { + auto pname = static_cast(global_info->arPivotSxNames[sxIndex].name.get()); + if(pname->ifdb >=0 && pname->ifdb < global_info->arPivotCacheSxNames.size()) + { + _Name = global_info->arPivotCacheSxNames[pname->ifdb]; + if (std::wstring::npos != _Name.find(L" ")) + { + _Name = L"'" + _Name + L"'"; + } + } + } ptg_stack.push(_Name); } else diff --git a/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.cpp b/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.cpp index ff5326474e..a83e005c4f 100644 --- a/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.cpp +++ b/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.cpp @@ -96,6 +96,7 @@ namespace XLSB } else m_bBrtEndPCDField = false; + global_info = proc.getGlobalWorkbookInfo(); return m_BrtBeginPCDField && m_bBrtEndPCDField; } diff --git a/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.h b/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.h index 6164cc8dfb..35bc1e482c 100644 --- a/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.h +++ b/OOXML/XlsbFormat/Biff12_unions/PCDFIELD.h @@ -32,6 +32,7 @@ #pragma once #include "../../../MsBinaryFile/XlsFile/Format/Logic/CompositeObject.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" namespace XLSB { @@ -54,6 +55,7 @@ namespace XLSB XLS::BaseObjectPtr m_PCDFGROUP; XLS::BaseObjectPtr m_FRTPCDFIELD; bool m_bBrtEndPCDField; + XLS::GlobalWorkbookInfoPtr global_info; }; diff --git a/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.cpp b/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.cpp index 2385056314..1ac6b37e9b 100644 --- a/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.cpp +++ b/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.cpp @@ -79,6 +79,7 @@ namespace XLSB } else m_bBrtEndPCDFields = false; + global_info = proc.getGlobalWorkbookInfo(); return m_BrtBeginPCDFields && m_bBrtEndPCDFields; } diff --git a/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.h b/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.h index aed45a15f1..fb72d894d3 100644 --- a/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.h +++ b/OOXML/XlsbFormat/Biff12_unions/PCDFIELDS.h @@ -32,6 +32,7 @@ #pragma once #include "../../../MsBinaryFile/XlsFile/Format/Logic/CompositeObject.h" +#include "../../../MsBinaryFile/XlsFile/Format/Logic/GlobalWorkbookInfo.h" namespace XLSB { @@ -53,6 +54,7 @@ namespace XLSB XLS::BaseObjectPtr m_BrtBeginPCDFields; std::vector m_arPCDFIELD; bool m_bBrtEndPCDFields; + XLS::GlobalWorkbookInfoPtr global_info; }; diff --git a/OOXML/XlsxFormat/Pivot/Pivots.cpp b/OOXML/XlsxFormat/Pivot/Pivots.cpp index 4e8063c7de..dcc4ca17f8 100644 --- a/OOXML/XlsxFormat/Pivot/Pivots.cpp +++ b/OOXML/XlsxFormat/Pivot/Pivots.cpp @@ -121,6 +121,8 @@ #include "../../XlsbFormat/Biff12_unions/PCDSCSET.h" #include "../../XlsbFormat/Biff12_records/BeginPCDSCSet.h" #include "../../XlsbFormat/Biff12_records/PCRRecord.h" +#include "../../XlsbFormat/Biff12_unions/PNAMES.h" +#include "../../XlsbFormat/Biff12_unions/PNAME.h" #include @@ -2345,8 +2347,10 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { m_oColPageCount = ptr->ccolPage; m_oFirstDataCol = ptr->colFirstData; - m_oFirstDataRow = ptr->rwFirstData; m_oFirstHeaderRow = ptr->rwFirstHead; + if(ptr->rwFirstHead < ptr->rwFirstData) + m_oFirstDataRow = ptr->rwFirstData; + m_oRowPageCount = ptr->crwPage; if(!ptr->rfxGeom.toString().empty()) @@ -2669,10 +2673,22 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { m_oCount = (_UINT32)ptr->m_arPCDFIELD.size(); + for(auto &item : ptr->m_arPCDFIELD) + { + auto field = static_cast(item.get()); + if(field == nullptr) + break; + auto BeginField = static_cast(field->m_BrtBeginPCDField.get()); + if(BeginField == nullptr) + break; + ptr->global_info->arPivotCacheSxNames.push_back(BeginField->stFldName); + } + for(auto &item : ptr->m_arPCDFIELD) { m_arrItems.push_back(new CPivotCacheField(item)); } + ptr->global_info->arPivotCacheSxNames.clear(); } } void CPivotCacheFields::ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -2740,7 +2756,20 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" auto ptr = static_cast(obj.get()); if(ptr != nullptr) - { + { + if(ptr->m_PNAMES != nullptr) + { + XLSB::PNAMES* names = static_cast(ptr->m_PNAMES.get()); + for(auto i:names->m_arPNAME) + { + auto name = static_cast(i.get()); + XLS::_sx_name nameStruct; + nameStruct.name = name->m_BrtBeginPName; + ptr->global_info->arPivotSxNames.push_back(nameStruct); + + } + } + ReadAttributes(ptr->m_BrtBeginPCDField); if(ptr->m_PCDFATBL != nullptr) @@ -2748,6 +2777,9 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(ptr->m_PCDFGROUP != nullptr) m_oFieldGroup = ptr->m_PCDFGROUP; + + if(!ptr->global_info->arPivotSxNames.empty()) + ptr->global_info->arPivotSxNames.clear(); } } void CPivotCacheField::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -3019,6 +3051,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" } } } + if(m_oCount->GetValue() != m_arrItems.size()) + *m_oCount = m_arrItems.size(); } } void CSharedItems::ReadAttributes(XLS::BaseObjectPtr& obj) @@ -3405,16 +3439,21 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"bc", m_oBackColor, m_oBackColor->GetValue()); WritingStringNullableAttrInt(L"fc", m_oForeColor, m_oForeColor->GetValue()); WritingStringNullableAttrInt(L"in", m_oFormatIndex, m_oFormatIndex->GetValue()); - writer.WriteString(L">"); + if(!m_arrItems.empty()) + { + 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""); + for ( size_t i = 0; i < m_arrItems.size(); ++i) + { + if ( m_arrItems[i] ) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + else + writer.WriteString(L"/>"); } void CPivotCharacterValue::fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -3491,8 +3530,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(!ptr->info.stCaption.value().empty()) m_oCaption = ptr->info.stCaption.value(); - - m_oCalculated = ptr->info.fFmla; + if(ptr->info.fFmla) + m_oCalculated = ptr->info.fFmla; m_oUnused = ptr->info.fGhost; m_oCount = ptr->info.cIMemProps; @@ -3525,16 +3564,23 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"bc", m_oBackColor, m_oBackColor->GetValue()); WritingStringNullableAttrInt(L"fc", m_oForeColor, m_oForeColor->GetValue()); WritingStringNullableAttrInt(L"in", m_oFormatIndex, m_oFormatIndex->GetValue()); - writer.WriteString(L">"); + if(!m_arrItems.empty()) + { + 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""); + for ( size_t i = 0; i < m_arrItems.size(); ++i) + { + if ( m_arrItems[i] ) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + else + { + writer.WriteString(L"/>"); + } } void CPivotErrorValue::fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -3631,7 +3677,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(!ptr->info.stCaption.value().empty()) m_oCaption = ptr->info.stCaption.value(); - + if(ptr->info.fFmla) m_oCalculated = ptr->info.fFmla; m_oUnused = ptr->info.fGhost; m_oCount = ptr->info.cIMemProps; @@ -3665,16 +3711,21 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"bc", m_oBackColor, m_oBackColor->GetValue()); WritingStringNullableAttrInt(L"fc", m_oForeColor, m_oForeColor->GetValue()); WritingStringNullableAttrInt(L"in", m_oFormatIndex, m_oFormatIndex->GetValue()); - writer.WriteString(L">"); + if(!m_arrItems.empty()) + { + 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""); + for ( size_t i = 0; i < m_arrItems.size(); ++i) + { + if ( m_arrItems[i] ) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + else + writer.WriteString(L"/>"); } void CPivotNumericValue::fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -3752,8 +3803,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(!ptr->info.stCaption.value().empty()) m_oCaption = ptr->info.stCaption.value(); - - m_oCalculated = ptr->info.fFmla; + if(ptr->info.fFmla) + m_oCalculated = ptr->info.fFmla; m_oUnused = ptr->info.fGhost; m_oCount = ptr->info.cIMemProps; @@ -3840,7 +3891,7 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(!ptr->info.stCaption.value().empty()) m_oCaption = ptr->info.stCaption.value(); - + if(ptr->info.fFmla) m_oCalculated = ptr->info.fFmla; m_oUnused = ptr->info.fGhost; m_oCount = ptr->info.cIMemProps; @@ -3928,8 +3979,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" if(!ptr->info.stCaption.value().empty()) m_oCaption = ptr->info.stCaption.value(); - - m_oCalculated = ptr->info.fFmla; + if(ptr->info.fFmla) + m_oCalculated = ptr->info.fFmla; m_oUnused = ptr->info.fGhost; m_oCount = ptr->info.cIMemProps; @@ -3961,16 +4012,21 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" WritingStringNullableAttrInt(L"bc", m_oBackColor, m_oBackColor->GetValue()); WritingStringNullableAttrInt(L"fc", m_oForeColor, m_oForeColor->GetValue()); WritingStringNullableAttrInt(L"in", m_oFormatIndex, m_oFormatIndex->GetValue()); - writer.WriteString(L">"); + if(!m_arrItems.empty()) + { + 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""); + for ( size_t i = 0; i < m_arrItems.size(); ++i) + { + if ( m_arrItems[i] ) + { + m_arrItems[i]->toXML(writer); + } + } + writer.WriteString(L""); + } + else + writer.WriteString(L"/>"); } void CPivotNoValue::fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -4044,8 +4100,8 @@ xmlns:xr16=\"http://schemas.microsoft.com/office/spreadsheetml/2017/revision16\" { if(!ptr->info.stCaption.value().empty()) m_oCaption = ptr->info.stCaption.value(); - - m_oCalculated = ptr->info.fFmla; + if(ptr->info.fFmla) + m_oCalculated = ptr->info.fFmla; m_oUnused = ptr->info.fGhost; m_oCount = ptr->info.cIMemProps;