파이썬에서 엑셀 워크북 작성하기
from openpyxl import Workbook
filename = '사원_정보 2.xlsx'
# Workbook 객체 생성
e_info_wb = Workbook()
# 활성화된 워크시트 변수 할당
active_ws = e_info_wb.active
# 제목 설정
active_ws.title = '인사_기록'
# 워크북에 '과거_인사_평가', '연봉' 워크시트 추가
e_info_wb.create_sheet('과거_인사_평가')
e_info_wb.create_sheet('연봉')
# 워크북 저장
e_info_wb.save(filename)
엑셀 파일 불러오기
from openpyxl import load_workbook
filename = '사원_정보 2.xlsx'
# load excel
e_info_wb = load_workbook(filename)
# 워크시트 목록 출력
print(e_info_wb.sheetnames)
# '인사_기록' 워크시트 선택
personnel_info_ws = e_info_wb['인사_기록']
# 선택된 워크시트 정보 출력
print(personnel_info_ws)
# 워크시트 제거
import openpyxl
e_info_wb2 = openpyxl.load_workbook(filename)
e_info_wb2.sheetnames
remove_ws = e_info_wb2.get_sheet_by_name('인사_기록')
e_info_wb2.remove_sheet(remove_ws)
e_info_wb2.sheetnames
리스트형 자료를 열 단위로 이어 붙이기
from operator import itemgetter
from openpyxl import load_workbook
filename = '사원_정보 2.xlsx'
# load excel
e_info_wb = load_workbook(filename)
# 워크시트 목록 출력
print(e_info_wb.sheetnames)
# '인사_기록' 워크시트 선택
personnel_info_ws = e_info_wb['인사_기록']
# 추가될 컬럼의 목록
column = ['ID', '이름', '주소', '생년월일', '학력', '입사 연월']
# append method 사용
personnel_info_ws.append(column)
# 추가될 데이터
data = [['1233', '박찬성', '세종시 도담동', '1985-12-23', '학사', '2012-
11'],
['1723', '김진수', '대전시 월평동', '1989-05-17', '학사', '2017-
02'],
['1435', '이수빈', '세종시 아름동', '1988-02-25', '박사', '2014-
05'],
['1601', '김민준', '대전시 반석동', '1989-07-27', '석사', '2016-
12'],
['1804', '최형아', '대전시 둔산동', '1986-01-20', '학사', '2018-
03']
]
# 첫번째 키 기준 정렬
# key: Optional. A Function to execute to decide the order.
# Default is None
# itemgetter(0) : index 0 을 기준으로 sort 하겠다는 의미
data = sorted(data, key=itemgetter(0))
data
# 이름 순으로 정렬
data = sorted(data, key=itemgetter(1))
data
# for 문과 append 메서드 사용
for row in data:
personnel_info_ws.append(row)
filename2 = '사원_정보 3.xlsx'
e_info_wb.save(filename2)
행 단위로 각 열에 맞는 데이터 추가 삽입
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
filename = '사원_정보 3.xlsx'
# load excel
e_info_wb = load_workbook(filename)
# '인사_기록' 워크시트 선택
personnel_info_ws = e_info_wb['인사_기록']
# 행 최대 크기와 해당 행의 알파벳
print(personnel_info_ws.max_column)
print(get_column_letter(personnel_info_ws.max_column))
# 5 번째 행에 하나의 행 추가
# insert_cols(idx, amount=1)
# idx 에 해당하는 열 바로 앞에 col 추가
personnel_info_ws.insert_cols(5,1)
# personnel_info_ws.insert_cols(5,2) # 열 2 개
# 행 추가 후 행 최대 크기 조사
print(personnel_info_ws.max_column)
print(get_column_letter(personnel_info_ws.max_column))
# 추가된 행에 추가할 데이터
new_column = '병역'
new_data = ['군필', '미필', '제외', '군필', '제외']
# E1 셀에 '병역' 문자열 추가
personnel_info_ws['E1'] = new_column
# 첫 번째 행은 열 이름으로 사용되고 두번째 행부터 데이터 삽입을 위한 카운터
count = 2
# 추가된 행의 열마다 해당 데이터를 넣어줌
for data in new_data:
personnel_info_ws.cell(row = count, column = 5, value=data)
count = count +1 # count += 1
e_info_wb
filename3 = '사원_정보 4.xlsx'
e_info_wb.save(filename3)
# numpy & pandas 이용
import pandas as pd
import numpy as np
# df = pd.read_excel('사원정보 4.xlsx')
df = pd.read_excel(filename3)
# df.insert(3, "column1", np.nan)
df
new_column = '재직여부'
add_data = ['재직', '이직', '재직', '재직', '휴직']
df.insert(3, new_column, add_data)
df
filename4 = '사원_정보 5.xlsx'
df.to_excel(filename4)
# 여러 worksheet 를 각각 dataframe 으로 만들어 excel 로 저장
import pandas as pd
import numpy as np
import xlsxwriter
ws1_contents = {
'name1': ['김', '이', '박', '최'],
'age': [10, 20, 30, 40]
}
ws2_contents = {
'name2': ['정', '강', '조', '윤'],
'age': [11, 21, 31, 41]
}
ws3_contents = {
'name3': ['장', '임', '한', '오'],
'age': [12, 22, 32, 42]
}
# Dictionary to Dataframe conversion
dataframe1 = pd.DataFrame(ws1_contents)
dataframe2 = pd.DataFrame(ws2_contents)
dataframe3 = pd.DataFrame(ws3_contents)
with pd.ExcelWriter('employee1.xlsx', engine='xlsxwriter') as
writer:
dataframe1.to_excel(writer, sheet_name='worksheet1')
dataframe2.to_excel(writer, sheet_name='worksheet2')
dataframe3.to_excel(writer, sheet_name='worksheet3')
워크북에서 원하는 열을 찾아서 반환
from openpyxl import load_workbook
from openpyxl import Workbook
def get_rules(filename):
file = open(filename, 'r')
key_column = file.readline().split(':')[1]
key = file.readline().split(':')[1]
targets = []
for tmp_line in file:
line = tmp_line.strip()
wb_name = line.split(':')[0]
ws_names = line.split(':')[1].split(',')
target = {wb_name : ws_names}
targets.append(target)
return key_column.strip(), key.strip(), targets
def find_column(ws, key_column):
column = -1
for col in range(1, ws.max_column+1):
if ws.cell(row=1, column=col).value == key_column:
# print(ws.cell(row=1, column=col).value)
column = col
break
return column
def get_rows(ws, key, column):
rows = []
for row in range(1, ws.max_row+1):
if ws.cell(row=row, column=column).value == int(key):
rows.append(ws[row])
return rows
def get_raw_row(row):
cells = []
for cell in row:
cells.append(cell.value)
return cells
def get_row_by(key_column, key, target):
wb_name = list(target.keys())[0]
ws_names = target[wb_name]
rows = []
wb = load_workbook(wb_name)
for ws_name in ws_names:
ws = wb[ws_name]
column = find_column(ws, key_column)
if column != -1:
rows_cell = get_rows(ws, key, column)
for row in rows_cell:
rows_raw = get_raw_row(row)
rows.append(rows_raw)
return rows
def main():
key_column, key, targets = get_rules('규칙파일.txt')
rows = []
merge_info_wb = Workbook()
active_ws = merge_info_wb.active
active_ws_title = '취합_' + key
for target in targets:
tmp_rows = get_row_by(key_column, key, target)
for row in tmp_rows:
active_ws.append(row)
merge_info_wb.save('취합_정보_' + key + '_2' +'.xlsx')
# if __name__ == "__main__":
# main()
main()