Python 原生庫 (xlrd/xlwt/openpyxl) 對圖表支持有限。利用 JPype 啟動 JVM,調用 Java 庫 SmartXLS,可完整讀寫 Excel 並保留圖表、格式、宏。
JAVA_HOME。pip install jpype1 (JPype1 是維護分支)。SmartXLS.jar (商業庫,有免費試用版),放項目目錄。
# -*- coding: utf-8 -*-
from __future__ import print_function, division
import os
import jpype
# 1. 啟動 JVM (僅一次,程序啟動時)
# classpath 包含 SmartXLS.jar
jar_path = os.path.abspath("SX.jar") # 或 SmartXLS.jar
jpype.startJVM(
jpype.getDefaultJVMPath(),
'-Djava.class.path=' + jar_path,
'-Xmx512m' # 根據文件大小調整堆內存
)
try:
# 2. 獲取 Java 類
WorkBook = jpype.JClass('com.smartxls.WorkBook')
# 3. 實例化並操作
wb = WorkBook()
wb.read("input.xlsx") # 讀取文件
wb.setNumber(0, 2, 0, 20.0) # Sheet 0, 行 2, 列 0 寫入數值 20.0
# wb.setText(0, 1, 1, "Hello") # 寫入文本
wb.write("output.xlsx") # 寫出文件,保留圖表/格式
print("Excel 修改完成,圖表已保留")
finally:
# 4. 關閉 JVM (程序結束時)
jpype.shutdownJVM()
| 操作 | SmartXLS 方法 |
|---|---|
| 讀取文件 | read(String path) |
| 寫入數值 | setNumber(sheet, row, col, value) |
| 寫入文本 | setText(sheet, row, col, text) |
| 寫入公式 | setFormula(sheet, row, col, formula) |
| 獲取單元格 | getCell(sheet, row, col) 返回 Cell 對象 |
| 插入/刪除行列 | insertRow/Col, deleteRow/Col |
| 複製/移動 Sheet | copySheet, moveSheet |
| 圖表操作 | getCharts(), addChart() 等 |
| 保存 | write(String path) |
startJVM 放模塊級或單例初始化。jpype.attachThreadToJVM(),用完 detachThreadFromJVM()。try/except 捕獲。;,Linux/Mac 用 : 分隔 classpath 多路徑。pythonnet 調用 .NET 版 SmartXLS (NPOI/EPPlus),或 subprocess 調用 LibreOffice 無頭模式轉換。JPype + SmartXLS 是 Python 完整操作 Excel (含圖表、宏、複雜格式) 的強大方案。關鍵點:正確啟動/關閉 JVM、類路徑配置、線程附著、授權合規。對於純數據讀寫,優先考慮 openpyxl/pandas 純 Python 方案,無 JVM 依賴更輕量。