diff --git a/ASCOfficeOdfFileW/source/OdfFormat.vcproj b/ASCOfficeOdfFileW/source/OdfFormat.vcproj index 8ba62913d3..e156c23610 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat.vcproj +++ b/ASCOfficeOdfFileW/source/OdfFormat.vcproj @@ -1291,6 +1291,10 @@ RelativePath=".\ReadMe.txt" > + + diff --git a/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp b/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp index 9df7e49861..ee8827d8e0 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp +++ b/ASCOfficeOdfFileW/source/OdfFormat/odf_chart_context.cpp @@ -48,7 +48,7 @@ namespace odf class odf_chart_context::Impl { public: - Impl(odf_conversion_context *odf_context) :odf_context_(odf_context), drawing_context_(odf_context), text_context_(odf_context) + Impl(odf_conversion_context *odf_context) :odf_context_(odf_context)/*, drawing_context_(odf_context)*/, text_context_(odf_context) { styles_context_ = NULL; @@ -62,12 +62,10 @@ public: odf_style_context *styles_context_; odf_conversion_context *odf_context_; - odf_drawing_context drawing_context_; //для заполения графических стилей объектов чарта odf_text_context text_context_; style_chart_properties *current_chart_properties; chart_chart *current_chart_; - }; //////////////////////////////////////////////////////////////////////////// @@ -83,13 +81,13 @@ odf_chart_context::~odf_chart_context() void odf_chart_context::set_styles_context(odf_style_context * style_context) { impl_->styles_context_ = style_context; - impl_->drawing_context_.set_styles_context(style_context); + impl_->odf_context_->drawing_context()->set_styles_context(style_context); impl_->text_context_.set_styles_context(style_context); } odf_drawing_context * odf_chart_context::drawing_context() { - return &impl_->drawing_context_; + return impl_->odf_context_->drawing_context(); } odf_text_context * odf_chart_context::text_context() { diff --git a/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp b/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp index 2631c3a5f1..1d2396c6dd 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp +++ b/ASCOfficeOdfFileW/source/OdfFormat/odf_conversion_context.cpp @@ -135,6 +135,7 @@ void odf_conversion_context::end_chart() chart_context_.end_chart(); end_object(); + chart_context_.set_styles_context(styles_context()); } void odf_conversion_context::end_spreadsheet() { diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp index 851d2a51ee..f0a5fb69f6 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp +++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.cpp @@ -1,5 +1,6 @@ #include "precompiled_cpodf.h" +#include "../utils.h" #include "ods_conversion_context.h" #include "office_spreadsheet.h" @@ -73,11 +74,24 @@ void parsing_ref (const std::wstring & ref, int & col,int & row) col = getColAddressInv(strCol)+1; row = getRowAdderssInv(strRow)+1; +} +void calculate_size_font_symbols(_font_metrix & metrix) +{ + double appr_px = _gdi_graphics_::calculate_size_symbol(metrix.font_name,metrix.font_size,metrix.italic,metrix.bold); + + if (appr_px > 0) + { + //pixels to pt + metrix.approx_symbol_size = appr_px * 72./96. ;///1.1;//"1.2" волшебное число оО + metrix.IsCalc = true; + } + } } ods_conversion_context::ods_conversion_context(package::odf_document * outputDocument) : odf_conversion_context(outputDocument), table_context_(*this), current_text_context_(NULL) { + font_metrix_ = _font_metrix(); } @@ -313,6 +327,19 @@ void ods_conversion_context::end_cell() current_table().end_cell(); end_text_context(); } +void ods_conversion_context::calculate_font_metrix(std::wstring name, double size, bool italic, bool bold) +{ + if (font_metrix_.IsCalc)return; + + font_metrix_.font_size = size; + font_metrix_.italic = italic; + font_metrix_.bold = bold; + font_metrix_.font_name = name; + +//////////////////////////////////////////// + utils::calculate_size_font_symbols(font_metrix_); +} + void ods_conversion_context::start_columns() { } @@ -334,7 +361,7 @@ void ods_conversion_context::start_rows() void ods_conversion_context::end_rows() { //add default last row - int repeat = std::max(current_table().dimension_row,1024) - current_table().current_row(); + int repeat = max(current_table().dimension_row,1024) - current_table().current_row(); if (repeat < 0) repeat = 1; start_row(current_table().current_row()+1,repeat,0,true); diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h index 07d145064c..bb68de169a 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h +++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_conversion_context.h @@ -9,10 +9,23 @@ namespace odf { class office_spreadsheet; class odf_text_context; +struct _font_metrix +{ + _font_metrix(){IsCalc = italic = bold = false; font_size = approx_symbol_size =0;} + bool IsCalc; + + std::wstring font_name; + double font_size; + bool italic; + bool bold; + + double approx_symbol_size;//in pt +}; + class ods_conversion_context : public odf_conversion_context { public: - ods_conversion_context(package::odf_document * outputDocument);// : odf_conversion_context(outputDocument){} + ods_conversion_context(package::odf_document * outputDocument); virtual void start_document(); @@ -24,6 +37,8 @@ public: void add_column(int start_column, int repeated, int level = 0, bool _default = false); void end_columns(); + void calculate_font_metrix(std::wstring name, double size, bool italic, bool bold); + void start_rows(); void start_row(int _start_row, int repeated, int level = 0, bool _default = false); void end_row(); @@ -57,7 +72,10 @@ public: void start_image(std::wstring & image_file_name); void end_image(){drawing_context()->end_image();} + double convert_symbol_width(double val) {return val * font_metrix_.approx_symbol_size;} + private: + _font_metrix font_metrix_; ods_table_context table_context_; odf_text_context* current_text_context_; diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp index 876a8864f1..4b57464858 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp +++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.cpp @@ -194,7 +194,7 @@ void ods_table_state::set_column_default_cell_style(std::wstring & style_name) column->table_table_column_attlist_.table_default_cell_style_name_ = style_ref(style_name); } -void ods_table_state::set_column_width(int width)//cm, pt ??? +void ods_table_state::set_column_width(double width)//cm, pt ??? { odf::style* style = dynamic_cast(columns_.back().style_elm.get()); if (!style)return; @@ -204,7 +204,7 @@ void ods_table_state::set_column_width(int width)//cm, pt ??? columns_.back().size = width; //pt - column_properties->style_table_column_properties_attlist_.style_column_width_ = length(width/4.35,length::cm); + column_properties->style_table_column_properties_attlist_.style_column_width_ = length(length(width,length::pt).get_value_unit(length::cm),length::cm); } void ods_table_state::set_column_optimal_width(bool val) { @@ -279,7 +279,7 @@ void ods_table_state::set_row_height(double height) rows_.back().size = height;//pt - row_properties->style_table_row_properties_attlist_.style_row_height_ = length(height/22.85,length::cm); + row_properties->style_table_row_properties_attlist_.style_row_height_ = length(length(height,length::pt).get_value_unit(length::cm),length::cm); } diff --git a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h index ee292dddf3..2bc3d0c1c1 100644 --- a/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h +++ b/ASCOfficeOdfFileW/source/OdfFormat/ods_table_state.h @@ -84,7 +84,7 @@ public: void set_table_dimension(int col, int row); void add_column(office_element_ptr & elm, int repeated ,office_element_ptr & style); - void set_column_width(int width); + void set_column_width(double width); void set_column_optimal_width(bool val); void set_column_default_cell_style(std::wstring & style_name); diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj b/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj index e568c908c7..57d5c19eb2 100644 --- a/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj +++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter.vcproj @@ -186,10 +186,6 @@ Filter="h;hpp;hxx;hm;inl;inc;xsd" UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}" > - - diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp b/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp index b95b406ce1..6b95fa32c6 100644 --- a/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp +++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter/Converter.cpp @@ -3,7 +3,7 @@ #include "stdAfx.h" #include "Converter.h" -#include "Additional.h" +#include "../utils.h" #include "XlsxConverter.h" #include "DocxConverter.h" @@ -297,7 +297,7 @@ void OoxConverter::convert(OOX::Drawing::CBlipFillProperties *oox_bitmap_fill) if (pathImage.GetLength() > 0) { odf_context()->drawing_context()->set_bitmap_link(string2std_string(pathImage)); - _image_file_::GetResolution(pathImage, Width, Height); + _gdi_graphics_::GetResolution(pathImage, Width, Height); } else { @@ -821,6 +821,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CChartSpace *oox_chart) if ((!oox_chart) && (!oox_chart->m_oChartSpace.m_chart))return; odf_context()->start_chart(); + convert(oox_chart->m_oChartSpace.m_oSpPr.GetPointer()); convert(oox_chart->m_oChartSpace.m_chart->m_title); convert(oox_chart->m_oChartSpace.m_chart->m_legend); @@ -838,7 +839,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_Title* ct_title) if (ct_title == NULL)return; odf_context()->chart_context()->start_title(); - + convert(ct_title->m_oSpPr.GetPointer()); odf_context()->chart_context()->end_element(); } void OoxConverter::convert(OOX::Spreadsheet::CT_Legend* ct_legend) @@ -846,7 +847,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_Legend* ct_legend) if (ct_legend == NULL)return; odf_context()->chart_context()->start_legend(); - + convert(ct_legend->m_oSpPr.GetPointer()); odf_context()->chart_context()->end_element(); } void OoxConverter::convert(OOX::Spreadsheet::CT_PlotArea* ct_plotArea) @@ -854,12 +855,11 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_PlotArea* ct_plotArea) if (ct_plotArea == NULL)return; odf_context()->chart_context()->start_plot_area(); + convert(ct_plotArea->m_oSpPr.GetPointer()); + if (ct_plotArea->m_layout)//разметка { } - if (ct_plotArea->m_spPr) - { - } for (long i=0; i< ct_plotArea->m_Items.GetCount(); i++)// { if (!ct_plotArea->m_ItemsElementName0[i]) continue; @@ -905,6 +905,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_CatAx* ct_catAx) if (ct_catAx == NULL)return; odf_context()->chart_context()->start_axis(); + convert(ct_catAx->m_oSpPr.GetPointer()); convert(ct_catAx->m_title); odf_context()->chart_context()->end_element(); } @@ -913,6 +914,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_DateAx* ct_dateAx) if (ct_dateAx == NULL)return; odf_context()->chart_context()->start_axis(); + convert(ct_dateAx->m_oSpPr.GetPointer()); convert(ct_dateAx->m_title); odf_context()->chart_context()->end_element(); } @@ -921,6 +923,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_SerAx* ct_serAx) if (ct_serAx == NULL)return; odf_context()->chart_context()->start_axis(); + convert(ct_serAx->m_oSpPr.GetPointer()); convert(ct_serAx->m_title); odf_context()->chart_context()->end_element(); } @@ -929,6 +932,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_ValAx* ct_valAx) if (ct_valAx == NULL)return; odf_context()->chart_context()->start_axis(); + convert(ct_valAx->m_oSpPr.GetPointer()); convert(ct_valAx->m_title); odf_context()->chart_context()->end_element(); } @@ -1115,6 +1119,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_OfPieChart *chart) void OoxConverter::convert(OOX::Spreadsheet::CT_AreaSer* ser) { odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_cat, 1); convert(ser->m_val, 2); odf_context()->chart_context()->end_element(); @@ -1124,6 +1129,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_BubbleSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_xVal, 1); convert(ser->m_yVal, 2); odf_context()->chart_context()->end_element(); @@ -1133,6 +1139,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_SurfaceSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_cat, 1); convert(ser->m_val, 2); odf_context()->chart_context()->end_element(); @@ -1142,6 +1149,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_PieSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_cat, 1); convert(ser->m_val, 2); odf_context()->chart_context()->end_element(); @@ -1151,6 +1159,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_BarSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_cat, 1); convert(ser->m_val, 2); odf_context()->chart_context()->end_element(); @@ -1160,6 +1169,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_ScatterSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_xVal, 1); convert(ser->m_yVal, 2); odf_context()->chart_context()->end_element(); @@ -1169,6 +1179,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_RadarSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_cat, 1); convert(ser->m_val, 2); odf_context()->chart_context()->end_element(); @@ -1178,6 +1189,7 @@ void OoxConverter::convert(OOX::Spreadsheet::CT_LineSer* ser) if (ser == NULL)return; odf_context()->chart_context()->start_series(); + convert(ser->m_oSpPr.GetPointer()); convert(ser->m_cat, 1); convert(ser->m_val, 2); odf_context()->chart_context()->end_element(); diff --git a/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp b/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp index 2b8d4aa336..71188e7363 100644 --- a/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp +++ b/ASCOfficeOdfFileW/source/Oox2OdfConverter/XlsxConverter.cpp @@ -3,7 +3,7 @@ #include "stdAfx.h" #include "XlsxConverter.h" -#include "Additional.h" +#include "../utils.h" #include @@ -484,6 +484,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CCol *oox_column) else if (oox_column->m_oCustomWidth.IsInit() == false || (oox_column->m_oCustomWidth.IsInit() == true && oox_column->m_oCustomWidth->GetValue() == 1)) { + width = ods_context->convert_symbol_width(width); ods_context->current_table().set_column_width(width); ods_context->current_table().set_column_optimal_width(false); // пока не преобразовываем правильно размерность !!! @@ -628,10 +629,18 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf::style_text_prop if (font == NULL)return; if (text_properties == NULL)return; + std::wstring font_name; + double font_size = 0; + bool font_bold = false; + bool font_italic = false; + if (font->m_oBold.IsInit()) { if (font->m_oBold->m_oVal.ToBool() ==true) + { + font_bold = true; text_properties->content().fo_font_weight_ = odf::font_weight(odf::font_weight::WBold); + } else text_properties->content().fo_font_weight_ = odf::font_weight(odf::font_weight::WNormal); } @@ -644,13 +653,17 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf::style_text_prop if (font->m_oItalic.IsInit()) { if (font->m_oItalic->m_oVal.ToBool() ==true) + { + font_italic = true; text_properties->content().fo_font_style_ = odf::font_style(odf::font_style::Italic); + } else text_properties->content().fo_font_style_ = odf::font_style(odf::font_style::Normal); } if (font->m_oSz.IsInit()) { - OoxConverter::convert(font->m_oSz->m_oVal->GetValue(), text_properties->content().fo_font_size_); + font_size = font->m_oSz->m_oVal->GetValue(); + OoxConverter::convert(font_size, text_properties->content().fo_font_size_); } if (font->m_oFamily.IsInit()) { @@ -658,9 +671,11 @@ void XlsxConverter::convert(OOX::Spreadsheet::CFont * font, odf::style_text_prop if (font->m_oRFont.IsInit()) { + font_name = string2std_string(font->m_oRFont->m_sVal.get()); //text_properties->content().style_font_name_ = string2std_string(font->m_oRFont->m_sVal.get()); - text_properties->content().fo_font_family_ = string2std_string(font->m_oRFont->m_sVal.get()); + text_properties->content().fo_font_family_ = font_name; } + ods_context->calculate_font_metrix(font_name,font_size,font_italic,font_bold); ///// //... ///// @@ -1228,7 +1243,7 @@ void XlsxConverter::convert(OOX::Spreadsheet::CPic* oox_picture) sID = oox_picture->m_oBlipFill->m_oBlip->m_oLink.GetValue(); //??? } - _image_file_::GetResolution(pathImage, Width, Height); + _gdi_graphics_::GetResolution(pathImage, Width, Height); } ods_context->start_image(string2std_string(pathImage)); { diff --git a/ASCOfficeOdfFileW/source/utils.h b/ASCOfficeOdfFileW/source/utils.h new file mode 100644 index 0000000000..5c0073482a --- /dev/null +++ b/ASCOfficeOdfFileW/source/utils.h @@ -0,0 +1,75 @@ +#pragma once + +#include +#include +#pragma comment(lib, "gdiplus.lib") + +namespace _gdi_graphics_ +{ + bool static GetResolution(const WCHAR* fileName, double & Width, double &Height) //pt + { + bool result =false; + Gdiplus::GdiplusStartupInput gdiplusStartupInput; + ULONG_PTR gdiplusToken=0; + Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + + Gdiplus::Bitmap *file = new Gdiplus::Bitmap(fileName,false); + if ((file) && (file->GetLastStatus()==Gdiplus::Ok)) + { + Height = file->GetHeight(); + Width = file->GetWidth(); + + double dpi_x = file->GetHorizontalResolution(); + double dpi_y = file->GetVerticalResolution(); + + if (dpi_x <1 )dpi_x = 96; + if (dpi_y <1 )dpi_y = 96; + + Height = Height *72. / dpi_y; + Width = Width * 72. /dpi_x; + + result = true; + delete file; + } + Gdiplus::GdiplusShutdown(gdiplusToken); + return result; + } + double static calculate_size_symbol(std::wstring name, double size, bool italic, bool bold) + { + double result =0; + Gdiplus::GdiplusStartupInput gdiplusStartupInput; + ULONG_PTR gdiplusToken=0; + Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); + //// + std::wstring test_string = L"0123456789"; + + int style = Gdiplus::FontStyleRegular; + if (bold && italic) style = Gdiplus::FontStyleBoldItalic; + else if (bold) style = Gdiplus::FontStyleBold; + else if (italic) style = Gdiplus::FontStyleItalic; + + Gdiplus::Graphics * gr = new Gdiplus::Graphics(GetWindowDC(NULL)); + if (gr) + { + Gdiplus::Font *font = new Gdiplus::Font(name.c_str(),size,style); + if (font) + { + Gdiplus::SizeF layout; + Gdiplus::RectF bound; + Gdiplus::Status res = gr->MeasureString(test_string.c_str(),test_string.length(),font,layout,&bound); + + if (res==0)result = bound.Width / test_string.length(); + //normalize to dpi = 96; + + double dpi = gr->GetDpiX(); + + result = result * 96./dpi; + + delete font; + } + delete gr; + } + Gdiplus::GdiplusShutdown(gdiplusToken); + return result; + } +}; \ No newline at end of file diff --git a/ASCOfficeOdfFileW/version.h b/ASCOfficeOdfFileW/version.h index abe1338d0e..81b7fa77c0 100644 --- a/ASCOfficeOdfFileW/version.h +++ b/ASCOfficeOdfFileW/version.h @@ -2,6 +2,6 @@ //1 //2 //0 -//34 -#define INTVER 1,2,0,34 -#define STRVER "1,2,0,34\0" +//35 +#define INTVER 1,2,0,35 +#define STRVER "1,2,0,35\0" diff --git a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h index d7672374c6..7e9d423f68 100644 --- a/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h +++ b/Common/DocxFormat/Source/DocxFormat/Drawing/DrawingCoreInfo.h @@ -785,12 +785,14 @@ namespace OOX m_eEffectType = effecttypeUnknown; CWCharWrapper sName = oReader.GetName(); - if ( _T("a:spPr") == sName ) + if ( _T("a:spPr") == sName ) m_eType = et_a_spPr; else if ( _T("pic:spPr") == sName ) m_eType = et_pic_spPr; else if ( _T("xdr:spPr") == sName ) m_eType = et_xdr_spPr; + else if ( _T("c:spPr") == sName ) + m_eType = et_c_spPr; else return; @@ -875,6 +877,8 @@ namespace OOX sResult = _T(""); else if ( et_xdr_spPr == m_eType ) sResult = _T(""); + else if ( et_c_spPr == m_eType ) + sResult = _T(""); return sResult; } virtual EElementType getType() const diff --git a/Common/DocxFormat/Source/DocxFormat/WritingElement.h b/Common/DocxFormat/Source/DocxFormat/WritingElement.h index d28cfe3b16..806b0e1f36 100644 --- a/Common/DocxFormat/Source/DocxFormat/WritingElement.h +++ b/Common/DocxFormat/Source/DocxFormat/WritingElement.h @@ -468,6 +468,7 @@ namespace OOX et_xdr_spPr, // et_c_chart, // + et_c_spPr, et_sl_schema, // et_sl_schemaLibrary, // diff --git a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp index 1c9c1d9f27..59a88dc68e 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp +++ b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.cpp @@ -2,6 +2,33 @@ #include "ChartSerialize.h" namespace OOX{ namespace Spreadsheet{ + + nullable FromString_spPr(CString *spPr) + { + nullable oSpPr; + XmlUtils::CXmlLiteReader oShapeReader; + //сформируем полноценную xml-строку + CString xmlString = L""; + xmlString += L""; + xmlString += *spPr; + xmlString += L""; + BOOL result =oShapeReader.FromString(xmlString); + + result = oShapeReader.ReadNextNode();//root ... skiping + result = oShapeReader.ReadNextNode(); + + CWCharWrapper sName = oShapeReader.GetName(); + + if (_T("c:spPr") == sName) + oSpPr = oShapeReader; + return oSpPr; + } bool FromXml_ST_PageSetupOrientation(CString& val, ST_PageSetupOrientation& eOut) { bool bRes = true; @@ -1070,6 +1097,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -2399,6 +2427,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -2848,6 +2877,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -3043,6 +3073,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -3407,6 +3438,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } } } @@ -3478,6 +3510,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -4209,6 +4242,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -4666,6 +4700,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -4880,6 +4915,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -5223,6 +5259,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -5539,6 +5576,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("invertIfNegative") == sName) { @@ -5810,6 +5848,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("pictureOptions") == sName) { @@ -5909,6 +5948,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("extLst") == sName) { @@ -6986,6 +7026,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("trendlineType") == sName) { @@ -7297,6 +7338,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { @@ -7434,6 +7476,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("extLst") == sName) { @@ -8520,6 +8563,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("cat") == sName) { @@ -8609,6 +8653,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } } } @@ -9138,6 +9183,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("explosion") == sName) { @@ -9600,6 +9646,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("invertIfNegative") == sName) { @@ -10429,6 +10476,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("marker") == sName) { @@ -10779,6 +10827,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("marker") == sName) { @@ -11223,6 +11272,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("marker") == sName) { @@ -11447,6 +11497,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } } } @@ -12026,6 +12077,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("pictureOptions") == sName) { @@ -12504,6 +12556,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("extLst") == sName) { @@ -12833,6 +12886,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("pictureOptions") == sName) { @@ -13246,6 +13300,7 @@ namespace OOX{ CString sVal = oReader.GetOuterXml(); *pNewElem = sVal; m_spPr = pNewElem; + m_oSpPr = FromString_spPr(m_spPr); } else if(_T("txPr") == sName) { diff --git a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h index 36ae0002d1..cbbf10eec8 100644 --- a/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h +++ b/Common/DocxFormat/Source/XlsxFormat/Chart/ChartSerialize.h @@ -451,6 +451,7 @@ namespace OOX{ CT_Chart* m_chart; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -672,6 +673,7 @@ namespace OOX{ CT_Boolean* m_overlay; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -770,6 +772,7 @@ namespace OOX{ CT_Boolean* m_showKeys; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -807,6 +810,7 @@ namespace OOX{ CT_TickLblPos* m_tickLblPos; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -884,6 +888,7 @@ namespace OOX{ public: //Member CString* m_spPr; + nullable m_oSpPr; CT_ChartLines(); ~CT_ChartLines(); void fromXML(XmlUtils::CXmlLiteReader& oReader); @@ -901,6 +906,7 @@ namespace OOX{ CT_Boolean* m_overlay; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -1062,6 +1068,7 @@ namespace OOX{ CT_TickLblPos* m_tickLblPos; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -1152,6 +1159,7 @@ namespace OOX{ CT_TickLblPos* m_tickLblPos; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -1189,6 +1197,7 @@ namespace OOX{ CT_Tx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; CT_DispUnitsLbl(); @@ -1263,6 +1272,7 @@ namespace OOX{ CT_TickLblPos* m_tickLblPos; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -1320,6 +1330,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_Boolean* m_invertIfNegative; //Member @@ -1374,6 +1385,7 @@ namespace OOX{ CT_UnsignedInt* m_explosion; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_PictureOptions* m_pictureOptions; //Member @@ -1393,6 +1405,7 @@ namespace OOX{ CT_MarkerSize* m_size; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_extLst* m_extLst; CT_Marker(); @@ -1518,6 +1531,7 @@ namespace OOX{ CString* m_name; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_TrendlineType* m_trendlineType; //Member @@ -1588,6 +1602,7 @@ namespace OOX{ CT_NumFmt* m_numFmt; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member @@ -1617,6 +1632,7 @@ namespace OOX{ CT_Double* m_val; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_extLst* m_extLst; CT_ErrBars(); @@ -1846,6 +1862,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_AxDataSource* m_cat; //Member @@ -1865,6 +1882,7 @@ namespace OOX{ CT_UnsignedInt* m_idx; //Member CString* m_spPr; + nullable m_oSpPr; CT_BandFmt(); ~CT_BandFmt(); void fromXML(XmlUtils::CXmlLiteReader& oReader); @@ -1976,6 +1994,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_UnsignedInt* m_explosion; //Member @@ -2067,6 +2086,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_Boolean* m_invertIfNegative; //Member @@ -2234,6 +2254,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_Marker* m_marker; //Member @@ -2301,6 +2322,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_Marker* m_marker; //Member @@ -2385,6 +2407,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_Marker* m_marker; //Member @@ -2431,6 +2454,7 @@ namespace OOX{ public: //Member CString* m_spPr; + nullable m_oSpPr; CT_UpDownBar(); ~CT_UpDownBar(); void fromXML(XmlUtils::CXmlLiteReader& oReader); @@ -2540,6 +2564,7 @@ namespace OOX{ CT_SerTx* m_tx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_PictureOptions* m_pictureOptions; //Member @@ -2602,6 +2627,7 @@ namespace OOX{ CT_DTable* m_dTable; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_extLst* m_extLst; CT_PlotArea(); @@ -2630,6 +2656,7 @@ namespace OOX{ CT_Thickness* m_thickness; //Member CString* m_spPr; + nullable m_oSpPr; //Member CT_PictureOptions* m_pictureOptions; //Member @@ -2725,6 +2752,7 @@ namespace OOX{ CT_UnsignedInt* m_idx; //Member CString* m_spPr; + nullable m_oSpPr; //Member CString* m_txPr; //Member