2013-07-08 11 views
0

Excel 시트에서 셀 값을 가져 와서 계산하고 새 시트에 출력을 작성하려고합니다. 나는 계속 ErrorType을 얻는다. 나는 이전에 성공적으로 코드를 실행하지만, 그냥이 부분을 추가했습니다, 따라서 코드는 아래에 증류수되었습니다Openpyxl : 셀 값 조작

import openpyxl 

#set up ws from file, and ws_out write to new file 

def get_data(): 
    first = 0 
    second = 0 
    for x in range (1, 1000): 
     if ws.cell(row=x, column=1).value == 'string': 
      for y in range (1, 10):   #Only need next ten rows after 'string' 

       ws_out.cell(row=y, column=1).value = ws.cell(row=x+y, column=1).value 

       second = first        #displaces first -> second 
       first = ws.cell(row=x+y, column=1).value/100  #new value for first 
       difference = first - second 

       ws_out.cell(row=x+y+1, column=1).value = difference #add to output 
      break 

이 형식 오류 메시지 오류 :

first = ws.cell(row=x+y, column=1).value)/100
TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'

나는이 언급되는 가정 ws.cell 값 (100)는 각각, 그래서 나는 또한 시도했다 : 제기 어떤

first = int(ws.cell(row=x, column=1))/100 #also tried with float 

:

TypeError: int() argument must be a string or a number

필자는 모든 열의 셀이 숫자로만 구성되었음을 확인했습니다. 또한 openpyxl의 cell.data_type은 'n'을 반환합니다 (아마도 문서에서 알 수있는 한 숫자에 해당하는 것으로 추정됩니다).

나는 또한 더 간단한 수학을 테스트했으며 동일한 오류가 있습니다.

내 검색 모두는 일반적으로 이와 같이 정상적으로 작동하는 openpyxl을 가리키는 것으로 보입니다. 내가 잘못된 것을하고 있습니까? 아니면 이것은 단순히 모듈의 한계입니까? 그렇다면 프로그래밍 방식 해결 방법이 있습니까?

보너스로 코드를보다 간결하게 작성하는 방법에 대한 조언을 많이 주시면 감사하겠습니다. 나는 이제 막 시작했는데, 이와 같은 아이디어를 작성하는 더 깨끗한 방법이 있어야한다고 생각합니다.

파이썬 3.3, openpyxl-1.6.2, 윈도우 7


요약

CFI의 대답은 내가 약간 다른 해결 방법을 사용하지만, 내가, 그것을 알아낼 수있었습니다. 원본 파일을 검사 할 때 빈 셀 하나가있었습니다 (이전에 놓친 것). 내가 다시 사용되기 때문에 더 산발적 빈 셀에 열을 나중에이 코드를, 내가 사용 : 지정된 셀이 비어 있다면

if ws.cell(row=x+r, column=40).data_type == 'n': 
    second = first        #displaces first -> second 
    first = ws.cell(row=x+y, column=1).value/100  #new value for first 
    difference = first - second 

    ws_out.cell(row=x+y+1, column=1).value = difference #add to output 

따라서, 그것을 무시하고 건너 뜁니다.

+0

항상 인용 된 오류와 일치하는 코드를 게시하십시오. 'row = x + r'은 코드에 존재하지 않는 변수'r'을 가리 킵니다. – cfi

+0

감사합니다. 오류 메시지가 업데이트되었습니다. – Jonathan

답변

0

실제로 액세스하는 모든 셀이 값을 보유하고 있는지 100 % 확실합니까? (편집 : 내용을 확인하려면 print("dbg> cell value of {}, {} is {}".format(row, 1, ws.cell(row=row, column=1).value))을 수행하십시오)

고정 된 범위 (1,1000)를 통과하는 대신 openpyxl 인트로 스펙 션 방법을 사용하여 기존 행을 반복 할 것을 권장합니다. 예컨대 :

wb=load_workbook(inputfile) 
    for ws in wb.worksheets: 
     for row in ws.rows: 
      for cell in row: value = cell.value 

값이 .value 속성을 추출하는 것을 잊지 마세요 점점 :

first = ws.cell(row=x+y, column=1).value/100 #new value for first 
일반적인 참고로

: 2 차원 좌표에 대한 xy 유용한 변수 이름입니다. 둘 다 행에 사용하지 마십시오. 코드를 읽어야하는 다른 사람들을 오도하게 만듭니다. x 대신 start_row 또는 row_offset 또는 비슷한 것을 사용할 수 있습니다.y 대신 row을 사용하면 첫 번째 색인이 start_row+1 인 것으로 시작할 수 있습니다.

일부 예제 코드 (테스트되지 않은이) :

def get_data(): 
    first = 0 
    second = 0 
    for start_row in range (1, ws.rows): 
     if ws.cell(row=start_row, column=1).value == 'string': 
      for row in range (start_row+1, start_row+10): 

       ws_out.cell(row=start_row, column=1).value = ws.cell(row=row, column=1) 

       second = first 
       first = ws.cell(row=row, column=1).value/100 
       difference = first - second 

       ws_out.cell(row=row+1, column=1).value = difference 
      break 

지금이 코드를 난 아직도 당신이 달성하려고하는 것을 이해하지 않습니다. break이 정확하게 들여 쓰기되어 있습니까? 예인 경우 처음으로 string과 일치 할 때 바깥 쪽 루프는 break으로 종료됩니다. 그렇다면 변수 firstsecond의 요점은 무엇입니까?

편집 : 의 글자를 cell()이 아닌으로 작성해야합니다.

+0

다음'if' 문을 시작하는'string'의 첫 번째 인스턴스 만 찾고 있기 때문에'break'가 올바르게 들여 쓰기됩니다. 'First'와'Second'는'string'과 특별한 관계가있는 다른 변수를 찾아서 다른 변수를 뺍니다. (구체적으로 말하자면, 그것들은 시간 지점입니다 : 시간 2가 시간 1에서 시간 2에서 다음 행으로의 값이되는 시간 2에서 시간 2를 뺀 시간입니다. '문자열'에 대한 속도를 계산하는 데 사용 된 시간입니다.) 나는 당신의 생각을 좋아합니다. 내가 할 변수의 이름을 바꾼다. 많은 thanks – Jonathan

+0

@Jonathan : 계산을 위해 내용을 확인하기 전에 값을 print() 할 수 있다고 덧붙였다. 둘째로'cell'뿐만 아니라'cell.value'에 wrinte되도록하십시오. 그에 따라 내 코드 예제를 편집했습니다. - 아, 너의 Q 편집을 이미 본 것 같아. – cfi