열 번호에서 Excel 스타일 열 이름 가져오기
행과 콜 ID가 제공되지만 다음과 같은 값을 제공할 때 COLUMN 이름을 제공하기 위한 코드입니다.row = 1 and col = 104
그것은 돌아올 겁니다.CZ
그러나 그것은 돌아옵니다.D@
row = 1
col = 104
div = col
column_label = str()
while div:
(div, mod) = divmod(div, 26)
column_label = chr(mod + 64) + column_label
print column_label
내가 하는 일에 무슨 문제가 있습니까?
(이 코드는 EXCEL 열에 대한 참조로, 행, 열 ID 값을 제공하고 동일한 값에 대한 영문자 값을 예상합니다.)
참고 현재 이 답변에 표시된 코드는 귀하가 수락했을 때의 코드가 아닙니다. 이는 다음보다 큰 열 번호를 제대로 처리하지 못하게 한 버그를 발견하고 수정했기 때문입니다.702
(Excel 열에 해당)'ZZ'
).
문제가 발생할 정도로 큰 열 번호를 가진 이전 버전을 사용하지 않았을 가능성이 높습니다.FWIW, Microsoft Excel 사양 및 제한에 따르면 최대 1,048,576 행, 16,384 열(예: 열)의 워크시트를 지원합니다.'XFD'
).
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def excel_style(row, col):
""" Convert given row and column number to an Excel-style cell name. """
result = []
while col:
col, rem = divmod(col-1, 26)
result[:0] = LETTERS[rem]
return ''.join(result) + str(row)
if __name__ == '__main__':
addresses = [(1, 1), (1, 26),
(1, 27), (1, 52),
(1, 53), (1, 78),
(1, 79), (1, 104),
(1, 18253), (1, 18278),
(1, 702), # -> 'ZZ1'
(1, 703), # -> 'AAA1'
(1, 16384), # -> 'XFD1'
(1, 35277039)]
print('({:3}, {:>10}) --> {}'.format('row', 'col', 'Excel'))
print('==========================')
for row, col in addresses:
print('({:3}, {:10,}) --> {!r}'.format(row, col, excel_style(row, col)))
출력:
(row, col) --> Excel
========================
( 1, 1) --> 'A1'
( 1, 26) --> 'Z1'
( 1, 27) --> 'AA1'
( 1, 52) --> 'AZ1'
( 1, 53) --> 'BA1'
( 1, 78) --> 'BZ1'
( 1, 79) --> 'CA1'
( 1, 104) --> 'CZ1'
( 1, 18253) --> 'ZZA1'
( 1, 18278) --> 'ZZZ1'
( 1, 702) --> 'ZZ1'
( 1, 703) --> 'AAA1'
( 1, 16384) --> 'XFD1'
( 1, 35277039) --> 'BYEBYE1'
인덱스 문제가 몇 가지 있습니다.
따라서 문제를 해결하려면 모든 인덱스를 일치시켜야 합니다.
def colToExcel(col): # col is 1 based
excelCol = str()
div = col
while div:
(div, mod) = divmod(div-1, 26) # will return (x, 0 .. 25)
excelCol = chr(mod + 65) + excelCol
return excelCol
print colToExcel(1) # => A
print colToExcel(26) # => Z
print colToExcel(27) # => AA
print colToExcel(104) # => CZ
print colToExcel(26**3+26**2+26) # => ZZZ
나는 Maritineau의 답변을 좋아합니다. 왜냐하면 코드가 단순하고 따라하기 쉬워 보이기 때문입니다.그러나 26**2 + 26보다 큰 열 번호는 처리할 수 없습니다.그래서 저는 그것의 일부를 수정합니다.
def excel_col(col):
"""Covert 1-relative column number to excel-style column label."""
quot, rem = divmod(col-1,26)
return excel_col(quot) + chr(rem+ord('A')) if col!=0 else ''
if __name__=='__main__':
for i in [1, 26, 27, 26**3+26**2+26]:
print 'excel_col({0}) -> {1}'.format(i, excel_col(i))
결과.
excel_col(1) -> A
excel_col(26) -> Z
excel_col(27) -> AA
excel_col(18278) -> ZZZ
def ColNum2ColName(n):
convertString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
base = 26
i = n - 1
if i < base:
return convertString[i]
else:
return ColNum2ColName(i//base) + convertString[i%base]
편집: 맞아요, 맞아요, 맞아요.
방금 접근했습니다.A, B, .. AA, AB, ...
숫자가 있는 숫자 베이스로A-Z
.
A = 1
B = 2
.
.
X = 24
Y = 25
Z = 26
.
.
.
이것은 시간 루프 등이 없는 쉬운 방법이며, 어떤 숫자에도 사용할 수 있습니다.> 0
.
저는 이것과 비슷한 것이라고 생각합니다.
def get_col(col):
"""Get excel-style column names"""
(div, mod) = divmod(col, 26)
if div == 0:
return str(unichr(mod+64))
elif mod == 0:
return str(unichr(div+64-1)+'Z')
else:
return str(unichr(div+64)+unichr(mod+64))
일부 테스트:
>>> def get_col(col):
... (div, mod) = divmod(col, 26)
... if div == 0:
... return str(unichr(mod+64))
... elif mod == 0:
... return str(unichr(div+64-1)+'Z')
... else:
... return str(unichr(div+64)+unichr(mod+64))
...
>>> get_col(105)
'DA'
>>> get_col(104)
'CZ'
>>> get_col(1)
'A'
>>> get_col(55)
'BC'
제가 알아낸 것 같습니다. divmod(104,26)는 chr(0+64) = 64 ie '@'를 만드는 mod=0을 제공합니다.
column_label 앞에 이 줄을 추가하면"mod=26 if mod==0 else mod"
잘 될 거라고 생각합니다.
column_label=''
div=104
while div:
(div, mod) = divmod(div, 26)
mod=26 if mod==0 else mod
column_label = chr(mod + 64) + column_label
print column_label
다음 코드 사용:
def xlscol(colnum):
a = []
while colnum:
colnum, remainder = divmod(colnum - 1, 26)
a.append(remainder)
a.reverse()
return ''.join([chr(n + ord('A')) for n in a])
Excel 스타일 열을 얻는 또 다른 솔루션은 기존 라이브러리를 사용하는 것입니다. 예를 들어 xlsxwriter에는 다음을 위한 유틸리티 기능이 있습니다.
from xlsxwriter.utility import xl_col_to_name
xl_col_to_name(0) # A
xl_col_to_name(25) # Z
xl_col_to_name(26) # AA
xl_col_to_name(18277) # ZZZ
이 함수는 인덱스가 0인 열을 사용하므로 예제에서는 호출하기 전에 1을 빼야 합니다.
판다 다중 인덱스 데이터 프레임을 사용하여 루프 없이 엑셀 열 이름을 얻는 또 다른 방법이 있습니다.이는 일반화된 기본 간 변환기를 수정한 것이므로 코드가 다른 옵션보다 약간 길지만 효과적이라고 생각합니다.
def xlcolumn(num):
base = ["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"]
baseln = len(base)
idx = [""]+base
num = num-1
# create pandas multiindex using idx, base
# current excel version has 16384 columns (A --> XFD), so multiindex needs to have a minimum of 3 levels:
# (26x26x26 = 17576 > 16384 columns)
index = pd.MultiIndex.from_product([idx, idx, idx],names=['level 1', 'level 2', 'level 3'])
df = pd.DataFrame(index = index)
df = df.drop("",level = 'level 3')
df = df.iloc[:baseln].append(df.drop("",level = 'level 2'))
df['val']=1
if num < baseln:
xlcol = str(df.iloc[num].name[2])
elif num >= baseln and num < baseln**2:
xlcol = str(df.iloc[num].name[1])+str(df.iloc[num].name[2])
else:
xlcol = str(df.iloc[num].name[0])+str(df.iloc[num].name[1])+str(df.iloc[num].name[2])
return xlcol
현재 모든 답변은 이전 Python 규약을 사용합니다.Python 3.6+ 목록 조작 및 유형 주석을 사용한 답변입니다.
import string
def excel_style(col: int) -> str:
"""Convert given row and column number to an Excel-style cell name."""
result = []
while col:
col, rem = divmod(col - 1, 26)
result.append(string.ascii_uppercase[rem])
result.reverse()
return "".join(result)
언급URL : https://stackoverflow.com/questions/19153462/get-excel-style-column-names-from-column-number
'programing' 카테고리의 다른 글
마리아에서 모든 외부 키를 선택하는 방법DB (0) | 2023.06.06 |
---|---|
Promise와 같은 대기물을 결합합니다.모든. (0) | 2023.06.06 |
레일즈의 현재 경로는 어떻게 알 수 있습니까? (0) | 2023.06.06 |
목록에서 단어 빈도를 세고 빈도별로 정렬 (0) | 2023.06.06 |
파이어베이스 & 그래프QL (0) | 2023.06.06 |