From 0a80c302b3464a43e86496758d30aab84ad721f5 Mon Sep 17 00:00:00 2001 From: Thomas Fussell Date: Sat, 22 Oct 2016 13:53:44 -0400 Subject: [PATCH] fix sheet deletion, #71 --- include/xlnt/packaging/manifest.hpp | 5 +++++ source/packaging/manifest.cpp | 10 ++++++++++ source/workbook/tests/test_produce_xlsx.hpp | 16 ++++++++++++++++ source/workbook/workbook.cpp | 10 +++++++--- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/include/xlnt/packaging/manifest.hpp b/include/xlnt/packaging/manifest.hpp index ab171c28..5c9576af 100644 --- a/include/xlnt/packaging/manifest.hpp +++ b/include/xlnt/packaging/manifest.hpp @@ -94,6 +94,11 @@ public: /// std::string register_relationship(const uri &source, relationship::type type, const uri &target, target_mode mode, const std::string &rel_id); + /// + /// + /// + void unregister_relationship(const uri &source, const std::string &rel_id); + // Content Types /// diff --git a/source/packaging/manifest.cpp b/source/packaging/manifest.cpp index cfaed685..65900f09 100644 --- a/source/packaging/manifest.cpp +++ b/source/packaging/manifest.cpp @@ -98,6 +98,11 @@ void manifest::register_override_type(const path &part, const std::string &conte override_content_types_[part] = content_type; } +void manifest::unregister_override_type(const path &part) +{ + override_content_types_.erase(part); +} + std::vector manifest::get_parts_with_overriden_types() const { std::vector overriden; @@ -176,6 +181,11 @@ std::string manifest::register_relationship(const uri &source, relationship::typ return rel_id; } +void manifest::unregister_relationship(const uri &source, const std::string &rel_id) +{ + relationships_.at(source.get_path()).erase(rel_id); +} + bool manifest::has_default_type(const std::string &extension) const { return default_content_types_.find(extension) != default_content_types_.end(); diff --git a/source/workbook/tests/test_produce_xlsx.hpp b/source/workbook/tests/test_produce_xlsx.hpp index e7ed9be3..ab1474a2 100644 --- a/source/workbook/tests/test_produce_xlsx.hpp +++ b/source/workbook/tests/test_produce_xlsx.hpp @@ -121,4 +121,20 @@ public: wb.save("simple.xlsx"); } + + void test_save_after_sheet_deletion() + { + xlnt::workbook workbook; + + TS_ASSERT_EQUALS(workbook.get_sheet_titles().size(), 1); + + auto sheet = workbook.create_sheet(); + sheet.set_title("XXX1"); + TS_ASSERT_EQUALS(workbook.get_sheet_titles().size(), 2); + + workbook.remove_sheet(workbook.get_sheet_by_title("XXX1")); + TS_ASSERT_EQUALS(workbook.get_sheet_titles().size(), 1); + + TS_ASSERT_THROWS_NOTHING(workbook.save("sample.xlsx")); + } }; diff --git a/source/workbook/workbook.cpp b/source/workbook/workbook.cpp index 6804602f..8899f88a 100644 --- a/source/workbook/workbook.cpp +++ b/source/workbook/workbook.cpp @@ -694,15 +694,19 @@ bool workbook::get_guess_types() const void workbook::remove_sheet(worksheet ws) { auto match_iter = std::find_if(d_->worksheets_.begin(), d_->worksheets_.end(), - [=](detail::worksheet_impl &comp) { return worksheet(&comp) == ws; }); + [=](detail::worksheet_impl &comp) { return &comp == ws.d_; }); if (match_iter == d_->worksheets_.end()) { throw invalid_parameter(); } - auto sheet_filename = path("worksheets/sheet" + std::to_string(d_->worksheets_.size()) + ".xml"); - + auto ws_rel_id = d_->sheet_title_rel_id_map_.at(ws.get_title()); + auto wb_rel = d_->manifest_.get_relationship(xlnt::path("/"), xlnt::relationship_type::office_document); + auto ws_rel = d_->manifest_.get_relationship(wb_rel.get_target().get_path(), ws_rel_id); + d_->manifest_.unregister_override_type(ws_rel.get_target().get_path()); + d_->manifest_.unregister_relationship(wb_rel.get_target(), ws_rel_id);; + d_->sheet_title_rel_id_map_.erase(ws.get_title()); d_->worksheets_.erase(match_iter); }