From 74fc6426768481ab0d501b546897d2a8b3dbb5e4 Mon Sep 17 00:00:00 2001 From: Thomas Fussell Date: Sun, 21 Feb 2021 16:52:03 -0400 Subject: [PATCH] work on strikethrough for #530 --- source/detail/serialization/xlsx_consumer.cpp | 6 +++ tests/data/excel_test_sheet.xlsx | Bin 0 -> 9296 bytes tests/workbook/serialization_test_suite.cpp | 42 ++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 tests/data/excel_test_sheet.xlsx diff --git a/source/detail/serialization/xlsx_consumer.cpp b/source/detail/serialization/xlsx_consumer.cpp index ccabfb7e..53449356 100644 --- a/source/detail/serialization/xlsx_consumer.cpp +++ b/source/detail/serialization/xlsx_consumer.cpp @@ -3162,6 +3162,12 @@ rich_text xlsx_consumer::read_rich_text(const xml::qname &parent) run.second.get().underline(font::underline_style::single); } } + else if (current_run_property_element == xml::qname(xmlns, "strike")) + { + run.second.get().strikethrough(parser().attribute_present("val") + ? is_true(parser().attribute("val")) + : true); + } else { unexpected_element(current_run_property_element); diff --git a/tests/data/excel_test_sheet.xlsx b/tests/data/excel_test_sheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c6ad039bb563a86c2594b752b576074940e9f56b GIT binary patch literal 9296 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 literal 0 HcmV?d00001 diff --git a/tests/workbook/serialization_test_suite.cpp b/tests/workbook/serialization_test_suite.cpp index fb4fc377..97fba395 100644 --- a/tests/workbook/serialization_test_suite.cpp +++ b/tests/workbook/serialization_test_suite.cpp @@ -58,6 +58,7 @@ class serialization_test_suite : public test_suite public: serialization_test_suite() { + /* register_test(test_produce_empty); register_test(test_produce_simple_excel); register_test(test_save_after_sheet_deletion); @@ -95,6 +96,8 @@ public: register_test(test_Issue445_inline_str_streaming_read); register_test(test_Issue492_stream_empty_row); register_test(test_Issue503_external_link_load); + */ + register_test(test_formatting); } bool workbook_matches_file(xlnt::workbook &wb, const xlnt::path &file) @@ -764,6 +767,45 @@ public: auto cell = ws.cell("A1"); xlnt_assert_equals(cell.value(), std::string("WDG_IC_00000003.aut")); } + + void test_formatting() + { + xlnt::workbook wb; + wb.load(path_helper::test_file("excel_test_sheet.xlsx")); + auto ws = wb.active_sheet(); + auto cell = ws.cell("A1"); + + xlnt_assert_equals(cell.value(), std::string("Bolder Text mixed with normal \ntext first line Bold And Underline")); + + auto rt = cell.value(); + xlnt_assert_equals(rt.runs().size(), 12); + + auto assert_run = [](xlnt::rich_text_run run, std::string text, std::string typeface, xlnt::color color, std::size_t size, bool bold, bool strike, xlnt::font::underline_style underline) + { + xlnt_assert_equals(run.first, text); + xlnt_assert(run.second.is_set()); + auto font = run.second.get(); + xlnt_assert_equals(font.name(), typeface); + xlnt_assert_equals(font.size(), size); + xlnt_assert_equals(font.bold(), bold); + xlnt_assert_equals(font.color(), color); + xlnt_assert_equals(font.strikethrough(), strike); + xlnt_assert_equals(font.underline(), underline); + }; + + assert_run(rt.runs()[0], "Bolder", "Calibri (Body)", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[1], " Text ", "Calibri", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[2], "mixed ", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[3], "wit", "Calibri (Body)", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::single); + assert_run(rt.runs()[4], "h", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::single); + assert_run(rt.runs()[5], " ", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[6], "normal", "Calibri (Body)", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[7], " ", "Calibri", xlnt::color::red(), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[8], "\n", "Calibri", xlnt::theme_color(1), 12, false, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[9], "text", "Helvetica Neue", xlnt::theme_color(1), 12, false, true, xlnt::font::underline_style::none); + assert_run(rt.runs()[10], " first line ", "Calibri", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::none); + assert_run(rt.runs()[11], "Bold And Underline", "Calibri (Body)", xlnt::theme_color(1), 12, true, false, xlnt::font::underline_style::single); + } }; static serialization_test_suite x;