파이썬 openpyxl data_only=True인데 None인 이유: 수식 캐시와 재계산 구분법

openpyxl에서 data_only=True로 읽은 수식 셀이 None이라면, Python이 수식을 계산하지 못했다는 한 가지 원인으로 단정하면 안 됩니다. 먼저 data_only=False로 수식이 실제로 있는지 확인하고, 그다음 파일에 마지막 계산값이 저장되어 있는지와 그 값이 최신인지 구분해야 합니다.

data_only=True와 data_only=False의 역할

같은 통합 문서를 두 방식으로 읽으면 수식과 저장값을 나누어 볼 수 있습니다.

from openpyxl import load_workbook

path = "report.xlsx"

formula_book = load_workbook(path, data_only=False)
value_book = load_workbook(path, data_only=True)

formula_cell = formula_book["Summary"]["B2"]
value_cell = value_book["Summary"]["B2"]

print("수식:", formula_cell.value)
print("저장된 계산값:", value_cell.value)

data_only=False에서는 수식 셀의 수식 문자열을 반환하고, data_only=True에서는 Excel이 시트를 마지막으로 읽었을 때 저장한 값을 반환합니다. 따라서 data_only=True는 수식을 계산하거나 새 계산값을 만드는 옵션이 아닙니다. 이 차이를 모르면 수식이 사라졌거나 Python 계산이 실패했다고 잘못 판단하기 쉽습니다.

None이 나왔을 때 먼저 확인할 것

첫째, 같은 좌표를 data_only=False로 읽어 수식이 존재하는지 확인합니다. 수식이 없다면 셀 주소, 시트 이름, 파일 버전이 맞는지부터 살펴봐야 합니다.

둘째, 수식은 있는데 data_only=True에서 None이라면 입력 파일에 읽을 수 있는 저장 계산값이 없는 상태일 수 있습니다. openpyxl 공식 문서는 수식을 수정하거나 읽을 수 있다고 설명하지만 수식을 평가하지는 않습니다. 이 경우 openpyxl을 다시 호출하는 것만으로 새 결과가 생기지 않습니다.

셋째, None이 아니더라도 값이 최신이라는 보장은 없습니다. 수식이 참조하는 입력 셀이 바뀐 뒤 재계산되지 않았다면 저장된 값은 이전 결과일 수 있습니다. 특히 자동화 과정에서 파일을 저장한 프로그램과 실제 계산을 담당한 프로그램이 다르면 이 구분이 중요합니다.

재계산과 직접 계산 중 무엇을 선택할까

판단 기준은 수식의 권위 있는 계산 주체와 운영 환경입니다.

  • 원본 엑셀의 수식과 계산 결과를 그대로 유지해야 한다면 Excel에서 통합 문서를 열어 재계산하고 저장하는 단계를 둡니다. Excel은 자동 계산과 수동 계산을 구분하며, 수동 계산에서는 사용자가 통합 문서 계산을 실행해야 할 수 있습니다.
  • 서버나 배치 환경에서 Excel을 사용할 수 없다면 호환 계산 엔진을 검토할 수 있지만, 함수 지원 범위와 결과 일치 여부를 수식별로 검증해야 합니다.
  • 수식이 단순하고 업무 규칙을 Python으로 명확히 표현할 수 있다면 입력값을 Python에서 직접 계산해 결과를 별도 값으로 생성하는 방법도 있습니다. 이때 원본 수식을 계산한 것처럼 표시하지 말고, 직접 계산한 값과 계산 규칙을 분리해 기록하는 편이 안전합니다.

openpyxl은 수식을 보존하거나 수정하는 도구이지 일반 수식의 계산 엔진이 아닙니다. 그러므로 data_only=True를 선택하는 것과 재계산을 수행하는 것은 서로 다른 단계입니다.

자동화에 넣을 검증 순서

보고서 후속 단계에서 수식 결과를 사용한다면 다음 순서로 실패를 분류하는 것이 실무적입니다.

  1. 파일과 시트, 셀 주소가 예상 대상인지 확인합니다.
  2. data_only=False로 수식 문자열의 존재를 확인합니다.
  3. data_only=True로 저장된 계산값을 읽고 None 여부를 기록합니다.
  4. 입력 셀 변경 시점과 마지막 재계산·저장 시점을 비교합니다.
  5. 값이 없거나 최신성을 확인할 수 없으면 집계·검증 단계로 넘기지 않고 재계산 또는 직접 계산 경로를 선택합니다.

이렇게 하면 “수식이 없다”, “계산값이 저장되지 않았다”, “저장값이 오래됐다”를 하나의 오류로 뭉뚱그리지 않을 수 있습니다. 운영 로그에는 최소한 셀 주소, 수식 확인 결과, 저장값 확인 결과, 선택한 재계산 경로를 남기는 것이 좋습니다.

마무리

data_only=True에서 None을 만났을 때의 핵심은 옵션을 바꾸는 데 있지 않습니다. 수식 자체는 data_only=False로 확인하고, 계산값은 파일에 저장된 캐시로 확인한 뒤, 최신 결과가 필요하면 Excel 또는 검증한 호환 엔진의 재계산 단계를 명시적으로 선택해야 합니다. 그 기준이 정해져야 Python 자동화가 보고서 값을 신뢰할 수 있습니다.

출처

Leave a Comment