반응형

 

아래 코드는 차트의 아래 부분을 변경함. (x축 값)

 

해당 값을 엑셀로 확인하는 방법.

 

 

반응형

 

코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart
from openpyxl.chart.data_source import AxDataSource, NumRef, StrRef
from openpyxl.chart.axis import ChartLines

path = '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

# 차트의 x축값, 카테고리를 출력
def print_chart_categories(chart):
    # Access all chart types within the composite chart
    bar_chart, line_chart = read_composite_chart(chart)

    # Print Bar Chart categories
    if bar_chart and bar_chart.series[0].cat:
        print("Bar Chart Categories:")
        for label in bar_chart.series[0].cat.strRef.strCache.pt:
            # 사용할 수 있는 변수 확인 idx, v
            print(vars(label)) 
            
            # 확인한 변수를 가지고 출력
            print(label.idx)
            print(label.v)

    # Print Line Chart categories
    # if line_chart and line_chart.series[0].cat:
    #     print("Line Chart Categories:")
    #     for label in line_chart.series[0].cat.strRef.strCache.pt:
    #         print(label.v)


# 차트의 카테고리 범위 변경.
def update_chart_categories(chart, sheet, new_range):
    # Access all chart types within the composite chart
    bar_chart, line_chart = read_composite_chart(chart)

    # Update Bar Chart categories
    if bar_chart:
        bar_chart.series[0].cat = AxDataSource(strRef=StrRef(f=new_range))
        print("Bar Chart categories updated.")

    # Update Line Chart categories
    if line_chart:
        line_chart.series[0].cat = AxDataSource(strRef=StrRef(f=new_range))
        print("Line Chart categories updated.")


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


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

# 새로운 카테고리 범위 설정 (예: C18:C30)
# 엑셀에서 해당 범위 드레그로 확인해서 복붙하는게 좋음.
new_range = "'Sheet1'!$C$18:$C$20"
update_chart_categories(chart, sheet, new_range)


wb.save(path)
# 엑셀 파일 닫기
wb.close()

 

 

 

 

 

반응형
반응형

 

엑셀의 차트의 카테코리 정보를 출력.

아래와 같이 data가 아닌, categories를 출력하는 코드.

결과

 

반응형

 

코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart

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_and_categories(chart):
    # Access all chart types within the composite chart
    bar_chart, line_chart = read_composite_chart(chart)

    # Print Bar Chart series titles and categories
    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}")

        # Print Bar Chart categories
        if bar_chart.series[0].cat:
            print("Bar Chart Categories:")
            for label in bar_chart.series[0].cat.strRef.strCache.pt:
                print(label.v)

    # Print Line Chart series titles and categories
    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}")

        # Print Line Chart categories
        if line_chart.series[0].cat:
            print("Line Chart Categories:")
            for label in line_chart.series[0].cat.strRef.strCache.pt:
                print(label.v)

# 엑셀 파일 열기
wb = openpyxl.load_workbook('C:\\temp\\test.xlsx')
sheet = wb['Sheet1']  # 원하는 시트 이름으로 변경


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

# 시리즈 와 카테고리 출력
print_chart_series_and_categories(chart)

# 엑셀 파일 닫기
wb.close()

 

 

 

 

 

반응형
반응형

 

 

만약 기존의 엑셀에 있는 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()

 

 

 

 

반응형
반응형

 

 

결과

아래와 같은 그래프가 있을 때 결과가 잘 출력된다.

 

 

코드

import openpyxl
from openpyxl.chart import Reference, BarChart, LineChart

# 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}")

# 엑셀 파일 열기
wb = openpyxl.load_workbook('C:\\_workspace\\_SS_MX\\_LicenseUsageCheck\\Siemens_License_Report_Server_Template.xlsx')
sheet = wb['Sheet1']  # 원하는 시트 이름으로 변경

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

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

# 엑셀 파일 닫기
wb.close()

 

읽은 차트의 Series를 수정하려면 아래를 참고.

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

 

[Python] 엑셀 Chart Series (legend)의 range값 변경

만약 기존의 엑셀에 있는 Chart 정보를 읽고 출력하는 방법은 아래를 참고.https://ansan-survivor.tistory.com/1980 [Python] 엑셀의 Chart 읽고 Series (legend)의 제목과 range값 출력결과아래와 같은 그래프가 있을

ansan-survivor.tistory.com

 

 

 

 

반응형
1

+ Recent posts