diff --git a/ClosedXML/Excel/Cells/XLCell.cs b/ClosedXML/Excel/Cells/XLCell.cs index c9f9a1f..07f6cea 100644 --- a/ClosedXML/Excel/Cells/XLCell.cs +++ b/ClosedXML/Excel/Cells/XLCell.cs @@ -1920,7 +1920,7 @@ var c = new XLConditionalFormat(fmtRanges, true); c.CopyFrom(cf); - c.AdjustFormulas((XLCell) cf.Ranges.First().FirstCell(), (XLCell)fmtRanges.First().FirstCell()); + c.AdjustFormulas((XLCell)cf.Ranges.First().FirstCell(), (XLCell)fmtRanges.First().FirstCell()); _worksheet.ConditionalFormats.Add(c); } @@ -2072,43 +2072,36 @@ if (String.IsNullOrWhiteSpace(strValue)) return String.Empty; - try + var value = ">" + strValue + "<"; + + var regex = conversionType == FormulaConversionType.A1ToR1C1 ? A1Regex : R1C1Regex; + + var sb = new StringBuilder(); + var lastIndex = 0; + + foreach (var match in regex.Matches(value).Cast()) { - var value = ">" + strValue + "<"; - - var regex = conversionType == FormulaConversionType.A1ToR1C1 ? A1Regex : R1C1Regex; - - var sb = new StringBuilder(); - var lastIndex = 0; - - foreach (var match in regex.Matches(value).Cast()) + var matchString = match.Value; + var matchIndex = match.Index; + if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0 + && value.Substring(0, matchIndex).CharCount('\'') % 2 == 0) { - var matchString = match.Value; - var matchIndex = match.Index; - if (value.Substring(0, matchIndex).CharCount('"') % 2 == 0 - && value.Substring(0, matchIndex).CharCount('\'') % 2 == 0) - { - // Check if the match is in between quotes - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); - sb.Append(conversionType == FormulaConversionType.A1ToR1C1 - ? GetR1C1Address(matchString, rowsToShift, columnsToShift) - : GetA1Address(matchString, rowsToShift, columnsToShift)); - } - else - sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); - lastIndex = matchIndex + matchString.Length; + // Check if the match is in between quotes + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex)); + sb.Append(conversionType == FormulaConversionType.A1ToR1C1 + ? GetR1C1Address(matchString, rowsToShift, columnsToShift) + : GetA1Address(matchString, rowsToShift, columnsToShift)); } - - if (lastIndex < value.Length) - sb.Append(value.Substring(lastIndex)); - - var retVal = sb.ToString(); - return retVal.Substring(1, retVal.Length - 2); + else + sb.Append(value.Substring(lastIndex, matchIndex - lastIndex + matchString.Length)); + lastIndex = matchIndex + matchString.Length; } - catch (IndexOutOfRangeException) - { - return "#REF!"; - } + + if (lastIndex < value.Length) + sb.Append(value.Substring(lastIndex)); + + var retVal = sb.ToString(); + return retVal.Substring(1, retVal.Length - 2); } private string GetA1Address(string r1C1Address, int rowsToShift, int columnsToShift) @@ -2136,14 +2129,21 @@ return leftPart + ":" + rightPart; } - var rowPart = addressToUse.Substring(0, addressToUse.IndexOf("C")); - var rowToReturn = GetA1Row(rowPart, rowsToShift); + try + { + var rowPart = addressToUse.Substring(0, addressToUse.IndexOf("C")); + var rowToReturn = GetA1Row(rowPart, rowsToShift); - var columnPart = addressToUse.Substring(addressToUse.IndexOf("C")); - var columnToReturn = GetA1Column(columnPart, columnsToShift); + var columnPart = addressToUse.Substring(addressToUse.IndexOf("C")); + var columnToReturn = GetA1Column(columnPart, columnsToShift); - var retAddress = columnToReturn + rowToReturn; - return retAddress; + var retAddress = columnToReturn + rowToReturn; + return retAddress; + } + catch (ArgumentOutOfRangeException) + { + return "#REF!"; + } } private string GetA1Column(string columnPart, int columnsToShift) diff --git a/ClosedXML/XLHelper.cs b/ClosedXML/XLHelper.cs index 652dabe..43aa729 100644 --- a/ClosedXML/XLHelper.cs +++ b/ClosedXML/XLHelper.cs @@ -111,6 +111,10 @@ public static string GetColumnLetterFromNumber(int columnNumber, bool trimToAllowed = false) { if (trimToAllowed) columnNumber = TrimColumnNumber(columnNumber); + + if (columnNumber <= 0 || columnNumber > allLetters.Length) + throw new ArgumentOutOfRangeException(nameof(columnNumber)); + // Adjust for start on column 1 return allLetters[columnNumber - 1]; } diff --git a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs index cf20ce7..fd294fb 100644 --- a/ClosedXML_Tests/Excel/Cells/XLCellTests.cs +++ b/ClosedXML_Tests/Excel/Cells/XLCellTests.cs @@ -631,21 +631,24 @@ using (var wb = new XLWorkbook()) { var ws = wb.Worksheets.Add("Sheet1"); - ws.Cell("A1").Value = "ValueA1"; - ws.Cell("B2").FormulaA1 = "=A1"; + ws.Cell("A1").Value = 1; + ws.Cell("B1").Value = 2; + ws.Cell("B2").FormulaA1 = "=A1+B1"; + + Assert.AreEqual(3, ws.Cell("B2").Value); ws.Range("A2").Value = ws.Range("B2"); var fA2 = ws.Cell("A2").FormulaA1; wb.SaveAs(ms); - Assert.AreEqual("#REF!", fA2); + Assert.AreEqual("#REF!+A1", fA2); } using (var wb2 = new XLWorkbook(ms)) { var fA2 = wb2.Worksheets.First().Cell("A2").FormulaA1; - Assert.AreEqual("#REF!", fA2); + Assert.AreEqual("#REF!+A1", fA2); } } }