반응형

 

 

만약 기존의 엑셀에 있는 Chart 정보를 읽고 출력하는 방법은 아래를 참고.

https://ansan-survivor.tistory.com/1980

 

[Python] 엑셀의 Chart 읽고 Series (legend)의 제목과 range값 출력

결과아래와 같은 그래프가 있을 때 결과가 잘 출력된다.  코드import openpyxlfrom openpyxl.chart import Reference, BarChart, LineChart# bar와 line이 합쳐진 복합 차트.def read_composite_chart(chart): bar_chart = None line_char

ansan-survivor.tistory.com

 

 

아래 코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart, Series
from copy import deepcopy

# 로드 후 결과를 다시 저장할 경로.
DEST_PATH = r"C:\Temp\test.xlsx"

# Bar와 Line형태의 차트를 읽기
def read_composite_chart(chart):
    bar_chart = None
    line_chart = None

    for ch in chart._charts:
        if isinstance(ch, BarChart):
            bar_chart = ch
        elif isinstance(ch, LineChart):
            line_chart = ch
    return bar_chart, line_chart

# 차트의 정보 출력
def print_chart_series(chart):
    # 차트 객체의 모든 차트 유형 접근
    bar_chart, line_chart = read_composite_chart(chart)

    # 바 차트 시리즈의 제목 출력
    if bar_chart:
        print("Bar Chart Series Titles:")
        for i, series in enumerate(bar_chart.series):
            barTitle = series.tx.v if series.tx and series.tx.v else series.title
            bar_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {barTitle}")
            print(f"Bar Chart Series Values Reference: {bar_val_ref}")

    # 라인 차트 시리즈의 제목 출력
    if line_chart:
        print("Line Chart Series Titles:")
        for i, series in enumerate(line_chart.series):
            lineTitle = series.tx.v if series.tx and series.tx.v else series.title
            line_val_ref = series.val.numRef.f if series.val and series.val.numRef else None
            print(f"title: {lineTitle}")
            print(f"Line Chart Series Values Reference: {line_val_ref}")


# 접근한 차트의 Series의 Range 정보를 변경
def modify_chart_series_ranges(chart, new_bar_range, new_line_range):
    bar_chart, line_chart = read_composite_chart(chart)

    if bar_chart:
        for i, series in enumerate(bar_chart.series):
            series.val.numRef.f = new_bar_range
            print(f"Updated Bar Chart Series {i+1} to range: {new_bar_range}")

    if line_chart:
        for i, series in enumerate(line_chart.series):
            series.val.numRef.f = new_line_range
            print(f"Updated Line Chart Series {i+1} to range: {new_line_range}")


# 엑셀 파일 열기
wb = openpyxl.load_workbook(DEST_PATH)
sheet = wb['Shee1']  # 원하는 시트 이름으로 변경


# 차트 객체 가져오기 (첫 번째 차트로 가정)
chart = sheet._charts[0]

# 시리즈 제목 출력
print_chart_series(chart)

# 새로운 Range 설정
new_bar_range = "'Shee1'!$M$18:$M$50"
new_line_range = "'Shee1'!$N$18:$N$50"


# 시리즈의 범위 변경
modify_chart_series_ranges(chart, new_bar_range, new_line_range)


# 변경한 정보 저장
wb.save(DEST_PATH)
# 엑셀 파일 닫기
wb.close()

 

 

 

 

반응형

+ Recent posts