假设此字符串变量是Excel中的一系列单元格:

string RangeReference = "C20:F22";


所以我需要像这样的RangeReference中的引用列表:

List<string> GetAllReferencesInRange(string RangeReference) { }


对于这种情况,我们将有:

GetAllReferencesInRange(RangeReference);
//=
//C20
//D20
//E20
//F20
//C21
//D21
//E21
//F21
//C22
//D22
//E22
//F22


如果RangeReference = "AG9:AI11";然后:

GetAllReferencesInRange(RangeReference);
//=
//AG9
//AH9
//AI9
//AG10
//AH10
//AI10
//AG11
//AH11
//AI11


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

更新:

我知道这个问题根本与Excel不相关,但是我使用OpenXML SDK 2.5来获取Excel文件和元素,因此也许在OpenXML中有一种我不知道的简便方法。

最佳答案

我发现了一些东西,但我不知道这是否是最快的方法。

首先,我为字典创建一个存储列名和相关数字的字典:

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”的列

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

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));
   }
}

09-10 03:59
查看更多