需要帮助findn个Excel范围

所以我有这样的情况:

在工作中,我需要制作一个Excel AddIn,它可以从用户调查中收集一些数据,并将其显示在一个整齐的Excel报告中。 我有格式,但我很难弄清楚如何find需要展示调查问题的Excel范围。

每个问题都需要占用三个单元,因为每个问题都有三个相关的属性,直到你到达Z并且必须从AA,AB,AC等重新开始。我不能完全包围它,感觉我目前的解决scheme是不必要的复杂。 我知道现在有13个问题。 我总共需要39个单元,但是这个问题在未来可能会改变,或者我可能不得不比13个问题中的所有问题find更小的报告。 我需要确保我的algorithm可以处理这两种情况。

目前我有这个:

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是我经历了多less次字母表,所以如果我需要在我的单元格字母前添加一个额外的字母(像AB中的A),我可以从ALPHABETstring
  • AlphabetIndex是我目前在AlphabetIndex中的哪个位置。

我希望你能帮助我。

如何获得所需的所有范围,以便能够详细了解n个问题?

微不足道的解决办法是改变

 const string ALPHABET = "ABC..." 

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

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

更好的解决scheme是将列索引作为基数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; }