- 질문 게시판입니다.
Date | 19/02/28 13:08:04 |
Name | Crimson |
File #1 | navdf.PNG (77.3 KB), Download : 6 |
Subject | 엑셀 or 파이썬을 이용한 반복작업 질문입니다 |
티타임에 남긴 글에서 댓글로 파이썬을 추천해주시는 분이 많아서 기초강의를 3회 정도 (거의)정주행 했습니다. 프로그래머스의 입문강좌, 점프 투 파이썬, 코딩도장의 파이썬 강좌 어느정도 파이썬에 대해 맛은 봤고 수식을 보면 더듬더듬 이해는 가는 정도인데 딱히 써먹으려 하니 활용법도 모르겠고 연습문제를 푸는 정도에서 멈추어 있는 상태입니다 그러던 중 회사에서 업무를 시켰는데 보자마자 파이썬이 생각 났습니다 사진에 보이는것처럼 양식에 고객 데이터를 기입하여 출력하는 작업입니다 실제로는 4가지의 양식과 100명이상의 고객 데이터가 주어져 있어 수동으로 하려니 한숨부터 나오네요 양식을 엑셀로 만들고 이름, 생년월일 등을 파이썬 openpyxl을 활용해 for 문을 이용해서 셀 주소만 바꿔가며 입력시키면 될 것 같다는 생각은 떠오르는데 구체적인 방법을 모르겠네요 구글에 검색해도 원하는 정보를 찾지 못한 상태입니다 알고리즘은 간단할것 같은 작업이라 엑셀의 매크로? VBA? 를 활용할수도 있을것 같은데 방법을 아시거나 혹은 저런 유형의 작업을 배울 수 있는 사이트 등을 알려주시면 공부해서 활용해보겠습니다 0
이 게시판에 등록된 Crimson님의 최근 게시물 |
댓글 파일선택은 엑셀은 안올라가는지 해봐도 안되서 구글 스프레드시트 링크 남겨볼께요
https://docs.google.com/spreadsheets/d/1_QnKiH9jphlUTGs0j2P7GeGgF4bUIulN-VeyN2yVlIg/edit?usp=sharing
https://docs.google.com/spreadsheets/d/1_QnKiH9jphlUTGs0j2P7GeGgF4bUIulN-VeyN2yVlIg/edit?usp=sharing
이제 좀 정신을 차렸습니닷
1. openpyxl을 이용해 파이썬 상에서 엑셀 파일을 생성하고, 양식을 조정한다.
2. 고객 데이터를 타겟으로 한 위치에 입력한 후 저장한다.
3. for 문을 이용하여 반복한다.
올려주신 데이터를 기반으로 코드를 간략하게 짜보면
# 라이브러리 불러오기
import pandas as pd
from openpyxl import Workbook
from op... 더 보기
1. openpyxl을 이용해 파이썬 상에서 엑셀 파일을 생성하고, 양식을 조정한다.
2. 고객 데이터를 타겟으로 한 위치에 입력한 후 저장한다.
3. for 문을 이용하여 반복한다.
올려주신 데이터를 기반으로 코드를 간략하게 짜보면
# 라이브러리 불러오기
import pandas as pd
from openpyxl import Workbook
from op... 더 보기
이제 좀 정신을 차렸습니닷
1. openpyxl을 이용해 파이썬 상에서 엑셀 파일을 생성하고, 양식을 조정한다.
2. 고객 데이터를 타겟으로 한 위치에 입력한 후 저장한다.
3. for 문을 이용하여 반복한다.
올려주신 데이터를 기반으로 코드를 간략하게 짜보면
# 라이브러리 불러오기
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
# 엑셀 파일 불러와서 명단만 끌어오기
data = pd.read_excel("fall.xlsx", sheet_name="명단", header = None)
# 엑셀 양식 파이썬으로 만들기(기초적으로)
wb = Workbook() # 워크북 생성
ws = wb.active # 활성화
ws.merge_cells('A1:B2') # A1:B2까지 셀 합치기 - 양식 조정을 위한 예시
ws['A1'] = '수급자명:' # A1:B2까지 합친 셀은 A1으로 찾아들어갈 수 있음. 합친 셀에 글자 입력
name=ws['A1'] # 작업하는 셀을 하나의 변수로 저장
name.alignment = Alignment(horizontal = 'right', vertical = 'center') # 해당 변수의 스타일 조작(글자 위치 조정)
ws.merge_cells('C1:D2') # C1부터 D2까지 합친 후 셀을 합침
ws['C1'].alignment = Alignment(horizontal = 'left', vertical = 'center') # 변수를 따로 생성하지 않고, 병합한 셀 내 글자 위치 조정
# 데이터 입력 및 저장
for i in range(1, 30): # 테스트 용도로 30개만 for문을 돌려봄
ws['C1'] = data[0][i] # 위에서 불러왔던 명단 데이터를 앞서 합쳐둔 빈 셀에 입력.
wb.save('test%d.xlsx' %i) # 이름을 각기 다르게 하여 저장
1. openpyxl을 이용해 파이썬 상에서 엑셀 파일을 생성하고, 양식을 조정한다.
2. 고객 데이터를 타겟으로 한 위치에 입력한 후 저장한다.
3. for 문을 이용하여 반복한다.
올려주신 데이터를 기반으로 코드를 간략하게 짜보면
# 라이브러리 불러오기
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment
# 엑셀 파일 불러와서 명단만 끌어오기
data = pd.read_excel("fall.xlsx", sheet_name="명단", header = None)
# 엑셀 양식 파이썬으로 만들기(기초적으로)
wb = Workbook() # 워크북 생성
ws = wb.active # 활성화
ws.merge_cells('A1:B2') # A1:B2까지 셀 합치기 - 양식 조정을 위한 예시
ws['A1'] = '수급자명:' # A1:B2까지 합친 셀은 A1으로 찾아들어갈 수 있음. 합친 셀에 글자 입력
name=ws['A1'] # 작업하는 셀을 하나의 변수로 저장
name.alignment = Alignment(horizontal = 'right', vertical = 'center') # 해당 변수의 스타일 조작(글자 위치 조정)
ws.merge_cells('C1:D2') # C1부터 D2까지 합친 후 셀을 합침
ws['C1'].alignment = Alignment(horizontal = 'left', vertical = 'center') # 변수를 따로 생성하지 않고, 병합한 셀 내 글자 위치 조정
# 데이터 입력 및 저장
for i in range(1, 30): # 테스트 용도로 30개만 for문을 돌려봄
ws['C1'] = data[0][i] # 위에서 불러왔던 명단 데이터를 앞서 합쳐둔 빈 셀에 입력.
wb.save('test%d.xlsx' %i) # 이름을 각기 다르게 하여 저장
저는 주피터 노트북으로 작업했는데, 위 코드를 한 번 실행해 보실래요? 컴공이 전공이 아니라 코드가 깔끔하거나 효율적으로 짜여있지는 않지만... 위 방식을 따라가면 원하시는 방식을 구현할 수는 있을 듯해요.
미리 양식을 엑셀로 짜놓은 이후에, openpyxl로 불러오면 그대로 양식이 유지될지도 모르겠네요. 이 경우에는 파이썬에서 일일히 작업하는 부담을 줄일 수 있을텐데 체크해봐야겠어요.
http://www.hanul93.com/openpyxl-basic/
전 위 링크를 참고했습니다.
미리 양식을 엑셀로 짜놓은 이후에, openpyxl로 불러오면 그대로 양식이 유지될지도 모르겠네요. 이 경우에는 파이썬에서 일일히 작업하는 부담을 줄일 수 있을텐데 체크해봐야겠어요.
http://www.hanul93.com/openpyxl-basic/
전 위 링크를 참고했습니다.
일단 올려주신 코드상에서는 이런 에러가 떠버렸네요
ws['C1'] = data[0][i] # 위에서 불러왔던 명단 데이터를 앞서 합쳐둔 빈 셀에 입력.
^
IndentationError: expected an indented block
ws['C1'] = data[0][i] # 위에서 불러왔던 명단 데이터를 앞서 합쳐둔 빈 셀에 입력.
^
IndentationError: expected an indented block
from openpyxl import load_workbook
wb = load_workbook(filename='pt.xlsx', data_only=True)
ws1 = wb['1']
ws2 = wb['2']
ws3 = wb['3']
ws4 = wb['4']
ws5 = wb['5']
for i in range(2,10):
... 더 보기
wb = load_workbook(filename='pt.xlsx', data_only=True)
ws1 = wb['1']
ws2 = wb['2']
ws3 = wb['3']
ws4 = wb['4']
ws5 = wb['5']
for i in range(2,10):
... 더 보기
from openpyxl import load_workbook
wb = load_workbook(filename='pt.xlsx', data_only=True)
ws1 = wb['1']
ws2 = wb['2']
ws3 = wb['3']
ws4 = wb['4']
ws5 = wb['5']
for i in range(2,10):
name = "=5!a%d" % i
ws1['I8'] = name
ws2['g4'] = name
ws3['d13'] = name
ws4['b9'] = name
wb.save('%s.xlsx' %name)
제가 만든 코드인데 저장할때 =5!a2.xlsx, =5!a3.xlsx 이런식으로 마지막 숫자만 커지며 수식으로된 파일이 생성되네요
wb = load_workbook(filename='pt.xlsx', data_only=True)
ws1 = wb['1']
ws2 = wb['2']
ws3 = wb['3']
ws4 = wb['4']
ws5 = wb['5']
for i in range(2,10):
name = "=5!a%d" % i
ws1['I8'] = name
ws2['g4'] = name
ws3['d13'] = name
ws4['b9'] = name
wb.save('%s.xlsx' %name)
제가 만든 코드인데 저장할때 =5!a2.xlsx, =5!a3.xlsx 이런식으로 마지막 숫자만 커지며 수식으로된 파일이 생성되네요
아 그리고 하나만 더!
현재 샘플로 올린fall 파일 안에있는 양식과 명단이라는 시트가 있는데
사실 양식으로 쓸 시트가 4가지 명단시트 1가지 총 5개 시트인데
인쇄하려고 보니 한번에 통합인쇄를 하면 명단시트가 딸려나와서
for i in range(2,10):
wb = load_workbook(filename='{}.xlsx'.format(i))
ws5 = wb['5']
wb.remove_sheet(ws5)
wb.save('x{}.xlsx'.for... 더 보기
현재 샘플로 올린fall 파일 안에있는 양식과 명단이라는 시트가 있는데
사실 양식으로 쓸 시트가 4가지 명단시트 1가지 총 5개 시트인데
인쇄하려고 보니 한번에 통합인쇄를 하면 명단시트가 딸려나와서
for i in range(2,10):
wb = load_workbook(filename='{}.xlsx'.format(i))
ws5 = wb['5']
wb.remove_sheet(ws5)
wb.save('x{}.xlsx'.for... 더 보기
아 그리고 하나만 더!
현재 샘플로 올린fall 파일 안에있는 양식과 명단이라는 시트가 있는데
사실 양식으로 쓸 시트가 4가지 명단시트 1가지 총 5개 시트인데
인쇄하려고 보니 한번에 통합인쇄를 하면 명단시트가 딸려나와서
for i in range(2,10):
wb = load_workbook(filename='{}.xlsx'.format(i))
ws5 = wb['5']
wb.remove_sheet(ws5)
wb.save('x{}.xlsx'.format(i))
이용해서 명단시트를 제거하니 양식 시트에 값이 안닌 수식오류가 떠서 값으로 어떻게 바꾸나 찾아보니 openpyxl 의 한계라고 나오네요
이런 경우 시트를 분리해서 양식파일.xls 명단파일.xls 두개로 만들어서 코드를 다시 짜야할까요?
시트 안에서 코딩은 얼추 하겠는데 파일 2개로 불러오는건 찾아보니 잘 안나와서 힘드네요
현재 샘플로 올린fall 파일 안에있는 양식과 명단이라는 시트가 있는데
사실 양식으로 쓸 시트가 4가지 명단시트 1가지 총 5개 시트인데
인쇄하려고 보니 한번에 통합인쇄를 하면 명단시트가 딸려나와서
for i in range(2,10):
wb = load_workbook(filename='{}.xlsx'.format(i))
ws5 = wb['5']
wb.remove_sheet(ws5)
wb.save('x{}.xlsx'.format(i))
이용해서 명단시트를 제거하니 양식 시트에 값이 안닌 수식오류가 떠서 값으로 어떻게 바꾸나 찾아보니 openpyxl 의 한계라고 나오네요
이런 경우 시트를 분리해서 양식파일.xls 명단파일.xls 두개로 만들어서 코드를 다시 짜야할까요?
시트 안에서 코딩은 얼추 하겠는데 파일 2개로 불러오는건 찾아보니 잘 안나와서 힘드네요
네네, 문자열 포맷팅 논리가
"=5!a" + "%d" + %i
(for문을 통해 i에 들어오는 값들을 %d 위치로 집어넣기)
로 되어있으니
for i in range(2,10):
name = "=5!a%d" % i
print(name)
를 하면 결과가
5!a2
5!a3
5!a4
...
로 되네요.
pt.xlsx 파일이 없어서 추측하자면
5개의 워크시트가 있는데,
워크시트 1의 l8, 2의 g4, 3의 d13, 4의 b9에 name을 각각 입력하는 코드 같은데... 더 보기
"=5!a" + "%d" + %i
(for문을 통해 i에 들어오는 값들을 %d 위치로 집어넣기)
로 되어있으니
for i in range(2,10):
name = "=5!a%d" % i
print(name)
를 하면 결과가
5!a2
5!a3
5!a4
...
로 되네요.
pt.xlsx 파일이 없어서 추측하자면
5개의 워크시트가 있는데,
워크시트 1의 l8, 2의 g4, 3의 d13, 4의 b9에 name을 각각 입력하는 코드 같은데... 더 보기
네네, 문자열 포맷팅 논리가
"=5!a" + "%d" + %i
(for문을 통해 i에 들어오는 값들을 %d 위치로 집어넣기)
로 되어있으니
for i in range(2,10):
name = "=5!a%d" % i
print(name)
를 하면 결과가
5!a2
5!a3
5!a4
...
로 되네요.
pt.xlsx 파일이 없어서 추측하자면
5개의 워크시트가 있는데,
워크시트 1의 l8, 2의 g4, 3의 d13, 4의 b9에 name을 각각 입력하는 코드 같은데
name은 원하시는대로 들어갔나요?
지금 쓰인 방식이라면 name도 수식으로 5!a2, 5!a3 등이 name이 들어가야 하는 칸에 들어갈 것 같거든요.
"=5!a" + "%d" + %i
(for문을 통해 i에 들어오는 값들을 %d 위치로 집어넣기)
로 되어있으니
for i in range(2,10):
name = "=5!a%d" % i
print(name)
를 하면 결과가
5!a2
5!a3
5!a4
...
로 되네요.
pt.xlsx 파일이 없어서 추측하자면
5개의 워크시트가 있는데,
워크시트 1의 l8, 2의 g4, 3의 d13, 4의 b9에 name을 각각 입력하는 코드 같은데
name은 원하시는대로 들어갔나요?
지금 쓰인 방식이라면 name도 수식으로 5!a2, 5!a3 등이 name이 들어가야 하는 칸에 들어갈 것 같거든요.
제가 추측하는 바가 맞는 듯하네요.
써주신 코드를 fall.xlsx에 맞춰서 변형해보면
from openpyxl import load_workbook
wb = load_workbook(filename='fall.xlsx', data_only=True)
ws1 = wb['양식']
ws2 = wb['명단']
for i in range(2,10):
name = "=명단!a%d" % i
ws1... 더 보기
써주신 코드를 fall.xlsx에 맞춰서 변형해보면
from openpyxl import load_workbook
wb = load_workbook(filename='fall.xlsx', data_only=True)
ws1 = wb['양식']
ws2 = wb['명단']
for i in range(2,10):
name = "=명단!a%d" % i
ws1... 더 보기
제가 추측하는 바가 맞는 듯하네요.
써주신 코드를 fall.xlsx에 맞춰서 변형해보면
from openpyxl import load_workbook
wb = load_workbook(filename='fall.xlsx', data_only=True)
ws1 = wb['양식']
ws2 = wb['명단']
for i in range(2,10):
name = "=명단!a%d" % i
ws1['l4'] = name
wb.save('%s.xlsx' %name)
로 조정해서
두 번째 시트에 있는 명단을 첫 번째 양식의 l4에 기입하도록 했어요.
엑셀 파일을 열어보니
서명자 위치에 "명단!A2", "명단!A3"... 방식으로 수식이 하나씩 입력되면서 데이터를 끌어오는 식으로 구성되네요.
근데 이거는 엑셀 내부에서 서로 형님 아우 하는 느낌이고
엑셀보다 위에서 파일을 관리하는 파이썬 입장에서는 '이게 무슨 소리여' 할 것 같아요.
파이썬에서는 '명단!A2'라고 했을 때 엑셀처럼 알아듣지 못하니까요.
그러니 제 킹리적 갓심으로는 아래처럼 코드를 변형하시면 될 것 같습니다.
from openpyxl import load_workbook
wb = load_workbook(filename='pt.xlsx', data_only=True)
ws1 = wb['1']
ws2 = wb['2']
ws3 = wb['3']
ws4 = wb['4']
ws5 = wb['5']
namelist=[]
for row in ws5.rows:
namelist.append(row[0].value)
for i in range(2,10):
name = "=5!a%d" % i
ws1['I8'] = name
ws2['g4'] = name
ws3['d13'] = name
ws4['b9'] = name
wb.save('%s.xlsx' %namelist[i])
써주신 코드를 fall.xlsx에 맞춰서 변형해보면
from openpyxl import load_workbook
wb = load_workbook(filename='fall.xlsx', data_only=True)
ws1 = wb['양식']
ws2 = wb['명단']
for i in range(2,10):
name = "=명단!a%d" % i
ws1['l4'] = name
wb.save('%s.xlsx' %name)
로 조정해서
두 번째 시트에 있는 명단을 첫 번째 양식의 l4에 기입하도록 했어요.
엑셀 파일을 열어보니
서명자 위치에 "명단!A2", "명단!A3"... 방식으로 수식이 하나씩 입력되면서 데이터를 끌어오는 식으로 구성되네요.
근데 이거는 엑셀 내부에서 서로 형님 아우 하는 느낌이고
엑셀보다 위에서 파일을 관리하는 파이썬 입장에서는 '이게 무슨 소리여' 할 것 같아요.
파이썬에서는 '명단!A2'라고 했을 때 엑셀처럼 알아듣지 못하니까요.
그러니 제 킹리적 갓심으로는 아래처럼 코드를 변형하시면 될 것 같습니다.
from openpyxl import load_workbook
wb = load_workbook(filename='pt.xlsx', data_only=True)
ws1 = wb['1']
ws2 = wb['2']
ws3 = wb['3']
ws4 = wb['4']
ws5 = wb['5']
namelist=[]
for row in ws5.rows:
namelist.append(row[0].value)
for i in range(2,10):
name = "=5!a%d" % i
ws1['I8'] = name
ws2['g4'] = name
ws3['d13'] = name
ws4['b9'] = name
wb.save('%s.xlsx' %namelist[i])
목록 |
|