需要帮助找到 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);
}
还没完,因为我运行在这里撞墙了。所以只是解释一下:
ALPHABET
就是这样。字母表。我用它来获取单元格字母。
AlphabetCounter
是我遍历字母表的次数,所以如果我需要在我的单元格字母前添加一个额外的字母(如 AB 中的 A),我可以从ALPHABET
字符串
AlphabetIndex
是我目前在字母表中的位置。
希望你能帮帮我。
我将如何获得我需要的所有 运行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;
}
所以我有这种情况:
在工作中,我需要制作一个 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);
}
还没完,因为我运行在这里撞墙了。所以只是解释一下:
ALPHABET
就是这样。字母表。我用它来获取单元格字母。AlphabetCounter
是我遍历字母表的次数,所以如果我需要在我的单元格字母前添加一个额外的字母(如 AB 中的 A),我可以从ALPHABET
字符串AlphabetIndex
是我目前在字母表中的位置。
希望你能帮帮我。
我将如何获得我需要的所有 运行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;
}