▶ write-only 모드의 Workbook

Workbook 클래스의 close 메서드는 열려 있는 Workbook 파일을 닫을 때 사용한다고 설명되어 있다.
단, 이때 Workbook은 'read-only' 또는 'wirte-only' 모드여야 함을 전제한다.

▶ write-only 모드의 Workbook에서 메서드 create_sheet의 사용
논리적으로 마지막 코드에 Workbook.close 메서드를 사용해 생성한 Workbook을 닫아줘야 할 것 같은 아래의 코드도
Workbook.close 메서드를 사용하든 하지 않든 엑셀 파일 'sample.xlsx'는 정상적으로 생성된다.
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook()
worksheet = workbook.active
worksheet['A1'].value = 'Hello openpyxl!'
workbook.save('sample.xlsx')
# workbook.close()

아래 Workbook 클래스의 생성자 정의와 같이 Workbook의 write_only 값은 'False'가 기본값이다.
class openpyxl.workbook.workbook.Workbook(write_only=False,
iso_dates=False)
위 첫번째 파이썬 코드에서 Workbook 객체를 생성할 때 write_only=True로 정의한 후 실행하면 오류가 발생한다.
(a newly-created write-only workbook does not contain any worksheets.)
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook(write_only=True)
worksheet = workbook.active
worksheet['A1'].value = 'Hello openpyxl!'
workbook.save('sample.xlsx')

이에 Workbook의 create_sheet 메서드를 사용해 코드를 수정한 후 실행해 본다.
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook(write_only=True)
worksheet = workbook.create_sheet()
worksheet['A1'].value = 'Hello openpyxl!'
workbook.save('sample.xlsx')
아래와 같이 오류가 발생하나 오류의 원인에는 차이가 난다.

▶ write-only 모드의 Workbook에서 Worksheet 메서드 append의 사용
이제 각 셀에 임의의 값을 쓰기 위해 Worksheet 클래스의 append 메서드를 사용해 본다.
(In a write-only workbook, rows can only be added with append().)
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook(write_only=True)
worksheet = workbook.create_sheet()
for i in range(5):
worksheet.append([i])
workbook.save('sample.xlsx')
다음과 같이 A열에 의도한 숫자값이 입력되어 있음을 확인한다.

다음으로 시트 두 개를 새로 생성한 후 각각 임의의 값을 입력해 본다.
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook(write_only=True)
worksheet = workbook.create_sheet()
for i in range(5):
worksheet.append([i])
worksheet = workbook.create_sheet()
for i in ['a', 'b', 'c', 'd', 'e']:
worksheet.append([i])
workbook.save('sample.xlsx')
아래와 같이 두번째 시트가 새로 생성되고 알파벳이 입력되어 있음을 확인한다.

마지막으로 write-only 모드로 생성한 workbook을 두번 이상 저장하도록 코드를 작성하면 오류가 발생한다.
(A write-only workbook can only be saved once.)
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook(write_only=True)
worksheet = workbook.create_sheet()
for i in range(5):
worksheet.append([i])
workbook.save('sample.xlsx')
worksheet = workbook.create_sheet()
for i in ['a', 'b', 'c', 'd', 'e']:
worksheet.append([i])
workbook.save('sample.xlsx')

▶ write-only 모드의 Workbook에서 Workbook.close 메서드의 영향성
아래의 코드를 실행해 본 바 Workbook 클래스의 close 메서드를 코드 중간에 호출해도 엑셀 파일은 정상적으로 생성됨을 확인한다.
# python 3.9.5
# openpyxl 3.0.7
from openpyxl import Workbook
workbook = Workbook(write_only=True)
worksheet = workbook.create_sheet()
for i in range(5):
worksheet.append([i])
# workbook.save('sample.xlsx')
workbook.close()
worksheet = workbook.create_sheet()
for i in ['a', 'b', 'c', 'd', 'e']:
worksheet.append([i])
workbook.save('sample.xlsx')
'코딩 > 파이썬과 엑셀' 카테고리의 다른 글
| [Python] openpyxl로 엑셀 파일 다루기 008. Cell(셀)에 값 읽고 쓰기 (0) | 2021.06.10 |
|---|---|
| [Python] openpyxl로 엑셀 파일 처리 007. Worksheet(시트)의 탭 색상 설정 (0) | 2021.06.09 |
| [Python] openpyxl로 엑셀 파일 처리 005. Workbook의 시트 객체 리스트를 얻는 두 가지 방법 (0) | 2021.06.07 |
| [Python] openpyxl로 엑셀 파일 처리 004. load_workbook 함수로 엑셀 파일 불러오기 (0) | 2021.06.06 |
| [Python] openpyxl로 엑셀 파일 처리 003. 시트 복사(worksheet copy) (0) | 2021.06.05 |