Excel中的下一个单元格列是什么 – 组合/排列

我需要知道一个电子表格的列名与一个给定的起始列最多n列的数量,假设起始列是“AB”,我想知道99列后的列(标签)。

对于那些需要Ralph答案的T-SQL风格

Create FUNCTION fsExcelValueToColum(@value int) returns varchar(3) as begin DECLARE @DIGIT INT,@RV VARCHAR(3);set @rv='' IF @VALUE=0 RETURN @rv WHILE @VALUE > 0 BEGIN SET @DIGIT = @VALUE % 26 IF @DIGIT = 0 BEGIN set @RV=@RV+'Z' set @RV=@RV+dbo.fsExcelValueToColum(@value /26 -1) return @rv END set @rv=@rv+char(@digit+64) set @value=(@value-@digit) /26 END return @rv end USE [ecs] GO /****** Object: UserDefinedFunction [dbo].[fnExcelColumnToValue] Script Date: 12/06/2009 10:33:37 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER function [dbo].[fnExcelColumnToValue](@Column varchar(3)) returns int as Begin --declare @column varchar(10); select @column = 'AC' declare @value int, @pow int,@i int,@n int select @pow=1,@VALUE=0,@I=LEN(@COLUMN) SET @I=LEN(@COLUMN) WHILE @I >= 1 BEGIN SET @VALUE=@VALUE+@POW*((ASCII(SUBSTRING(UPPER(@COLUMN),@I,1)) - 65) +1) SET @POW=@POW *26 SET @I=@I-1 END return @value end 

把字符AB ,…, Z看作代表值1,2,… 26(你不能把它看作是基数26,因为没有代表0的字符也不能因为我们不想要,例如, AA表示0)。 所以我们必须搞点小把戏才能解决这个问题:

 static int ColumnToValue(string column) { int value = 0; int pow = 1; for (int i = column.Length - 1; i >= 0; i--) { value += pow * (column[i] - 'A' + 1); pow *= 26; } return value; } static string ValueToColumn(int value) { if (value == 0) { return string.Empty; } StringBuilder sb = new StringBuilder(); while (value > 0) { int digit = value % 26; if (digit == 0) { sb.Insert(0, 'Z'); return sb.Insert(0, ValueToColumn(value / 26 - 1)).ToString(); } sb.Insert(0,(char)(digit + 'A' - 1)); value = (value - digit) / 26; } return sb.ToString(); } 

以便

 Console.WriteLine(ValueToColumn(ColumnToValue("AB") + 99)); 

输出DW

 Console.WriteLine(ValueToColumn(ColumnToValue("AB") - 2)); 

输出Z 显然,你可以把这一切都包装在一个不错的课堂上,并且stream利或者你有什么。

说明:例如,考虑值702和通常的基数为26的符号,其中有一个数字代表0(我将使用符号_来表示这个神奇的数字,以便我们不会混淆0和数字0 )。 让我们试着将702(十进制)转换为base-26。 通常的algorithm是计算702%26,这是0,所以我们将最后一个数字作为_ 。 然后我们除以26得到27.我们会注意到27%26是1,所以倒数第二个数字是A 然后我们除以26得到1,计算1%26得到1,并报告最高有效位数为A 我们将返回AA_作为表示base-26中702的string的数字( _ = 0, A = 1,… Z = 26)(检查:1 * 26 ^ 2 + 1 * 26 ^ 1 + 0 * 26 = 702)。 就我们的目的而言,这是错误的。 我们想要找回stringZZ (因为我们有26个数字ABC ,… Z表示1,2,… 26(记住,没有数字代表0的值!),所以ZZ = 26 * 26 ^ 1 + 26 * 26 ^ 0 = 702)。 原来在我们的系统中,与0模26相同的数字应该有最低有效位Z 因此,这表明我们的algorithm应该检查,看是否value 0模26。如果是,预先一个Z ,然后前面的值代表value / 26 - 1 。 这是你在上面看到的algorithm。

我前一段时间在Clipper(旧的XBASE编译器)

  if nColumn <= 26 // Column 26 or less ? retval := chr(nColumn+64) else temp := int(nColumn/26) // Compute first letter remd := nColumn % 26 // and second letter and retval:= if(remd=0,chr(temp+63)+"Z",; chr(temp+64)+chr(remd+64)) endif 

这适用于多达256列的电子表格,我不知道该公式是否相同的列以外。 我不确定你正在使用什么编程语言,但是Clipper代码是相当简单的…

这是我的价值(快速写 – 我相信它可以被整理): –

  public static string ToAlpha(int index) { if (index <= 0) { throw new ArgumentOutOfRangeException("index"); } --index; var chars = new List<char>(); int x = index; do { int r = x % 26; chars.Insert(0, Convert.ToChar(65 + r)); x /= 26; } while (x > 26); if (x > 0) { chars.Insert(0, Convert.ToChar(64 + x)); } return new string(chars.ToArray()); } public static int ToNumeric(string index) { int total = 0; var chars = index.ToCharArray(); int chrIndex = chars.Length - 1; foreach (char chr in chars) { total += (Convert.ToInt32(chr) - 64) * (int)(Math.Pow(26d, (double)chrIndex)); --chrIndex; } return total; } 

用法

  string input = "AB"; string output = ToAlpha(ToNumeric(input) + 99);