void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context) { try { const std::wstring href = common_xlink_attlist_.href_.get_value_or(L""); odf_reader::odf_document * odf_reader = Context.root(); std::wstring folderPath = odf_reader->get_folder(); std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href; // normalize path ???? todooo boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR); cpdoccore::odf_reader::odf_document objectSubDoc(objectPath,NULL); //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //в отдельных embd объектах чаще всего диаграммы... но МОГУТ быть и обычные объекты подтипа frame!!! пример RemanejamentoOrcamentario.ods /////////////////////////////////////////////////////////////////////////// //функциональная часть const office_element *contentSubDoc = objectSubDoc.get_impl()->get_content(); chart_build objectBuild; if (contentSubDoc) { process_build_chart process_build_object_(objectBuild, objectSubDoc.odf_context()); contentSubDoc->accept(process_build_object_); } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //отображательная часть if (objectBuild.object_type_ == 1)//диаграмма { const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L""); objectBuild.xlsx_convert(Context); Context.get_drawing_context().start_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы Context.get_drawing_context().end_chart(); } else if (objectBuild.object_type_ == 2)//текст (odt text) { Context.get_drawing_context().start_shape(2); Context.get_text_context().start_drawing_content(); //сменить контекст с главного на другой ... проблема со стилями!! Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer()); objectBuild.xlsx_convert(Context); std::wstring text_content_ = Context.get_text_context().end_drawing_content(); Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ... if (text_content_.length()>0) { Context.get_drawing_context().set_property(_property(L"text-content",text_content_)); } Context.get_drawing_context().end_shape(); } else { //временно - замещающая картинка(если она конечно присутствует) Context.get_drawing_context().set_use_image_replacement(); } } catch(...) { _CP_LOG << "[error] : convert draw::object error" << std::endl; } }
void office_annotation::xlsx_convert(oox::xlsx_conversion_context & Context) { const _CP_OPT(length) svg_widthVal = office_annotation_attr_.svg_width_; const double width_cm = svg_widthVal.get_value_or(length(0)).get_value_unit(length::cm); const double width_pt = svg_widthVal.get_value_or(length(0)).get_value_unit(length::pt); const _CP_OPT(length) svg_heightVal =office_annotation_attr_.svg_height_; const double height_cm = svg_heightVal.get_value_or(length(0)).get_value_unit(length::cm); const double height_pt = svg_heightVal.get_value_or(length(0)).get_value_unit(length::pt); const double x_pt = office_annotation_attr_.svg_x_.get_value_or(length(0)).get_value_unit(length::pt); const double y_pt = office_annotation_attr_.svg_y_.get_value_or(length(0)).get_value_unit(length::pt); ///////////////////////////////// std::wstring date; std::wstring author; if (dc_date_) { date = xml::utils::replace_text_to_xml(dynamic_cast<dc_date * >(dc_date_.get())->content_); } if (dc_creator_) { author = xml::utils::replace_text_to_xml(dynamic_cast<dc_creator * >(dc_creator_.get())->content_); } //////////////////////////////////////// Context.get_comments_context().start_comment(width_pt, height_pt, x_pt, y_pt); if (office_annotation_attr_.display_) { Context.get_comments_context().set_visibly(office_annotation_attr_.display_.get()); } Context.get_text_context().start_comment_content(); for (size_t i = 0; i < content_.size(); i++)//текст + текстовый стиль { content_[i]->xlsx_convert(Context); } Context.get_comments_context().add_author(author); Context.get_comments_context().add_content(Context.get_text_context().end_comment_content()); ////////////////////////////////////////////////////////////////// /// Обрабатываем стиль draw std::vector<const odf_reader::style_instance *> instances; style_instance* styleInst = Context.root()->odf_context().styleContainer().style_by_name( office_annotation_attr_.draw_style_name_.get_value_or(L""), odf_types::style_family::Graphic, false/*Context.process_headers_footers_*/); if (styleInst) { style_instance * defaultStyle = Context.root()->odf_context().styleContainer().style_default_by_type(odf_types::style_family::Graphic); if (defaultStyle)instances.push_back(defaultStyle); instances.push_back(styleInst); } graphic_format_properties graphicProperties = calc_graphic_properties_content(instances); graphicProperties.apply_to(Context.get_comments_context().get_draw_properties()); const std::wstring textStyleName = office_annotation_attr_.draw_text_style_name_.get_value_or(L""); int col = Context.current_table_column(); if (col < 0) col = 0; int row = Context.current_table_row(); if (row < 0) row = 0; std::wstring ref = oox::getCellAddress(col, row); Context.get_comments_context().end_comment(ref, col, row); }