diff --git a/ClosedXML/ClosedXML/ClosedXML/XLHelper.cs b/ClosedXML/ClosedXML/ClosedXML/XLHelper.cs index 6bb853c..150a059 100644 --- a/ClosedXML/ClosedXML/ClosedXML/XLHelper.cs +++ b/ClosedXML/ClosedXML/ClosedXML/XLHelper.cs @@ -54,85 +54,44 @@ RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.ExplicitCapture ); - private static Dictionary columnNumbers = new Dictionary(); /// - /// Gets the column number of a given column letter. + /// Gets the column number of a given column letter. /// /// The column letter to translate into a column number. public static int GetColumnNumberFromLetter(string columnLetter) { - int retVal; - columnLetter = columnLetter.ToUpper(); - if (columnNumbers.TryGetValue(columnLetter, out retVal)) - return retVal; + if (string.IsNullOrEmpty(columnLetter)) throw new ArgumentNullException("columnLetter"); - if (columnLetter[0] <= '9') + columnLetter = columnLetter.ToUpperInvariant(); + + int sum = 0; + + for (int i = 0; i < columnLetter.Length; i++) { - retVal = Int32.Parse(columnLetter, NumberFormatForParse); - columnNumbers.Add(columnLetter, retVal); - return retVal; + sum *= 26; + sum += (columnLetter[i] - 'A' + 1); } - - var length = columnLetter.Length; - if (length == 1) - { - retVal = Convert.ToByte(columnLetter[0]) - 64; - columnNumbers.Add(columnLetter, retVal); - return retVal; - } - if (length == 2) - { - retVal = - ((Convert.ToByte(columnLetter[0]) - 64)*26) + - (Convert.ToByte(columnLetter[1]) - 64); - columnNumbers.Add(columnLetter, retVal); - return retVal; - } - if (length == 3) - { - retVal = ((Convert.ToByte(columnLetter[0]) - 64)*TwoT26) + - ((Convert.ToByte(columnLetter[1]) - 64)*26) + - (Convert.ToByte(columnLetter[2]) - 64); - columnNumbers.Add(columnLetter, retVal); - return retVal; - } - throw new ApplicationException("Column Length must be between 1 and 3."); + + return sum; } - private static Dictionary columnLetters = new Dictionary(); /// /// Gets the column letter of a given column number. /// - /// The column number to translate into a column letter. + /// The column number to translate into a column letter. public static string GetColumnLetterFromNumber(int columnNumber) { - String retVal; - if (columnLetters.TryGetValue(columnNumber, out retVal)) - return retVal; + var dividend = columnNumber; + var columnName = String.Empty; - #region Check - - if (columnNumber <= 0) - throw new ArgumentOutOfRangeException("column", "Must be more than 0"); - - #endregion - - var value = new StringBuilder(6); - int column = columnNumber; - while (column > 0) + while (dividend > 0) { - var residue = column%26; - column /= 26; - if (residue == 0) - { - residue = 26; - column--; - } - value.Insert(0, (char) (64 + residue)); + var modulo = (dividend - 1) % 26; + columnName = Convert.ToChar(65 + modulo) + columnName; + dividend = (dividend - modulo) / 26; } - retVal = value.ToString(); - columnLetters.Add(columnNumber, retVal); - return retVal; + + return columnName; } public static bool IsValidColumn(string column)