본문 바로가기

Python

파이썬 엑셀 loop 시트 생성

하나의 엑셀 파일에(워크북) 엑셀 시트별로 동일한 형태의 자료가 있을 때

동일한 함수나 수식을 적용한 워크북을 시트별로 생성하고 싶을 때

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import openpyxl
import pandas as pd
import sys
from openpyxl import load_workbook  
sys.path.append("C:\\pytest")
xlsxFile = 'C:\\pytest\\commoditydata.xlsx'
wb = openpyxl.load_workbook(xlsxFile)
 
# 시트 이름 확인하기
wb.sheetnames
 
# 시트 데이터 가져와서 시트별로 저장하기
for item in wb.sheetnames[:]:
    df = pd.read_excel(xlsxFile, item, index_col = 'DATE', parse_dates = True)
    df = df.copy().resample('W').mean()
      
    path = r"C:\\pytest\\looptest.xlsx"
           
    book = load_workbook(path)
    writer = pd.ExcelWriter(path, engine = 'openpyxl')
    writer.book = book
    
    df.to_excel(writer, sheet_name = item)
    writer.save()
    writer.close()
cs

여기서는 데이터 프레임 주간 평균을 간단하게 적용해 본 것 뿐.

간단한 거 같은데 막상 쓸려면 헤매는구나...

저장할 looptest.xlsx 파일은 미리 생성되어 있어야 한다. 

 

다만 위 코드를 주간마다  반복할 경우 시트 수가 계속 생성된다는 문제점이 있다. ㄷㄷ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import openpyxl
import pandas as pd
import sys
from openpyxl import load_workbook  
sys.path.append("C:\\pytest")
xlsxFile = 'C:\\pytest\\commoditydata.xlsx'
wb = openpyxl.load_workbook(xlsxFile)
 
# 시트 이름 확인하기
wb.sheetnames
 
# 파일 없을 경우 워크북 생성해서 시트별로 저장하기
for item in wb.sheetnames[:]:
    df = pd.read_excel(xlsxFile, item, index_col = 'DATE', parse_dates = True)
    df = df.copy().resample('W').mean()
      
    try:
        path = r"C:\\pytest\\looptest.xlsx"
        wb = load_workbook(path)
        sheet = wb.active
        print("기존의 파일 불러오기 완료")
        
    
    except:
        wb = openpyxl.Workbook()
        sheet = wb.active
        print("새로운 파일 생성 완료")
           
    book = wb
    writer = pd.ExcelWriter(path, engine = 'openpyxl')
    writer.book = book
    
    df.to_excel(writer, sheet_name = item)
    writer.save()
    writer.close()
cs

따라서, try 및 except를 이용하여 새로운 워크북을 생성한 후 저장하기 위해서 위 코드를 이용. 

위 코드는 파일 생성용 엑셀 파일을 미리 만들 필요가 없다.