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

标签 c# 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 (你不能完全认为这是 base-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。显然,您可以将所有这些都包含在一个不错的类(class)中,并使其流利或您拥有什么。

解释:例如,考虑值 702 和一个常用的 base-26 表示法,其中有一个数字表示 0(我将使用表示法 _ 来表示这个神奇的数字,以便我们不要混淆值 0 和数字 0)。让我们尝试将 702(十进制)转换为 base-26。通常的算法是计算 702 % 26,即 0,这样我们的最后一位数字就是 _。然后我们将除以 26 得到 27。我们会注意到 27 % 26 是 1,因此倒数第二位是 A。然后我们除以 26 得到 1,计算 1 % 26 得到 1 并报告最高有效位是 A。我们将返回 AA_ 作为表示 base-26 中带有数字的 702 的字符串 (_ = 0, A = 1, ... Z = 26)(检查:1 * 26^2 + 1 * 26^1 + 0 * 26 = 702)。就我们的目的而言,这是错误的。我们想取回字符串 ZZ(因为我们有 26 位数字 ABC、.. . Z 代表 1, 2, ... 26(记住,没有数字代表值 0!)所以 ZZ = 26 * 26^1 + 26 * 26^ 0 = 702)。结果在我们的系统中,与 0 模 26 一致的数字应该具有最低有效数字 Z。因此,这表明我们的算法应该检查并查看 value 是否与 0 modulo 26 一致。如果是,则在前面加上 Z,然后在前面加上表示值 值/26 - 1。这就是您在上面看到的算法。

关于c# - Excel 中的下一个单元格列是什么 - 组合/排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1852322/

相关文章:

c# - 在没有完整回发的情况下执行服务器端代码

c# - 重用包含相同属性但不同 lambda where 子句条件的方法

c# - 以编程方式 (C#) 将 Excel 转换为图像

python - 将列表字典写入Excel Openpyxl

Excel函数: "Not Isblank" with "Or" and if date is

c# - XSD 文件,从哪里获取 xmlns 参数?

c# - 防止属性(property)重新分配

c# - 当其他数据绑定(bind)有效时,命令绑定(bind)不起作用

excel - POI 创建 excel 文件,日期分隔符根据客户日期格式更改

xml - Excel 2013后台自定义问题