본문 바로가기

코딩/파이썬과 엑셀

[Python] openpyxl로 엑셀 파일 처리 006. write-only 모드의 Workbook과 Workbook.close 메서드의 영향성

▶ write-only 모드의 Workbook

python : openpyxl : write-only 모드

 

Workbook 클래스의 close 메서드는 열려 있는 Workbook 파일을 닫을 때 사용한다고 설명되어 있다.

단, 이때 Workbook은 'read-only' 또는 'wirte-only' 모드여야 함을 전제한다.

 

Workbook.close 메서드 정의

▶ 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()

 

write_only = False 모드

 

아래 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')

 

write_only = True 모드

 

이에 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 = True 모드, create_sheet 메서드 사용

▶ 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열에 의도한 숫자값이 입력되어 있음을 확인한다.

 

write_only = True, Worksheet.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])

worksheet = workbook.create_sheet()

for i in ['a', 'b', 'c', 'd', 'e']:
    worksheet.append([i])

workbook.save('sample.xlsx')

 

아래와 같이 두번째 시트가 새로 생성되고 알파벳이 입력되어 있음을 확인한다.

 

create_sheet 메서드 두번 사용

 

마지막으로 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 = True, 2회 이상 파일 저장 시 오류 발생

▶ 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')