首页 > 解决方案 > 如何获取创建的对象“单元格”的范围?

问题描述

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

我想也许我可以使用Split()带有':'','分隔符的方法,但我不知道如何构造它以在我的代码中使用。

程序截图:

在此处输入图像描述

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

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

标签: c#winforms

解决方案


在 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 not contain a ':', it's a single cell, add it to the list of cells
        else
        {
            cells.Add(range);
        }
    }

    return cells;
}

注意:此代码仅适用于 26 列 - A 到 Z。

例子:

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

推荐阅读