需要帮助找到 n 个 Excel 个范围

Need help finding n amount of Excel Ranges

所以我有这种情况:

在工作中,我需要制作一个 Excel 加载项,它可以从用户调查中收集一些数据并将它们显示在一个整洁的小 Excel 报告中。我记下了格式,但我无法弄清楚如何找到展示调查中提出的问题所需的 Excel 范围。

每个问题都需要占用三个单元格,因为每个问题都有三个相关的统计数据,这很好,直到你到达 Z 并且必须从 AA、AB、AC 等重新开始。我不能完全总结我的绕过它,我觉得我目前的解决方案是不必要的复杂。我知道现在有 13 个问题。这是我总共需要 39 个问题的单元格,但将来可能会改变,或者我可能不得不找到比所有 13 个问题都小的报告。我需要确保我的算法可以处理这两种情况。

目前我有这个:

const String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int alphabetCounter = 0;
int alphabetIndex = 1;
for (int i = 0; i < dict["questions"].Length; i++)
{
    String start = "";
    String end = "";

    if ((alphabetIndex + 1) > ALPHABET.Length)
    {
        alphabetCounter++;
        alphabetIndex = 0;
        start += ALPHABET[alphabetCounter - 1] + ALPHABET[alphabetIndex];
    }
    else
    {
        start += ALPHABET[alphabetIndex];
        alphabetIndex++;
    }


    if ((alphabetIndex + 1) > ALPHABET.Length)
    {
        alphabetCounter++;
        alphabetIndex = 0;
        end += ALPHABET[alphabetIndex];
    }
    else
    {
        alphabetIndex++;
        end += ALPHABET[alphabetIndex];
    }

    Excel.Range range = sheet.get_Range(start + "7", end + "7");
    questionRanges.Add(range);
}

还没完,因为我运行在这里撞墙了。所以只是解释一下:

希望你能帮帮我。

我将如何获得我需要的所有 运行ges 以及我可以获得详细信息的 n 个问题?

简单的解决方案是更改

const string ALPHABET = "ABC..."

const string[] ColumnNames = { "A", "B", "C", ..., "Z", "AA".. }

但这并不能很好地扩展。想一想当您需要添加一列时会发生什么。您必须在数组中添加另一个项目,最终您将拥有 26^2 个数组条目。当然不理想。

更好的解决方案是将列索引视为以 26 为基数的数字,并使用如下函数对其进行转换:

string GetColumnName(int index)
{
    List<char> chars = new List<char>();
    while (index >= 0)
    {
        int current = index % 26;
        chars.Add((char)('A' + current));
        index = (int)((index - current) / 26) - 1;
    }
    chars.Reverse();
    return new string(chars.ToArray());
}

这里的函数通过重复计算余数(也称为取模或%)来转换基数。

只是另一种实现思路,也许有用:

    ...
    List<char> start = new List<char>();
    List<char> end = new List<char>();

    start = Increment(end);
    Increment(end);
    Increment(end);

    Excel.Range range = sheet.get_Range(new String(start.ToArray())+ "7", 
                                        new String(end.ToArray())+ "7");
}

private List<char> Increment(List<char> listColumn, int position=0)
{
    if (listColumn.Count > position)
    {
        listColumn[position]++;
        if (listColumn[position] == '[')
        {
            listColumn[position] = 'A';
            Increment(listColumn, ++position);
        }
    }
    else
    {
            listColumn.Add('A');
    }

    return listColumn;
}