[Python] 엑셀 M*N 곱셈표 만들기/openpyxl 모듈


openpyxl 모듈은 파이썬에서 엑셀을 쉽게 다룰 수 있도록 도와주는 모듈입니다. openpyxl 설치는 cmd(터미널)창에서 다음과 같이 입력해주어야합니다.

pip install openpyxl

 

가로 M, 세로 N 값을 받아 곱셈표를 만들어 엑셀파일(xlsx)로 저장하는 코드입니다. 예를 들어 가로 5, 세로 6을 입력하면 다음과 같이 엑셀에 저장되어야 합니다.


1. 필요한 모듈 가져오기

현재 디렉토리에서 작업하여 해당 파일에 저장하기 위해 os 모듈을 사용합니다.(선택)

가로 M, 세로 N 값을 받기 위해 sys 모듈을 사용합니다. (선택, input() 사용 가능)

파이썬에서 엑셀을 다루기 위해 openpyxl 모듈을 사용합니다.

import sys, openpyxl, os
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

2. 현재 작업 디렉토리 이동(선택)

현재 작업 디렉토리가 확인하기 위해 os.getcwd()를 사용하여 확인합니다. 출력되는 위치에 엑셀파일이 저장될 것입니다. 작업 디렉토리를 이동하고자 한다면 os.chdir(이동하고자하는 위치)를 입력합니다.

os.getcwd()
os.chdir('C:\\Users\\USER\\Desktop\\AlgorithmQuiz')

3. 엑셀파일 쓰기

엑셀파일을 쓰기 위해 Workbook() 객체를 생성해주고 활성화해줍니다.

wb = openpyxl.Workbook()
sheet = wb.active

4. 곱셈 표 만들기

m,n 값을 sys모듈을 통해 입력받습니다. 엑셀 A1칸에는 'MxN표'라고 넣어줍니다. 가로,세로로 입력받은 값만큼 숫자를 넣어줍니다.

# sys로 값 입력받기
m,n = map(int,sys.stdin.readline().split()) 

# A1번칸에 'mxn표' 문자열 넣기
sheet['A1'] = f"{m}x{n}표"

#가로 M값 넣기
#B1 C1 D1...위치에
m_num = 1
for i in range(98, 98+m):
    # sheet[f'{chr(i)}1'].font = title_style
    # sheet[f'{chr(i)}1'].fill = title_color
    sheet[f'{chr(i)}1'] = m_num
    
    m_num += 1

#세로 N값 넣기
#A2 A3 A4...위치에
for j in range(2,n+2):
    # sheet[f'A{j}'].font = title_style
    # sheet[f'A{j}'].fill = title_color
    sheet[f'A{j}'] = j-1

5. 곱셈 값을 넣기

#곱셈값 넣기
#row 세로, column 가로
for i in range(2,m+2): #가로
  for j in range(2,n+2): #세로
    #가로값을 A로 고정하고 세로를 1,2,3..순
    row_val = int(sheet.cell(row=j, column=1).value)
    #세로값을 1로 고정하고 가로를 A,B,C..순
    col_val = int(sheet.cell(row=1, column=i).value)
    #위에서 받은 값을 서로 곱해서 값을 넣기
    sheet.cell(row=j, column=i, value= row_val * col_val)

6. 표 꾸미기

가장 윗쪽과 왼쪽에 들어가는 값들은 폰트사이즈를 12로 설정하고 굵게 설정해줍니다. 그리고 색상도 넣어줍니다. 표에 전체적으로 테두리를 넣어줍니다. 모든 값을 가운데 정렬해줍니다.

#가운데정렬, 텍스트 스타일, 셀 스타일 변경
title_style = Font(size=12, bold=True)
title_color = PatternFill(start_color='F8CBAD',fill_type='solid')
all_border = Border(top = Side(border_style='thin', color='000000'),
                    bottom = Side(border_style='thin', color='000000'),
                    left = Side(border_style='thin', color='000000'),
                    right = Side(border_style='thin', color='000000'),)

for i in sheet.rows:
   for cell in i:
      cell.alignment = Alignment(horizontal='center', vertical='center')
      cell.border = all_border
      
      if cell.column == 1 or cell.row == 1:
         cell.font = title_style
         cell.fill = title_color

7. 엑셀파일(xlsx) 저장

wb.save('multiplication_table.xlsx')

8. 전체코드 및 결과

저장된 엑셀파일(xlsx)

# M 가로, N 세로 곱셈표 만들기
'''
m*n표 1 2 3 4 5
  1 
  2
  3
  4
  5
  6
'''
import sys, openpyxl,os
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
os.chdir('C:\\Users\\USER\\Desktop\\AlgorithmQuiz')

wb = openpyxl.Workbook()
sheet = wb.active

# sys로 값 입력받기
m,n = map(int,sys.stdin.readline().split()) 

# A1번칸에 'mxn표' 문자열 넣기
sheet['A1'] = f"{m}x{n}표"

# 가로 M값 넣기
# B1 C1 D1...위치에
m_num = 1
for i in range(98, 98+m):
    # sheet[f'{chr(i)}1'].font = title_style
    # sheet[f'{chr(i)}1'].fill = title_color
    sheet[f'{chr(i)}1'] = m_num
    
    m_num += 1

# 세로 N값 넣기
# A2 A3 A4...위치에
for j in range(2,n+2):
    # sheet[f'A{j}'].font = title_style
    # sheet[f'A{j}'].fill = title_color
    sheet[f'A{j}'] = j-1

# 곱셈값 넣기
#row 세로, column 가로
for i in range(2,m+2): #가로
  for j in range(2,n+2): #세로
    # 가로값을 A로 고정하고 세로를 1,2,3..순
    row_val = int(sheet.cell(row=j, column=1).value)
    # 세로값을 1로 고정하고 가로를 A,B,C..순
    col_val = int(sheet.cell(row=1, column=i).value)
    # 위에서 받은 값을 서로 곱해서 값을 넣기
    sheet.cell(row=j, column=i, value= row_val * col_val)

# 가운데정렬, 텍스트 스타일, 셀 스타일 변경
title_style = Font(size=12, bold=True)
title_color = PatternFill(start_color='F8CBAD',fill_type='solid')
all_border = Border(top = Side(border_style='thin', color='000000'),
                    bottom = Side(border_style='thin', color='000000'),
                    left = Side(border_style='thin', color='000000'),
                    right = Side(border_style='thin', color='000000'),)

for i in sheet.rows:
   for cell in i:
      cell.alignment = Alignment(horizontal='center', vertical='center')
      cell.border = all_border
      
      if cell.column == 1 or cell.row == 1:
         cell.font = title_style
         cell.fill = title_color
wb.save('multiplication_table.xlsx')