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()
void Logger::writeLine(const std::string& type, const std::string& str)
{
static wchar_t time_stamp[16] ={};
#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
std::cout << type << ": " << str << std::endl;
}
void Logger::writeLine(const std::wstring& type, const std::wstring& str)
{
static wchar_t time_stamp[16]={};
#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
std::wcout << type << L": " << str << std::endl;
}
Logger& Logger::getLogger()
{
static Logger logger("AVSOfficeXlsFile.log");
static Logger logger("OfficeXlsFile.log");
return logger;
}
......@@ -5,6 +5,8 @@
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()
{
......@@ -71,6 +73,167 @@ void Font::set_color_ext(FillInfoExt & 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)
{
......
......@@ -26,6 +26,7 @@ public:
int serialize (std::wostream & stream);
int serialize_properties (std::wostream & stream, bool rPr = false);
int serialize_rPr (std::wostream & stream);
void set_color_ext (FillInfoExt & color_ext);
......
#include "TxO.h"
#include <Logic/Biff_structures/ODRAW/SimpleOfficeArtContainers.h>
#include <Logic/Biff_records/Font.h>
#include <simple_xml_writer.h>
#include <utils.h>
namespace XLS
{
......@@ -29,6 +34,8 @@ void TxO::writeFields(CFRecord& record)
void TxO::readFields(CFRecord& record)
{
pGlobalWorkbookInfoPtr = record.getGlobalWorkbookInfo();
unsigned short flags;
record >> flags;
hAlignment = static_cast<unsigned char>(GETBITS(flags, 1, 3));
......@@ -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
......@@ -32,6 +32,11 @@ public:
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 vAlignment;
BIFF_BYTE fLockText;
......
......@@ -48,7 +48,7 @@ void ObjFmla::load(CFRecord& record)
size_t data_size = record.getRdPtr() - start_ptr;
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);
}
......
......@@ -33,8 +33,13 @@ void ObjectParsedFormula::load(CFRecord& record)
record >> cce;
cce = GETBITS(cce, 0, 14);
record.skipNunBytes(4); // unused
rgce.load(record, cce);
if (record.getRdPtr() + 4 < record.getDataSize()) // .xls - cce == 0
record.skipNunBytes(4); // unused
if (cce > 0)
{
rgce.load(record, cce);
}
}
......
......@@ -18,16 +18,6 @@ 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)
{
}
......
......@@ -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;
......
......@@ -33,9 +33,9 @@ public:
const bool loadContent(BinProcessor& proc)
{
bool res = proc.optional<TEXTOBJECT>() ||
proc.optional<OBJ>() ||
proc.optional<CHART>();
bool res = proc.optional<OBJ>() ||
proc.optional<TEXTOBJECT>() ||
proc.optional<CHART>() ;
return res;
};
......@@ -70,8 +70,10 @@ public:
// return false;
//}
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;
}
......@@ -98,30 +100,17 @@ const bool OBJECTS::loadContentRead(BinReaderProcessor& proc)
m_MsoDrawing = boost::shared_ptr<MsoDrawing>(new MsoDrawing(is_inside_chart_sheet_));
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;
proc.repeated(parenthesis_objects_2, 0, 0);
proc.repeated<Continue>(0,0);
int count_1 = proc.repeated(parenthesis_objects_1, 0, 0);
int i = 0 ;
for(std::list<BaseObjectPtr>::iterator it = elements_.begin(); it != elements_.end() ; it++)
{
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();
//int count_2 = proc.repeated(parenthesis_objects_2, 0, 0);
//int count_3 = proc.repeated<Continue>(0,0);
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:
MsoDrawingPtr m_MsoDrawing;
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
......
......@@ -119,7 +119,7 @@ const bool XFS::loadContent(BinProcessor& proc)
{
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());
if (ext)
......
......@@ -7,6 +7,8 @@
#include "../XlsFormat/Logic/WorkbookStreamObject.h"
#include "../XlsFormat/Logic/WorksheetSubstream.h"
#include "../XlsFormat/Logic/GlobalsSubstream.h"
#include "../XlsFormat/Logic/ChartSheetSubstream.h"
#include "../XlsFormat/Logic/BinProcessor.h"
#include "../XlsFormat/Logic/SummaryInformationStream/SummaryInformation.h"
......@@ -21,6 +23,7 @@
#include "../XlsFormat/Logic/Biff_unions/MSODRAWINGGROUP.h"
#include "../XlsFormat/Logic/Biff_unions/OBJ.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/MsoDrawingGroup.h>
......@@ -370,6 +373,8 @@ void XlsConverter::convert(XLS::FORMATTING* formating)
std::wstring XlsConverter::GetTargetMoniker(XLS::BiffStructure *moniker)
{
if (moniker == NULL) return L"";
if (moniker->getClassName() == "URLMoniker")
{
OSHARED::URLMoniker* urlMoniker = dynamic_cast<OSHARED::URLMoniker* >(moniker);
......@@ -462,13 +467,25 @@ void XlsConverter::convert(XLS::HLINK * HLINK_)
{
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;
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)
......@@ -488,7 +505,7 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
if (objects == NULL) return;
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++)
{
int ind = objects->m_OBJs[i].second;
......@@ -540,6 +557,11 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
{
convert(sp);
std::wstringstream strm;
txO->serialize(strm);
xlsx_context->get_drawing_context().set_text(strm.str());
xlsx_context->get_drawing_context().end_drawing();
}
}
......@@ -552,6 +574,86 @@ void XlsConverter::convert(XLS::OBJECTS* objects)
//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)
......
......@@ -133,7 +133,7 @@ void xlsx_drawing_context::start_shape(int type)
if (0x0006 == type)
{
drawing_state.back().shape_type = msosptTextBox;
drawing_state.back().bTextBox = true;
//drawing_state.back().bTextBox = true;
}
if (0x001E == type)
{
......@@ -308,6 +308,7 @@ void xlsx_drawing_context::serialize_shape()
//serialize_fill(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
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)
{
CP_XML_WRITER(stream)
......@@ -622,6 +643,12 @@ void xlsx_drawing_context::set_path (const std::wstring & 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)
{
if (drawing_state.size() < 1 )return;
......
......@@ -55,6 +55,7 @@ public:
id = -1;
memset(image_crop, 0, 4 * sizeof(int));
rotation = 0;
image_crop_enabled = false;
}
int shape_type;
......@@ -80,6 +81,8 @@ public:
std::wstring path;
_rect path_rect;
std::wstring text_content;
bool isInternal;
bool bTextBox;
......@@ -143,6 +146,8 @@ public:
void set_path_rect (_rect & rect);
void set_path (const std::wstring & path);
void set_text (const std::wstring & text);
//------------------------------------------------------------------------------
void serialize (std::wostream & stream);
......@@ -154,6 +159,7 @@ public:
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_xfrm (std::wostream & stream);
void serialize_text (std::wostream & stream);
void end_drawing();
private:
......
......@@ -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;
......@@ -51,7 +51,9 @@ public:
r.display = display;
r.id = std::wstring(L"hId") + boost::lexical_cast<std::wstring>(records_.size()+1);
r.location = target;
r.type = L"External" ;
if (bExternal) r.type = L"External" ;
else r.type = L"Internal";
if (r.display.length()<1)
r.display =target;
......@@ -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
......
......@@ -12,7 +12,7 @@ public:
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 serialize(std::wostream & _stream) const;
......
......@@ -83,9 +83,9 @@ xlsx_drawing_context & xlsx_table_context::get_drawing_context()
// 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)
{
......
......@@ -37,7 +37,7 @@ public:
//
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 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