From a3bd8b944fa62e61891f173cf7b98e36d573b8d9 Mon Sep 17 00:00:00 2001 From: "Elen.Subbotina" Date: Wed, 5 Aug 2015 16:35:52 +0000 Subject: [PATCH] =?UTF-8?q?XlsFile2=20-=20"=D0=BF=D1=80=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B5"=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BA=D0=B0=D1=80=D1=82=D0=B8=D0=BD=D0=BA=D0=B8=20(?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B5),=20=D0=B3=D0=B8=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=BB=D0=B8=D0=BD=D0=BA=D0=B8=20=D1=81=20=D0=BA=D0=B0?= =?UTF-8?q?=D1=80=D1=82=D0=B8=D0=BD=D0=BE=D0=BA=20(=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BE=D0=B5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@63902 954022d7-b5bf-4e40-9824-e11837661b57 --- .../XlsFormat/Logic/Biff_records/Obj.cpp | 30 ++++++++++++---- .../source/XlsFormat/Logic/Biff_records/Obj.h | 20 ++++++----- .../XlsFormat/Logic/Biff_records/TxO.cpp | 19 +++++++++- .../ODRAW/OfficeArtContainer.cpp | 6 ++-- .../Biff_structures/ODRAW/OfficeArtFOPTE.cpp | 20 ++++++++++- .../Biff_structures/ODRAW/OfficeArtFOPTE.h | 35 ++++++++++++++++-- .../ODRAW/OfficeArtRecordHeader.cpp | 4 +++ .../ODRAW/OfficeArtRecordHeader.h | 1 + .../Logic/Biff_structures/TxORuns.cpp | 9 ----- .../XlsFormat/Logic/Biff_unions/OBJ.cpp | 6 ++-- .../source/XlsFormat/Logic/Biff_unions/OBJ.h | 9 ++--- .../XlsFormat/Logic/Biff_unions/OBJECTS.cpp | 36 +++++-------------- .../source/XlsFormat/Logic/XlsElementsType.h | 1 + .../source/XlsXlsxConverter/XlsConverter.cpp | 28 ++++++++++----- .../XlsXlsxConverter/xlsx_drawing_context.cpp | 31 +++++++++++++++- .../XlsXlsxConverter/xlsx_drawing_context.h | 9 +++++ 16 files changed, 183 insertions(+), 81 deletions(-) diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.cpp index 3272274357..a36e859d1b 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.cpp @@ -1,12 +1,12 @@ #include "Obj.h" #include -#include +#include namespace XLS {; -Obj::Obj(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing) +Obj::Obj() { } @@ -171,12 +171,28 @@ void Obj::readFields(CFRecord& record) std::list& recs = continue_records[rt_Continue]; ODRAW::OfficeArtDgContainer dg(ODRAW::OfficeArtRecord::CA_Sheet); - - while( !recs.empty() ) + if (recs.size()) { - //dg.loadFields(*recs.front()); - mso_drawing_->storeRecordAndDecideProceeding(recs.front()); - recs.pop_front(); + m_OfficeArtSpContainer = ODRAW::OfficeArtRecordPtr(new ODRAW::OfficeArtSpContainer(ODRAW::OfficeArtRecord::CA_Sheet)); + while( !recs.empty() ) + { + record.appendRawData(recs.front()); + recs.pop_front(); + } + record >> *m_OfficeArtSpContainer; + + BYTE* Add = NULL; + if (record.getRdPtr() < record.getDataSize()) + { + int size = record.getDataSize() - record.getRdPtr(); + Add = new BYTE [size]; + memcpy(Add, record.getData(), size); + record.skipNunBytes(size); + } + if (Add) + { + delete []Add; + } } } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.h index 9a5a2b4af4..753ae1014b 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/Obj.h @@ -15,11 +15,17 @@ #include #include -namespace XLS -{; +namespace ODRAW +{ + class OfficeArtRecord; + typedef boost::shared_ptr OfficeArtRecordPtr; +} -class MsoDrawing; -typedef boost::shared_ptr MsoDrawingPtr; +namespace XLS +{ + +//class MsoDrawing; +//typedef boost::shared_ptr MsoDrawingPtr; // Logical representation of Obj record in BIFF8 class Obj : public BiffRecordContinued @@ -27,7 +33,7 @@ class Obj : public BiffRecordContinued BIFF_RECORD_DEFINE_TYPE_INFO(Obj) BASE_OBJECT_DEFINE_CLASS_NAME(Obj) public: - Obj(MsoDrawingPtr mso_drawing); + Obj(); ~Obj(); BaseObjectPtr clone(); @@ -37,7 +43,6 @@ public: static const ElementType type = typeObj; - MsoDrawingPtr mso_drawing_; //----------------------------- FtCmo cmo; FtCf pictFormat; @@ -54,8 +59,7 @@ public: FtLbsData list; FtGboData gbo; - -public: + ODRAW::OfficeArtRecordPtr m_OfficeArtSpContainer; //BO_ATTRIB_MARKUP_BEGIN //BO_ATTRIB_MARKUP_COMPLEX(cmo) //if(0x08 == cmo.ot) diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp index 4fa8d588ac..2a4a3326f8 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_records/TxO.cpp @@ -64,7 +64,24 @@ void TxO::readFields(CFRecord& record) TxOruns.m_runCount = cbRuns / 8 - 1; TxOruns.load(record); - ///+120 byte ??? + ///+120 byte ??? + + + /*BYTE* Add = NULL;*/ + int size = 0; + if (record.getRdPtr() < record.getDataSize()) + { + //XLUnicodeStringNoCch add; + //record >> add; + size = record.getDataSize() - record.getRdPtr(); + //Add = new BYTE [size]; + //memcpy(Add, record.getData(), size); + record.skipNunBytes(size); + } + //if (Add) + //{ + // delete []Add; + //} } } } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtContainer.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtContainer.cpp index 9d2cc176db..964f7ad992 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtContainer.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtContainer.cpp @@ -141,15 +141,15 @@ void OfficeArtContainer::loadFields(XLS::CFRecord& record) if(record.getRdPtr() != child_beginning_ptr + rh_child.recLen) { - if(record.getRdPtr() < child_beginning_ptr + rh_child.recLen) + if(record.getRdPtr() < child_beginning_ptr + rh_child.recLen - 8) { Log::warning(STR::int2wstr(child_beginning_ptr + rh_child.recLen - record.getRdPtr(), 10) + L" unsigned chars were not processed while reading from OfficeArt record of type 0x" + STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType))); } - else + else if(record.getRdPtr() > child_beginning_ptr + rh_child.recLen) { - throw;// EXCEPT::RT::WrongBiffRecord("Wrong data parsed in OfficeArt record of type 0x" + + throw;// EXCEPT::RT::WrongBiffRecord("Wrong data parsed in OfficeArt record of type 0x" + //STR::int2hex_wstr(rh_child.recType, sizeof(rh_child.recType)), record.getTypeString()); } } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp index 1b00bf7771..f836dcbeeb 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.cpp @@ -244,6 +244,9 @@ OfficeArtFOPTEPtr OfficeArtFOPTE::load_and_create(XLS::CFRecord& record) fopte = OfficeArtFOPTEPtr(new ShadowStyleBooleanProperties); break; + case 0x0382: + fopte = OfficeArtFOPTEPtr(new pihlShape); + break; default: fopte = OfficeArtFOPTEPtr(new OfficeArtFOPTE); break; @@ -486,5 +489,20 @@ void fillShadeColors::ReadComplexData(XLS::CFRecord& record) // own_tag->setAttribute(L"fUsefshadowObscured", fUsefshadowObscured); // own_tag->setAttribute(L"fUsefShadow", fUsefShadow); //} +XLS::BiffStructurePtr IHlink::clone() +{ + return XLS::BiffStructurePtr(new IHlink(*this)); +} -} // namespace XLS +void IHlink::load(XLS::CFRecord& record) +{ + record >> CLSID_StdHlink; + record >> hyperlink; +} + +void pihlShape::ReadComplexData(XLS::CFRecord& record) +{ + record >> IHlink_complex; +} + +} diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.h index 32f829100a..52e7d53bbc 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtFOPTE.h @@ -7,6 +7,7 @@ #include "IMsoArray.h" #include "MSOSHADECOLOR.h" #include "MSO_enums.h" +#include namespace XLS { @@ -61,7 +62,6 @@ class TextBooleanProperties : public OfficeArtFOPTE BASE_STRUCTURE_DEFINE_CLASS_NAME(TextBooleanProperties) public: - //virtual void setXMLAttributes(MSXML2::IXMLDOMElementPtr own_tag); }; @@ -384,7 +384,7 @@ class fillShadeColors : public OfficeArtFOPTE public: //virtual void setXMLAttributes(MSXML2::IXMLDOMElementPtr own_tag); virtual void ReadComplexData(XLS::CFRecord& record); -private: + IMsoArray fillShadeColors_complex; }; @@ -572,6 +572,35 @@ public: //} }; +class IHlink; +typedef boost::shared_ptr IHlinkPtr; + +class IHlink : public XLS::BiffStructure +{ + BASE_STRUCTURE_DEFINE_CLASS_NAME(IHlink) +public: + IHlink(){} + + XLS::BiffStructurePtr clone(); + + void load(XLS::CFRecord& record); + void store(XLS::CFRecord& record){} + + static const XLS::ElementType type = XLS::typeIHLink; + + _GUID_ CLSID_StdHlink; + OSHARED::HyperlinkObject hyperlink; +}; + +class pihlShape : public OfficeArtFOPTE +{ + BASE_STRUCTURE_DEFINE_CLASS_NAME(pihlShape) +public: + virtual void ReadComplexData(XLS::CFRecord& record); + + IHlink IHlink_complex; +}; -} // namespace XLS + +} diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.cpp index 42fcfa251b..f6b18d4ca4 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.cpp @@ -6,6 +6,10 @@ namespace ODRAW {; +OfficeArtRecordHeader::OfficeArtRecordHeader() +{ + recVer = recInstance = recType = recLen = 0; +} XLS::BiffStructurePtr OfficeArtRecordHeader::clone() { diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.h index 30269f2389..24e6a27cc1 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/ODRAW/OfficeArtRecordHeader.h @@ -15,6 +15,7 @@ class OfficeArtRecordHeader : public XLS::BiffStructure { BASE_STRUCTURE_DEFINE_CLASS_NAME(OfficeArtRecordHeader) public: + OfficeArtRecordHeader(); XLS::BiffStructurePtr clone(); virtual void load(XLS::CFRecord& record); diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/TxORuns.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/TxORuns.cpp index b4347db106..3ba85f20a7 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/TxORuns.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_structures/TxORuns.cpp @@ -20,15 +20,6 @@ TxORuns::~TxORuns() { } -//void TxORuns::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag) -//{ -// std::for_each(rgTxoRuns.begin(), rgTxoRuns.end(), boost::bind(&Run::toXML, _1, xml_tag)); -// lastRun.toXML(xml_tag); -//} -// -//void TxORuns::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag) -//{ -//} void TxORuns::store(CFRecord& record) { diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.cpp index 2ffb9f11cf..f8f2a172e2 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.cpp @@ -2,13 +2,12 @@ #include "OBJ.h" #include #include -#include namespace XLS {; -OBJ::OBJ(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing) +OBJ::OBJ() { } @@ -27,8 +26,7 @@ BaseObjectPtr OBJ::clone() // OBJ = Obj *Continue const bool OBJ::loadContent(BinProcessor& proc) { - Obj Obj_(mso_drawing_); - if(!proc.mandatory(Obj_)) + if(!proc.mandatory()) { return false; } diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.h index ecc709f736..a583d08cd0 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJ.h @@ -5,27 +5,22 @@ namespace XLS {; -class MsoDrawing; -typedef boost::shared_ptr MsoDrawingPtr; // Logical representation of OBJ union of records class OBJ: public CompositeObject { BASE_OBJECT_DEFINE_CLASS_NAME(OBJ) public: - OBJ(MsoDrawingPtr mso_drawing); + OBJ(); ~OBJ(); BaseObjectPtr clone(); virtual const bool loadContent(BinProcessor& proc); - BaseObjectPtr m_Obj; - MsoDrawingPtr m_MsoDrawing; + BaseObjectPtr m_Obj; static const ElementType type = typeOBJ; - - MsoDrawingPtr mso_drawing_; }; } // namespace XLS diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJECTS.cpp b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJECTS.cpp index 40c0f9d326..5a4bf51a0e 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJECTS.cpp +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/Biff_unions/OBJECTS.cpp @@ -26,10 +26,6 @@ class Parenthesis_OBJECTS_2: public ABNFParenthesis { BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_2) public: - Parenthesis_OBJECTS_2(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing) - { - } - BaseObjectPtr clone() { return BaseObjectPtr(new Parenthesis_OBJECTS_2(*this)); @@ -37,14 +33,12 @@ public: const bool loadContent(BinProcessor& proc) { - OBJ OBJ_(mso_drawing_); - bool res = proc.optional() || - proc.optional(OBJ_)|| - proc.optional(); + bool res = proc.optional() || + proc.optional() || + proc.optional(); return res; }; - MsoDrawingPtr mso_drawing_; }; @@ -53,13 +47,13 @@ class Parenthesis_OBJECTS_1: public ABNFParenthesis BASE_OBJECT_DEFINE_CLASS_NAME(Parenthesis_OBJECTS_1) public: - Parenthesis_OBJECTS_1(MsoDrawingPtr mso_drawing,MsoDrawingPtr mso_drawing2) : mso_drawing_(mso_drawing), mso_drawing2_(mso_drawing2) + Parenthesis_OBJECTS_1(MsoDrawingPtr mso_drawing) : mso_drawing_(mso_drawing) { } BaseObjectPtr clone() { - return BaseObjectPtr(new Parenthesis_OBJECTS_1(mso_drawing_, mso_drawing2_)); + return BaseObjectPtr(new Parenthesis_OBJECTS_1(mso_drawing_)); } const bool loadContent(BinProcessor& proc) @@ -74,13 +68,12 @@ public: { return false; } - int count1 = proc.repeated(Parenthesis_OBJECTS_2(mso_drawing2_), 0, 0); - + proc.repeated(Parenthesis_OBJECTS_2(), 0, 0); + proc.repeated(0,0); return true; } MsoDrawingPtr mso_drawing_; - MsoDrawingPtr mso_drawing2_; }; @@ -101,22 +94,9 @@ const bool OBJECTS::loadContent(BinProcessor& proc) const bool OBJECTS::loadContentRead(BinReaderProcessor& proc) { m_MsoDrawing = boost::shared_ptr(new MsoDrawing(is_inside_chart_sheet_)); - m_MsoDrawingObjects = boost::shared_ptr(new MsoDrawing(is_inside_chart_sheet_)); - int count1 = proc.repeated(Parenthesis_OBJECTS_1(m_MsoDrawing, m_MsoDrawingObjects), 0, 0); + int count1 = proc.repeated(Parenthesis_OBJECTS_1(m_MsoDrawing), 0, 0); - if (m_MsoDrawing->isReading == false) - { - try - { - m_MsoDrawingObjects->readFields(); - m_MsoDrawing = m_MsoDrawingObjects; - } - catch(...) - { - } - } - int i = 0 ; for(std::list::iterator it = elements_.begin(); it != elements_.end() ; it++) { diff --git a/ASCOfficeXlsFile2/source/XlsFormat/Logic/XlsElementsType.h b/ASCOfficeXlsFile2/source/XlsFormat/Logic/XlsElementsType.h index 8dc797dafb..72f69b018a 100644 --- a/ASCOfficeXlsFile2/source/XlsFormat/Logic/XlsElementsType.h +++ b/ASCOfficeXlsFile2/source/XlsFormat/Logic/XlsElementsType.h @@ -147,6 +147,7 @@ enum ElementType typeHFPicture, typeHideObj, typeHLink, + typeIHLink, typeHLinkTooltip, typeHorizontalPageBreaks, typeIFmtRecord, diff --git a/ASCOfficeXlsFile2/source/XlsXlsxConverter/XlsConverter.cpp b/ASCOfficeXlsFile2/source/XlsXlsxConverter/XlsConverter.cpp index 4ab192d8a1..f70c56b41d 100644 --- a/ASCOfficeXlsFile2/source/XlsXlsxConverter/XlsConverter.cpp +++ b/ASCOfficeXlsFile2/source/XlsXlsxConverter/XlsConverter.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -443,24 +444,25 @@ void XlsConverter::convert(XLS::OBJECTS* objects) ODRAW::OfficeArtSpgrContainer *spgr = dynamic_cast(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpgrContainer.get()); //ODRAW::OfficeArtSpContainer *sp = dynamic_cast(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.get()); - if (spgr == NULL && objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.size() < 1) return; + //if (spgr == NULL/* && objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.size() < 1*/) return; for (long i = 0 ; i < objects->m_OBJs.size(); i++) { int ind = objects->m_OBJs[i].second; + XLS::OBJ* OBJ = dynamic_cast(objects->m_OBJs[i].first.get()); + XLS::Obj *obj = dynamic_cast(OBJ->m_Obj.get()); ODRAW::OfficeArtSpContainer *sp = NULL; - if ( (spgr) && (ind < spgr->child_records.size())) + + if (obj->m_OfficeArtSpContainer) + { + sp = dynamic_cast(obj->m_OfficeArtSpContainer.get()); + } + else if ( (spgr) && (ind < spgr->child_records.size())) { sp = dynamic_cast(spgr->child_records[ind+1].get()); } - else if (ind < objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer.size()) - { - sp = dynamic_cast(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpContainer[ind].get()); - } - XLS::OBJ* OBJ = dynamic_cast(objects->m_OBJs[i].first.get()); - XLS::Obj *obj = dynamic_cast(OBJ->m_Obj.get()); if (xlsx_context->get_drawing_context().start_drawing(obj->cmo.ot)) { @@ -539,8 +541,16 @@ void XlsConverter::convert(ODRAW::OfficeArtFOPT * fort) std::wstring rId = xlsx_context->get_mediaitems().find_image(fort->fopt.rgfopte[i]->op , target, isIternal); xlsx_context->get_drawing_context().set_image(target); }break; + case 0x0382: + { + ODRAW::pihlShape *pihlShape = dynamic_cast(fort->fopt.rgfopte[i].get()); + if (pihlShape) + { + std::wstring target = GetTargetMoniker(pihlShape->IHlink_complex.hyperlink.oleMoniker.data.get()); + xlsx_context->get_drawing_context().set_hyperlink(target); + } + }break; } - } } diff --git a/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.cpp b/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.cpp index 2478bace08..3b5bad645e 100644 --- a/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.cpp +++ b/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.cpp @@ -5,7 +5,7 @@ #include "xlsx_drawing_context.h" #include - +#include namespace oox { @@ -150,6 +150,7 @@ void xlsx_drawing_context::set_shape_id(int id) if (drawing_state.size() < 1 )return; drawing_state.back().shape_id = id; } + void xlsx_drawing_context::end_drawing() { if (drawing_state.size() < 1 )return; @@ -188,6 +189,17 @@ void xlsx_drawing_context::serialize_pic(std::wstring rId) { if (drawing_state.back().id >= 0) CP_XML_ATTR(L"id", drawing_state.back().id); CP_XML_ATTR(L"name", L"Picture_" + rId.substr(5)); + + if (!drawing_state.back().hyperlink.empty()) + { + CP_XML_NODE(L"a:hlinkClick") + { + CP_XML_ATTR(L"xmlns:r", L"http://schemas.openxmlformats.org/officeDocument/2006/relationships"); + //CP_XML_ATTR(L"xmlns:a", L"http://schemas.openxmlformats.org/drawingml/2006/main"); + + CP_XML_ATTR(L"r:id", drawing_state.back().hyperlink); + } + } } CP_XML_NODE(L"xdr:cNvPicPr") { @@ -266,6 +278,23 @@ void xlsx_drawing_context::set_image(std::wstring & str) if (drawing_state.size() < 1 )return; drawing_state.back().image_target = str; } + +void xlsx_drawing_context::set_hyperlink(std::wstring & str) +{ + if (drawing_state.size() < 1 )return; + + std::wstring hId=std::wstring(L"hId") + boost::lexical_cast(hlinks_.size()+1); + + std::wstring href_correct = xml::utils::replace_text_to_xml(str); + + _hlink_desc desc = {hId, href_correct}; + + hlinks_.push_back(desc); + drawing_state.back().hyperlink = hId; + + xlsx_drawings_->add( false, hId , href_correct, external_items::typeHyperlink); +} + void xlsx_drawing_context::set_properties(std::wstring & str) { if (drawing_state.size() < 1 )return; diff --git a/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.h b/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.h index 8e8e2b8e7a..3ffaa644da 100644 --- a/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.h +++ b/ASCOfficeXlsFile2/source/XlsXlsxConverter/xlsx_drawing_context.h @@ -39,9 +39,15 @@ public: int shape_id; bool flipV; bool flipH; + std::wstring hyperlink; bool isInternal; }; +struct _hlink_desc +{ + std::wstring hId; + std::wstring hRef; +}; class xlsx_drawing_context { @@ -67,6 +73,7 @@ public: void set_image(std::wstring & str); void set_anchor(std::wstring & str); void set_properties(std::wstring & str); + void set_hyperlink(std::wstring & str); void serialize(std::wostream & stream); @@ -79,6 +86,8 @@ private: xlsx_drawing_context_handle & handle_; xlsx_drawings_ptr xlsx_drawings_; int count_object; + + std::vector<_hlink_desc> hlinks_; }; }