From ccbc044f11658d3db03d1ccf771e161140ead978 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Mon, 18 Feb 2019 17:38:05 +0300 Subject: [PATCH] . --- .../Source/DocxFormat/Drawing/DrawingExt.cpp | 11 + .../Source/DocxFormat/Drawing/DrawingExt.h | 14 +- .../Worksheets/ConditionalFormatting.h | 356 ++++++++++++------ .../Common/BinReaderWriterDefines.h | 3 +- XlsxSerializerCom/Reader/BinaryWriter.h | 6 + XlsxSerializerCom/Writer/BinaryReader.h | 57 ++- 6 files changed, 314 insertions(+), 133 deletions(-) diff --git a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp index ca5f2e6864..d9b4d3f14d 100644 --- a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp +++ b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.cpp @@ -147,6 +147,17 @@ namespace OOX m_oAltTextTable->toXML(writer); sResult += writer.GetData().c_str(); } + if (false == m_arrConditionalFormatting.empty()) + { + sResult += L""; + NSStringUtils::CStringBuilder writer; + for (size_t i = 0; i < m_arrConditionalFormatting.size(); i++) + { + m_arrConditionalFormatting[i]->toXML2(writer, true); + } + sResult += writer.GetData().c_str(); + sResult += L""; + } if (m_oId.IsInit()) { sResult += L"<" + sNamespace + L"id>" + m_oId.get2() + L""; diff --git a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.h b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.h index 82c3e5169b..53320fd79e 100644 --- a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.h +++ b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingExt.h @@ -220,15 +220,15 @@ namespace OOX } } } - virtual std::wstring toXML() const + virtual std::wstring toXML() const { - return toXMLWithNS(_T("a:")); + return toXMLWithNS(L"a:"); } std::wstring toXMLWithNS(const std::wstring& sNamespace) const { - std::wstring sResult = _T("<"); - sResult += sNamespace; - sResult += _T("extLst>"); + if (m_arrExt.empty()) return L""; + + std::wstring sResult = L"<" + sNamespace + L"extLst>"; for ( size_t nIndex = 0; nIndex < m_arrExt.size(); nIndex++ ) { @@ -236,9 +236,7 @@ namespace OOX sResult += m_arrExt[nIndex]->toXMLWithNS(sNamespace); } - sResult += _T(""); + sResult += L""; return sResult; } diff --git a/Common/DocxFormat/Source/XlsxFormat/Worksheets/ConditionalFormatting.h b/Common/DocxFormat/Source/XlsxFormat/Worksheets/ConditionalFormatting.h index adb9ccc1ba..9c01cee71c 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Worksheets/ConditionalFormatting.h +++ b/Common/DocxFormat/Source/XlsxFormat/Worksheets/ConditionalFormatting.h @@ -60,12 +60,16 @@ namespace OOX { return L""; } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const { writer.WriteString(L"<" + m_sNodeName + L">"); writer.WriteEncodeXmlString(m_sText); writer.WriteString(L""); } + virtual void toXML(NSStringUtils::CStringBuilder& writer) const + { + toXML2(writer, false); + } virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { m_sNodeName = oReader.GetName(); @@ -97,7 +101,10 @@ namespace OOX return oFormula; } - + bool isExtended () + { + return false; + } std::wstring m_sNodeName; std::wstring m_sText; }; @@ -121,19 +128,31 @@ namespace OOX } virtual void toXML(NSStringUtils::CStringBuilder& writer) const { - if (m_oType.IsInit()) + toXML2(writer, false); + } + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const + { + if (false == m_oType.IsInit()) return; + + if (bExtendedWrite == false) { - writer.WriteString(L"GetValue() == SimpleTypes::Spreadsheet::autoMin) m_oType->SetValue(SimpleTypes::Spreadsheet::Minimum); if (m_oType->GetValue() == SimpleTypes::Spreadsheet::autoMax) m_oType->SetValue(SimpleTypes::Spreadsheet::Maximum); + } + std::wstring node_name = bExtendedWrite ? L"x14:cfvo" : L"cfvo"; + + writer.WriteString(L"<" + node_name); WritingStringAttrString(L"type", m_oType->ToString()); if (m_oGte.IsInit() && false == m_oGte->ToBool()) writer.WriteString(L" gte=\"0\""); WritingStringNullableAttrEncodeXmlString(L"val", m_oVal, m_oVal.get()); - writer.WriteString(L"/>"); - } + writer.WriteString(L">"); + + if (m_oFormula.IsInit()) + m_oFormula->toXML2(writer, bExtendedWrite); + + writer.WriteString(L""); } virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -150,7 +169,6 @@ namespace OOX m_oFormula = oReader; } } - virtual EElementType getType () const { return et_x_ConditionalFormatValueObject; @@ -161,11 +179,9 @@ namespace OOX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start(oReader) - - WritingElement_ReadAttributes_Read_if (oReader, L"gte" , m_oGte) - WritingElement_ReadAttributes_Read_else_if (oReader, L"type" , m_oType) - WritingElement_ReadAttributes_Read_else_if (oReader, L"val" , m_oVal) - + WritingElement_ReadAttributes_Read_if (oReader, L"gte" , m_oGte) + WritingElement_ReadAttributes_Read_else_if (oReader, L"type" , m_oType) + WritingElement_ReadAttributes_Read_else_if (oReader, L"val" , m_oVal) WritingElement_ReadAttributes_End(oReader) } @@ -196,10 +212,16 @@ namespace OOX } virtual void toXML(NSStringUtils::CStringBuilder& writer) const { - writer.WriteString(L""); + toXML2(writer, false); + } + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const + { + if (!bExtendedWrite) return; + + writer.WriteString(L""); WritingStringNullableAttrString(L"iconSet", m_oIconSet, m_oIconSet->ToString()) WritingStringNullableAttrInt(L"iconId", m_oIconId, m_oIconId->GetValue()) - writer.WriteString(L""); + writer.WriteString(L""); } virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -244,6 +266,10 @@ namespace OOX return L""; } virtual void toXML(NSStringUtils::CStringBuilder& writer) const + { + toXML2(writer, false); + } + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const { if (1 < m_arrValues.size() && 1 < m_arrColors.size()) // min 2 + 2 { @@ -254,7 +280,7 @@ namespace OOX { if ( m_arrValues[i].IsInit() ) { - m_arrValues[i]->toXML(writer); + m_arrValues[i]->toXML2(writer, bExtendedWrite); } //if ( (i < m_arrColors.size()) && (m_arrColors[i].IsInit()) ) //{ @@ -334,7 +360,10 @@ namespace OOX } return oColorScale; } - + bool isExtended () + { + return false; + } std::vector> m_arrValues; std::vector> m_arrColors; }; @@ -356,33 +385,73 @@ namespace OOX { return L""; } + bool isExtended () + { + if (m_oAxisColor.IsInit() || m_oAxisPosition.IsInit() || m_oDirection.IsInit() || m_oBorderColor.IsInit() + || m_oNegativeFillColor.IsInit() || m_oNegativeBorderColor.IsInit() + || m_oNegativeBarColorSameAsPositive.IsInit() || m_oNegativeBarBorderColorSameAsPositive.IsInit()) + { + return true; + } + return false; + } virtual void toXML(NSStringUtils::CStringBuilder& writer) const { - if (2 == m_arrValues.size() && m_oColor.IsInit()) - { - std::wstring sValue; - writer.WriteString(L"GetValue()); WritingStringNullableAttrInt(L"minLength", m_oMinLength, m_oMinLength->GetValue()); if (m_oShowValue.IsInit() && false == m_oShowValue->ToBool()) { writer.WriteString(L" showValue=\"0\""); } + if (bExtendedWrite) + { + if (m_oBorderColor.IsInit()) writer.WriteString(L" border=\"1\""); + WritingStringNullableAttrString(L"axisPosition", m_oAxisPosition, m_oAxisPosition->ToString()) + WritingStringNullableAttrString(L"direction", m_oDirection, m_oDirection->ToString()) + + if (m_oGradient.IsInit() && false == m_oGradient->ToBool()) + { + writer.WriteString(L" gradient=\"0\""); + } + if (m_oNegativeBarColorSameAsPositive.IsInit() && true == m_oNegativeBarColorSameAsPositive->ToBool()) + { + writer.WriteString(L" negativeBarColorSameAsPositive=\"1\""); + } + if (m_oNegativeBarBorderColorSameAsPositive.IsInit() && false == m_oNegativeBarBorderColorSameAsPositive->ToBool()) + { + writer.WriteString(L" negativeBarBorderColorSameAsPositive=\"0\""); + } + } + writer.WriteString(L">"); - writer.WriteString(L">"); - - for ( size_t i = 0; i < m_arrValues.size(); ++i) + for ( size_t i = 0; i < m_arrValues.size(); ++i) + { + if ( m_arrValues[i].IsInit() ) { - if ( m_arrValues[i].IsInit() ) - { - m_arrValues[i]->toXML(writer); - } + m_arrValues[i]->toXML2(writer, bExtendedWrite); } + } - m_oColor->toXML2(writer, L"color"); + m_oColor->toXML2(writer, bExtendedWrite ? L"x14:fillColor" : L"color"); - writer.WriteString(L""); + if (bExtendedWrite) + { + if (m_oBorderColor.IsInit()) m_oBorderColor->toXML2(writer, L"x14:borderColor"); + if (m_oNegativeFillColor.IsInit()) m_oNegativeFillColor->toXML2(writer, L"x14:negativeFillColor"); + if (m_oNegativeBorderColor.IsInit())m_oNegativeBorderColor->toXML2(writer, L"x14:negativeBorderColor"); + if (m_oAxisColor.IsInit()) m_oAxisColor->toXML2(writer, L"x14:axisColor"); } + + writer.WriteString(L""); } virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -438,6 +507,7 @@ namespace OOX oDataBar.m_oGradient = Merge( oPrev.m_oGradient, oCurrent.m_oGradient ); 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 ); @@ -462,17 +532,16 @@ namespace OOX void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { WritingElement_ReadAttributes_Start(oReader) + WritingElement_ReadAttributes_Read_if (oReader, L"maxLength" , m_oMaxLength) + WritingElement_ReadAttributes_Read_else_if (oReader, L"minLength" , m_oMinLength) + WritingElement_ReadAttributes_Read_else_if (oReader, L"showValue" , m_oShowValue) - WritingElement_ReadAttributes_Read_if (oReader, L"maxLength" , m_oMaxLength) - WritingElement_ReadAttributes_Read_else_if (oReader, L"minLength" , m_oMinLength) - WritingElement_ReadAttributes_Read_else_if (oReader, L"showValue" , m_oShowValue) - - WritingElement_ReadAttributes_Read_else_if (oReader, L"axisPosition", m_oAxisPosition) - WritingElement_ReadAttributes_Read_else_if (oReader, L"border" , m_oBorder) - WritingElement_ReadAttributes_Read_else_if (oReader, L"gradient" , m_oGradient) - WritingElement_ReadAttributes_Read_else_if (oReader, L"direction" , m_oDirection) - WritingElement_ReadAttributes_Read_else_if (oReader, L"negativeBarColorSameAsPositive" , m_oNegativeBarColorSameAsPositive) - + WritingElement_ReadAttributes_Read_else_if (oReader, L"axisPosition", m_oAxisPosition) + WritingElement_ReadAttributes_Read_else_if (oReader, L"border" , m_oBorder) + WritingElement_ReadAttributes_Read_else_if (oReader, L"gradient" , m_oGradient) + WritingElement_ReadAttributes_Read_else_if (oReader, L"direction" , m_oDirection) + WritingElement_ReadAttributes_Read_else_if (oReader, L"negativeBarColorSameAsPositive", m_oNegativeBarColorSameAsPositive) + WritingElement_ReadAttributes_Read_else_if (oReader, L"negativeBarBorderColorSameAsPositive", m_oNegativeBarBorderColorSameAsPositive) WritingElement_ReadAttributes_End(oReader) } @@ -484,12 +553,14 @@ namespace OOX nullable m_oColor; std::vector> m_arrValues; + //---ext----------- nullable> m_oAxisPosition; nullable> m_oDirection; nullable> m_oBorder; nullable> m_oGradient; nullable> m_oNegativeBarColorSameAsPositive; + nullable> m_oNegativeBarBorderColorSameAsPositive; nullable m_oAxisColor; nullable m_oBorderColor; @@ -517,45 +588,50 @@ namespace OOX } virtual void toXML(NSStringUtils::CStringBuilder& writer) const { - if (1 < m_arrValues.size()) // min value = 2 - { - std::wstring sValue; - writer.WriteString(L"ToString()) - if (m_oPercent.IsInit() && false == m_oPercent->ToBool()) - { - writer.WriteString(L" percent=\"0\""); - } - if (m_oReverse.IsInit() && true == m_oReverse->ToBool()) - { - writer.WriteString(L" reverse=\"1\""); - } - if (m_oShowValue.IsInit() && false == m_oShowValue->ToBool()) - { - writer.WriteString(L" showValue=\"0\""); - } - if (m_oCustom.IsInit() && true == m_oCustom->ToBool()) - { - writer.WriteString(L" custom=\"1\""); - } - writer.WriteString(L">"); + toXML2(writer, false); + } + void toXML2(NSStringUtils::CStringBuilder& writer, bool bExtendedWrite) const + { + if (m_arrValues.size() < 2) return; // min value = 2 - for ( size_t i = 0; i < m_arrValues.size(); ++i) - { - if ( m_arrValues[i].IsInit() ) - { - m_arrValues[i]->toXML(writer); - } - } - for ( size_t i = 0; i < m_arrIconSets.size(); ++i) - { - if ( m_arrIconSets[i].IsInit() ) - { - m_arrIconSets[i]->toXML(writer); - } - } - writer.WriteString(L""); + std::wstring node_name = bExtendedWrite ? L"x14:iconSet" : L"iconSet"; + + std::wstring sValue; + writer.WriteString(L"<" + node_name); + WritingStringNullableAttrString(L"iconSet", m_oIconSet, m_oIconSet->ToString()) + if (m_oPercent.IsInit() && false == m_oPercent->ToBool()) + { + writer.WriteString(L" percent=\"0\""); } + if (m_oReverse.IsInit() && true == m_oReverse->ToBool()) + { + writer.WriteString(L" reverse=\"1\""); + } + if (m_oShowValue.IsInit() && false == m_oShowValue->ToBool()) + { + writer.WriteString(L" showValue=\"0\""); + } + if (bExtendedWrite && false == m_arrIconSets.empty()) + { + writer.WriteString(L" custom=\"1\""); + } + writer.WriteString(L">"); + + for ( size_t i = 0; i < m_arrValues.size(); ++i) + { + if ( m_arrValues[i].IsInit() ) + { + m_arrValues[i]->toXML2(writer, bExtendedWrite); + } + } + for ( size_t i = 0; bExtendedWrite && i < m_arrIconSets.size(); ++i) + { + if ( m_arrIconSets[i].IsInit() ) + { + m_arrIconSets[i]->toXML2(writer, bExtendedWrite); + } + } + writer.WriteString(L""); } virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -628,6 +704,10 @@ namespace OOX } return oIconSet; } + bool isExtended () + { + return (false == m_arrIconSets.empty()); + } private: void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) @@ -672,11 +752,28 @@ namespace OOX { return L""; } + bool isExtended() + { + if (m_oDxf.IsInit()) return true; + + if (m_oDataBar.IsInit()) return m_oDataBar->isExtended(); + if (m_oIconSet.IsInit()) return m_oIconSet->isExtended(); + if (m_oColorScale.IsInit()) return m_oColorScale->isExtended(); + if (m_oFormula.IsInit()) return m_oFormula->isExtended(); + + return false; + } virtual void toXML(NSStringUtils::CStringBuilder& writer) const { - if (isValid()) - { - writer.WriteString(L"ToString()); WritingStringAttrInt(L"priority", m_oPriority->GetValue()); if (m_oAboveAverage.IsInit() && false == m_oAboveAverage->ToBool()) @@ -695,20 +792,18 @@ namespace OOX writer.WriteString(L" stopIfTrue=\"1\""); WritingStringNullableAttrEncodeXmlString(L"text", m_oText, m_oText.get()); WritingStringNullableAttrString(L"timePeriod", m_oTimePeriod, m_oTimePeriod.get()); + writer.WriteString(L">"); - writer.WriteString(L">"); + if (m_oIconSet.IsInit()) + m_oIconSet->toXML2(writer, bExtendedWrite); + if (m_oColorScale.IsInit()) + m_oColorScale->toXML2(writer, bExtendedWrite); + if (m_oDataBar.IsInit()) + m_oDataBar->toXML2(writer, bExtendedWrite); + if (m_oFormula.IsInit()) + m_oFormula->toXML2(writer, bExtendedWrite); - if (m_oIconSet.IsInit()) - m_oIconSet->toXML(writer); - if (m_oColorScale.IsInit()) - m_oColorScale->toXML(writer); - if (m_oDataBar.IsInit()) - m_oDataBar->toXML(writer); - if (m_oFormula.IsInit()) - m_oFormula->toXML(writer); - - writer.WriteString(L""); - } + writer.WriteString(L""); } virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { @@ -868,7 +963,7 @@ namespace OOX { public: WritingElement_AdditionConstructors(CConditionalFormatting) - CConditionalFormatting() + CConditionalFormatting() : m_bIsExtended(false), m_bIsValid(false) { } virtual ~CConditionalFormatting() @@ -881,41 +976,66 @@ namespace OOX { return L""; } - virtual void toXML(NSStringUtils::CStringBuilder& writer) const + bool IsExtended() { - bool isValid = false; + m_bIsExtended = false; + m_bIsValid = false; + + if (m_oSqRef.IsInit() == false) return m_bIsExtended; + + m_bIsValid = true; for ( size_t i = 0; i < m_arrItems.size(); ++i) { - if ( (m_arrItems[i]) && (m_arrItems[i]->isValid()) ) - { - isValid = true; - break; - } + if ( !m_arrItems[i]) continue; + + if (m_arrItems[i]->isValid() == false) + m_bIsValid = false; + if (m_arrItems[i]->isExtended() == true) + m_bIsExtended = true; } - if (m_oSqRef.IsInit() && isValid) - { - writer.WriteString(L"ToBool()) { writer.WriteString(L" pivot=\"1\""); } - - writer.WriteString(L">"); - - for ( size_t i = 0; i < m_arrItems.size(); ++i) + writer.WriteString(L">"); + + for ( size_t i = 0; i < m_arrItems.size(); ++i) + { + if ( m_arrItems[i] ) { - if ( m_arrItems[i] ) - { - m_arrItems[i]->toXML(writer); - } + m_arrItems[i]->toXML2(writer, bExtendedWrite); } - - writer.WriteString(L""); + } + if (bExtendedWrite) + { + writer.WriteString(L"" + m_oSqRef.get() + L""); } + writer.WriteString(L""); } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) { ReadAttributes(oReader); @@ -959,9 +1079,13 @@ namespace OOX WritingElement_ReadAttributes_End(oReader) } + + mutable bool m_bIsExtended; + mutable bool m_bIsValid; public: - nullable> m_oPivot; - nullable m_oSqRef; // ToDo переделать на тип "sqref" (18.18.76) - последовательность "ref", разделенные пробелом + + nullable> m_oPivot; + nullable m_oSqRef; // ToDo переделать на тип "sqref" (18.18.76) - последовательность "ref", разделенные пробелом }; } //Spreadsheet } // namespace OOX diff --git a/XlsxSerializerCom/Common/BinReaderWriterDefines.h b/XlsxSerializerCom/Common/BinReaderWriterDefines.h index 3446872986..49af69532d 100755 --- a/XlsxSerializerCom/Common/BinReaderWriterDefines.h +++ b/XlsxSerializerCom/Common/BinReaderWriterDefines.h @@ -739,7 +739,8 @@ namespace BinXlsxRW AxisPosition = 9, Direction = 10, GradientEnabled = 11, - NegativeBarColorSameAsPositive = 12 + NegativeBarColorSameAsPositive = 12, + NegativeBarBorderColorSameAsPositive = 13 };} namespace c_oSer_ConditionalFormattingIconSet{enum c_oSer_ConditionalFormattingIconSet { diff --git a/XlsxSerializerCom/Reader/BinaryWriter.h b/XlsxSerializerCom/Reader/BinaryWriter.h index 0a2d60ae42..268ec8892e 100755 --- a/XlsxSerializerCom/Reader/BinaryWriter.h +++ b/XlsxSerializerCom/Reader/BinaryWriter.h @@ -4349,6 +4349,12 @@ namespace BinXlsxRW m_oBcw.m_oStream.WriteBOOL(oDataBar.m_oNegativeBarColorSameAsPositive->ToBool()); m_oBcw.WriteItemEnd(nCurPos); } + if (oDataBar.m_oNegativeBarBorderColorSameAsPositive.IsInit()) + { + nCurPos = m_oBcw.WriteItemStart(c_oSer_ConditionalFormattingDataBar::NegativeBarBorderColorSameAsPositive); + m_oBcw.m_oStream.WriteBOOL(oDataBar.m_oNegativeBarBorderColorSameAsPositive->ToBool()); + m_oBcw.WriteItemEnd(nCurPos); + } if (oDataBar.m_oAxisPosition.IsInit()) { nCurPos = m_oBcw.WriteItemStart(c_oSer_ConditionalFormattingDataBar::AxisPosition); diff --git a/XlsxSerializerCom/Writer/BinaryReader.h b/XlsxSerializerCom/Writer/BinaryReader.h index f6373d8237..99bf554b5b 100644 --- a/XlsxSerializerCom/Writer/BinaryReader.h +++ b/XlsxSerializerCom/Writer/BinaryReader.h @@ -2702,10 +2702,37 @@ namespace BinXlsxRW oMergeCells.m_oCount->SetValue((unsigned int)oMergeCells.m_arrItems.size()); SEEK_TO_POS_END(oMergeCells); + OOX::Drawing::COfficeArtExtension* pOfficeArtExtensionCF = new OOX::Drawing::COfficeArtExtension(); + SEEK_TO_POS_START(c_oSerWorksheetsTypes::ConditionalFormatting); - OOX::Spreadsheet::CConditionalFormatting oConditionalFormatting; - READ1_DEF(length, res, this->ReadConditionalFormatting, &oConditionalFormatting); - SEEK_TO_POS_END(oConditionalFormatting); + OOX::Spreadsheet::CConditionalFormatting *pConditionalFormatting = new OOX::Spreadsheet::CConditionalFormatting(); + READ1_DEF(length, res, this->ReadConditionalFormatting, pConditionalFormatting); + + if (pConditionalFormatting->IsExtended()) + { + pOfficeArtExtensionCF->m_arrConditionalFormatting.push_back(pConditionalFormatting); + } + else + { + pConditionalFormatting->toXML(oStreamWriter); + delete pConditionalFormatting; + } + SEEK_TO_POS_END2(); + + if (pOfficeArtExtensionCF->m_arrConditionalFormatting.empty()) + { + delete pOfficeArtExtensionCF; + } + else + { + pOfficeArtExtensionCF->m_sUri.Init(); + pOfficeArtExtensionCF->m_sUri = L"{78C0D931-6437-407d-A8EE-F0AAD7539E65}"; + pOfficeArtExtensionCF->m_sAdditionalNamespace = L"xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\""; + + if (m_pCurWorksheet->m_oExtLst.IsInit() == false) + m_pCurWorksheet->m_oExtLst.Init(); + m_pCurWorksheet->m_oExtLst->m_arrExt.push_back(pOfficeArtExtensionCF); + } SEEK_TO_POS_START(c_oSerWorksheetsTypes::Hyperlinks); OOX::Spreadsheet::CHyperlinks oHyperlinks; @@ -2882,12 +2909,19 @@ namespace BinXlsxRW READ1_DEF(length, res, this->ReadSparklineGroups, pOfficeArtExtension->m_oSparklineGroups.GetPointer()); pOfficeArtExtension->m_sUri.Init(); - pOfficeArtExtension->m_sUri->append(_T("{05C60535-1F16-4fd2-B633-F4F36F0B64E0}")); - pOfficeArtExtension->m_sAdditionalNamespace = _T("xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\""); - OOX::Drawing::COfficeArtExtensionList oExtLst; - oExtLst.m_arrExt.push_back(pOfficeArtExtension); - oStreamWriter.WriteString(oExtLst.toXMLWithNS(_T(""))); + pOfficeArtExtension->m_sUri = L"{05C60535-1F16-4fd2-B633-F4F36F0B64E0}"; + pOfficeArtExtension->m_sAdditionalNamespace = L"xmlns:x14=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/main\""; + + if (m_pCurWorksheet->m_oExtLst.IsInit() == false) + m_pCurWorksheet->m_oExtLst.Init(); + m_pCurWorksheet->m_oExtLst->m_arrExt.push_back(pOfficeArtExtension); + SEEK_TO_POS_END2(); + + if (m_pCurWorksheet->m_oExtLst.IsInit()) + { + oStreamWriter.WriteString(m_pCurWorksheet->m_oExtLst->toXMLWithNS(L"")); + } SEEK_TO_POS_START(c_oSerWorksheetsTypes::WorksheetProp); READ2_DEF_SPREADSHEET(length, res, this->ReadWorksheetProp, poResult); @@ -2911,6 +2945,8 @@ namespace BinXlsxRW } SEEK_TO_POS_END2(); + + m_oBufferedStream.Seek(nOldPos); m_pCurWorksheet->toXMLEnd(oStreamWriter); return res; @@ -4416,6 +4452,11 @@ namespace BinXlsxRW pDataBar->m_oNegativeBarColorSameAsPositive.Init(); pDataBar->m_oNegativeBarColorSameAsPositive->FromBool(m_oBufferedStream.GetBool()); } + else if(c_oSer_ConditionalFormattingDataBar::NegativeBarBorderColorSameAsPositive == type) + { + pDataBar->m_oNegativeBarBorderColorSameAsPositive.Init(); + pDataBar->m_oNegativeBarBorderColorSameAsPositive->FromBool(m_oBufferedStream.GetBool()); + } else if(c_oSer_ConditionalFormattingDataBar::AxisPosition == type) { pDataBar->m_oAxisPosition.Init();