2011-08-31 18 views
6

में एक्सेल या स्प्रैडशीट कॉलम अक्षर को अपने नंबर पर कनवर्ट करें क्या एक्सेल-स्टाइल कॉलम को संख्याओं (1 से शुरू करने) में परिवर्तित करने का एक और पाइथोनिक तरीका है?पायथनिक फैशन

दो पत्र के लिए कोड को कार्य करना:

def column_to_number(c): 
    """Return number corresponding to excel-style column.""" 
    number=-25 
    for l in c: 
     if not l in string.ascii_letters: 
      return False 
     number+=ord(l.upper())-64+25 
    return number 

कोड चलाता है: काम नहीं कर रहा

>>> column_to_number('2') 
False 
>>> column_to_number('A') 
1 
>>> column_to_number('AB') 
28 

तीन पत्र।

>>> column_to_number('ABA') 
54 
>>> column_to_number('AAB') 
54 

संदर्भ: question answered in C#

उत्तर

18

इसे और अधिक pythonic बनाने के लिए एक तरीका होता है (तीन या अधिक पत्र के साथ काम करता है और कम जादू संख्या का उपयोग करता है):

def col2num(col): 
    num = 0 
    for c in col: 
     if c in string.ascii_letters: 
      num = num * 26 + (ord(c.upper()) - ord('A')) + 1 
    return num 

और का उपयोग कर एक एक लाइनर के रूप में कम हो (इनपुट की जाँच करता है और कम पढ़ी जा सकती है तो मैं इसकी सलाह नहीं देते):

col2num = lambda col: reduce(lambda x, y: x*26 + y, [ord(c.upper()) - ord('A') + 1 for c in col]) 
+0

और आप दूसरी तरफ कैसे जाते हैं? –

1

यह करना चाहिए, VBA में, आप जो खोज रहे हैं:

Function columnNumber(colLetter As String) As Integer 

    Dim colNumber As Integer 
    Dim i As Integer 

    colLetter = UCase(colLetter) 
    colNumber = 0 
    For i = 1 To Len(colLetter) 
     colNumber = colNumber + (Asc(Mid(colLetter, Len(colLetter) - i + 1, 1)) - 64) * 26^(i - 1) 
    Next 

    columnNumber = colNumber 

End Function 

आप इसे आप के रूप में उपयोग कर सकते हैं एक एक्सेल सूत्र होगा - स्तंभ दर्ज करते हैं, अक्षरों में, एक स्ट्रिंग के रूप में (उदाहरण के लिए, "एए") और कॉलम की लंबाई के बावजूद काम करना चाहिए।

आपका कोड टूट जाता है जब क्योंकि जिस तरह से आप उनकी गिनती कर रहे हैं के तीन अक्षरों के साथ काम - आप आधार का उपयोग करने के 26.

0

मुझे यकीन है कि मैं ठीक से समझ, आप "अनुवाद करना चाहते हैं नहीं कर रहा हूँ की जरूरत है "संदर्भित सी # कोड पायथन के लिए? यदि हां, तो आप सही रास्ते पर थे; सिर्फ इसलिए इसे संशोधित:

def column_to_number(c): 
    """Return number corresponding to excel-style column.""" 
    sum = 0 
    for l in c: 
    if not l in string.ascii_letters: 
     return False 
    sum*=26 
    sum+=ord(l.upper())-64 
    return sum 
0

सिर्फ कार्य करें:

print ws.Range("E2").Column 

कॉल उदाहरण:

from win32com import client 
xl = client.Dispatch("Excel.Application") 
wb = xl.Workbooks.Open("c:/somePath/file.xls") 
xl.Visible = 1 
ws = wb.Sheets("sheet 1") 
print ws.Range("E2").Column 

परिणाम:

>>5 
5

यहाँ एक तरह से यह करने के लिए है। यह XlsxWriter मॉड्यूल में कोड पर एक भिन्नता है:

def col_to_num(col_str): 
    """ Convert base26 column string to number. """ 
    expn = 0 
    col_num = 0 
    for char in reversed(col_str): 
     col_num += (ord(char) - ord('A') + 1) * (26 ** expn) 
     expn += 1 

    return col_num 


>>> col_to_num('A') 
1 
>>> col_to_num('AB') 
28 
>>> col_to_num('ABA') 
729 
>>> col_to_num('AAB') 
704 
1

इस पढ़ने के बाद, मैं एक्सेल कोशिकाओं में सीधे यह करने के लिए एक रास्ता खोजने का फैसला किया। यह Z.

के बाद कॉलम के लिए भी खाता है, इस फ़ॉर्मूला को किसी भी कॉलम की किसी भी पंक्ति के सेल में पेस्ट करें और यह आपको संबंधित नंबर देगा।

