C# 需要帮助查找n个Excel范围吗

C# 需要帮助查找n个Excel范围吗,c#,excel,add-in,C#,Excel,Add In,所以我有这样的情况: 在工作中,我需要制作一个Excel插件,它可以从用户调查中收集一些数据,并将它们显示在一个整洁的小Excel报告中。我已经把格式记下来了,但是我很难找到展示调查中所问问题所需的Excel范围 每个问题都需要占用三个单元格,因为每个单元格都有三个相关的统计数据,这很好,直到你达到Z,并且必须从AA、AB、AC等重新开始。我不能完全理解它,我觉得我当前的解决方案是不必要的复杂。我知道现在有13个问题。我总共需要39个单元格来回答问题,但这可能会在将来发生变化,或者我可能需要找到

所以我有这样的情况:

在工作中,我需要制作一个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);
}
const String ALPHABET=“abcdefghijklmnopqrstuvxyz”;
int alphabetCounter=0;
int字母索引=1;
for(int i=0;i字母表长度)
{
alphabetCounter++;
字母指数=0;
开始+=字母表[字母计数器-1]+字母表[字母索引];
}
其他的
{
开始+=字母表[字母索引];
字母索引++;
}
如果((字母索引+1)>字母表长度)
{
alphabetCounter++;
字母指数=0;
end+=字母表[字母索引];
}
其他的
{
字母索引++;
end+=字母表[字母索引];
}
Excel.Range范围=sheet.get_范围(开始+“7”,结束+“7”);
问题范围。添加(范围);
}
它还没完工,因为我在这里撞到了一堵墙。因此,我只想解释一下:

  • 字母表就是这样。字母表。我用它来获取手机号
  • AlphabetCounter
    是我浏览字母表的次数,因此如果我需要在单元格字母前面添加一个额外的字母(如AB中的A),我可以从
    字母表
    字符串中获取该字母
  • 字母索引
    是我目前在字母表中的位置
我希望你能帮助我


我将如何获得我需要的所有范围,以伴随我可以获得详细信息的n个问题?

简单的解决方案是改变

const string ALPHABET = "ABC..."

但这并不能很好地扩展。考虑一下当您需要添加列时会发生什么。您必须在数组中添加另一项,最终将有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());
}
string GetColumnName(int索引)
{
列表字符=新列表();
而(索引>=0)
{
int当前=索引%26;
字符添加((字符)('A'+当前));
指数=(int)((指数-当前)/26)-1;
}
chars.Reverse();
返回新字符串(chars.ToArray());
}

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

简单的解决方案是改变

const string ALPHABET = "ABC..."

但这并不能很好地扩展。考虑一下当您需要添加列时会发生什么。您必须在数组中添加另一项,最终将有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());
}
string GetColumnName(int索引)
{
列表字符=新列表();
而(索引>=0)
{
int当前=索引%26;
字符添加((字符)('A'+当前));
指数=(int)((指数-当前)/26)-1;
}
chars.Reverse();
返回新字符串(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.Range Range=sheet.get_Range(新字符串(start.ToArray())+“7”,
新字符串(end.ToArray())+“7”);
}
私有列表增量(列表列表列,int位置=0)
{
如果(listColumn.Count>位置)
{
列表列[位置]+;
if(listColumn[position]=='[')
{
listColumn[position]=“A”;
增量(列表列,++位置);
}
}
其他的
{
listColumn.Add('A');
}
返回列表列;
}

这只是实现的另一个想法,可能会很有用:

    ...
    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.Range Range=sheet.get_Range(新字符串(start.ToArray())+“7”,
新字符串(end.ToArray())+“7”);
}
私有列表增量(列表列表列,int位置=0)
{
如果(listColumn.Count>位置)
{
列表列[位置]+;
if(listColumn[position]=='[')
{
listColumn[position]=“A”;
增量(列表列,++位置);
}
}
其他的
{
listColumn.Add('A');
}
返回列表列;
}

为什么不使用UsedRange属性?@Abbas很抱歉,当我需要在一行中获取一组范围,然后在之后用数据填充它们时,它对我有什么帮助?我真的不关心已经使用了哪些单元格。为什么不使用UsedRange属性?@Abbas很抱歉,但是当我需要在一行中获取一组范围时,它对我有什么帮助一行,然后在之后用数据填充它们?我真的不关心已经使用了哪些单元格。那么,这将如何工作?会吗