Prevent null reference exception when expression contains a single quoted worksheet name with an embedded ! character. Previously the single quotes were removed and the code simply split on the ! because it assumed the ! separated the worksheet name from the address. In the case of a worksheet name with an embedded !, the split erroneously occurred on the ! within the worksheet name. We then got a null reference exception because the worksheet name was invalid and could not be found.
diff --git a/EPPlus/ExcelAddress.cs b/EPPlus/ExcelAddress.cs
index c4c8c37..70f3012 100644
--- a/EPPlus/ExcelAddress.cs
+++ b/EPPlus/ExcelAddress.cs
@@ -264,14 +264,7 @@
address = address.Trim();
if (address.StartsWith("'"))
{
- int pos = address.IndexOf("'", 1);
- while (pos < address.Length && address[pos + 1] == '\'')
- {
- pos = address.IndexOf("'", pos+2);
- }
- var wbws = address.Substring(1,pos-1).Replace("''","'");
- SetWbWs(wbws);
- _address = address.Substring(pos + 2);
+ SetWbWs(address);
}
else if (address.StartsWith("[")) //Remove any external reference
{
@@ -306,23 +299,51 @@
}
private void SetWbWs(string address)
{
- int pos;
- if (address[0] == '[')
+ int pos = 0;
+
+ // Get Workbook, if any
+ if (address[pos] == '[')
{
pos = address.IndexOf("]");
- _wb = address.Substring(1, pos - 1);
- _ws = address.Substring(pos + 1);
+ _wb = address.Substring(1, pos - 1);
+ pos++;
}
else
{
_wb = "";
- _ws = address;
}
- pos = _ws.IndexOf("!");
+
+ // Get Worksheet
+ if (address[pos] == '\'')
+ {
+ int startPos = pos;
+ pos = address.IndexOf("'", pos + 1);
+ while (pos < address.Length && address[pos + 1] == '\'')
+ {
+ pos = address.IndexOf("'", pos + 2);
+ }
+ _ws = address.Substring(startPos + 1, pos - startPos - 1).Replace("''", "'");
+ pos++;
+ }
+ else
+ {
+ int startPos = pos;
+ pos = address.IndexOf("!", pos);
+ if (pos > -1)
+ {
+ _ws = address.Substring(startPos, pos - startPos);
+ }
+ }
+
+ // Get Address
+ pos = address.IndexOf("!", pos);
if (pos > -1)
{
- _address = _ws.Substring(pos + 1);
- _ws = _ws.Substring(0, pos);
+ _address = address.Substring(pos + 1);
+ }
+ else
+ {
+ _address = "";
}
}
internal void ChangeWorksheet(string wsName, string newWs)