이전 포스팅에서는 텍스트 파일을 다루는 방법을 알아봤는데, 이번엔 openpyxl로 엑셀파일을 다루는 방법을 알아보겠다. 텍스트 파일 보다 조금 더 깔끔하게 데이터를 다룰 수 있을 것이다.
먼저 터미널로 라이브러리를 설치해주자.
라이브러리 문서
pip install openpyxl
기본 사용법은 아래와 같다.
엑셀 파일 열기
book = openpyxl.load_workbook("파일이름.xlsx")
시트 선택하기
ws = book["시트이름"]
이름으로 시트 열기
ws = book.active
활성화 된 시트 열기
특정 셀에 접근하기
cell = ws.cell(row=1, column=1)
cell = ws['A1']
특정 셀의 값 얻기
ws['A1'].value
특정 셀의 값 수정 하기
ws['A1'] = "new_value"
특정 범위 접근하기
cells = ws['A1':'C3']
rows = ws[1:3]
columns = ws['A':'C']
all_rows = ws.rows
all_columns = ws.columns
내용 append 하기
ws.append([column1, column2, ...])
저장 하거나 닫기
book.save(filename)
파일 내용을 수정 했을 시
book.close()
파일 내용을 읽기만 했을 시
먼저 discord_bot.xlsx 파일을 생성하고 시트 이름을 discord_bot으로 해두겠다.
다음으로 엑셀 파일에 내용을 쓰는 기능을 작성해보자.
import openpyxl
@app.command(name="엑셀쓰기")
async def write_excel(ctx, write_str: str): # 입력 내용을 받는다.
filename = "discord_bot.xlsx"
book = openpyxl.load_workboot(filename)
ws = book.get_sheet_by_name("discord_bot") # 시트 이름으로 선택
ws.append([str(ctx.author), write_str]) # 맨 마지막에 append 한다.
book.save(filename) // 수정 내용 저장
await ctx.send("엑셀 입력 완료!")
마지막으로 엑셀 파일에서 명령어 사용자가 쓴 내용을 받아보자.
import openpyxl
@app.command(name="엑셀읽기")
async def read_excel(ctx):
filename = "discord_bot.xlsx"
book = openpyxl.load_workboot(filename)
ws = book.get_sheet_by_name("discord_bot")
result = []
for row in ws.rows: # 모든 row 순회
if row[0].value == str(ctx.author): # 명령어 사용자가 엑셀 쓰기한 내용 찾기
result.append(row[1].value)
book.close()
if result:
await ctx.send(f'{ctx.author}님이 엑셀 파일에 입력한 내용들입니다.')
await ctx.send(result.join("\n"))
else:
await ctx.send(f'{ctx.author}님이 엑셀 파일에 입력한 내용이 없습니다.')
<엑셀 파일 내용 삭제 후 입력>
그냥 코드로 파일을 생성하고 싶다면 예시의 동일한 부분을
import openpyxl
book = openpyxl.Workbook()
...
...
...
book.save("파일이름.xlsx")
위의 코드로 대체 해주면 된다.
엑셀파일을 열고 save()사용 시 발생하는 오류이다. 엑셀 파일을 닫고 다시 실행해보자.
파일명이 잘못 되었을 때 발생한다. 오타가 없는지 확인하자.
시트명이 잘못 되었을 때 발생한다. 다시 확인해보자.
텍스트 파일에 이어 엑셀 파일을 다루는 방법까지 알아보았다. 봇을 운영하면서 꼭 저장 해두어야 할 내용이 있다면 이 포스팅이나 이전 포스팅을 활용하여 저장해보자.
time.sleep(259200)