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.
@@ -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