Commit 17009616 authored by Elen.Subbotina's avatar Elen.Subbotina Committed by Alexander Trofimov

XlsFile2 фиксы ошибок по результатам тестирования

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@64173 954022d7-b5bf-4e40-9824-e11837661b57
parent 567e91af
...@@ -17,39 +17,17 @@ Logger::~Logger() ...@@ -17,39 +17,17 @@ Logger::~Logger()
void Logger::writeLine(const std::string& type, const std::string& str) void Logger::writeLine(const std::string& type, const std::string& str)
{ {
static wchar_t time_stamp[16] ={}; std::cout << type << ": " << str << std::endl;
#if defined(_WIN32) || defined(_WIN64)
time_t now;
tm local;
time(&now);
localtime_s(&local, &now);
swprintf_s(time_stamp, 15, L"%02d:%02d:%02d ", local.tm_hour, local.tm_min, local.tm_sec);
#else
m_log << time_stamp << std::wstring(type.begin(),type.end()) << ": " << std::wstring(str.begin(),str.end()) << std::endl;
std::cout << time_stamp << type << ": " << str << std::endl;
#endif
} }
void Logger::writeLine(const std::wstring& type, const std::wstring& str) void Logger::writeLine(const std::wstring& type, const std::wstring& str)
{ {
static wchar_t time_stamp[16]={}; std::wcout << type << L": " << str << std::endl;
#if defined(_WIN32) || defined(_WIN64)
time_t now;
tm local;
time(&now);
localtime_s(&local, &now);
swprintf_s(time_stamp, 15, L"%02d:%02d:%02d ", local.tm_hour, local.tm_min, local.tm_sec);
#else
m_log << time_stamp << type << L": " << str << std::endl;
std::wcout << time_stamp << type << L": " << str << std::endl;
#endif
} }
Logger& Logger::getLogger() Logger& Logger::getLogger()
{ {
static Logger logger("AVSOfficeXlsFile.log"); static Logger logger("OfficeXlsFile.log");
return logger; return logger;
} }
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
namespace XLS namespace XLS
{ {
const static std::wstring shemeColor[17] =
{L"accent1",L"accent2",L"accent3",L"accent4",L"accent5",L"accent6",L"bg1",L"bg2",L"dk1",L"dk2",L"folHlink",L"hlink",L"lt1",L"lt2",L"phClr",L"tx1",L"tx2"};
Font::Font() Font::Font()
{ {
...@@ -71,6 +73,167 @@ void Font::set_color_ext(FillInfoExt & color_ext_) ...@@ -71,6 +73,167 @@ void Font::set_color_ext(FillInfoExt & color_ext_)
{ {
color_ext = color_ext_; color_ext = color_ext_;
} }
int Font::serialize_rPr(std::wostream & stream)
{
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"a:rPr")
{
if (dyHeight.value())
{
CP_XML_ATTR(L"sz", dyHeight/20 * 100);
}
if ((bls.value()) && (*bls.value() == 700))
{
CP_XML_ATTR(L"b", true);
}
if ((fItalic.value()) && (fItalic))
{
CP_XML_ATTR(L"i", fItalic);
}
//if (bCharSet.value())
//{
// CP_XML_NODE(L"charset")
// {
// CP_XML_ATTR(L"val", bCharSet);
// }
//}
//if ((fCondense.value()) && (*fCondense.value()))
//{
// CP_XML_NODE(L"condense")
// {
// CP_XML_ATTR(L"val", (int)(*fCondense.value()));
// }
//}
//if ((fExtend.value()) && (fExtend))
// {
// CP_XML_NODE(L"extend")
// {
// CP_XML_ATTR(L"val", fExtend);
// }
// }
//if (!fontName.value().empty())
//{
// CP_XML_ATTR(L"typeface", fontName.value());
//}
if (((icv.value()) && (icv < 0x7fff)) || color_ext.enabled )
{
CP_XML_NODE(L"a:solidFill")
{
if (color_ext.enabled )
{
switch(color_ext.xclrType)
{
case 0://auto
/*CP_XML_ATTR(L"auto");*/ break;
case 1://indexed
CP_XML_NODE(L"a:schemeClr")
{
CP_XML_ATTR(L"val", color_ext.icv); break;
}
case 2://rgb
CP_XML_NODE(L"a:srgbClr")
{
CP_XML_ATTR(L"val", STR::toARGB(color_ext.xclrValue));
}break;
case 3://theme color
CP_XML_NODE(L"a:schemeClr")
{
CP_XML_ATTR(L"val", color_ext.xclrValue + 1);
CP_XML_NODE(L"tint")
{
CP_XML_ATTR(L"val", color_ext.nTintShade / 32767.0);
}
}break;
case 4://not set
break;
}
}
else
{
int index = icv;
if (icv < 17)
{
CP_XML_NODE(L"a:schemeClr")
{
CP_XML_ATTR(L"val", shemeColor[icv]);
}
}
}
}
}
//if ((fOutline.value()) && (fOutline))
// {
// CP_XML_NODE(L"outline")
// {
// CP_XML_ATTR(L"val", fOutline);
// }
// }
//if (font.scheme)
//{
// CP_XML_NODE(L"scheme")
// {
// CP_XML_ATTR(L"val", *font.scheme);
// }
//}
//if ((fShadow.value()) && (fShadow))
// {
// CP_XML_NODE(L"shadow")
// {
// CP_XML_ATTR(L"val", fShadow);
// }
// }
//if ((fStrikeOut.value()) && (fStrikeOut))
//{
// CP_XML_NODE(L"strike")
// {
// CP_XML_ATTR(L"val", fStrikeOut);
// }
//}
// if ((uls.value()) && (*uls.value() > 0))
// {
// CP_XML_NODE(L"u")
// {
//switch(uls)
//{
// case 1: CP_XML_ATTR(L"val", "single");break;
// case 2: CP_XML_ATTR(L"val", "double");break;
// case 33: CP_XML_ATTR(L"val", "singleAccounting");break;
// case 34: CP_XML_ATTR(L"val", "doubleAccounting");break;
//}
// }
// }
// if ((sss.value()) && (*sss.value() > 0))
// {
// CP_XML_NODE(L"vertAlign")
// {
//switch(*sss.value())
//{
// case 1: CP_XML_ATTR(L"val", L"superscript");break;
// case 2: CP_XML_ATTR(L"val", L"subscript");break;
//}
//
// }
// }
}
}
return 0;
}
int Font::serialize_properties(std::wostream & stream, bool rPr) int Font::serialize_properties(std::wostream & stream, bool rPr)
{ {
......
...@@ -26,6 +26,7 @@ public: ...@@ -26,6 +26,7 @@ public:
int serialize (std::wostream & stream); int serialize (std::wostream & stream);
int serialize_properties (std::wostream & stream, bool rPr = false); int serialize_properties (std::wostream & stream, bool rPr = false);
int serialize_rPr (std::wostream & stream);
void set_color_ext (FillInfoExt & color_ext); void set_color_ext (FillInfoExt & color_ext);
......
#include "TxO.h" #include "TxO.h"
#include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h> #include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h>
#include <Logic/Biff_records/Font.h>
#include <simple_xml_writer.h>
#include <utils.h>
namespace XLS namespace XLS
{ {
...@@ -29,6 +34,8 @@ void TxO::writeFields(CFRecord& record) ...@@ -29,6 +34,8 @@ void TxO::writeFields(CFRecord& record)
void TxO::readFields(CFRecord& record) void TxO::readFields(CFRecord& record)
{ {
pGlobalWorkbookInfoPtr = record.getGlobalWorkbookInfo();
unsigned short flags; unsigned short flags;
record >> flags; record >> flags;
hAlignment = static_cast<unsigned char>(GETBITS(flags, 1, 3)); hAlignment = static_cast<unsigned char>(GETBITS(flags, 1, 3));
...@@ -76,5 +83,63 @@ void TxO::readFields(CFRecord& record) ...@@ -76,5 +83,63 @@ void TxO::readFields(CFRecord& record)
} }
} }
int TxO::serialize (std::wostream & _stream)
{
std::wstring str_ = commentText.value();
int str_size = str_.size();
int Fmt = 0;
CP_XML_WRITER(_stream)
{
for (int i = 0 ; i < TxOruns.rgTxoRuns.size(); i++)
{
Run *run = dynamic_cast<Run*>(TxOruns.rgTxoRuns[i].get());
if (run == NULL) continue;
int end_string = str_size;
if ( i < TxOruns.rgTxoRuns.size() - 1)
{
Run *run_next = dynamic_cast<Run*>(TxOruns.rgTxoRuns[i+1].get());
if (run_next)
end_string = run_next->formatRun.ich;
}
CP_XML_NODE(L"a:r")
{
Fmt = run->formatRun.ifnt;
serialize_rPr(CP_XML_STREAM(), Fmt );
CP_XML_NODE(L"a:t")
{
//CP_XML_ATTR(L"xml:space", L"preserve");
std::wstring str_part = str_.substr( run->formatRun.ich, end_string - run->formatRun.ich);
CP_XML_STREAM() << xml::utils::replace_text_to_xml(str_part);
}
}
}
}
return 0;
}
int TxO::serialize_rPr (std::wostream & _stream, int iFmt)
{
if (!pGlobalWorkbookInfoPtr) return 0;
if (!pGlobalWorkbookInfoPtr->fonts) return 0;
int sz = pGlobalWorkbookInfoPtr->fonts->size();
if (iFmt -1 > sz || iFmt < 1) return 0;
Font * font = dynamic_cast<Font*>(pGlobalWorkbookInfoPtr->fonts->at(iFmt-1).get());
if (font) font->serialize_rPr(_stream);
return 0;
}
} // namespace XLS } // namespace XLS
...@@ -32,6 +32,11 @@ public: ...@@ -32,6 +32,11 @@ public:
static const ElementType type = typeTxO; static const ElementType type = typeTxO;
int serialize (std::wostream & _stream);
int serialize_rPr (std::wostream & _stream, int iFmt);
GlobalWorkbookInfoPtr pGlobalWorkbookInfoPtr;
BIFF_BYTE hAlignment; BIFF_BYTE hAlignment;
BIFF_BYTE vAlignment; BIFF_BYTE vAlignment;
BIFF_BYTE fLockText; BIFF_BYTE fLockText;
......
...@@ -48,7 +48,7 @@ void ObjFmla::load(CFRecord& record) ...@@ -48,7 +48,7 @@ void ObjFmla::load(CFRecord& record)
size_t data_size = record.getRdPtr() - start_ptr; size_t data_size = record.getRdPtr() - start_ptr;
size_t padding_size = cbFmla - data_size; size_t padding_size = cbFmla - data_size;
if(0 != padding_size) if(0 != padding_size && (record.getRdPtr() + padding_size) <= record.getDataSize())
{ {
record.skipNunBytes(padding_size); record.skipNunBytes(padding_size);
} }
......
...@@ -33,8 +33,13 @@ void ObjectParsedFormula::load(CFRecord& record) ...@@ -33,8 +33,13 @@ void ObjectParsedFormula::load(CFRecord& record)
record >> cce; record >> cce;
cce = GETBITS(cce, 0, 14); cce = GETBITS(cce, 0, 14);
record.skipNunBytes(4); // unused if (record.getRdPtr() + 4 < record.getDataSize()) // .xls - cce == 0
rgce.load(record, cce); record.skipNunBytes(4); // unused
if (cce > 0)
{
rgce.load(record, cce);
}
} }
......
...@@ -18,16 +18,6 @@ Run::Run() ...@@ -18,16 +18,6 @@ Run::Run()
Run::~Run() Run::~Run()
{ {
} }
//
//void Run::setXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
// formatRun.toXML(xml_tag);
//}
//
//void Run::getXMLAttributes(MSXML2::IXMLDOMElementPtr xml_tag)
//{
//}
void Run::store(CFRecord& record) void Run::store(CFRecord& record)
{ {
} }
......
...@@ -77,6 +77,19 @@ int XLUnicodeRichExtendedString::serialize (std::wostream & _stream) ...@@ -77,6 +77,19 @@ int XLUnicodeRichExtendedString::serialize (std::wostream & _stream)
} }
} }
} }
if (start_string < str_.size())
{
CP_XML_NODE(L"r")
{
serialize_rPr(CP_XML_STREAM(), Fmt );
CP_XML_NODE(L"t")
{
std::wstring str_part = str_.substr( start_string, str_.size() - start_string );
CP_XML_STREAM() << xml::utils::replace_text_to_xml(str_part);
}
}
}
} }
return 0; return 0;
......
...@@ -33,9 +33,9 @@ public: ...@@ -33,9 +33,9 @@ public:
const bool loadContent(BinProcessor& proc) const bool loadContent(BinProcessor& proc)
{ {
bool res = proc.optional<TEXTOBJECT>() || bool res = proc.optional<OBJ>() ||
proc.optional<OBJ>() || proc.optional<TEXTOBJECT>() ||
proc.optional<CHART>(); proc.optional<CHART>() ;
return res; return res;
}; };
...@@ -70,8 +70,10 @@ public: ...@@ -70,8 +70,10 @@ public:
// return false; // return false;
//} //}
Parenthesis_OBJECTS_2 parenthesis_objects_2; Parenthesis_OBJECTS_2 parenthesis_objects_2;
int count = proc.repeated(parenthesis_objects_2, 0, 0);
proc.repeated<Continue>(0,0); int count = proc.repeated(parenthesis_objects_2, 0, 0);
int count_continue = proc.repeated<Continue>(0,0);
return res || count>0; return res || count>0;
} }
...@@ -98,30 +100,17 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc) ...@@ -98,30 +100,17 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
m_MsoDrawing = boost::shared_ptr<MsoDrawing>(new MsoDrawing(is_inside_chart_sheet_)); m_MsoDrawing = boost::shared_ptr<MsoDrawing>(new MsoDrawing(is_inside_chart_sheet_));
Parenthesis_OBJECTS_1 parenthesis_objects_1(m_MsoDrawing); Parenthesis_OBJECTS_1 parenthesis_objects_1(m_MsoDrawing);
int count1 = proc.repeated(parenthesis_objects_1, 0, 0); //Parenthesis_OBJECTS_2 parenthesis_objects_2;
Parenthesis_OBJECTS_2 parenthesis_objects_2; int count_1 = proc.repeated(parenthesis_objects_1, 0, 0);
proc.repeated(parenthesis_objects_2, 0, 0);
proc.repeated<Continue>(0,0);
int i = 0 ; //int count_2 = proc.repeated(parenthesis_objects_2, 0, 0);
for(std::list<BaseObjectPtr>::iterator it = elements_.begin(); it != elements_.end() ; it++) //int count_3 = proc.repeated<Continue>(0,0);
{
XLS::ElementType type = (*it)->get_type();
switch (type)
{
case XLS::typeOBJ: m_OBJs.push_back(std::pair<BaseObjectPtr, int>(*it, i)); i++; break;
case XLS::typeTEXTOBJECT: m_TEXTOBJECTs.push_back(std::pair<BaseObjectPtr, int>(*it, i)); i++; break;
case XLS::typeCHART: m_CHARTs.push_back(std::pair<BaseObjectPtr, int>(*it, i)); i++; break;
}
}
elements_.clear();
MsoDrawingSelection mso_drawing_selection; MsoDrawingSelection mso_drawing_selection;
int count2 = proc.optional(mso_drawing_selection); int count_4 = proc.optional(mso_drawing_selection);
return count1 > 0 || count2 > 0; return count_1 > 0 || count_4 > 0;
} }
......
...@@ -29,9 +29,6 @@ public: ...@@ -29,9 +29,6 @@ public:
MsoDrawingPtr m_MsoDrawing; MsoDrawingPtr m_MsoDrawing;
MsoDrawingPtr m_MsoDrawingObjects; MsoDrawingPtr m_MsoDrawingObjects;
std::vector<std::pair<BaseObjectPtr, int>> m_OBJs;
std::vector<std::pair<BaseObjectPtr, int>> m_TEXTOBJECTs;
std::vector<std::pair<BaseObjectPtr, int>> m_CHARTs;
}; };
} // namespace XLS } // namespace XLS
......
...@@ -119,7 +119,7 @@ const bool XFS::loadContent(BinProcessor& proc) ...@@ -119,7 +119,7 @@ const bool XFS::loadContent(BinProcessor& proc)
{ {
XF *xfs = dynamic_cast<XF*>(m_cell_xfs[i].get()); XF *xfs = dynamic_cast<XF*>(m_cell_xfs[i].get());
if (m_xf_ext.size() > cellStyleXfs_count) if (m_xf_ext.size() > cellStyleXfs_count + i)
{ {
XFExt*ext = dynamic_cast<XFExt*>(m_xf_ext[i + cellStyleXfs_count].get()); XFExt*ext = dynamic_cast<XFExt*>(m_xf_ext[i + cellStyleXfs_count].get());
if (ext) if (ext)
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#include "../XlsFormat/Logic/WorkbookStreamObject.h" #include "../XlsFormat/Logic/WorkbookStreamObject.h"
#include "../XlsFormat/Logic/WorksheetSubstream.h" #include "../XlsFormat/Logic/WorksheetSubstream.h"
#include "../XlsFormat/Logic/GlobalsSubstream.h" #include "../XlsFormat/Logic/GlobalsSubstream.h"
#include "../XlsFormat/Logic/ChartSheetSubstream.h"
#include "../XlsFormat/Logic/BinProcessor.h" #include "../XlsFormat/Logic/BinProcessor.h"
#include "../XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h" #include "../XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h"
...@@ -21,6 +23,7 @@ ...@@ -21,6 +23,7 @@
#include "../XlsFormat/Logic/Biff_unions/MSODRAWINGGROUP.h" #include "../XlsFormat/Logic/Biff_unions/MSODRAWINGGROUP.h"
#include "../XlsFormat/Logic/Biff_unions/OBJ.h" #include "../XlsFormat/Logic/Biff_unions/OBJ.h"
#include "../XlsFormat/Logic/Biff_unions/TEXTOBJECT.h" #include "../XlsFormat/Logic/Biff_unions/TEXTOBJECT.h"
#include "../XlsFormat/Logic/Biff_unions/CHART.h"
#include <Logic/Biff_records/HLink.h> #include <Logic/Biff_records/HLink.h>
#include <Logic/Biff_records/MsoDrawingGroup.h> #include <Logic/Biff_records/MsoDrawingGroup.h>
...@@ -370,6 +373,8 @@ void XlsConverter::convert(XLS::FORMATTING* formating) ...@@ -370,6 +373,8 @@ void XlsConverter::convert(XLS::FORMATTING* formating)
std::wstring XlsConverter::GetTargetMoniker(XLS::BiffStructure *moniker) std::wstring XlsConverter::GetTargetMoniker(XLS::BiffStructure *moniker)
{ {
if (moniker == NULL) return L"";
if (moniker->getClassName() == "URLMoniker") if (moniker->getClassName() == "URLMoniker")
{ {
OSHARED::URLMoniker* urlMoniker = dynamic_cast<OSHARED::URLMoniker* >(moniker); OSHARED::URLMoniker* urlMoniker = dynamic_cast<OSHARED::URLMoniker* >(moniker);
...@@ -462,13 +467,25 @@ void XlsConverter::convert(XLS::HLINK * HLINK_) ...@@ -462,13 +467,25 @@ void XlsConverter::convert(XLS::HLINK * HLINK_)
{ {
XLS::HLink * hLink = dynamic_cast<XLS::HLink*>(HLINK_->m_HLink.get()); XLS::HLink * hLink = dynamic_cast<XLS::HLink*>(HLINK_->m_HLink.get());
std::wstring target = GetTargetMoniker(hLink->hyperlink.oleMoniker.data.get()); std::wstring target;
bool bExternal = false;
if (hLink->hyperlink.hlstmfHasMoniker)
{
target = GetTargetMoniker(hLink->hyperlink.oleMoniker.data.get());
bExternal = true;
}
else if (hLink->hyperlink.hlstmfHasLocationStr)
{
target = hLink->hyperlink.location.value();
}
std::wstring display = hLink->hyperlink.displayName; std::wstring display = hLink->hyperlink.displayName;
if (display.empty()) display = target; if (display.empty()) display = target;
xlsx_context->get_table_context().add_hyperlink( hLink->ref8.toString(), target, display); xlsx_context->get_table_context().add_hyperlink( hLink->ref8.toString(), target, display, bExternal);
} }
void XlsConverter::convert(XLS::LBL * def_name) void XlsConverter::convert(XLS::LBL * def_name)
...@@ -488,7 +505,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects) ...@@ -488,7 +505,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
if (objects == NULL) return; if (objects == NULL) return;
ODRAW::OfficeArtSpgrContainer *spgr = dynamic_cast<ODRAW::OfficeArtSpgrContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpgrContainer.get()); ODRAW::OfficeArtSpgrContainer *spgr = dynamic_cast<ODRAW::OfficeArtSpgrContainer*>(objects->m_MsoDrawing.get()->rgChildRec.m_OfficeArtSpgrContainer.get());
/*
for (int i = 0 ; i < objects->m_OBJs.size(); i++) for (int i = 0 ; i < objects->m_OBJs.size(); i++)
{ {
int ind = objects->m_OBJs[i].second; int ind = objects->m_OBJs[i].second;
...@@ -540,6 +557,11 @@ void XlsConverter::convert(XLS::OBJECTS* objects) ...@@ -540,6 +557,11 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
{ {
convert(sp); convert(sp);
std::wstringstream strm;
txO->serialize(strm);
xlsx_context->get_drawing_context().set_text(strm.str());
xlsx_context->get_drawing_context().end_drawing(); xlsx_context->get_drawing_context().end_drawing();
} }
} }
...@@ -552,6 +574,86 @@ void XlsConverter::convert(XLS::OBJECTS* objects) ...@@ -552,6 +574,86 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
//xlsx_context->get_chart_context().end_drawing(); //xlsx_context->get_chart_context().end_drawing();
} }
*/
bool note = false;
int ind = 0;
for ( std::list<XLS::BaseObjectPtr>::iterator elem = objects->elements_.begin(); elem != objects->elements_.end(); elem++)
{
short type_object = 0;
ODRAW::OfficeArtSpContainer *sp = NULL;
ODRAW::OfficeArtSpContainer *sp_common = NULL;
XLS::OBJ * OBJ = dynamic_cast<XLS::OBJ*> (elem->get());
XLS::TEXTOBJECT * TEXTOBJECT = dynamic_cast<XLS::TEXTOBJECT*>(elem->get());
XLS::CHART * CHART = dynamic_cast<XLS::CHART*> (elem->get());
XLS::Obj * obj = NULL;
XLS::TxO * text_obj = NULL;
XLS::ChartSheetSubstream * chart = NULL;
if (OBJ) obj = dynamic_cast<XLS::Obj*>(OBJ->m_Obj.get());
if (TEXTOBJECT) text_obj = dynamic_cast<XLS::TxO *>(TEXTOBJECT->m_TxO.get());
if (CHART) chart = dynamic_cast<XLS::ChartSheetSubstream *>(CHART->elements_.back().get());
if (obj)
{
type_object = obj->cmo.ot; //тут тип шейпа ВРАНЬЕ !!! пример - 7.SINIF I.DÖNEM III.YAZILI SINAV.xls
if (obj->m_OfficeArtSpContainer)
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(obj->m_OfficeArtSpContainer.get());
}
if (text_obj)
{
type_object = 0x0006;
if (text_obj->m_OfficeArtSpContainer)
sp = dynamic_cast<ODRAW::OfficeArtSpContainer*>(text_obj->m_OfficeArtSpContainer.get());
}
if (chart)
{
type_object = 0x0005;
}
//-----------------------------------------------------------------------------
if ( (spgr) && (ind+1< spgr->child_records.size()))
{
sp_common = dynamic_cast<ODRAW::OfficeArtSpContainer*>(spgr->child_records[ind+1].get());
}
if (note && text_obj)
{
//convert_comment(text_obj/*, note_obj*/);
note = false;
continue;
}
note = false;
if (xlsx_context->get_drawing_context().start_drawing(type_object))
{
convert(sp);
convert(sp_common);
if (text_obj)
{
std::wstringstream strm;
text_obj->serialize(strm);
xlsx_context->get_drawing_context().set_text(strm.str());
}
xlsx_context->get_drawing_context().end_drawing();
}
else
{
if (type_object == 0x19)
{
note = true;
}
}
if (sp == NULL) ind++;
}
} }
void XlsConverter::convert(ODRAW::OfficeArtSpContainer *sp) void XlsConverter::convert(ODRAW::OfficeArtSpContainer *sp)
......
...@@ -133,7 +133,7 @@ void xlsx_drawing_context::start_shape(int type) ...@@ -133,7 +133,7 @@ void xlsx_drawing_context::start_shape(int type)
if (0x0006 == type) if (0x0006 == type)
{ {
drawing_state.back().shape_type = msosptTextBox; drawing_state.back().shape_type = msosptTextBox;
drawing_state.back().bTextBox = true; //drawing_state.back().bTextBox = true;
} }
if (0x001E == type) if (0x001E == type)
{ {
...@@ -308,6 +308,7 @@ void xlsx_drawing_context::serialize_shape() ...@@ -308,6 +308,7 @@ void xlsx_drawing_context::serialize_shape()
//serialize_fill(CP_XML_STREAM()); //serialize_fill(CP_XML_STREAM());
serialize_line(CP_XML_STREAM()); serialize_line(CP_XML_STREAM());
} }
serialize_text(CP_XML_STREAM());
} }
} }
...@@ -387,6 +388,26 @@ void xlsx_drawing_context::serialize_color (std::wostream & stream, const _color ...@@ -387,6 +388,26 @@ void xlsx_drawing_context::serialize_color (std::wostream & stream, const _color
else{CP_XML_NODE(L"a:sysClr") { CP_XML_ATTR(L"val",L"windowText");}} else{CP_XML_NODE(L"a:sysClr") { CP_XML_ATTR(L"val",L"windowText");}}
} }
} }
void xlsx_drawing_context::serialize_text(std::wostream & stream)
{
if (drawing_state.back().text_content.empty()) return;
CP_XML_WRITER(stream)
{
CP_XML_NODE(L"xdr:txBody")
{
CP_XML_NODE(L"a:bodyPr");
CP_XML_NODE(L"a:lstStyle");
CP_XML_NODE(L"a:p")
{
CP_XML_STREAM() << drawing_state.back().text_content;
}
}
}
}
void xlsx_drawing_context::serialize_line(std::wostream & stream) void xlsx_drawing_context::serialize_line(std::wostream & stream)
{ {
CP_XML_WRITER(stream) CP_XML_WRITER(stream)
...@@ -622,6 +643,12 @@ void xlsx_drawing_context::set_path (const std::wstring & path) ...@@ -622,6 +643,12 @@ void xlsx_drawing_context::set_path (const std::wstring & path)
drawing_state.back().path = path; drawing_state.back().path = path;
} }
void xlsx_drawing_context::set_text (const std::wstring & text)
{
if (drawing_state.size() < 1 )return;
drawing_state.back().text_content = text;
}
void xlsx_drawing_context::set_path_rect(_rect & rect) void xlsx_drawing_context::set_path_rect(_rect & rect)
{ {
if (drawing_state.size() < 1 )return; if (drawing_state.size() < 1 )return;
......
...@@ -55,6 +55,7 @@ public: ...@@ -55,6 +55,7 @@ public:
id = -1; id = -1;
memset(image_crop, 0, 4 * sizeof(int)); memset(image_crop, 0, 4 * sizeof(int));
rotation = 0; rotation = 0;
image_crop_enabled = false;
} }
int shape_type; int shape_type;
...@@ -80,6 +81,8 @@ public: ...@@ -80,6 +81,8 @@ public:
std::wstring path; std::wstring path;
_rect path_rect; _rect path_rect;
std::wstring text_content;
bool isInternal; bool isInternal;
bool bTextBox; bool bTextBox;
...@@ -143,6 +146,8 @@ public: ...@@ -143,6 +146,8 @@ public:
void set_path_rect (_rect & rect); void set_path_rect (_rect & rect);
void set_path (const std::wstring & path); void set_path (const std::wstring & path);
void set_text (const std::wstring & text);
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void serialize (std::wostream & stream); void serialize (std::wostream & stream);
...@@ -154,6 +159,7 @@ public: ...@@ -154,6 +159,7 @@ public:
void serialize_bitmap_fill (std::wostream & stream, std::wstring rId, const std::wstring ns = L"a:"); void serialize_bitmap_fill (std::wostream & stream, std::wstring rId, const std::wstring ns = L"a:");
void serialize_none_fill (std::wostream & stream); void serialize_none_fill (std::wostream & stream);
void serialize_xfrm (std::wostream & stream); void serialize_xfrm (std::wostream & stream);
void serialize_text (std::wostream & stream);
void end_drawing(); void end_drawing();
private: private:
......
...@@ -36,7 +36,7 @@ public: ...@@ -36,7 +36,7 @@ public:
} }
} }
std::wstring add(std::wstring const & ref, std::wstring const & target1, std::wstring const & display) std::wstring add(std::wstring const & ref, std::wstring const & target1, std::wstring const & display, bool bExternal)
{ {
std::wstring target =target1; std::wstring target =target1;
...@@ -51,7 +51,9 @@ public: ...@@ -51,7 +51,9 @@ public:
r.display = display; r.display = display;
r.id = std::wstring(L"hId") + boost::lexical_cast<std::wstring>(records_.size()+1); r.id = std::wstring(L"hId") + boost::lexical_cast<std::wstring>(records_.size()+1);
r.location = target; r.location = target;
r.type = L"External" ;
if (bExternal) r.type = L"External" ;
else r.type = L"Internal";
if (r.display.length()<1) if (r.display.length()<1)
r.display =target; r.display =target;
...@@ -104,9 +106,9 @@ xlsx_hyperlinks::~xlsx_hyperlinks() ...@@ -104,9 +106,9 @@ xlsx_hyperlinks::~xlsx_hyperlinks()
{ {
} }
std::wstring xlsx_hyperlinks::add(std::wstring const & ref, std::wstring const & target, std::wstring const & display) std::wstring xlsx_hyperlinks::add(std::wstring const & ref, std::wstring const & target, std::wstring const & display, bool bExternal)
{ {
return impl_->add(ref, target, display); return impl_->add(ref, target, display, bExternal);
} }
void xlsx_hyperlinks::dump_rels(rels & Rels) const void xlsx_hyperlinks::dump_rels(rels & Rels) const
......
...@@ -12,7 +12,7 @@ public: ...@@ -12,7 +12,7 @@ public:
xlsx_hyperlinks(); xlsx_hyperlinks();
~xlsx_hyperlinks(); ~xlsx_hyperlinks();
std::wstring add( std::wstring const & ref, std::wstring const & target, std::wstring const & display); std::wstring add( std::wstring const & ref, std::wstring const & target, std::wstring const & display, bool bExternal);
void dump_rels(rels & Rels) const; void dump_rels(rels & Rels) const;
void serialize(std::wostream & _stream) const; void serialize(std::wostream & _stream) const;
......
...@@ -83,9 +83,9 @@ xlsx_drawing_context & xlsx_table_context::get_drawing_context() ...@@ -83,9 +83,9 @@ xlsx_drawing_context & xlsx_table_context::get_drawing_context()
// return state().start_hyperlink(); // return state().start_hyperlink();
//} //}
// //
std::wstring xlsx_table_context::add_hyperlink(std::wstring const & ref, std::wstring const & target, std::wstring const & display) std::wstring xlsx_table_context::add_hyperlink(std::wstring const & ref, std::wstring const & target, std::wstring const & display, bool bExternal)
{ {
return state()->hyperlinks_.add( ref, target, display); return state()->hyperlinks_.add( ref, target, display, bExternal);
} }
void xlsx_table_context::dump_rels_hyperlinks(rels & Rels) void xlsx_table_context::dump_rels_hyperlinks(rels & Rels)
{ {
......
...@@ -37,7 +37,7 @@ public: ...@@ -37,7 +37,7 @@ public:
// //
table_state_ptr & state(); table_state_ptr & state();
std::wstring add_hyperlink(std::wstring const & ref, std::wstring const & target, std::wstring const & display); std::wstring add_hyperlink(std::wstring const & ref, std::wstring const & target, std::wstring const & display, bool bExternal);
void dump_rels_hyperlinks(rels & Rels); void dump_rels_hyperlinks(rels & Rels);
void serialize_hyperlinks(std::wostream & _Wostream); void serialize_hyperlinks(std::wostream & _Wostream);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment