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()
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()
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()
이는 일반적으로 레이아웃 프로그램에서 설정할 수 있습니다. 예를 들어, Eagle 프로그램에서는 그리드 영역을 "Hatch"라고 부릅니다.
물론 이는 민감한 고주파의 배선(Trace)이 없는 경우에만 가능합니다. "Grid"는 특히 단 하나의 레이어(one layer)만 있는 회로 기판의 경우 "뒤틀림" 및 "휨" 효과를 방지하는 데 큰 도움이 됩니다.
구리가 없는 영역은 ( Grid ) 구리로 채워야 합니다.
장점: Plated Through-Hole 벽의 균일성이 향상됩니다. 회로 기판의 비틀림 및 휘어짐을 방지합니다.
2. 구리가 Layer (층) 간에서도 상하대칭이 되어야 한다.
큰 구리 영역은 반대쪽 레이어의 "copper filling"으로 균형을 맞춰야 합니다. 또한 가능한 Copper Trace를 보드 전체에 최대한 균일하게 분포시키십시오. (고주파 설계와 관계 없다면) 다층 회로 기판(Multi layer board)의 경우 반대쪽 레이어와 Copper가 대칭하도록 "Copper Filling (구리 채우기)"을 합니다.
3. Copper foil(동박)의 두께는 상하 Layer에 대해 항상 대칭적으로 분포
회로 기판의 레이어 빌드업에서 Copper foil(동박)의 두께는 항상 대칭적으로 분포되어야 합니다. 물론 비대칭 레이어 빌드업을 제작할 수 있지만, 변형 가능성 때문에 이러한 설계는 지양하는 것이 좋습니다.
Batch 파일로 현재 PC의 Network Adapter를 모두 찾아내고, 그 아래 부여된 IP주소를 출력.
여기서 IP주소는 IPv4, IPv6 를 의미.
코드
@echo off
setlocal enabledelayedexpansion
REM 임시 파일 생성
ipconfig > temp.txt
REM "Ethernet adapter" 또는 "Wireless LAN adapter"가 포함된 줄을 찾아서 임시 파일에 저장
findstr /r /c:"Ethernet adapter" /c:"Wireless LAN adapter" temp.txt > temp2.txt
REM 임시 파일에서 라인 단위로 읽으면서 어댑터 명과 IP 주소를 출력
for /f "tokens=1-2 delims=:" %%a in (temp2.txt) do (
set "adapter=%%a"
set "adapter=!adapter:~0,-1!"
echo !adapter!
REM 각 어댑터에 대한 IP 주소 출력
for /f "tokens=2 delims=:" %%i in ('ipconfig ^| findstr /r /c:"IPv4 Address" /c:"IPv6 Address"') do (
set "ip_address=%%i"
set "ip_address=!ip_address: =!"
echo IP Address: !ip_address!
)
)
pause
temp1 파일
temp2 파일
temp2 파일에서 어댑터와 IP주소만 읽어서 출력.
결과
아래 코드는 한번 adapter를 보여주고 pause 후 ip 주소를 보여줌.
코드
@echo off
setlocal enabledelayedexpansion
REM 어댑터 이름 가져오기
for /f "tokens=1-2 delims=:" %%a in ('ipconfig ^| findstr /r /c:"Ethernet adapter" /c:"Wireless LAN adapter"') do (
set "adapter=%%a"
set "adapter=!adapter:~0,-1!"
echo !adapter!
)
pause
REM IP 주소 가져오기
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /r /c:"IPv4 Address"') do (
set "ip_address=%%a"
set "ip_address=!ip_address: =!"
echo !adapter!: !ip_address!
)
pause