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);
}