fixed XSSFWorkbook.createSheet to throw exception if sheet name begins or ends with a single quote ('), see Bugzilla 49875
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@992629 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
c6219cadca
commit
3744428426
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.7-beta3" date="2010-??-??">
|
<release version="3.7-beta3" date="2010-??-??">
|
||||||
|
<action dev="poi-developers" type="fix">49875 - fixed XSSFWorkbook.createSheet to throw exception if sheet name begins or ends with a single quote (')</action>
|
||||||
<action dev="poi-developers" type="fix">49873 - fixed XSSFFormulaEvaluator to support blank cells</action>
|
<action dev="poi-developers" type="fix">49873 - fixed XSSFFormulaEvaluator to support blank cells</action>
|
||||||
<action dev="poi-developers" type="fix">49850 - added a getter for _iStartAt in ListFormatOverrideLevel</action>
|
<action dev="poi-developers" type="fix">49850 - added a getter for _iStartAt in ListFormatOverrideLevel</action>
|
||||||
<action dev="poi-developers" type="fix">49761 - change cell type to error when setting Double.NaN or Infinities</action>
|
<action dev="poi-developers" type="fix">49761 - change cell type to error when setting Double.NaN or Infinities</action>
|
||||||
|
@ -26,6 +26,7 @@ import org.apache.poi.util.BitFieldFactory;
|
|||||||
import org.apache.poi.util.HexDump;
|
import org.apache.poi.util.HexDump;
|
||||||
import org.apache.poi.util.LittleEndianOutput;
|
import org.apache.poi.util.LittleEndianOutput;
|
||||||
import org.apache.poi.util.StringUtil;
|
import org.apache.poi.util.StringUtil;
|
||||||
|
import org.apache.poi.ss.util.WorkbookUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Title: Bound Sheet Record (aka BundleSheet) (0x0085)<P>
|
* Title: Bound Sheet Record (aka BundleSheet) (0x0085)<P>
|
||||||
@ -90,42 +91,11 @@ public final class BoundSheetRecord extends StandardRecord {
|
|||||||
*/
|
*/
|
||||||
public void setSheetname(String sheetName) {
|
public void setSheetname(String sheetName) {
|
||||||
|
|
||||||
validateSheetName(sheetName);
|
WorkbookUtil.validateSheetName(sheetName);
|
||||||
field_5_sheetname = sheetName;
|
field_5_sheetname = sheetName;
|
||||||
field_4_isMultibyteUnicode = StringUtil.hasMultibyte(sheetName) ? 1 : 0;
|
field_4_isMultibyteUnicode = StringUtil.hasMultibyte(sheetName) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void validateSheetName(String sheetName) {
|
|
||||||
if (sheetName == null) {
|
|
||||||
throw new IllegalArgumentException("sheetName must not be null");
|
|
||||||
}
|
|
||||||
int len = sheetName.length();
|
|
||||||
if (len < 1) {
|
|
||||||
throw new IllegalArgumentException("sheetName must not be empty string");
|
|
||||||
}
|
|
||||||
for (int i=0; i<len; i++) {
|
|
||||||
char ch = sheetName.charAt(i);
|
|
||||||
switch (ch) {
|
|
||||||
case '/':
|
|
||||||
case '\\':
|
|
||||||
case '?':
|
|
||||||
case '*':
|
|
||||||
case ']':
|
|
||||||
case '[':
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// all other chars OK
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("Invalid char (" + ch
|
|
||||||
+ ") found at index (" + i + ") in sheet name '" + sheetName + "'");
|
|
||||||
}
|
|
||||||
if (sheetName.charAt(0) == '\'' || sheetName.charAt(len-1) == '\'') {
|
|
||||||
throw new IllegalArgumentException("Invalid sheet name '" + sheetName
|
|
||||||
+ "'. Sheet names must not begin or end with (').");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the offset in bytes of the Beginning of File Marker within the HSSF Stream part of the POIFS file
|
* get the offset in bytes of the Beginning of File Marker within the HSSF Stream part of the POIFS file
|
||||||
*
|
*
|
||||||
|
@ -74,4 +74,59 @@ public class WorkbookUtil {
|
|||||||
}
|
}
|
||||||
return result.toString();
|
return result.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates sheet name.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* The character count <tt>MUST</tt> be greater than or equal to 1 and less than or equal to 31.
|
||||||
|
* The string MUST NOT contain the any of the following characters:
|
||||||
|
* <ul>
|
||||||
|
* <li> 0x0000 </li>
|
||||||
|
* <li> 0x0003 </li>
|
||||||
|
* <li> colon (:) </li>
|
||||||
|
* <li> backslash (\) </li>
|
||||||
|
* <li> asterisk (*) </li>
|
||||||
|
* <li> question mark (?) </li>
|
||||||
|
* <li> forward slash (/) </li>
|
||||||
|
* <li> opening square bracket ([) </li>
|
||||||
|
* <li> closing square bracket (]) </li>
|
||||||
|
* </ul>
|
||||||
|
* The string MUST NOT begin or end with the single quote (') character.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param sheetName the name to validate
|
||||||
|
*/
|
||||||
|
public static void validateSheetName(String sheetName) {
|
||||||
|
if (sheetName == null) {
|
||||||
|
throw new IllegalArgumentException("sheetName must not be null");
|
||||||
|
}
|
||||||
|
int len = sheetName.length();
|
||||||
|
if (len < 1) {
|
||||||
|
throw new IllegalArgumentException("sheetName must not be empty string");
|
||||||
|
}
|
||||||
|
for (int i=0; i<len; i++) {
|
||||||
|
char ch = sheetName.charAt(i);
|
||||||
|
switch (ch) {
|
||||||
|
case '/':
|
||||||
|
case '\\':
|
||||||
|
case '?':
|
||||||
|
case '*':
|
||||||
|
case ']':
|
||||||
|
case '[':
|
||||||
|
case ':':
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// all other chars OK
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Invalid char (" + ch
|
||||||
|
+ ") found at index (" + i + ") in sheet name '" + sheetName + "'");
|
||||||
|
}
|
||||||
|
if (sheetName.charAt(0) == '\'' || sheetName.charAt(len-1) == '\'') {
|
||||||
|
throw new IllegalArgumentException("Invalid sheet name '" + sheetName
|
||||||
|
+ "'. Sheet names must not begin or end with (').");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ import org.apache.poi.ss.usermodel.Sheet;
|
|||||||
import org.apache.poi.ss.usermodel.Workbook;
|
import org.apache.poi.ss.usermodel.Workbook;
|
||||||
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||||
import org.apache.poi.ss.util.CellReference;
|
import org.apache.poi.ss.util.CellReference;
|
||||||
|
import org.apache.poi.ss.util.WorkbookUtil;
|
||||||
import org.apache.poi.util.*;
|
import org.apache.poi.util.*;
|
||||||
import org.apache.poi.xssf.model.CalculationChain;
|
import org.apache.poi.xssf.model.CalculationChain;
|
||||||
import org.apache.poi.xssf.model.MapInfo;
|
import org.apache.poi.xssf.model.MapInfo;
|
||||||
@ -511,7 +512,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
|||||||
}
|
}
|
||||||
|
|
||||||
private CTSheet addSheet(String sheetname) {
|
private CTSheet addSheet(String sheetname) {
|
||||||
validateSheetName(sheetname);
|
WorkbookUtil.validateSheetName(sheetname);
|
||||||
|
|
||||||
CTSheet sheet = workbook.getSheets().addNewSheet();
|
CTSheet sheet = workbook.getSheets().addNewSheet();
|
||||||
sheet.setName(sheetname);
|
sheet.setName(sheetname);
|
||||||
@ -1099,11 +1100,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
|||||||
* or contains /\?*[]
|
* or contains /\?*[]
|
||||||
*
|
*
|
||||||
* @param sheet number (0 based)
|
* @param sheet number (0 based)
|
||||||
* @see #validateSheetName(String)
|
|
||||||
*/
|
*/
|
||||||
public void setSheetName(int sheet, String name) {
|
public void setSheetName(int sheet, String name) {
|
||||||
validateSheetIndex(sheet);
|
validateSheetIndex(sheet);
|
||||||
validateSheetName(name);
|
WorkbookUtil.validateSheetName(name);
|
||||||
if (containsSheet(name, sheet ))
|
if (containsSheet(name, sheet ))
|
||||||
throw new IllegalArgumentException( "The workbook already contains a sheet of this name" );
|
throw new IllegalArgumentException( "The workbook already contains a sheet of this name" );
|
||||||
workbook.getSheets().getSheetArray(sheet).setName(name);
|
workbook.getSheets().getSheetArray(sheet).setName(name);
|
||||||
@ -1232,56 +1232,6 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Iterable<X
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Validates sheet name.
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* The character count <tt>MUST</tt> be greater than or equal to 1 and less than or equal to 31.
|
|
||||||
* The string MUST NOT contain the any of the following characters:
|
|
||||||
* <ul>
|
|
||||||
* <li> 0x0000 </li>
|
|
||||||
* <li> 0x0003 </li>
|
|
||||||
* <li> colon (:) </li>
|
|
||||||
* <li> backslash (\) </li>
|
|
||||||
* <li> asterisk (*) </li>
|
|
||||||
* <li> question mark (?) </li>
|
|
||||||
* <li> forward slash (/) </li>
|
|
||||||
* <li> opening square bracket ([) </li>
|
|
||||||
* <li> closing square bracket (]) </li>
|
|
||||||
* </ul>
|
|
||||||
* The string MUST NOT begin or end with the single quote (') character.
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param sheetName the name to validate
|
|
||||||
*/
|
|
||||||
private static void validateSheetName(String sheetName) {
|
|
||||||
if (sheetName == null) {
|
|
||||||
throw new IllegalArgumentException("sheetName must not be null");
|
|
||||||
}
|
|
||||||
int len = sheetName.length();
|
|
||||||
if (len < 1 || len > 31) {
|
|
||||||
throw new IllegalArgumentException("sheetName '" + sheetName
|
|
||||||
+ "' is invalid - must be 1-30 characters long");
|
|
||||||
}
|
|
||||||
for (int i=0; i<len; i++) {
|
|
||||||
char ch = sheetName.charAt(i);
|
|
||||||
switch (ch) {
|
|
||||||
case '/':
|
|
||||||
case '\\':
|
|
||||||
case '?':
|
|
||||||
case '*':
|
|
||||||
case ']':
|
|
||||||
case '[':
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// all other chars OK
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("Invalid char (" + ch
|
|
||||||
+ ") found at index (" + i + ") in sheet name '" + sheetName + "'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a boolean value that indicates whether the date systems used in the workbook starts in 1904.
|
* Gets a boolean value that indicates whether the date systems used in the workbook starts in 1904.
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -72,7 +72,8 @@ public abstract class BaseTestWorkbook extends TestCase {
|
|||||||
|
|
||||||
//names cannot be blank or contain any of /\*?[]
|
//names cannot be blank or contain any of /\*?[]
|
||||||
String[] invalidNames = {"", "Sheet/", "Sheet\\",
|
String[] invalidNames = {"", "Sheet/", "Sheet\\",
|
||||||
"Sheet?", "Sheet*", "Sheet[", "Sheet]"};
|
"Sheet?", "Sheet*", "Sheet[", "Sheet]", "'Sheet'",
|
||||||
|
"My:Sheet"};
|
||||||
for (String sheetName : invalidNames) {
|
for (String sheetName : invalidNames) {
|
||||||
try {
|
try {
|
||||||
wb.createSheet(sheetName);
|
wb.createSheet(sheetName);
|
||||||
|
Loading…
Reference in New Issue
Block a user