如何获得已创建对象“单元格”的范围?

时间:2019-07-28 10:01:58

标签: c# winforms

我正在Visual Studio中设置26x26电子表格程序。我创建了一个对象cell,该对象继承了文本框,但还包含一个属性cellID。现在,我创建了一个selectedRange文本框,该文本框允许用户输入要在其上执行公式的范围(例如:'A1:A9')(例如:Sum)。我想抓住范围内的类型并找到一种算术使用它的方法。

我以为也许可以将Split()':'分隔符与','方法一起使用,但是我不知道如何构造它以便在我的代码中使用。

程序的屏幕截图:

enter image description here

private void btn_sum_Click(object sender, EventArgs e)
{
    int rows = 0;
    int columns = 0; 

    string[] cells = txt_selectedRange.Text.Split(':',',');
}

1 个答案:

答案 0 :(得分:0)

在excel中,您可以使用如下复杂的范围字符串:“ D6:F11,I6:I9,J14,N10,P5:Q9”,因此首先需要用“,”分隔,然后对每个包含一个“:”,您需要获取单元格的子范围。

Hear是一种获取范围字符串,对其进行解析并返回单元格字符串列表的方法:

private static List<string> GetCellStrings(string cellRange)
{
    // Cell string to return from this method.
    List<string> cells = new List<string>();

    // Remove whitespace.
    cellRange = cellRange.Replace(" ", "").Trim();

    // First split by ',' to get subranges
    string[] subranges = cellRange.Split(',');

    // Iterate over subranges
    for (int i = 0; i < subranges.Length; i++)
    {
        string range = subranges[i];

        // If the subrange contains a ':', calculate all range cells
        if (range.Contains(':'))
        {
            string[] rangeBounds = range.Split(':');
            char lowerBoundLetter = rangeBounds[0][0];
            char upperBoundLetter = rangeBounds[1][0];
            int lowerBoundNumber = int.Parse(rangeBounds[0].Substring(1));
            int upperBoundNumber = int.Parse(rangeBounds[1].Substring(1));

            for (char columnLetter = lowerBoundLetter; columnLetter <= upperBoundLetter; columnLetter++)
            {
                for (int rowNumber = lowerBoundNumber; rowNumber <= upperBoundNumber; rowNumber++)
                {
                    string cell = columnLetter.ToString() + rowNumber.ToString();
                    cells.Add(cell);
                }
            }
        }
        // If the subrange does contains a ':', it is a single cell, add it to the list of cells
        else
        {
            cells.Add(range);
        }
    }

    return cells;
}

注意:该代码仅适用于A到Z的26个列字母。

示例:

string cellRange = "D6:F11,I6:I9,J14,N10,P5:Q9";

List<string> cells = GetCellStrings(cellRange);

for (int i = 0; i < cells.Count; i++)
{
    Console.WriteLine(cells[i]);
}

输出:

D6
D7
D8
D9
D10
D11
E6
E7
E8
E9
E10
E11
F6
F7
F8
F9
F10
F11
I6
I7
I8
I9
J14
N10
P5
P6
P7
P8
P9
Q5
Q6
Q7
Q8
Q9