2013-02-16 33 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