From 8ef1fe1a2874a5e115105a687ff19a4afca1a83d Mon Sep 17 00:00:00 2001 From: Thomas Fussell Date: Sat, 23 Jul 2016 20:41:55 -0400 Subject: [PATCH] test and implement reading gradient fill --- source/detail/style_serializer.cpp | 10 +++++++++- source/workbook/tests/test_style_reader.hpp | 19 +++++++++++++++---- source/workbook/tests/test_workbook.hpp | 2 ++ tests/data/reader/formatting.xlsx | Bin 496771 -> 498819 bytes 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/source/detail/style_serializer.cpp b/source/detail/style_serializer.cpp index fd2ae676..88446058 100644 --- a/source/detail/style_serializer.cpp +++ b/source/detail/style_serializer.cpp @@ -633,7 +633,7 @@ xlnt::fill read_fill(const pugi::xml_node &fill_node) else if (fill_node.child("gradientFill")) { auto gradient_fill_node = fill_node.child("gradientFill"); - std::string gradient_fill_type_string = gradient_fill_node.attribute("gradientType").value(); + std::string gradient_fill_type_string = gradient_fill_node.attribute("type").value(); if (!gradient_fill_type_string.empty()) { @@ -643,6 +643,14 @@ xlnt::fill read_fill(const pugi::xml_node &fill_node) { new_fill = xlnt::fill::gradient(xlnt::gradient_fill::type::linear); } + + for (auto stop_node : gradient_fill_node.children("stop")) + { + auto position = stop_node.attribute("position").as_double(); + auto color = read_color(stop_node.child("color")); + + new_fill.get_gradient_fill().add_stop(position, color); + } } return new_fill; diff --git a/source/workbook/tests/test_style_reader.hpp b/source/workbook/tests/test_style_reader.hpp index 21ff2c34..e14f45df 100644 --- a/source/workbook/tests/test_style_reader.hpp +++ b/source/workbook/tests/test_style_reader.hpp @@ -17,11 +17,22 @@ public: wb.load(path_helper::get_data_directory("/reader/formatting.xlsx")); // border_style - TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("E30").get_border().get_top()->get_color(), xlnt::color(xlnt::color::type::indexed, 10)); - TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("E30").get_border().get_top()->get_border_style(), xlnt::border_style::thin); + auto ws = wb.get_active_sheet(); + auto e30 = ws.get_cell("E30"); + TS_ASSERT_EQUALS(e30.get_border().get_top()->get_color(), xlnt::color(xlnt::color::type::indexed, 10)); + TS_ASSERT_EQUALS(e30.get_border().get_top()->get_border_style(), xlnt::border_style::thin); // underline_style - TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("E30").get_font().get_underline(), xlnt::font::underline_style::none); - TS_ASSERT_EQUALS(wb.get_active_sheet().get_cell("F30").get_font().get_underline(), xlnt::font::underline_style::single); + auto f30 = ws.get_cell("F30"); + TS_ASSERT_EQUALS(e30.get_font().get_underline(), xlnt::font::underline_style::none); + TS_ASSERT_EQUALS(f30.get_font().get_underline(), xlnt::font::underline_style::single); + + // gradient fill + auto e21 = ws.get_cell("E21"); + TS_ASSERT_EQUALS(e21.get_fill().get_type(), xlnt::fill::type::gradient); + TS_ASSERT_EQUALS(e21.get_fill().get_gradient_fill().get_type(), xlnt::gradient_fill::type::linear); + TS_ASSERT_EQUALS(e21.get_fill().get_gradient_fill().get_stops().size(), 2); + TS_ASSERT_EQUALS(e21.get_fill().get_gradient_fill().get_stops().at(0), xlnt::color(xlnt::color::type::rgb, "FFFF0000")); + TS_ASSERT_EQUALS(e21.get_fill().get_gradient_fill().get_stops().at(1), xlnt::color(xlnt::color::type::rgb, "FF0000FF")); } }; diff --git a/source/workbook/tests/test_workbook.hpp b/source/workbook/tests/test_workbook.hpp index 05058316..752dcf91 100644 --- a/source/workbook/tests/test_workbook.hpp +++ b/source/workbook/tests/test_workbook.hpp @@ -104,6 +104,8 @@ public: auto found_sheet = wb.get_sheet_by_name(title); TS_ASSERT_EQUALS(new_sheet, found_sheet); TS_ASSERT_THROWS(wb.get_sheet_by_name("error"), xlnt::key_error); + const auto &wb_const = wb; + TS_ASSERT_THROWS(wb_const.get_sheet_by_name("error"), xlnt::key_error); } void test_get_sheet_by_name_const() diff --git a/tests/data/reader/formatting.xlsx b/tests/data/reader/formatting.xlsx index e6acaef76a11708fb3a9e677b140ff0b62d61d40..25a41c57e71efe0852017d8d9a0ea49e8b9892af 100644 GIT binary patch delta 13811 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 An*aa+ delta 11726 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