如何用Python添加修改Excel形状?寻求openpyxl不支持形状的替代方案
用Python操作Excel形状的可行方案
一、使用win32com.client(Windows专属,依赖本地Excel)
这个库直接调用本地安装的Excel程序,完全支持形状的添加、修改,且保存后不会丢失原有形状,是最可靠的方案。
1. 安装
pip install pywin32
2. 示例代码
(1)修改已有Excel中的形状
import win32com.client as win32 # 启动Excel程序 excel = win32.gencache.EnsureDispatch('Excel.Application') # 打开目标文件 wb = excel.Workbooks.Open(r'C:\path\to\your\file.xlsx') ws = wb.Worksheets('Sheet1') # 修改已有形状:找到名为"Rectangle 1"的形状,修改填充颜色和文本 shape = ws.Shapes('Rectangle 1') shape.Fill.ForeColor.RGB = 0xFF0000 # 设置为红色 shape.TextFrame2.TextRange.Text = '修改后的文本' # 保存并关闭 wb.Save() wb.Close() excel.Quit()
(2)添加新形状
import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Application') wb = excel.Workbooks.Open(r'C:\path\to\your\file.xlsx') ws = wb.Worksheets('Sheet1') # 添加矩形形状,参数:形状类型、左偏移、上偏移、宽度、高度(单位:磅) new_shape = ws.Shapes.AddShape(1, 100, 100, 200, 100) # 1代表矩形 new_shape.Name = 'MyRectangle' new_shape.Fill.ForeColor.RGB = 0x00FF00 # 绿色填充 new_shape.TextFrame2.TextRange.Text = '新添加的形状' wb.Save() wb.Close() excel.Quit()
二、使用xlwings(跨平台,依赖Excel/LibreOffice)
xlwings封装了Windows下的win32com和Mac下的appscript,API更简洁,跨平台支持更好,同样能完整保留形状。
1. 安装
pip install xlwings
2. 示例代码
(1)修改已有形状
import xlwings as xw with xw.App(visible=False) as app: wb = xw.Book(r'C:\path\to\your\file.xlsx') ws = wb.sheets['Sheet1'] # 获取形状并修改属性 shape = ws.shapes['Rectangle 1'] shape.api.Fill.ForeColor.RGB = 0x0000FF # 蓝色填充 shape.api.TextFrame2.TextRange.Text = 'xlwings修改的文本' wb.save() wb.close()
(2)添加新形状
import xlwings as xw with xw.App(visible=False) as app: wb = xw.Book(r'C:\path\to\your\file.xlsx') ws = wb.sheets['Sheet1'] # 添加矩形,参数:形状类型、左偏移、上偏移、宽度、高度 new_shape = ws.shapes.add_shape(1, 100, 100, 200, 100) new_shape.name = 'XlwingsShape' new_shape.api.Fill.ForeColor.RGB = 0xFFCC00 # 橙色填充 new_shape.api.TextFrame2.TextRange.Text = 'xlwings新增形状' wb.save() wb.close()
三、为什么openpyxl会丢失形状?
openpyxl仅支持读取和写入Excel的核心数据(单元格内容、基础样式等),对形状、图表这类非核心对象的支持非常有限,保存时会直接忽略这些元素,所以处理后原有形状会丢失。如果必须用openpyxl处理单元格数据,同时要保留形状,可先复制原文件,用openpyxl处理复制文件的单元格内容,再用上述两个库处理形状——但这种方法繁琐,优先推荐直接使用win32com或xlwings。
内容的提问来源于stack exchange,提问作者Jace Kington
相关产品推荐
相关产品推荐

