How to convert a column number (e.g. 127) into an Excel column (e.g. AA)

前端 未结 30 2657
鱼传尺愫
鱼传尺愫 2020-11-22 00:35

How do you convert a numerical number to an Excel column name in C# without using automation getting the value directly from Excel.

Excel 2007 has a possible range o

30条回答
  •  不要未来只要你来
    2020-11-22 01:02

    These my codes to convert specific number (index start from 1) to Excel Column.

        public static string NumberToExcelColumn(uint number)
        {
            uint originalNumber = number;
    
            uint numChars = 1;
            while (Math.Pow(26, numChars) < number)
            {
                numChars++;
    
                if (Math.Pow(26, numChars) + 26 >= number)
                {
                    break;
                }               
            }
    
            string toRet = "";
            uint lastValue = 0;
    
            do
            {
                number -= lastValue;
    
                double powerVal = Math.Pow(26, numChars - 1);
                byte thisCharIdx = (byte)Math.Truncate((columnNumber - 1) / powerVal);
                lastValue = (int)powerVal * thisCharIdx;
    
                if (numChars - 2 >= 0)
                {
                    double powerVal_next = Math.Pow(26, numChars - 2);
                    byte thisCharIdx_next = (byte)Math.Truncate((columnNumber - lastValue - 1) / powerVal_next);
                    int lastValue_next = (int)Math.Pow(26, numChars - 2) * thisCharIdx_next;
    
                    if (thisCharIdx_next == 0 && lastValue_next == 0 && powerVal_next == 26)
                    {
                        thisCharIdx--;
                        lastValue = (int)powerVal * thisCharIdx;
                    }
                }
    
                toRet += (char)((byte)'A' + thisCharIdx + ((numChars > 1) ? -1 : 0));
    
                numChars--;
            } while (numChars > 0);
    
            return toRet;
        }
    

    My Unit Test:

        [TestMethod]
        public void Test()
        {
            Assert.AreEqual("A", NumberToExcelColumn(1));
            Assert.AreEqual("Z", NumberToExcelColumn(26));
            Assert.AreEqual("AA", NumberToExcelColumn(27));
            Assert.AreEqual("AO", NumberToExcelColumn(41));
            Assert.AreEqual("AZ", NumberToExcelColumn(52));
            Assert.AreEqual("BA", NumberToExcelColumn(53));
            Assert.AreEqual("ZZ", NumberToExcelColumn(702));
            Assert.AreEqual("AAA", NumberToExcelColumn(703));
            Assert.AreEqual("ABC", NumberToExcelColumn(731));
            Assert.AreEqual("ACQ", NumberToExcelColumn(771));
            Assert.AreEqual("AYZ", NumberToExcelColumn(1352));
            Assert.AreEqual("AZA", NumberToExcelColumn(1353));
            Assert.AreEqual("AZB", NumberToExcelColumn(1354));
            Assert.AreEqual("BAA", NumberToExcelColumn(1379));
            Assert.AreEqual("CNU", NumberToExcelColumn(2413));
            Assert.AreEqual("GCM", NumberToExcelColumn(4823));
            Assert.AreEqual("MSR", NumberToExcelColumn(9300));
            Assert.AreEqual("OMB", NumberToExcelColumn(10480));
            Assert.AreEqual("ULV", NumberToExcelColumn(14530));
            Assert.AreEqual("XFD", NumberToExcelColumn(16384));
        }
    

提交回复
热议问题