2016-06-21 67 views
0

所以我有這樣的情況:需要幫助尋找施氮量的Excel範圍

在工作中我需要一個Excel加載項可以從用戶調查收集一些數據,並顯示在一個整潔的小Excel報表。我有格式,但是我很難弄清楚我如何找到需要展示調查問題的Excel範圍。

每個問題都需要佔用三個單元,因爲每個問題都與三個單元相關聯,這很好,直到你到達Z並且必須從AA,AB,AC等重新開始。我不能完全包裹我的頭圍繞它,我覺得我目前的解決方案是不必要的複雜。我知道現在有13個問題。這是總共需要的39個單元格,但未來可能會發生變化,或者我可能不得不找到比所有13個問題都小的報表。我需要確保我的算法能夠處理這兩種情況。

目前我有這樣的:

const String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
int alphabetCounter = 0; 
int alphabetIndex = 1; 
for (int i = 0; i < dict["questions"].Length; i++) 
{ 
    String start = ""; 
    String end = ""; 

    if ((alphabetIndex + 1) > ALPHABET.Length) 
    { 
     alphabetCounter++; 
     alphabetIndex = 0; 
     start += ALPHABET[alphabetCounter - 1] + ALPHABET[alphabetIndex]; 
    } 
    else 
    { 
     start += ALPHABET[alphabetIndex]; 
     alphabetIndex++; 
    } 


    if ((alphabetIndex + 1) > ALPHABET.Length) 
    { 
     alphabetCounter++; 
     alphabetIndex = 0; 
     end += ALPHABET[alphabetIndex]; 
    } 
    else 
    { 
     alphabetIndex++; 
     end += ALPHABET[alphabetIndex]; 
    } 

    Excel.Range range = sheet.get_Range(start + "7", end + "7"); 
    questionRanges.Add(range); 
} 

這還不算完,因爲我撞上了牆在這裏。所以只是爲了解釋:

  • ALPHABET就是這樣。字母表。我用它來獲取單元格字母。
  • AlphabetCounter是我多少次在字母表了這樣的事件,我需要在我的電池信的前面加上一個額外的字母(如在AB的A)我可以從ALPHABET
  • AlphabetIndex是我現在在字母表中的哪個位置。

我希望你能幫助我。

我該如何去獲得所需的所有範圍,以伴隨n個可以獲得詳細信息的問題?

+0

你爲什麼不使用UsedRange屬性? https://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.worksheet.usedrange.aspx – Abbas

+0

@Abasbas對不起,但它是如何幫助我,當我需要得到一組範圍在一行中,然後用數據填充它們之後?我並不在乎已經使用了哪些單元。 – OmniOwl

回答

1

瑣碎的解決辦法是改變

const string ALPHABET = "ABC..." 

const string[] ColumnNames = { "A", "B", "C", ..., "Z", "AA".. } 

但這不能很好地擴展。想想當你需要添加一列時會發生什麼。你必須在數組中添加另一個項目,最終你會有26^2個數組項。當然不理想。

更好的解決方案可用於治療的列索引作爲基底26號,並使用類似下面的函數轉換它:

string GetColumnName(int index) 
{ 
    List<char> chars = new List<char>(); 
    while (index >= 0) 
    { 
     int current = index % 26; 
     chars.Add((char)('A' + current)); 
     index = (int)((index - current)/26) - 1; 
    } 
    chars.Reverse(); 
    return new string(chars.ToArray()); 
} 

函數這裏基部通過重複計算所述剩餘轉換(也稱爲作爲模量或%)。

+0

那麼,這將如何工作?我會稱這種方法來獲得單個細胞嗎?如果是這樣,索引代表什麼?問題數組的索引? – OmniOwl

+0

@Vipar列的索引。即「A」= 0,「B」= 1,「AA」= 26,「AB」= 27等。 – theB

+0

那就像一個魅力一樣工作。多謝,夥計。 – OmniOwl

1

實施只是一個想法,也許它可能是有用的:

... 
    List<char> start = new List<char>(); 
    List<char> end = new List<char>(); 

    start = Increment(end); 
    Increment(end); 
    Increment(end); 

    Excel.Range range = sheet.get_Range(new String(start.ToArray())+ "7", 
             new String(end.ToArray())+ "7"); 
} 

private List<char> Increment(List<char> listColumn, int position=0) 
{ 
    if (listColumn.Count > position) 
    { 
     listColumn[position]++; 
     if (listColumn[position] == '[') 
     { 
      listColumn[position] = 'A'; 
      Increment(listColumn, ++position); 
     } 
    } 
    else 
    { 
      listColumn.Add('A'); 
    } 

    return listColumn; 
}