Skip to content

Commit 4bd9afd

Browse files
committed
Bug 56930: Add Workbook.getNames() to allow to query for names that appear multiple times
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1734863 13f79535-47bb-0310-9956-ffa450edef68
1 parent 3c1052e commit 4bd9afd

File tree

6 files changed

+84
-8
lines changed

6 files changed

+84
-8
lines changed

src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1473,6 +1473,18 @@ public HSSFName getName(String name) {
14731473
return names.get(nameIndex);
14741474
}
14751475

1476+
@Override
1477+
public List<HSSFName> getNames(String name) {
1478+
List<HSSFName> nameList = new ArrayList<HSSFName>();
1479+
for(HSSFName nr : names) {
1480+
if(nr.getNameName().equals(name)) {
1481+
nameList.add(nr);
1482+
}
1483+
}
1484+
1485+
return nameList;
1486+
}
1487+
14761488
@Override
14771489
public HSSFName getNameAt(int nameIndex) {
14781490
int nNames = names.size();

src/java/org/apache/poi/ss/usermodel/Workbook.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,15 @@ public interface Workbook extends Closeable, Iterable<Sheet> {
351351
* @return the defined name with the specified name. <code>null</code> if not found.
352352
*/
353353
Name getName(String name);
354+
355+
/**
356+
* Returns all defined names with the given name.
357+
*
358+
* @param name the name of the defined name
359+
* @return a list of the defined names with the specified name. An empty list is returned if none is found.
360+
*/
361+
List<? extends Name> getNames(String name);
362+
354363
/**
355364
* @param nameIndex position of the named range (0-based)
356365
* @return the defined name at the specified index

src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFWorkbook.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,18 @@ public Name getName(String name)
956956
{
957957
return _wb.getName(name);
958958
}
959+
960+
/**
961+
* Returns all defined names with the given name.
962+
*
963+
* @param name the name of the defined name
964+
* @return a list of the defined names with the specified name. An empty list is returned if none is found.
965+
*/
966+
@Override
967+
public List<? extends Name> getNames(String name) {
968+
return _wb.getNames(name);
969+
}
970+
959971
/**
960972
* @param nameIndex position of the named range (0-based)
961973
* @return the defined name at the specified index

src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ public int addPicture(byte[] pictureData, int format) {
522522
*/
523523
public int addPicture(InputStream is, int format) throws IOException {
524524
int imageNumber = getAllPictures().size() + 1;
525-
XSSFPictureData img = (XSSFPictureData)createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
525+
XSSFPictureData img = createRelationship(XSSFPictureData.RELATIONS[format], XSSFFactory.getInstance(), imageNumber, true).getDocumentPart();
526526
OutputStream out = img.getPackagePart().getOutputStream();
527527
IOUtils.copy(is, out);
528528
out.close();
@@ -872,7 +872,7 @@ public List<XSSFPictureData> getAllPictures() {
872872
List<PackagePart> mediaParts = getPackage().getPartsByName(Pattern.compile("/xl/media/.*?"));
873873
pictures = new ArrayList<XSSFPictureData>(mediaParts.size());
874874
for(PackagePart part : mediaParts){
875-
pictures.add(new XSSFPictureData(part, null));
875+
pictures.add(new XSSFPictureData(part));
876876
}
877877
}
878878
return pictures; //YK: should return Collections.unmodifiableList(pictures);
@@ -908,6 +908,18 @@ public XSSFName getName(String name) {
908908
return namedRanges.get(nameIndex);
909909
}
910910

911+
@Override
912+
public List<XSSFName> getNames(String name) {
913+
List<XSSFName> names = new ArrayList<XSSFName>();
914+
for(XSSFName nr : namedRanges) {
915+
if(nr.getNameName().equals(name)) {
916+
names.add(nr);
917+
}
918+
}
919+
920+
return names;
921+
}
922+
911923
@Override
912924
public XSSFName getNameAt(int nameIndex) {
913925
int nNames = namedRanges.size();

src/testcases/org/apache/poi/hssf/usermodel/TestHSSFName.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ Licensed to the Apache Software Foundation (ASF) under one or more
1717

1818
package org.apache.poi.hssf.usermodel;
1919

20-
import static org.junit.Assert.assertEquals;
21-
import static org.junit.Assert.assertTrue;
22-
import static org.junit.Assert.fail;
23-
2420
import org.apache.poi.POITestCase;
2521
import org.apache.poi.hssf.HSSFITestDataProvider;
2622
import org.apache.poi.hssf.HSSFTestDataSamples;
@@ -33,6 +29,8 @@ Licensed to the Apache Software Foundation (ASF) under one or more
3329
import org.apache.poi.ss.util.CellRangeAddress;
3430
import org.junit.Test;
3531

32+
import static org.junit.Assert.*;
33+
3634
/**
3735
* Tests various functionality having to do with {@link org.apache.poi.ss.usermodel.Name}.
3836
*/
@@ -119,6 +117,7 @@ public void testNamedRange() throws Exception {
119117
HSSFName namedRange1 = wb1.getNameAt(0);
120118
//Getting it sheet name
121119
sheetName = namedRange1.getSheetName();
120+
assertNotNull(sheetName);
122121

123122
// sanity check
124123
SanityChecker c = new SanityChecker();
@@ -198,6 +197,7 @@ public void testPrintAreaFileRead() throws Exception {
198197
workbook.close();
199198
}
200199

200+
@SuppressWarnings("deprecation")
201201
@Test
202202
public void testDeletedReference() throws Exception {
203203
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("24207.xls");
@@ -233,8 +233,8 @@ public void testTypeOfRootPtg() throws Exception {
233233
wb.createSheet("CSCO");
234234

235235
Ptg[] ptgs = HSSFFormulaParser.parse("CSCO!$E$71", wb, FormulaType.NAMEDRANGE, 0);
236-
for (int i = 0; i < ptgs.length; i++) {
237-
assertEquals('R', ptgs[i].getRVAType());
236+
for (Ptg ptg : ptgs) {
237+
assertEquals('R', ptg.getRVAType());
238238
}
239239
wb.close();
240240
}

src/testcases/org/apache/poi/ss/usermodel/BaseTestNamedRange.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ Licensed to the Apache Software Foundation (ASF) under one or more
2929
import org.apache.poi.ss.util.CellReference;
3030
import org.junit.Test;
3131

32+
import java.util.List;
33+
3234
/**
3335
* Tests of implementations of {@link org.apache.poi.ss.usermodel.Name}.
3436
*
@@ -643,4 +645,33 @@ public final void testDefferedSetting() throws Exception {
643645

644646
wb.close();
645647
}
648+
649+
@Test
650+
public void testBug56930() {
651+
Workbook wb = _testDataProvider.createWorkbook();
652+
653+
// x1 on sheet1 defines "x=1"
654+
wb.createSheet("sheet1");
655+
Name x1 = wb.createName();
656+
657+
x1.setNameName("x");
658+
x1.setRefersToFormula("1");
659+
x1.setSheetIndex(wb.getSheetIndex("sheet1"));
660+
661+
// x2 on sheet2 defines "x=2"
662+
wb.createSheet("sheet2");
663+
Name x2 = wb.createName();
664+
x2.setNameName("x");
665+
x2.setRefersToFormula("2");
666+
x2.setSheetIndex(wb.getSheetIndex("sheet2"));
667+
668+
List<? extends Name> names = wb.getNames("x");
669+
assertEquals("Had: " + names, 2, names.size());
670+
assertEquals("1", names.get(0).getRefersToFormula());
671+
assertEquals("2", names.get(1).getRefersToFormula());
672+
673+
assertEquals("1", wb.getName("x").getRefersToFormula());
674+
wb.removeName("x");
675+
assertEquals("2", wb.getName("x").getRefersToFormula());
676+
}
646677
}

0 commit comments

Comments
 (0)