ncepst-exceltools 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ncepst_exceltools-0.1.0/LICENSE +21 -0
- ncepst_exceltools-0.1.0/PKG-INFO +598 -0
- ncepst_exceltools-0.1.0/README.md +326 -0
- ncepst_exceltools-0.1.0/exceltools/BatchModifyCharts.py +231 -0
- ncepst_exceltools-0.1.0/exceltools/ModifyChart.py +992 -0
- ncepst_exceltools-0.1.0/exceltools/README_PYPI.md +578 -0
- ncepst_exceltools-0.1.0/exceltools/ScatterChart.py +719 -0
- ncepst_exceltools-0.1.0/exceltools/__init__.py +4 -0
- ncepst_exceltools-0.1.0/exceltools/create_sheet_index.py +99 -0
- ncepst_exceltools-0.1.0/ncepst_exceltools.egg-info/PKG-INFO +598 -0
- ncepst_exceltools-0.1.0/ncepst_exceltools.egg-info/SOURCES.txt +14 -0
- ncepst_exceltools-0.1.0/ncepst_exceltools.egg-info/dependency_links.txt +1 -0
- ncepst_exceltools-0.1.0/ncepst_exceltools.egg-info/requires.txt +4 -0
- ncepst_exceltools-0.1.0/ncepst_exceltools.egg-info/top_level.txt +1 -0
- ncepst_exceltools-0.1.0/pyproject.toml +33 -0
- ncepst_exceltools-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 ncepst
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ncepst-exceltools
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Create and format native Excel charts using xlwings on Windows
|
|
5
|
+
Author: ncepst
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Repository, https://github.com/ncepst/PyExcelTools
|
|
8
|
+
Project-URL: Issues, https://github.com/ncepst/PyExcelTools/issues
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Topic :: Office/Business
|
|
13
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
14
|
+
Requires-Python: >=3.10
|
|
15
|
+
Description-Content-Type: text/markdown
|
|
16
|
+
License-File: LICENSE
|
|
17
|
+
Requires-Dist: xlwings
|
|
18
|
+
Requires-Dist: pywin32; sys_platform == "win32"
|
|
19
|
+
Dynamic: license-file
|
|
20
|
+
|
|
21
|
+
## はじめに
|
|
22
|
+
本ライブラリは、**Pythonで技術資料向けの Excel グラフの体裁を効率的に整える**ことを目的としています。
|
|
23
|
+
主に **XYプロット(散布図)** を対象としており、測定データやシミュレーションデータなど、繰り返しグラフ作成が必要となる用途を想定しています。
|
|
24
|
+
|
|
25
|
+
対象環境は Windows + Excel (Excel 2021 以降推奨)+ Python 3.10 以降 となります。
|
|
26
|
+
使用する主なライブラリは `xlwings` と `win32com` です。
|
|
27
|
+
|
|
28
|
+
## 基本的な使い方
|
|
29
|
+
|
|
30
|
+
### インストール方法
|
|
31
|
+
|
|
32
|
+
```powershell
|
|
33
|
+
pip install ncepst-exceltools
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 最新版への更新
|
|
37
|
+
|
|
38
|
+
```powershell
|
|
39
|
+
pip install --upgrade ncepst-exceltools
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 散布図を作成する
|
|
43
|
+
|
|
44
|
+
```python
|
|
45
|
+
import xlwings as xw
|
|
46
|
+
from xlwings.constants import AxisType
|
|
47
|
+
from win32com.client import constants
|
|
48
|
+
import numpy as np
|
|
49
|
+
import time
|
|
50
|
+
import os
|
|
51
|
+
from exceltools import ScatterChart, RGB
|
|
52
|
+
|
|
53
|
+
# 計測開始
|
|
54
|
+
t1 = time.time()
|
|
55
|
+
|
|
56
|
+
SeriesName = "系列名"
|
|
57
|
+
title = "タイトル"
|
|
58
|
+
|
|
59
|
+
# ------------------------------------------------------------
|
|
60
|
+
# path は適宜変更してください (Ctrl + Shift + C でパスのコピー)
|
|
61
|
+
# ------------------------------------------------------------
|
|
62
|
+
excel_path = r"C:\Users\*****\Desktop\test.xlsx"
|
|
63
|
+
Sheet = "Sheet1"
|
|
64
|
+
|
|
65
|
+
# 指定のエクセルファイルがなければ作成する
|
|
66
|
+
if not os.path.exists(excel_path):
|
|
67
|
+
wb = xw.Book() # 新規Excelを開く
|
|
68
|
+
wb.save(excel_path)
|
|
69
|
+
else:
|
|
70
|
+
wb = xw.Book(excel_path) # 既存のExcelを開く
|
|
71
|
+
|
|
72
|
+
# 指定のワークシートがなければ作成する
|
|
73
|
+
if Sheet in [s.name for s in wb.sheets]:
|
|
74
|
+
ws = wb.sheets[Sheet]
|
|
75
|
+
else:
|
|
76
|
+
ws = wb.sheets.add(Sheet)
|
|
77
|
+
|
|
78
|
+
# エクセルの画面更新を無効にする
|
|
79
|
+
wb.app.screen_updating = False
|
|
80
|
+
|
|
81
|
+
# 上部に13行のセルを挿入する
|
|
82
|
+
ws.range("1:13").insert("down")
|
|
83
|
+
|
|
84
|
+
# デモデータ作成
|
|
85
|
+
data = 19
|
|
86
|
+
cell0 = np.linspace(-90, 90, data)
|
|
87
|
+
cell1 = np.cos(np.deg2rad(cell0))
|
|
88
|
+
cell = [cell0, cell1]
|
|
89
|
+
|
|
90
|
+
# データの貼り付け
|
|
91
|
+
ws.range(4,8).value = SeriesName
|
|
92
|
+
ws.range(2,8).value = title
|
|
93
|
+
for n in range(2):
|
|
94
|
+
for i in range(data):
|
|
95
|
+
ws.range(n+3,i+9).value = cell[n][i]
|
|
96
|
+
|
|
97
|
+
# 数値の表示桁数の変更
|
|
98
|
+
for i in range(data):
|
|
99
|
+
ws.range(3, i+9).number_format = "0" # 小数0桁まで
|
|
100
|
+
for i in range(data):
|
|
101
|
+
ws.range(4, i+9).number_format = "0.00" # 小数2桁まで
|
|
102
|
+
|
|
103
|
+
# cell1を数式に変更したい場合
|
|
104
|
+
for n in range(data):
|
|
105
|
+
col = 9 + n # 9=I列
|
|
106
|
+
col_letter = xw.utils.col_name(col) # "I", "J", "K", ...
|
|
107
|
+
ws.range(4, col).value = f"=cos({col_letter}3/180*pi())"
|
|
108
|
+
ws.range(5, col).value = f"=cos({col_letter}3/180*pi())*1.01"
|
|
109
|
+
|
|
110
|
+
chart1 = ScatterChart(ws = ws,
|
|
111
|
+
start_range="H3",
|
|
112
|
+
row = 3,
|
|
113
|
+
col = data +1,
|
|
114
|
+
paste_range="A1",
|
|
115
|
+
width_cm=12.54,
|
|
116
|
+
height_cm=7.54,
|
|
117
|
+
name = "",
|
|
118
|
+
title = "",
|
|
119
|
+
series_list = [{"color": RGB(68,114,196)}],
|
|
120
|
+
x_title = "角度 (deg.)",
|
|
121
|
+
x_min = -90,
|
|
122
|
+
x_max = +90,
|
|
123
|
+
x_major = 15,
|
|
124
|
+
x_cross = -90,
|
|
125
|
+
x_format = "0",
|
|
126
|
+
y_format = "0.0",
|
|
127
|
+
legend="",
|
|
128
|
+
frame_color="",
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
# エクセルの画面更新を有効にする
|
|
132
|
+
wb.app.screen_updating = True
|
|
133
|
+
|
|
134
|
+
# エクセルファイルを保存する
|
|
135
|
+
wb.save()
|
|
136
|
+
|
|
137
|
+
# 計測終了
|
|
138
|
+
t2 = time.time()
|
|
139
|
+
elapsed_time = round(t2-t1,3)
|
|
140
|
+
print("処理時間:"+str(elapsed_time)+" s")
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 選択中のグラフを修正する
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
from exceltools import ModifyChart, RGB, add_shape, add_line, template
|
|
147
|
+
import xlwings as xw
|
|
148
|
+
import time
|
|
149
|
+
|
|
150
|
+
# 計測開始
|
|
151
|
+
t1 = time.time()
|
|
152
|
+
|
|
153
|
+
wb = None
|
|
154
|
+
try:
|
|
155
|
+
wb = xw.books.active
|
|
156
|
+
ws = wb.sheets.active
|
|
157
|
+
wb.app.screen_updating = False
|
|
158
|
+
|
|
159
|
+
import random
|
|
160
|
+
r = random.randint(0, 100)
|
|
161
|
+
|
|
162
|
+
chart = ModifyChart(title=f"タイトル{r}", width_cm=12, height_cm=8, title_space=0, x_major=15,
|
|
163
|
+
NS=1, plot_area_space="absolute", height_inc=0,width_inc=0)
|
|
164
|
+
|
|
165
|
+
wb.app.screen_updating = True
|
|
166
|
+
|
|
167
|
+
except Exception as e:
|
|
168
|
+
print("Error:",e)
|
|
169
|
+
|
|
170
|
+
finally:
|
|
171
|
+
if wb is not None:
|
|
172
|
+
wb.app.screen_updating = True
|
|
173
|
+
|
|
174
|
+
# 計測終了
|
|
175
|
+
t2 = time.time()
|
|
176
|
+
elapsed_time = round(t2-t1,3)
|
|
177
|
+
print("処理時間:"+str(elapsed_time)+" s")
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### 複数グラフの一括変更
|
|
181
|
+
|
|
182
|
+
```python
|
|
183
|
+
import xlwings as xw
|
|
184
|
+
from exceltools import BatchModifyCharts
|
|
185
|
+
|
|
186
|
+
# アクティブシートの埋め込みグラフを変更
|
|
187
|
+
charts = BatchModifyCharts(target="sheet", preset="std", width_cm=12)
|
|
188
|
+
print(f"{len(charts)} 個のグラフを処理しました")
|
|
189
|
+
|
|
190
|
+
# Ctrlを押しながら外枠を複数選択したグラフだけを変更
|
|
191
|
+
BatchModifyCharts(target="selected", preset="excel2021")
|
|
192
|
+
|
|
193
|
+
# アクティブブックの全ワークシートを対象に変更
|
|
194
|
+
BatchModifyCharts(target="book", preset="no_grid", legend_font_size=12)
|
|
195
|
+
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
BatchModifyChartsにおいては、`NS=None`(既定)で各グラフの系列数を自動取得します。
|
|
199
|
+
`sheet`、`book`、`selected` モードでは、変更後のブックを自動保存しません。
|
|
200
|
+
必要に応じてExcelで保存してください。
|
|
201
|
+
`dir` モードのみ、処理後に上書き保存します。
|
|
202
|
+
|
|
203
|
+
### フォルダ内のExcelファイルを一括変更
|
|
204
|
+
|
|
205
|
+
`target="dir"` を指定し、`directory` に対象フォルダのパスを渡します。
|
|
206
|
+
以下のパスは、ご自身のフォルダに置き換えてください。
|
|
207
|
+
Windowsのパスは `r"..."` と書くと、バックスラッシュ(`\`)をそのまま指定できます。
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
from exceltools import BatchModifyCharts
|
|
211
|
+
|
|
212
|
+
saved = BatchModifyCharts(
|
|
213
|
+
target="dir",
|
|
214
|
+
directory=r"C:\Users\ユーザー名\Documents\測定結果",
|
|
215
|
+
recursive=False, # True: サブフォルダも対象
|
|
216
|
+
preset="grid",
|
|
217
|
+
width_cm=12,
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
for path in saved:
|
|
221
|
+
print("保存:", path)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
`recursive=False`(既定)では指定フォルダ直下だけを処理します。
|
|
225
|
+
サブフォルダ内のファイルも対象にする場合は `recursive=True` を指定します。
|
|
226
|
+
|
|
227
|
+
実行すると対象ファイルの一覧と、次の確認を表示します。
|
|
228
|
+
|
|
229
|
+
```text
|
|
230
|
+
上記ファイルの全てにグラフの書式設定を適用しますか?[yes/N] :
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
`yes` と入力すると実行します。`Yes`、`YES` も使用できます。
|
|
234
|
+
Enterのみ、`N`、`y` など、それ以外の入力ではファイルを開かず中止します。
|
|
235
|
+
|
|
236
|
+
**dirモードは対象ファイルを上書き保存します。**
|
|
237
|
+
|
|
238
|
+
対象は `.xlsx`、`.xlsm`、`.xlsb`、`.xls` の全ワークシート内の埋め込みグラフです。
|
|
239
|
+
`~$` で始まる一時ファイルを除外し、グラフがないブックは保存しません。
|
|
240
|
+
|
|
241
|
+
専用のExcelを起動し、マクロ・イベント・リンク更新を無効にして処理します。
|
|
242
|
+
ファイルは処理後に閉じます。
|
|
243
|
+
戻り値は保存したファイルの絶対パス(Path)のリストです。
|
|
244
|
+
|
|
245
|
+
エラーが発生した場合は対象パスを示して停止し、そのファイルは保存しません。
|
|
246
|
+
先に保存されたファイルの変更は残ります。
|
|
247
|
+
|
|
248
|
+
### シート目次の作成・更新
|
|
249
|
+
|
|
250
|
+
`create_sheet_index()` は、アクティブなExcelブックの先頭に「目次」シートを作成し、
|
|
251
|
+
各シートへのリンクと、各シートから「目次へ戻る」リンクを追加します。
|
|
252
|
+
対象のブックをExcelでアクティブにしてから実行してください。
|
|
253
|
+
|
|
254
|
+
```python
|
|
255
|
+
from exceltools import create_sheet_index
|
|
256
|
+
|
|
257
|
+
create_sheet_index()
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
**既存の「目次」シートは削除して作り直します。**
|
|
261
|
+
各シートの1行目に「目次へ戻る」リンク用の行を挿入します。
|
|
262
|
+
同名のリンクが既に1行目にあるシートには、行を追加しません。
|
|
263
|
+
1行目以外に「目次へ戻る」リンクがある場合は、見つかったリンクの行全体を削除してから1行目に追加します。
|
|
264
|
+
その行の他のデータも削除対象になるため、実行前に内容を確認してください。
|
|
265
|
+
処理後に完了ダイアログを表示します。上書き保存は行わないため、必要に応じてExcelで保存してください。
|
|
266
|
+
|
|
267
|
+
## 背景
|
|
268
|
+
Python から Excel グラフを作成する手段として、`openpyxl` や `xlwings` が利用できますが、
|
|
269
|
+
以下のような課題を感じていました。
|
|
270
|
+
- Excel 上で手動作成したグラフと比べて、**書式が一致しないことが多い**
|
|
271
|
+
- 技術資料用途では、**細かな体裁調整が多数必要**になる
|
|
272
|
+
- `matplotlib` で作成した画像形式のグラフを貼り付ける方法では、
|
|
273
|
+
Excel COM を介さないため処理速度の面でメリットはあるものの、
|
|
274
|
+
Excel 上での再編集ができず、用途に合わないケースがある
|
|
275
|
+
|
|
276
|
+
また、Excel グラフの体裁を細かく調整するには多数のパラメータ指定が必要となり、
|
|
277
|
+
手軽に自動化プログラムへ組み込むことが難しいという問題もありました。
|
|
278
|
+
|
|
279
|
+
そこで、**グラフ作成だけでなく書式設定までを含めて自動化プログラムに組み込めること**を目的として、
|
|
280
|
+
繰り返し利用可能な汎用関数としてコードを作成し、ライブラリとして公開しました。
|
|
281
|
+
|
|
282
|
+
これにより、技術資料作成や解析用途における作業効率の向上を図っています。
|
|
283
|
+
|
|
284
|
+
## 概要
|
|
285
|
+
|
|
286
|
+
グラフ書式設定パラメータは`PRESET`で管理しています。
|
|
287
|
+
|
|
288
|
+
`PRESET` を追加・修正する場合は、インストール先の
|
|
289
|
+
`ModifyChart.py`、`ScatterChart.py`内にある `PRESET` を編集してください。
|
|
290
|
+
|
|
291
|
+
インストール先の例:
|
|
292
|
+
|
|
293
|
+
```text
|
|
294
|
+
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python31*\Lib\site-packages\exceltools
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
実際のインストール先は、次のコードで確認できます。
|
|
298
|
+
|
|
299
|
+
```python
|
|
300
|
+
import exceltools
|
|
301
|
+
|
|
302
|
+
print(exceltools.__file__)
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
※ ライブラリを更新・再インストールすると、直接編集した内容が上書きされる場合があります。
|
|
306
|
+
|
|
307
|
+
## グラフ書式設定の指定方法
|
|
308
|
+
|
|
309
|
+
グラフの書式設定の項目のうち、用途ごとに指定が必要な項目が関数の引数としてリスト化されています。
|
|
310
|
+
`ScatterChart` は `ws`、`start_range`、`paste_range` が必須引数です。
|
|
311
|
+
`ModifyChart` は引数を省略すると、アクティブなグラフを対象にします。
|
|
312
|
+
グラフオブジェクトを `chart` に直接指定することもできます。
|
|
313
|
+
その他の任意引数で、書式などを設定します。
|
|
314
|
+
|
|
315
|
+
また、`PRESET`は **dict形式** で関数外に定義されており、
|
|
316
|
+
外側の辞書のキー`"excel2021"`に、Excel 2021 の散布図の書式設定が格納されています。
|
|
317
|
+
各グラフ設定パラメータはネスト(入れ子)辞書として管理されており、必要に応じて上書き・変更が可能です。
|
|
318
|
+
|
|
319
|
+
```python
|
|
320
|
+
from exceltools import ModifyChart, RGB
|
|
321
|
+
from exceltools.ModifyChart import PRESET
|
|
322
|
+
|
|
323
|
+
PRESET["std"] = {
|
|
324
|
+
**PRESET["excel2021"],
|
|
325
|
+
"title_font_color": RGB(0, 0, 0),
|
|
326
|
+
"axis_title_font_color": RGB(0, 0, 0),
|
|
327
|
+
"axis_tick_font_color": RGB(0, 0, 0),
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
上記のようにベースとなる設定を維持したまま一部を上書きすることで、
|
|
331
|
+
詳細な書式設定を定義できます。
|
|
332
|
+
関数の引数で`preset`を指定することができ、デフォルト引数では`preset="std"`が適用されます。
|
|
333
|
+
|
|
334
|
+
呼び出し側でも、PRESETの更新が可能で、
|
|
335
|
+
以下では、グリッド線の表示設定を一時的に False に変更しています。
|
|
336
|
+
呼び出し側での変更は その Python セッション内で (スクリプトが終了するまで) 有効となります。
|
|
337
|
+
以下は設定変更の例です。`....` の部分には、必要な引数を指定してください。
|
|
338
|
+
|
|
339
|
+
```python
|
|
340
|
+
from exceltools import ScatterChart
|
|
341
|
+
from exceltools.ScatterChart import PRESET
|
|
342
|
+
|
|
343
|
+
PRESET["std"]["x_major_grid"] = False
|
|
344
|
+
chart1 = ScatterChart(....)
|
|
345
|
+
|
|
346
|
+
PRESET["std"]["x_major_grid"] = True
|
|
347
|
+
chart2 = ScatterChart(....)
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
任意引数のうち、系列ごとの書式設定は `series_list = [{"name":"系列1"},{"name":"系列2"}, ...]`
|
|
351
|
+
で指定します。各系列は **dict形式** で定義し、系列をまとめてリスト`series_list`に格納します。
|
|
352
|
+
|
|
353
|
+
`ModifyChart`を`series_list = None` で実行する場合には、
|
|
354
|
+
処理する系列数を関数の引数`NS`で指定してください。
|
|
355
|
+
デフォルト引数では`NS=1`となっています。
|
|
356
|
+
`BatchModifyCharts`については`NS`の自動取得に対応しています。
|
|
357
|
+
|
|
358
|
+
一方、`ScatterChart`では、`row` と `col` の値から`NS`が自動計算されます。
|
|
359
|
+
`row` や `col` が `None` の場合は、`start_range`の入力値から`.end('down').row` 等を使って自動取得されます。
|
|
360
|
+
`paste_range`ではグラフを貼り付ける左上の座標として、どのセルの左上を基準にするのかを指定します。
|
|
361
|
+
|
|
362
|
+
### ModifyChart関数の引数説明
|
|
363
|
+
```python
|
|
364
|
+
def ModifyChart(chart: Any = "active", # ExcelのChartオブジェクト
|
|
365
|
+
ws = None, # None (系列ごとにRange指定する場合のみWorksheetオブジェクトを指定)
|
|
366
|
+
preset = "std", # プリセットスタイル名
|
|
367
|
+
width_cm = None, # グラフ幅(cm), Noneで変更なし
|
|
368
|
+
height_cm = None, # グラフ高さ(cm), Noneで変更なし
|
|
369
|
+
name = None, # グラフ名変更, Noneで変更なし
|
|
370
|
+
title: str|bool|None = None, # タイトル文字列, Falseで無効化, Noneで変更なし
|
|
371
|
+
title_font_color = None, # タイトルフォント色(RGB)
|
|
372
|
+
title_font_size = None, # タイトルフォントサイズ
|
|
373
|
+
title_space = +0, # タイトルとグラフの間隔(pt)
|
|
374
|
+
NS = 1, # データ系列数
|
|
375
|
+
series_list: list[dict]|None = None, # 各系列の設定
|
|
376
|
+
style = None, # 線+マーカーのスタイル
|
|
377
|
+
smooth = None, # Trueで曲線、Falseで折れ線
|
|
378
|
+
marker = None, # マーカー種類: "C":●, "S":■, "D":◆, "T":▲, "N":なし
|
|
379
|
+
alpha = None, # 線の透明度(0~1)
|
|
380
|
+
x_title: str|bool|None = None,# X軸タイトル文字列。Falseで無効化、Noneで変更なし
|
|
381
|
+
x_title_space = +0, # プロットエリアを下側に広げる場合はマイナス
|
|
382
|
+
x_min: float|str|None = None, # X軸最小値, "auto"で自動調整, Noneで変更なし
|
|
383
|
+
x_max: float|str|None = None, # X軸最大値, "auto"で自動調整, Noneで変更なし
|
|
384
|
+
x_major: float|None = None, # X軸主目盛間隔, Noneで変更なし, グリッド線表示設定はPRESET
|
|
385
|
+
x_minor: float|None = None, # X軸副目盛間隔, Noneで変更なし, グリッド線表示設定はPRESET
|
|
386
|
+
x_cross = None, # Y軸との交差位置, Noneで変更なし
|
|
387
|
+
x_format = None, # X軸表示形式 ("0.00", "0.0E+00", "0%" など), Noneで変更なし
|
|
388
|
+
x_log: bool|None = None, # Trueで対数表示, Noneで変更なし
|
|
389
|
+
y_title: str|bool|None = None,# Y軸タイトル, Noneで変更なし
|
|
390
|
+
y_title_space = +0,
|
|
391
|
+
y_min: float|str|None = None,
|
|
392
|
+
y_max: float|str|None = None,
|
|
393
|
+
y_major: float|None = None,
|
|
394
|
+
y_minor: float|None = None,
|
|
395
|
+
y_cross = None, # X軸との交差位置, Noneで変更なし
|
|
396
|
+
y_format = None,
|
|
397
|
+
y_log: bool|None = None,
|
|
398
|
+
y2_title: str|bool|None = None, # Y軸タイトル文字列, Falseで無効化, Noneで変更なし
|
|
399
|
+
y2_min: float|str|None = None,
|
|
400
|
+
y2_max: float|str|None = None,
|
|
401
|
+
y2_major: float|None = None,
|
|
402
|
+
y2_minor: float|None = None,
|
|
403
|
+
y2_format = None,
|
|
404
|
+
y2_log: bool|None = None,
|
|
405
|
+
frame_color: bool|int|None = None, # グラフ枠色 (False:枠なし, 0:黒枠, Noneでpreset)
|
|
406
|
+
legend: bool|str|None = None, # 凡例表示(False:非表示, Noneで変更なし, "right"で右側に表示)
|
|
407
|
+
legend_font_size = None, # 凡例のフォントサイズ, Noneで変更なし
|
|
408
|
+
legend_width_inc = 0, # 凡例ボックスの幅増減(pt)
|
|
409
|
+
legend_height_inc = 0, # 凡例ボックスの高さ増減(pt)
|
|
410
|
+
legend_right_space = 0, # 凡例の右端 = プロットエリアの右端を基準とした凡例位置制御
|
|
411
|
+
legent_top_space = 0, # 凡例の上端 = プロットエリアの上端を基準とした凡例位置制御
|
|
412
|
+
transparent_bg: bool|None = None, # 背景を透明化する場合はTrue
|
|
413
|
+
chart_type = None, # "bar"で棒グラフに変更
|
|
414
|
+
x_bold_line: float|None = None, # x_bold_line=0でx=0が太線
|
|
415
|
+
y_bold_line: float|None = None, # y_bold_line=0でy=0が太線
|
|
416
|
+
plot_area_space: str = "relative", # プロットエリア調整時の基準位置を"absolute"/"relative"で指定
|
|
417
|
+
width_inc = 0, # プロットエリアの幅増減(pt)
|
|
418
|
+
height_inc = 0, # プロットエリアの高さ増減(pt)
|
|
419
|
+
right_space = 0, # plot_area_space="abs"のときの右のスペース指定
|
|
420
|
+
):
|
|
421
|
+
```
|
|
422
|
+
- 型ヒントには `Python 3.10 以降`の記法を使用しています。
|
|
423
|
+
|
|
424
|
+
- `smooth`、`alpha`、`marker` の優先順位は、`series_list` の各系列の設定 > 関数の引数 > `PRESET` です。
|
|
425
|
+
各系列や関数の引数で指定しない場合(Noneの場合)は、`PRESET` の設定を使用します。
|
|
426
|
+
|
|
427
|
+
- 線の太さは、`series_list` の各系列の `weight` で指定できます。
|
|
428
|
+
指定しない場合は、`PRESET` の `line_weight` を使用します。
|
|
429
|
+
`line_weight` は関数の引数ではありません。
|
|
430
|
+
|
|
431
|
+
- `ScatterChart`関数の場合には、上記の引数: `NS`、`chart`の代わりに、
|
|
432
|
+
必須引数:`start_range`、`paste_range`、 任意引数:`row`、`col` が加わって、`ws`は必須引数に変わります。
|
|
433
|
+
戻り値はChartオブジェクトとなります。
|
|
434
|
+
|
|
435
|
+
- `title`、`x_title`、`y_title`、`y2_title`、`legend`には文字列を入力できる他に、`False`で無効化を指定できます。
|
|
436
|
+
`frame_color`には整数(RGB値)を入力できる他に、`False`で外枠の無効化を指定できます。
|
|
437
|
+
|
|
438
|
+
- `legend`の仕様
|
|
439
|
+
`legend="TR+bw+fb"`のようにポジションとオプションを指定できます。順不同で複数指定可能です。
|
|
440
|
+
`legend="right"`では、プロットエリアの右に凡例を配置します。オプションも利用可能です。
|
|
441
|
+
```
|
|
442
|
+
Position: (プロットエリア基準)
|
|
443
|
+
Vertical : T = Top, B = Bottom
|
|
444
|
+
Horizontal: L = Left, R = Right, C = Center
|
|
445
|
+
|
|
446
|
+
Options:
|
|
447
|
+
bw : background white (背景を白)
|
|
448
|
+
fb : frame black (枠を黒)
|
|
449
|
+
tb : text black (テキストを黒)
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
- `chart_type = "bar"` を指定すると、集合縦棒グラフ (`xlColumnClustered`) が表示されます。
|
|
453
|
+
ただしこの場合、内部処理でtry構文の例外が発生し、グリッド線の設定・軸のフォント設定には未対応です。
|
|
454
|
+
|
|
455
|
+
- 引数で `chart_type = "line"`を指定し、そのうち一部の系列の chart_type を "bar" にすると、
|
|
456
|
+
棒グラフ+折れ線グラフの組み合わせグラフ を表示できます。(グリッドと軸の設定はできません)
|
|
457
|
+
|
|
458
|
+
### series_listで指定可能なkeyとそのデフォルト値
|
|
459
|
+
以下から任意のkeyのみ設定可能です。
|
|
460
|
+
```python
|
|
461
|
+
series_list = [
|
|
462
|
+
{
|
|
463
|
+
"name": "系列1", # 系列名
|
|
464
|
+
"color": RGB(68,114,196), # 色
|
|
465
|
+
"style": "line+marker", # スタイル
|
|
466
|
+
"marker": "C", # マーカー: "C":●, "S":■, "D":◆, "T":▲
|
|
467
|
+
"size": 5, # マーカーサイズ
|
|
468
|
+
"weight": 1.5, # 線の幅 (pt)
|
|
469
|
+
"smooth": True, # 曲線(True) or 折れ線(False)
|
|
470
|
+
"alpha": None, # 線の透明度(0~1), デフォルト None
|
|
471
|
+
"axis": "primary", # "y2"で副軸
|
|
472
|
+
"XValues":None, # 系列のXの値(ExcelのRange指定)
|
|
473
|
+
"Values":None, # 系列のYの値(ExcelのRange指定)
|
|
474
|
+
"sheet":None, # 系列のデータがあるシート名
|
|
475
|
+
"chart_type": None, # グラフ種類の変更(デフォルトは散布図)
|
|
476
|
+
"trendline": None, # 近似曲線
|
|
477
|
+
"trendline_name":None, # 近似曲線の名前
|
|
478
|
+
"trendline_color":None, # 近似曲線の色
|
|
479
|
+
"trendline_weight":None, # 近似曲線の太さ
|
|
480
|
+
"trendline_style":None, # 近似曲線のDashstyle(solid,dash)
|
|
481
|
+
"trendline_option": None, # 近似曲線オプション("eq+r2")
|
|
482
|
+
"legend":None, # 系列を凡例に入れるか選択
|
|
483
|
+
"data_label":None # データラベルの表示
|
|
484
|
+
},
|
|
485
|
+
]
|
|
486
|
+
```
|
|
487
|
+
### サブ関数
|
|
488
|
+
`ModifyChart.py`には、`add_shape`、`add_line`、`template`の3つの関数が、
|
|
489
|
+
メイン関数`ModifyChart` とは独立に定義されており、
|
|
490
|
+
`from exceltools import ModifyChart, RGB, add_shape, add_line, template` のようにインポートして使います。
|
|
491
|
+
- `add_shape`: `chart`のプロットエリアに、帯(長方形)、注釈用のテキストボックスを追加します。
|
|
492
|
+
- `add_line` : `chart`のプロットエリアに、線もしくは破線を追加します。
|
|
493
|
+
- `template` : グラフテンプレート機能を利用します。(テンプレートとして保存した`.crtx`ファイルを使います)
|
|
494
|
+
|
|
495
|
+
詳細な使い方は、`ModifyChart.py` の各関数定義の下にある docstring をご参照ください。
|
|
496
|
+
|
|
497
|
+
また、`template`関数があればメイン関数を使わず、手軽にテンプレートを適用できますが、
|
|
498
|
+
`.crtx`ファイルから**書式設定のパラメータを直接確認、編集することはできません。**
|
|
499
|
+
|
|
500
|
+
本ライブラリのコードでは、
|
|
501
|
+
● 数値的に Excel グラフを制御できること
|
|
502
|
+
● 書式設定パラメータを一覧化し、コード上で管理できること
|
|
503
|
+
が利点と考えています。
|
|
504
|
+
|
|
505
|
+
### PRESET["excel2021"] 一覧
|
|
506
|
+
```python
|
|
507
|
+
PRESET = {
|
|
508
|
+
# "Aptos Narrow 本文"は Excel 2021以降のみ
|
|
509
|
+
"excel2021": {
|
|
510
|
+
"title_font_size": 14,
|
|
511
|
+
"title_font_color": RGB(89,89,89),
|
|
512
|
+
"title_font_bold": False,
|
|
513
|
+
"title_font_name": "Aptos Narrow 本文",
|
|
514
|
+
"axis_title_font_size": 10,
|
|
515
|
+
"axis_title_font_name": "Aptos Narrow 本文",
|
|
516
|
+
"axis_title_font_color": RGB(89,89,89),
|
|
517
|
+
"axis_title_font_bold": False,
|
|
518
|
+
"axis_tick_font_color": RGB(89, 89, 89),
|
|
519
|
+
"axis_tick_font_size": 9,
|
|
520
|
+
"axis_tick_font_name": "Aptos Narrow 本文",
|
|
521
|
+
"axis_line": True,
|
|
522
|
+
"axis_line_color": RGB(191, 191, 191),
|
|
523
|
+
"axis_line_weight": 0.75,
|
|
524
|
+
"x_major_grid": True,
|
|
525
|
+
"y_major_grid": True,
|
|
526
|
+
"x_minor_grid": None,
|
|
527
|
+
"y_minor_grid": None,
|
|
528
|
+
"major_grid_color": RGB(217, 217, 217),
|
|
529
|
+
"major_grid_weight": 0.75,
|
|
530
|
+
# TickMark: None, Inside, Outside, Cross
|
|
531
|
+
"x_major_tickmark": constants.xlTickMarkNone, # 目盛の内向き/外向きなし
|
|
532
|
+
"y_major_tickmark": constants.xlTickMarkNone,
|
|
533
|
+
"x_minor_tickmark": None,
|
|
534
|
+
"y_minor_tickmark": None,
|
|
535
|
+
# 外枠の有無は引数で指定してください
|
|
536
|
+
"frame_color": RGB(217,217,217),
|
|
537
|
+
"frame_weight": 0.75,
|
|
538
|
+
"plot_area_frame": None,
|
|
539
|
+
"plot_area_frame_color": RGB(0,0,0),
|
|
540
|
+
"plot_area_frame_weight": 1.0,
|
|
541
|
+
"style": "line+marker",
|
|
542
|
+
"smooth": True,
|
|
543
|
+
"alpha": None,
|
|
544
|
+
"line_weight": 1.5,
|
|
545
|
+
"marker": "C",
|
|
546
|
+
"markersize": 5,
|
|
547
|
+
"y2_major_grid": False, # 副軸グリッド表示なし
|
|
548
|
+
"y2_minor_grid": False,
|
|
549
|
+
"y2_major_tickmark": constants.xlTickMarkNone,
|
|
550
|
+
"y2_minor_tickmark": None,
|
|
551
|
+
},
|
|
552
|
+
}
|
|
553
|
+
```
|
|
554
|
+
### 補足
|
|
555
|
+
- 透明度(0~1)の`alpha`は`matplotlib`由来です。
|
|
556
|
+
- 線の太さ`line_weight`はExcel COM のプロパティ名`Line.Weight`に由来します。
|
|
557
|
+
(matplotlibでは`linewidth`)
|
|
558
|
+
- マーカーの種類(`"C","S","D","T","N"`)は頭文字に由来します。
|
|
559
|
+
(matplotlibの`"o","s","^"`などは使えません)
|
|
560
|
+
- スタイル(`style`)は、以下の指定に対応しています。
|
|
561
|
+
`"line+marker"`、`"line"`(ラインのみ)、`"marker"`(マーカーのみ)、`"dash"`(破線)、`"dash+marker"`など
|
|
562
|
+
また、`matplotlib`由来の表記`"--"`や`"-."`も使用可能です。
|
|
563
|
+
(破線は上記2種類のみ対応しています)
|
|
564
|
+
- 関数の引数が多いため、同じ引数を二度渡さないよう注意してください。
|
|
565
|
+
(二重指定すると `SyntaxError` になります)
|
|
566
|
+
- 系列の色指定については`RGB(r,g,b)`の他に、以下の文字列でも指定できます。
|
|
567
|
+
```python
|
|
568
|
+
COLOR_NAME_TO_RGB = {
|
|
569
|
+
"blue": RGB(68,114,196),
|
|
570
|
+
"orange":RGB(237,125,49),
|
|
571
|
+
"green":RGB(112,173,71),
|
|
572
|
+
"yellow":RGB(255,192,0),
|
|
573
|
+
"purple":RGB(112,48,160),
|
|
574
|
+
"brown":RGB(192,0,0),
|
|
575
|
+
"navy":RGB(0,32,96),
|
|
576
|
+
"gray":RGB(165,165,165),
|
|
577
|
+
"teal":RGB(0,128,128),
|
|
578
|
+
"cyan": RGB(0,255,255),
|
|
579
|
+
"magenta": RGB(255,0,255),
|
|
580
|
+
}
|
|
581
|
+
```
|
|
582
|
+
|
|
583
|
+
## 関連リンク
|
|
584
|
+
|
|
585
|
+
**Qiita 投稿記事**
|
|
586
|
+
|
|
587
|
+
[Python xlwings でエクセルグラフの体裁調整を自動化](https://qiita.com/ncepst/items/54c63974242bb9e18c23)
|
|
588
|
+
|
|
589
|
+
**VBA連携**
|
|
590
|
+
|
|
591
|
+
[PythonFromVBA.bas](https://github.com/ncepst/PyExcelTools/blob/main/PythonFromVBA.bas)
|
|
592
|
+
|
|
593
|
+
Pythonスクリプトは Excelマクロから実行することもでき、マクロにショートカットキーを割り当てると便利です。
|
|
594
|
+
VBAコードには、自動判定の範囲 または 選択範囲 でグラフを作成するマクロも含まれており、柔軟な運用が可能です。
|
|
595
|
+
|
|
596
|
+
## License
|
|
597
|
+
MIT License
|
|
598
|
+
Copyright (c) 2025 ncepst
|