From c21014c0fd1f8b9d9c2eed8c468967d4e8069801 Mon Sep 17 00:00:00 2001 From: snippet Date: Mon, 29 Aug 2022 18:30:48 +1000 Subject: [PATCH] Added the ability to set the active sheet Closes #653 --- include/xlnt/workbook/workbook.hpp | 6 ++++++ source/detail/serialization/xlsx_consumer.cpp | 1 + source/workbook/workbook.cpp | 5 +++++ tests/data/20_active_sheet.xlsx | Bin 0 -> 6035 bytes tests/workbook/serialization_test_suite.cpp | 8 ++++++++ tests/workbook/workbook_test_suite.cpp | 5 +++++ 6 files changed, 25 insertions(+) create mode 100644 tests/data/20_active_sheet.xlsx diff --git a/include/xlnt/workbook/workbook.hpp b/include/xlnt/workbook/workbook.hpp index 3afb95f8..f7aa4e3c 100644 --- a/include/xlnt/workbook/workbook.hpp +++ b/include/xlnt/workbook/workbook.hpp @@ -203,6 +203,12 @@ public: /// worksheet active_sheet(); + /// + /// Sets the worksheet that is determined to be active. An active + /// sheet is that which is initially shown by the spreadsheet editor. + /// + void active_sheet(std::size_t index); + /// /// Returns the worksheet with the given name. This may throw an exception /// if the sheet isn't found. Use workbook::contains(const std::string &) diff --git a/source/detail/serialization/xlsx_consumer.cpp b/source/detail/serialization/xlsx_consumer.cpp index e7dce8d1..dc50106c 100644 --- a/source/detail/serialization/xlsx_consumer.cpp +++ b/source/detail/serialization/xlsx_consumer.cpp @@ -2037,6 +2037,7 @@ void xlsx_consumer::read_office_document(const std::string &content_type) // CT_ if (parser().attribute_present("activeTab")) { view.active_tab = parser().attribute("activeTab"); + target_.d_->active_sheet_index_.set(view.active_tab.get()); } target_.view(view); diff --git a/source/workbook/workbook.cpp b/source/workbook/workbook.cpp index 5d49ddff..dce9d3bd 100644 --- a/source/workbook/workbook.cpp +++ b/source/workbook/workbook.cpp @@ -743,6 +743,11 @@ worksheet workbook::active_sheet() { return sheet_by_index(d_->active_sheet_index_.is_set() ? d_->active_sheet_index_.get() : 0); } +void workbook::active_sheet(std::size_t index) +{ + d_->active_sheet_index_.set(index); + d_->view_.get().active_tab = index; +} bool workbook::has_named_range(const std::string &name) const { diff --git a/tests/data/20_active_sheet.xlsx b/tests/data/20_active_sheet.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d441ddccd7f3195b2ca693a47388f05651b84251 GIT binary patch literal 6035 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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 10dbb4fd..ca6383a1 100644 --- a/tests/workbook/serialization_test_suite.cpp +++ b/tests/workbook/serialization_test_suite.cpp @@ -72,6 +72,7 @@ public: register_test(test_Issue492_stream_empty_row); register_test(test_Issue503_external_link_load); register_test(test_formatting); + register_test(test_active_sheet); } bool workbook_matches_file(xlnt::workbook &wb, const xlnt::path &file) @@ -800,6 +801,13 @@ public: 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); } + + void test_active_sheet() + { + xlnt::workbook wb; + wb.load(path_helper::test_file("20_active_sheet.xlsx")); + xlnt_assert_equals(wb.active_sheet(), wb[2]); + } }; static serialization_test_suite x; diff --git a/tests/workbook/workbook_test_suite.cpp b/tests/workbook/workbook_test_suite.cpp index 59eb3a69..09e37660 100644 --- a/tests/workbook/workbook_test_suite.cpp +++ b/tests/workbook/workbook_test_suite.cpp @@ -77,6 +77,11 @@ public: { xlnt::workbook wb; xlnt_assert_equals(wb.active_sheet(), wb[0]); + + wb.create_sheet(); + wb.create_sheet(); + wb.active_sheet(2); + xlnt_assert_equals(wb.active_sheet(), wb[2]); } void test_create_sheet()