Index: src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java =================================================================== --- cfl/workspaces/poi-trunk/ApachePOI/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (revision 1619852) +++ cfl/workspaces/poi-trunk/ApachePOI/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java (working copy) @@ -1076,6 +1076,7 @@ * @param index the 0-based index of the sheet to delete */ private void onSheetDelete(int index) { + String sheetName = getSheetName(index); //delete the CTSheet reference from workbook.xml workbook.getSheets().removeSheet(index); @@ -1089,8 +1090,9 @@ for (Iterator it = namedRanges.iterator(); it.hasNext();) { XSSFName nm = it.next(); CTDefinedName ct = nm.getCTName(); - if(!ct.isSetLocalSheetId()) continue; - if (ct.getLocalSheetId() == index) { + boolean nameIsScopedToRemovedSheet = ct.isSetLocalSheetId() && ct.getLocalSheetId() == index; + boolean nameRefersToRemovedSheet = nm.getSheetName().equals(sheetName); + if (nameIsScopedToRemovedSheet || nameRefersToRemovedSheet) { it.remove(); } else if (ct.getLocalSheetId() > index){ // Bump down by one, so still points at the same sheet Index: src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorksheetRemoval.java =================================================================== --- cfl/workspaces/poi-trunk/ApachePOI/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorksheetRemoval.java (revision 0) +++ cfl/workspaces/poi-trunk/ApachePOI/src/ooxml/testcases/org/apache/poi/xssf/usermodel/TestXSSFWorksheetRemoval.java (working copy) @@ -0,0 +1,25 @@ +package org.apache.poi.xssf.usermodel; + +import junit.framework.TestCase; + +import org.junit.Test; + +public final class TestXSSFWorksheetRemoval extends TestCase { + + @Test + public void testSheetRemovalRemovesNamedRanges() throws Exception { + XSSFWorkbook wb = new XSSFWorkbook(); + wb.createSheet("Sheet1"); + + XSSFName name = wb.createName(); + name.setNameName("test"); + name.setRefersToFormula("Sheet1!A1"); + + assertEquals(1, wb.getNumberOfNames()); + + wb.removeSheetAt(0); + assertEquals("Names referencing deleted sheet should be removed", 0, wb.getNumberOfNames()); + wb.close(); + } + +}