首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Excel引用范围("C20:F22")上迭代的最快方法

在Excel引用范围("C20:F22")上迭代的最快方法
EN

Stack Overflow用户
提问于 2013-02-16 07:58:06
回答 2查看 350关注 0票数 3

假设此字符串变量是Excel中的一个单元格范围:

代码语言:javascript
复制
string RangeReference = "C20:F22";

因此,我需要一个RangeReference中的引用列表,如下所示:

代码语言:javascript
复制
List<string> GetAllReferencesInRange(string RangeReference) { }

在这种情况下,我们将有:

代码语言:javascript
复制
GetAllReferencesInRange(RangeReference);
//=
//C20
//D20
//E20
//F20
//C21
//D21
//E21
//F21
//C22
//D22
//E22
//F22

如果RangeReference = "AG9:AI11";

代码语言:javascript
复制
GetAllReferencesInRange(RangeReference);
//=
//AG9
//AH9
//AI9
//AG10
//AH10
//AI10
//AG11
//AH11
//AI11

那么最快的方法是什么呢?

更新:

我知道这个问题与Excel完全无关,但是我使用OpenXML SDK2.5来获取Excel和元素,所以在OpenXML中可能有一种我不知道的简单方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-16 11:42:35

我发现了一些东西,但我不知道它是最快的还是不快的。

一开始,我买了一本字典,用来存储列名和相关数字:

代码语言:javascript
复制
Dictionary<string, ulong> ColumnsInNumber = new Dictionary<string, ulong>();
string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
ulong SpecialNumber = 0;

foreach (char FirstChar in Alphabet)
   ColumnsInNumber.Add(FirstChar.ToString(), SpecialNumber++);

foreach (char FirstChar in Alphabet)
   foreach (char SecondChar in Alphabet)
      ColumnsInNumber.Add(string.Format("{0}{1}", FirstChar, SecondChar), SpecialNumber++);

foreach (char FirstChar in Alphabet)
   foreach (char SecondChar in Alphabet)
      foreach (char ThirdChar in Alphabet)
          ColumnsInNumber.Add(string.Format("{0}{1}{2}", FirstChar, SecondChar, ThirdChar), SpecialNumber++);

在Excel 2010中,最后一列名为"XFD",在上面,我们将数字设置为从"A“到"ZZZ”的列

因此,我们可以迭代行和列:

代码语言:javascript
复制
string FirstColumn = GetColumnName(GetFirstCellReference(RangeReference));
string LastColumn = GetColumnName(GetLastCellReference(RangeReference));
uint FirstRow = GetRowNumber(GetFirstCellReference(RangeReference));
uint LastRow = GetRowNumber(GetLastCellReference(RangeReference));

List<string> Result = new List<string>();

for (uint row = FirstRow; row <= LastRow; row++)
{
   for (ulong column = ColumnsInNumber[FirstColumn]; column <= ColumnsInNumber[LastColumn]; column++)
   {
     string ColumnName = ColumnsInNumber.Where(kv => kv.Value == column).FirstOrDefault().Key;
     Result.Add(string.Format("{0}{1}", ColumnName, row));
   }
}
票数 2
EN

Stack Overflow用户

发布于 2013-02-16 08:57:29

首先检查它的格式是否正确,然后:

代码语言:javascript
复制
    static readonly List<char> alphabetUpper = new List<char> { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' };
    static public IEnumerable<string> GetRange(string arg)
    {
        arg = arg.ToUpperInvariant();
        string[] ranges = arg.Split(':');
        ulong range0 = ulong.Parse((new string((from char c in ranges[0] where char.IsDigit(c) select c).ToArray())));
        ulong range1 = ulong.Parse ((new string((from char c in ranges[1] where char.IsDigit(c) select c).ToArray())));
        ranges[0] = new string((from char c in ranges[0] where !char.IsDigit(c) select c).ToArray());
        ranges[1] = new string((from char c in ranges[1] where !char.IsDigit(c) select c).ToArray());
        IEnumerable<int> arrayindexes0 = from c in ranges[0] select alphabetUpper.IndexOf(c);
        IEnumerable<int> arrayindexes1 = from c in ranges[1] select alphabetUpper.IndexOf(c);
        foreach (IEnumerable<int> f in (from i in arrayindexes0 from e in arrayindexes1 select new List<int>() {i, e}))
        {
            foreach (int i in f)
            {
                foreach (ulong o in LongRange(range0, range1))
                {
                    yield return alphabetUpper[i] + o.ToString();
                }
            }
        }
    }
    static IEnumerable<BigInteger> LongRange (BigInteger first, BigInteger second)
    {
        BigInteger difference = second - first;
        for (BigInteger i = 0; i <= difference; i++)
        {
            yield return first + i;
        }
    }

目前,我正致力于让更多的行发生。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14908248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档