2013-02-16 94 views
3

假设这个字符串变量是在Excel中的单元格区域:最快的方法,反覆范围的Excel引用(“C20:F22”)

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 

那么最快的方法是什么?

更新:

我知道这个问题可能不相关的擅长,但是我用的OpenXML SDK 2.5获取Excel文件和元素,所以可能存在这样我不OpenXML的一种简单的方法t知道。

回答

2

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

起初我打造专业化存储列名和相关的数字的字典:

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

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

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

Works的单个字母的人的那一刻,我的工作让更多的行发生。

+0

我不知道你有什么要做的事情,但是这没有奏效。 – Saeid 2013-02-16 11:16:19

+0

输出结果是什么,看看我能修好吗? – 2013-02-16 11:17:38

+0

我用'“AX10:BC12”'测试它,但在“LongRange”中,“second”是一个负数。 – Saeid 2013-02-16 11:20:09