[M1 Mac, Big Sur 11.6.5, Python 3.10.4]
C++コードからPythonスクリプトを動かしてExcelを操作してみました。Pythonは公式サイトからダウンロード&インストールしたVer. 3.10.4を使っています。
以下のコードはExcelファイルのA列に入力された文字列とセル色をリストにして出力します。
モジュールではないのでデータの双方向なやりとりは直接できませんが、ファイルを介してなら可能でしょう。
C++でExcelを扱うにはLibXLのような3万円もする有償ライブラリが必要になるので、間接的とはいえopenpyxlで操作できるのであればこれで十分です。
FLTKのような軽量なGUIでopenpyxlやpandasが使えないかと思い、試してみた次第です。TkinterやPyQtといったウィジェットツールキットで重量級GUIにはしたくなかったものですから。
#include </Library/Frameworks/Python.framework/Versions/3.10/include/python3.10/Python.h>
int main() {
Py_Initialize();
PyRun_SimpleString("import openpyxl");
PyRun_SimpleString("wb = openpyxl.load_workbook('test.xlsx')");
PyRun_SimpleString("ws = wb.worksheets[0]");
PyRun_SimpleString("color_name = [cell.value for cell in ws['A']]");
PyRun_SimpleString("color_code = [cell.fill.fgColor.rgb for cell in ws['A']]");
PyRun_SimpleString("print(color_name)");
PyRun_SimpleString("print(color_code)");
Py_Finalize();
return 0;
}
# コンパイラ
COMPILER = clang++
DEBUG = -g
# オプション
CPPFLAGS =
# includeパス(-I)
INCLUDE = -I/Library/Frameworks/Python.framework/Versions/3.10/include/python3.10
# ライブラリパス(-l)
LIBRARY0 = -lpython3.10
# 優先ライブラリパス(-L)
LIBRARY = -L/Library/Frameworks/Python.framework/Versions/3.10/lib
# ソースファイル
SRCDIR = ./src
SRCS = $(SRCDIR)/Openpyxl.cpp
# オブジェクトファイル
OBJDIR = ./obj
OBJS = $(OBJDIR)/Openpyxl.o
# 実行ファイル
TARGETDIR = ./bin
TARGET = Openpyxl
# cppファイルからoファイル作成 $<:依存ファイル
$(OBJDIR)/Openpyxl.o: $(SRCDIR)/Openpyxl.cpp
$(COMPILER) $(CPPFLAGS) $(INCLUDE) $(DEBUG) -o $@ -c $<
# oファイルから実行ファイル作成
$(TARGET):$(OBJS)
$(COMPILER) -o $(TARGETDIR)/$@ $(OBJS) $(LIBRARY0) $(LDFLAGS) $(LIBRARY)
# ファイル削除&実行ファイル作成
.PHONY:all
all: clean $(TARGET)
# ファイル削除
.PHONY:clean
clean:
rm -rf $(OBJS) $(TARGETDIR)/$(TARGET)