From b611f97d0ff0e2f2d00ece02a8a9d9e00a856d49 Mon Sep 17 00:00:00 2001 From: ElenaSubbotina Date: Fri, 14 Oct 2016 15:54:03 +0300 Subject: [PATCH] XlsxFormat - add header/footer for spreadsheets --- .../Source/XlsxFormat/Comments/Comments.h | 7 +- .../Source/XlsxFormat/Worksheets/Worksheet.h | 36 +- .../Worksheets/WorksheetChildOther.h | 403 ++++++++++++++++++ .../Source/XlsxFormat/WritingElement.h | 5 + 4 files changed, 435 insertions(+), 16 deletions(-) diff --git a/Common/DocxFormat/Source/XlsxFormat/Comments/Comments.h b/Common/DocxFormat/Source/XlsxFormat/Comments/Comments.h index f5d440e000..7c3a1c7ee6 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Comments/Comments.h +++ b/Common/DocxFormat/Source/XlsxFormat/Comments/Comments.h @@ -345,12 +345,13 @@ namespace OOX return m_oReadPath; } private: - CPath m_oReadPath; + CPath m_oReadPath; + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) { } public: - nullable m_oAuthors; + nullable m_oAuthors; nullable m_oCommentList; }; class CLegacyDrawingWorksheet : public WritingElement @@ -388,7 +389,7 @@ namespace OOX virtual EElementType getType () const { - return et_FromTo; + return et_LegacyDrawingWorksheet; } private: diff --git a/Common/DocxFormat/Source/XlsxFormat/Worksheets/Worksheet.h b/Common/DocxFormat/Source/XlsxFormat/Worksheets/Worksheet.h index de19cee172..7a1d7f6d06 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Worksheets/Worksheet.h +++ b/Common/DocxFormat/Source/XlsxFormat/Worksheets/Worksheet.h @@ -56,29 +56,25 @@ namespace OOX { namespace Spreadsheet { - //необработанные child: +//необработанные child: // // // // // // - // - // // - // // // - // // // // // // - // // // // + class CWorksheet : public OOX::File, public OOX::Spreadsheet::IFileContainer { public: @@ -153,30 +149,39 @@ namespace OOX else if ( _T("tableParts") == sName ) m_oTableParts = oReader; else if ( _T("legacyDrawing") == sName ) - m_oLegacyDrawingWorksheet = oReader; + m_oLegacyDrawing = oReader; + else if ( _T("legacyDrawingHF") == sName ) + m_oLegacyDrawingHF = oReader; else if ( _T("oleObjects") == sName ) m_oOleObjects = oReader; + else if ( _T("headerFooter") == sName ) + m_oHeaderFooter = oReader; else if (_T("sheetPr") == sName) m_oSheetPr = oReader; else if (_T("extLst") == sName) m_oExtLst = oReader; + else if (_T("picture") == sName) + m_oPicture = oReader; } } - if(m_oLegacyDrawingWorksheet.IsInit() && m_oLegacyDrawingWorksheet->m_oId.IsInit()) + if(m_oLegacyDrawing.IsInit() && m_oLegacyDrawing->m_oId.IsInit()) { - OOX::RId oRId(m_oLegacyDrawingWorksheet->m_oId->GetValue()); + OOX::RId oRId(m_oLegacyDrawing->m_oId->GetValue()); smart_ptr oVmlDrawing = IFileContainer::Find(oRId); smart_ptr oComments = IFileContainer::Get(FileTypes::Comments); if (oComments.IsInit() && FileTypes::Comments == oComments->type() && oVmlDrawing.IsInit() && OOX::FileTypes::VmlDrawing == oVmlDrawing->type()) { - OOX::Spreadsheet::CComments* pComments = static_cast(oComments.operator->()); + OOX::Spreadsheet::CComments* pComments = static_cast(oComments.operator->()); OOX::CVmlDrawing* pVmlDrawing = static_cast(oVmlDrawing.operator->()); PrepareComments(pComments, pVmlDrawing); } } + if (m_oHeaderFooter.IsInit() && m_oLegacyDrawing.IsInit() && m_oLegacyDrawingHF->m_oId.IsInit()) + { + } } } void PrepareComments(OOX::Spreadsheet::CComments* pComments, OOX::CVmlDrawing* pVmlDrawing) @@ -357,8 +362,10 @@ namespace OOX m_oPageSetup->toXML(sXml); if(m_oDrawing.IsInit()) m_oDrawing->toXML(sXml); - if(m_oLegacyDrawingWorksheet.IsInit()) - m_oLegacyDrawingWorksheet->toXML(sXml); + if(m_oLegacyDrawing.IsInit()) + m_oLegacyDrawing->toXML(sXml); + if(m_oLegacyDrawingHF.IsInit()) + m_oLegacyDrawingHF->toXML(sXml); if(m_oOleObjects.IsInit()) m_oOleObjects->toXML(sXml); if(m_oTableParts.IsInit()) @@ -535,11 +542,14 @@ namespace OOX nullable m_oPrintOptions; nullable m_oAutofilter; nullable m_oTableParts; - nullable m_oLegacyDrawingWorksheet; + nullable m_oLegacyDrawing; nullable m_oOleObjects; std::map m_mapComments; std::vector m_arrConditionalFormatting; nullable m_oSheetPr; + nullable m_oHeaderFooter; + nullable m_oLegacyDrawingHF; + nullable m_oPicture; nullable m_oExtLst; }; diff --git a/Common/DocxFormat/Source/XlsxFormat/Worksheets/WorksheetChildOther.h b/Common/DocxFormat/Source/XlsxFormat/Worksheets/WorksheetChildOther.h index b4221cc1b8..42cbc43ab5 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Worksheets/WorksheetChildOther.h +++ b/Common/DocxFormat/Source/XlsxFormat/Worksheets/WorksheetChildOther.h @@ -945,6 +945,409 @@ namespace OOX nullable> m_oTransitionEntry; nullable> m_oTransitionEvaluation; }; + class CHeaderFooterElement : public WritingElement + { + public: + WritingElementSpreadsheet_AdditionConstructors(CHeaderFooterElement) + CHeaderFooterElement() + { + } + virtual ~CHeaderFooterElement() + { + } + + public: + virtual CString toXML() const + { + return _T(""); + } + virtual void toXML(XmlUtils::CStringWriter& writer) const + { + } + void toXML2(XmlUtils::CStringWriter& writer, CString sName) const + { + if (m_sText.IsEmpty()) return; + + writer.WriteString(_T("<")); + writer.WriteString(sName); + writer.WriteString(_T(">")); + + writer.WriteString(m_sText); + + writer.WriteString(_T("")); + } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes( oReader ); + + if ( oReader.IsEmptyNode() ) + return; + + m_sText = oReader.GetText2(); + } + virtual EElementType getType () const + { + return et_HeaderFooterElementWorksheet; + } + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start( oReader ) + WritingElement_ReadAttributes_End( oReader ) + } + + public: + CString m_sText; + }; + + class CHeaderFooter : public WritingElement + { + public: + WritingElementSpreadsheet_AdditionConstructors(CHeaderFooter) + CHeaderFooter() + { + } + virtual ~CHeaderFooter() + { + } + + public: + virtual CString toXML() const + { + return _T(""); + } + virtual void toXML(XmlUtils::CStringWriter& writer) const + { + writer.WriteString(_T("ToString()); + writer.WriteString(sVal); + } + if(m_oDifferentFirst.IsInit()) + { + CString sVal; sVal.Format(_T(" differentFirst=\"%ls\""), m_oDifferentFirst->ToString()); + writer.WriteString(sVal); + } + if(m_oDifferentOddEven.IsInit()) + { + CString sVal; sVal.Format(_T(" differentOddEven=\"%ls\""), m_oDifferentOddEven->ToString()); + writer.WriteString(sVal); + } + if(m_oScaleWithDoc.IsInit()) + { + CString sVal; sVal.Format(_T(" scaleWithDoc=\"%ls\""), m_oScaleWithDoc->ToString()); + writer.WriteString(sVal); + } + writer.WriteString(_T(">")); + if (m_oOddHeader.IsInit()) + { + m_oOddHeader->toXML2(writer, _T("oddHeader")); + } + if (m_oOddFooter.IsInit()) + { + m_oOddFooter->toXML2(writer, _T("oddFooter")); + } + if (m_oEvenHeader.IsInit()) + { + m_oEvenHeader->toXML2(writer, _T("evenHeader")); + } + if (m_oEvenFooter.IsInit()) + { + m_oEvenFooter->toXML2(writer, _T("evenFooter")); + } + if (m_oFirstFooter.IsInit()) + { + m_oFirstFooter->toXML2(writer, _T("firstFooter")); + } + if (m_oFirstHeader.IsInit()) + { + m_oFirstHeader->toXML2(writer, _T("firstHeader")); + } + writer.WriteString(_T("")); + } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes( oReader ); + + if ( oReader.IsEmptyNode() ) + return; + + int nCurDepth = oReader.GetDepth(); + while( oReader.ReadNextSiblingNode( nCurDepth ) ) + { + CString sName = XmlUtils::GetNameNoNS(oReader.GetName()); + + if ( _T("evenFooter") == sName ) + m_oEvenFooter = oReader; + else if ( _T("evenHeader") == sName ) + m_oEvenHeader = oReader; + else if ( _T("firstFooter") == sName ) + m_oFirstFooter = oReader; + else if ( _T("firstHeader") == sName ) + m_oFirstHeader = oReader; + else if ( _T("oddFooter") == sName ) + m_oOddFooter = oReader; + else if ( _T("oddHeader") == sName ) + m_oOddHeader = oReader; + } + } + virtual EElementType getType () const + { + return et_HeaderFooterWorksheet; + } + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start( oReader ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("alignWithMargins"), m_oAlignWithMargins) + WritingElement_ReadAttributes_Read_if ( oReader, _T("differentFirst"), m_oDifferentFirst) + WritingElement_ReadAttributes_Read_if ( oReader, _T("differentOddEven"), m_oDifferentOddEven) + WritingElement_ReadAttributes_Read_if ( oReader, _T("scaleWithDoc"), m_oScaleWithDoc) + WritingElement_ReadAttributes_End( oReader ) + } + + public: + nullable m_oEvenFooter; + nullable m_oEvenHeader; + nullable m_oFirstFooter; + nullable m_oFirstHeader; + nullable m_oOddFooter; + nullable m_oOddHeader; + + nullable> m_oAlignWithMargins; + nullable> m_oDifferentFirst; + nullable> m_oDifferentOddEven; + nullable> m_oScaleWithDoc; + + }; + + class CLegacyDrawingHFWorksheet : public WritingElement + { + public: + WritingElementSpreadsheet_AdditionConstructors(CLegacyDrawingHFWorksheet) + CLegacyDrawingHFWorksheet() + { + } + virtual ~CLegacyDrawingHFWorksheet() + { + } + + public: + virtual CString toXML() const + { + return _T(""); + } + virtual void toXML(XmlUtils::CStringWriter& writer) const + { + if(!m_oId.IsInit()) return; + + CString sVal = _T("GetValue() ; + + if(m_oCfe.IsInit()) + { + CString sVal; sVal.Format(_T(" cfe=\"%d\""), m_oCfe->GetValue()); + writer.WriteString(sVal); + } + if(m_oCff.IsInit()) + { + CString sVal; sVal.Format(_T(" cff=\"%d\""), m_oCff->GetValue()); + writer.WriteString(sVal); + } + if(m_oCfo.IsInit()) + { + CString sVal; sVal.Format(_T(" cfo=\"%d\""), m_oCfo->GetValue()); + writer.WriteString(sVal); + } + if(m_oChe.IsInit()) + { + CString sVal; sVal.Format(_T(" che=\"%d\""), m_oChe->GetValue()); + writer.WriteString(sVal); + } + if(m_oChf.IsInit()) + { + CString sVal; sVal.Format(_T(" chf=\"%d\""), m_oChf->GetValue()); + writer.WriteString(sVal); + } + if(m_oCho.IsInit()) + { + CString sVal; sVal.Format(_T(" cho=\"%d\""), m_oCho->GetValue()); + writer.WriteString(sVal); + } + if(m_oLfe.IsInit()) + { + CString sVal; sVal.Format(_T(" lfe=\"%d\""), m_oLfe->GetValue()); + writer.WriteString(sVal); + } + if(m_oLff.IsInit()) + { + CString sVal; sVal.Format(_T(" lff=\"%d\""), m_oLff->GetValue()); + writer.WriteString(sVal); + } + if(m_oLhe.IsInit()) + { + CString sVal; sVal.Format(_T(" lhe=\"%d\""), m_oLhe->GetValue()); + writer.WriteString(sVal); + } + if(m_oLhf.IsInit()) + { + CString sVal; sVal.Format(_T(" lLhf=\"%d\""), m_oLhf->GetValue()); + writer.WriteString(sVal); + } + if(m_oLho.IsInit()) + { + CString sVal; sVal.Format(_T(" lho=\"%d\""), m_oLho->GetValue()); + writer.WriteString(sVal); + } + if(m_oRfe.IsInit()) + { + CString sVal; sVal.Format(_T(" rfe=\"%d\""), m_oRfe->GetValue()); + writer.WriteString(sVal); + } + if(m_oRff.IsInit()) + { + CString sVal; sVal.Format(_T(" rff=\"%d\""), m_oRff->GetValue()); + writer.WriteString(sVal); + } + if(m_oRfo.IsInit()) + { + CString sVal; sVal.Format(_T(" rfo=\"%d\""), m_oRfo->GetValue()); + writer.WriteString(sVal); + } + if(m_oRhe.IsInit()) + { + CString sVal; sVal.Format(_T(" rhe=\"%d\""), m_oRhe->GetValue()); + writer.WriteString(sVal); + } + if(m_oRhf.IsInit()) + { + CString sVal; sVal.Format(_T(" rhf=\"%d\""), m_oRhf->GetValue()); + writer.WriteString(sVal); + } + if(m_oRho.IsInit()) + { + CString sVal; sVal.Format(_T(" rho=\"%d\""), m_oRho->GetValue()); + writer.WriteString(sVal); + } + + sVal += _T("\"/>"); + writer.WriteString(sVal); + + } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes( oReader ); + + if ( !oReader.IsEmptyNode() ) + oReader.ReadTillEnd(); + } + + virtual EElementType getType () const + { + return et_LegacyDrawingHFWorksheet; + } + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start( oReader ) + + WritingElement_ReadAttributes_Read_if ( oReader, _T("r:id"), m_oId ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("cfe"), m_oCfe ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("cff"), m_oCff ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("cfo"), m_oCfo ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("che"), m_oChe ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("chf"), m_oChf ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("cho"), m_oCho ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("lfe"), m_oLfe ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("lff"), m_oLff ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("lhe"), m_oLhe ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("lhf"), m_oLhf ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("lho"), m_oLho ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("rfe"), m_oRfe ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("rff"), m_oRff ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("rfo"), m_oRfo ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("rhe"), m_oRhe ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("rhf"), m_oRhf ) + WritingElement_ReadAttributes_Read_if ( oReader, _T("rho"), m_oRho ) + + WritingElement_ReadAttributes_End( oReader ) + } + public: + nullable m_oId; + nullable> m_oCfe; + nullable> m_oCff; + nullable> m_oCfo; + nullable> m_oChe; + nullable> m_oChf; + nullable> m_oCho; + nullable> m_oLfe; + nullable> m_oLff; + nullable> m_oLhe; + nullable> m_oLhf; + nullable> m_oLho; + nullable> m_oRfe; + nullable> m_oRff; + nullable> m_oRfo; + nullable> m_oRhe; + nullable> m_oRhf; + nullable> m_oRho; + }; + + class CPictureWorksheet : public WritingElement + { + public: + WritingElementSpreadsheet_AdditionConstructors(CPictureWorksheet) + CPictureWorksheet() + { + } + virtual ~CPictureWorksheet() + { + } + + public: + virtual CString toXML() const + { + return _T(""); + } + virtual void toXML(XmlUtils::CStringWriter& writer) const + { + if(m_oId.IsInit()) + { + CString sVal = _T("GetValue() + _T("\"/>"); + writer.WriteString(sVal); + } + + } + virtual void fromXML(XmlUtils::CXmlLiteReader& oReader) + { + ReadAttributes( oReader ); + + if ( !oReader.IsEmptyNode() ) + oReader.ReadTillEnd(); + } + + virtual EElementType getType () const + { + return et_PictureWorksheet; + } + + private: + void ReadAttributes(XmlUtils::CXmlLiteReader& oReader) + { + WritingElement_ReadAttributes_Start( oReader ) + + WritingElement_ReadAttributes_Read_if ( oReader, _T("r:id"), m_oId ) + + WritingElement_ReadAttributes_End( oReader ) + } + public: + nullable m_oId; + }; } //Spreadsheet } // namespace OOX diff --git a/Common/DocxFormat/Source/XlsxFormat/WritingElement.h b/Common/DocxFormat/Source/XlsxFormat/WritingElement.h index ec31d32140..ae7c866301 100644 --- a/Common/DocxFormat/Source/XlsxFormat/WritingElement.h +++ b/Common/DocxFormat/Source/XlsxFormat/WritingElement.h @@ -336,6 +336,11 @@ namespace Spreadsheet et_Pane, et_ExternalBook, et_Selection, + et_LegacyDrawingWorksheet, + et_LegacyDrawingHFWorksheet, + et_PictureWorksheet, + et_HeaderFooterWorksheet, + et_HeaderFooterElementWorksheet, et_PictureNonVisual, et_NonVisualDrawingProperties,