bug 56781: disallow names with symbols, except underscore, period, and backslash
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1749293 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
4036202ebc
commit
b617f3ccec
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
package org.apache.poi.hssf.usermodel;
|
package org.apache.poi.hssf.usermodel;
|
||||||
|
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.apache.poi.hssf.model.HSSFFormulaParser;
|
import org.apache.poi.hssf.model.HSSFFormulaParser;
|
||||||
import org.apache.poi.hssf.model.InternalWorkbook;
|
import org.apache.poi.hssf.model.InternalWorkbook;
|
||||||
import org.apache.poi.hssf.record.NameCommentRecord;
|
import org.apache.poi.hssf.record.NameCommentRecord;
|
||||||
@ -30,6 +32,11 @@ import org.apache.poi.ss.usermodel.Name;
|
|||||||
* 'named range' or name of a user defined function.
|
* 'named range' or name of a user defined function.
|
||||||
*/
|
*/
|
||||||
public final class HSSFName implements Name {
|
public final class HSSFName implements Name {
|
||||||
|
private static final Pattern isValidName = Pattern.compile(
|
||||||
|
"[\\p{IsAlphabetic}_\\\\]" +
|
||||||
|
"[\\p{IsAlphabetic}0-9_.\\\\]*",
|
||||||
|
Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
private HSSFWorkbook _book;
|
private HSSFWorkbook _book;
|
||||||
private NameRecord _definedNameRec;
|
private NameRecord _definedNameRec;
|
||||||
private NameCommentRecord _commentRec;
|
private NameCommentRecord _commentRec;
|
||||||
@ -155,10 +162,8 @@ public final class HSSFName implements Name {
|
|||||||
|
|
||||||
private static void validateName(String name){
|
private static void validateName(String name){
|
||||||
if(name.length() == 0) throw new IllegalArgumentException("Name cannot be blank");
|
if(name.length() == 0) throw new IllegalArgumentException("Name cannot be blank");
|
||||||
|
if(!isValidName.matcher(name).matches()) {
|
||||||
char c = name.charAt(0);
|
throw new IllegalArgumentException("Invalid name: '"+name+"'");
|
||||||
if(!(c == '_' || Character.isLetter(c)) || name.indexOf(' ') != -1) {
|
|
||||||
throw new IllegalArgumentException("Invalid name: '"+name+"'; Names must begin with a letter or underscore and not contain spaces");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ public interface Name {
|
|||||||
/**
|
/**
|
||||||
* Get the sheets name which this named range is referenced to
|
* Get the sheets name which this named range is referenced to
|
||||||
*
|
*
|
||||||
* @return sheet name, which this named range refered to
|
* @return sheet name, which this named range referred to
|
||||||
*/
|
*/
|
||||||
String getSheetName();
|
String getSheetName();
|
||||||
|
|
||||||
|
@ -17,6 +17,10 @@
|
|||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.apache.poi.ss.formula.FormulaParser;
|
import org.apache.poi.ss.formula.FormulaParser;
|
||||||
import org.apache.poi.ss.formula.FormulaType;
|
import org.apache.poi.ss.formula.FormulaType;
|
||||||
import org.apache.poi.ss.usermodel.Name;
|
import org.apache.poi.ss.usermodel.Name;
|
||||||
@ -52,6 +56,11 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDefinedName;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public final class XSSFName implements Name {
|
public final class XSSFName implements Name {
|
||||||
|
|
||||||
|
private static final Pattern isValidName = Pattern.compile(
|
||||||
|
"[\\p{IsAlphabetic}_\\\\]" +
|
||||||
|
"[\\p{IsAlphabetic}0-9_.\\\\]*",
|
||||||
|
Pattern.CASE_INSENSITIVE);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A built-in defined name that specifies the workbook's print area
|
* A built-in defined name that specifies the workbook's print area
|
||||||
@ -344,12 +353,11 @@ public final class XSSFName implements Name {
|
|||||||
XSSFName cf = (XSSFName) o;
|
XSSFName cf = (XSSFName) o;
|
||||||
return _ctName.toString().equals(cf.getCTName().toString());
|
return _ctName.toString().equals(cf.getCTName().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void validateName(String name){
|
private static void validateName(String name){
|
||||||
if(name.length() == 0) throw new IllegalArgumentException("Name cannot be blank");
|
if(name.length() == 0) throw new IllegalArgumentException("Name cannot be blank");
|
||||||
char c = name.charAt(0);
|
if (!isValidName.matcher(name).matches()) {
|
||||||
if(!(c == '_' || Character.isLetter(c)) || name.indexOf(' ') != -1) {
|
throw new IllegalArgumentException("Invalid name: '"+name+"'");
|
||||||
throw new IllegalArgumentException("Invalid name: '"+name+"'; Names must begin with a letter or underscore and not contain spaces");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.apache.poi.ss.ITestDataProvider;
|
import org.apache.poi.ss.ITestDataProvider;
|
||||||
@ -677,4 +678,47 @@ public abstract class BaseTestNamedRange {
|
|||||||
|
|
||||||
wb.close();
|
wb.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//@Ignore
|
||||||
|
@Test
|
||||||
|
public void test56781() throws IOException {
|
||||||
|
Workbook wb = _testDataProvider.createWorkbook();
|
||||||
|
|
||||||
|
Name name = wb.createName();
|
||||||
|
for (String valid : Arrays.asList(
|
||||||
|
"Hello",
|
||||||
|
"number1",
|
||||||
|
"_underscore",
|
||||||
|
"p.e.r.o.i.d.s",
|
||||||
|
"\\Backslash",
|
||||||
|
"Backslash\\"
|
||||||
|
)) {
|
||||||
|
name.setNameName(valid);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
name.setNameName("");
|
||||||
|
fail("expected exception: (blank)");
|
||||||
|
} catch (final IllegalArgumentException e) {
|
||||||
|
assertEquals("Name cannot be blank", e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (String invalid : Arrays.asList(
|
||||||
|
"1number",
|
||||||
|
"Sheet1!A1",
|
||||||
|
"Exclamation!",
|
||||||
|
"Has Space",
|
||||||
|
"Colon:",
|
||||||
|
"A-Minus",
|
||||||
|
"A+Plus",
|
||||||
|
"Dollar$")) {
|
||||||
|
try {
|
||||||
|
name.setNameName(invalid);
|
||||||
|
fail("expected exception: " + invalid);
|
||||||
|
} catch (final IllegalArgumentException e) {
|
||||||
|
assertEquals("Invalid name: '" + invalid + "'", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user