需要帮助查找n量的Excel范围

时间:2016-06-21 11:38:36

标签: c# excel add-in

所以我有这种情况:

在工作中,我需要创建一个Excel AddIn,它可以从用户调查中收集一些数据,并在一个简洁的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);
}

它还没完,因为我在这里遇到了一堵墙。所以只是解释一下:

  • ALPHABET就是这样。字母表。我用它来获取单元格字母。
  • AlphabetCounter是我通过字母表的次数,所以如果我需要在我的单元格字母前添加一个额外的字母(就像AB中的A一样)我可以从{ {1}}字符串
  • ALPHABET是我目前所在的字母。

我希望你能帮助我。

如何获得我需要的所有范围以及我可以获得详细信息的大量问题?

2 个答案:

答案 0 :(得分:1)

琐碎的解决方案是改变

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());
}

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

答案 1 :(得分:1)

只是另一种实施方式,也许它很有用:

    ...
    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;
}