=IF(LEN(SUBSTITUTE(ADDRESS(ROW(),COLUMN(),4),ROW(),""))=2, 
CODE(LEFT(SUBSTITUTE(ADDRESS(ROW(),COLUMN(),4),ROW(),""),1))-64*26)+ 
CODE(RIGHT(SUBSTITUTE(ADDRESS(ROW(),COLUMN(),4),ROW(),""),1)-64), 
CODE(SUBSTITUTE(ADDRESS(ROW(),COLUMN(),4),ROW(),""))-64) 

यहाँ विषय तथ्य यह है कि पत्र A के लिए ASCII वर्ण कोड 64 है के आधार पर, स्तंभ का अक्षर हड़पने इसके बारे में Code() हो और 64 घटाना, था।

1

openpyxl

import openpyxl 
(column_string, row) = openpyxl.cell.coordinate_from_string(address) 
column = openpyxl.cell.column_index_from_string(column_string) 
0

Coincise का उपयोग करते हुए और सुरुचिपूर्ण रूबी संस्करण:

def col_num(col_name) 
    col_name.split(//).inject(0) { |n, c| n * 26 + c.upcase.ord - "A".ord + 1 } 
end 
+0

प्रश्न रूबी के साथ कुछ लेना देना नहीं है। – arogachev

0

सूचकांक के लिए है कि (जैसे एक = 0, बी = 1, और इतने पर) शून्य से शुरू होता है:

def col_to_index(col): 
    A = ord('A') 
    return sum(i * 26 + (ord(c) - A) for i, c in enumerate(col[::-1].upper())) 
1

मैंने यह एक लाइनर बनाया:

colNameToNum = lambda cn: sum([((ord(cn[-1-pos]) - 64) * 26 ** pos) for pos in range(len(cn))]) 

यह रिवर्स ऑर्डर में अक्षरों के माध्यम से पुनरावृत्ति करके और 1, 26, 26 * 26 आदि से गुणा करके, सूची को संक्षेप में काम करता है। यह विधि अक्षरों के लंबे तारों के साथ भी संगत होगी।

प्रिंट (colNameToNum ('एए')) # 27

या

प्रिंट (colNameToNum ("XFD")) # उच्चतम स्तंभ की अनुमति दी, मेरा मानना ​​है कि:

मैं से कॉल करने की । परिणाम = 16384

0

आप उपयोग करने के लिए समझ और स्ट्रिंग काफी आसान है कि का उपयोग कर इस oneliner इस्तेमाल कर सकते हैं:

sum([string.ascii_lowercase.index(c) + 26 ** i for i,c in enumerate(col_letters)]) 
0

एक-लाइनर्स अजगर 2.7.1 में परीक्षण किया है और 3.5.2

excel_col_num = lambda a: 0 if a == '' else 1 + ord(a[-1]) - ord('A') + 26 * excel_col_num(a[:-1]) 

excel_col_name = lambda n: '' if n <= 0 else excel_col_name((n - 1) // 26) + chr((n - 1) % 26 + ord('A')) 

मल्टी-लाइनर्स वैसे ही

def excel_column_name(n): 
    """Number to Excel-style column name, e.g., 1 = A, 26 = Z, 27 = AA, 703 = AAA.""" 
    name = '' 
    while n > 0: 
     n, r = divmod (n - 1, 26) 
     name = chr(r + ord('A')) + name 
    return name 

def excel_column_number(name): 
    """Excel-style column name to number, e.g., A = 1, Z = 26, AA = 27, AAA = 703.""" 
    n = 0 
    for c in name: 
     n = n * 26 + 1 + ord(c) - ord('A') 
    return n 

def test (name, number): 
    for n in [0, 1, 2, 3, 24, 25, 26, 27, 702, 703, 704, 2708874, 1110829947]: 
     a = name(n) 
     n2 = number(a) 
     a2 = name(n2) 
     print ("%10d %-9s %s" % (n, a, "ok" if a == a2 and n == n2 else "error %d %s" % (n2, a2))) 

test (excel_column_name, excel_column_number) 
test (excel_col_name, excel_col_num) 

सभी परीक्षणों प्रिंट

  0    ok 
     1 A   ok 
     2 B   ok 
     3 C   ok 
     24 X   ok 
     25 Y   ok 
     26 Z   ok 
     27 AA   ok 
     702 ZZ   ok 
     703 AAA  ok 
     704 AAB  ok 
    2708874 EXCEL  ok 
1110829947 COLUMNS ok 
0

तुम बस कंसोल के लिए निम्न openpyxl मॉड्यूल स्थापित करने के बाद जोड़ सकते हैं:

import openpyxl 
from openpyxl.utils import get_column_letter, column_index_from_string 
workbook = openpyxl.load_workbook('your_workbook.xlsx') 
sheet = wb.get_sheet_by_name('your_sheet_from_workbook') 
print(get_column_letter(1)) 
print(column_index_from_string('A')) 

बस पत्र और नंबर को अपनी आवश्यकताओं के अनुरूप बनाने के लिए या बदलने के एक के लिए पाश एक पूरे के लिए काम करने के लिए परियोजना। आशा है कि ये आपकी मदद करेगा। चीयर्स।

संबंधित मुद्दे