Browse Source

Deleting a sheet did not delete table parts and relations. Deleting a table needs to also delete any queryTable relations and parts.

pull/1597/head
Antony Liu 3 weeks ago
parent
commit
baa5ecb424
  1. 35
      ooxml/XSSF/UserModel/XSSFSheet.cs
  2. 11
      ooxml/XSSF/UserModel/XSSFTable.cs
  3. 5
      ooxml/XSSF/UserModel/XSSFWorkbook.cs

35
ooxml/XSSF/UserModel/XSSFSheet.cs

@ -1145,6 +1145,27 @@ namespace NPOI.XSSF.UserModel
}
}
/// <summary>
/// Remove table references and relations
/// </summary>
/// <param name="t">table to remove</param>
public void RemoveTable(XSSFTable t)
{
long id = t.GetCTTable().id;
KeyValuePair<String, XSSFTable>? toDelete = null;
foreach (KeyValuePair<String, XSSFTable> entry in tables) {
if (entry.Value.GetCTTable().id == id)
toDelete = entry;
}
if (toDelete != null)
{
RemoveRelation(GetRelationById(toDelete.Value.Key), true);
tables.Remove(toDelete.Value.Key);
toDelete.Value.Value.OnTableDelete();
}
}
public ISheetConditionalFormatting SheetConditionalFormatting
{
get
@ -6552,5 +6573,19 @@ lblforbreak:
{
return CellRangeAddressList.Parse(cellranges);
}
/// <summary>
/// called when a sheet is being deleted/removed from a workbook, to clean up relations and other document pieces tied to the sheet
/// </summary>
internal void OnSheetDelete() {
foreach (RelationPart part in RelationParts) {
if (part.DocumentPart is XSSFTable) {
// call table delete
RemoveTable((XSSFTable) part.DocumentPart);
continue;
}
RemoveRelation(part.DocumentPart, true);
}
}
}
}

11
ooxml/XSSF/UserModel/XSSFTable.cs

@ -838,5 +838,16 @@ namespace NPOI.XSSF.UserModel
}
return false;
}
/// <summary>
/// Remove relations
/// </summary>
internal void OnTableDelete()
{
foreach (RelationPart part in RelationParts)
{
RemoveRelation(part.DocumentPart, true);
}
}
}
}

5
ooxml/XSSF/UserModel/XSSFWorkbook.cs

@ -1396,6 +1396,11 @@ namespace NPOI.XSSF.UserModel
*/
private void OnSheetDelete(int index)
{
// remove all sheet relations
XSSFSheet sheet = GetSheetAt(index) as XSSFSheet;
sheet.OnSheetDelete();
//delete the CT_Sheet reference from workbook.xml
workbook.sheets.RemoveSheet(index);

Loading…
Cancel
Save