python自动生成word报表之使用win32com插入自带可编辑的图表
解决问题
在做word报告自动生成过程中,想使用python向word中插入office自带的可以编辑的图表,查看python-docx v0.8.10文档还未实现该功能,考虑使用win32com。
前置知识
- 了解word编程时的几个主要对象和类,包括
Application对象:应用
Document对象:文档
Selection对象:选区
更多类别查阅文档:https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.word?view=word-pia - 了解宏录制功能,通过查看宏编辑器里的VBA代码,了解操作使用了哪些对象和方法
- 这些前置知识可以参考文章https://zhuanlan.zhihu.com/p/67543981,主要解决思路来源于此。
通过在word中录制宏可以了解大部分操作对象,本人使用office365版本的word程序不能录制生成图表和编辑图表的操作。
具体思路
win32模块安装:
pip install pypiwin32
考虑了两种实现思路:
思路一:从Excel应用中将图表copy至word
Excel本身对图表创建和操作相对更方便,且在Ecxel中可以录制创建、编辑等对图表的操作,方便查看使用的对象和方法。
该方法需要分别打开一个Word应用和Excel应用。
步骤
数据准备:
- Excel文件中保存生成图表的测试数据。
- 在word文档中插入书签,此处方便选择图表插入位置。也可调用Selection对象设置插入位置,具体可参考官方文档说明。
具体代码如下:
import win32com
from win32com.client import DispatchdocApp = win32com.client.Dispatch('Word.Application')
excelAPP = win32com.client.Dispatch('Excel.Application')
docApp.Visible = True
docApp.DisplayAlerts = 0
excelAPP.Visible = True
excelAPP.DisplayAlerts = 0doc = docApp.Documents.Open('test.docx')
excel = excelAPP.Workbooks.Open('test.xlsx')# 设置生成图表类型及数据范围
# AddChart2方法说明详见思路二
excel_chart = excel.ActiveSheet.Shapes.AddChart2(201, 51)
excel_chart.Chart.SetSourceData(Source=excel.ActiveSheet.Range("A1:D4"))# 设置图表样式,此处仅为简单示例,具体需求可通过录制宏参考调用的对象及其属性
excel_chart.Chart.ChartTitle.Text = '测试标题'
excel_chart.Chart.FullSeriesCollection(3).Format.Fill.ForeColor.ObjectThemeColor = 10# 将excel中的图表复制粘贴到word中
excel_chart.Copy()
doc.Bookmarks("插入图表位置").Select()
# docApp.Selection.Paste() # 直接粘贴,一般默认为使用目标主题和链接数据
docApp.Selection.PasteAndFormat(16) # 保留所粘贴材料的原始格式doc.Save()
doc.Close()
excel.Save()
excel.Close()
docApp.Quit()
excelAPP.Quit()
思路二:直接在word中插入图表
不需要打开Excel应用,直接在Word中调用图表对象。
步骤
数据准备:
- 在word文档中插入书签,此处方便选择图表插入位置。也可调用Selection对象设置插入位置,具体可参考官方文档说明。
具体代码如下:
import win32com
from win32com.client import DispatchdocApp = win32com.client.Dispatch('Word.Application')
docApp.Visible = True
docApp.DisplayAlerts = 0
doc = docApp.Documents.Open('test.docx')# 创建图表,图表的插入位置为预先在word文档中插入的书签,书签名为“插入图表位置”
shape_chart = doc.Shapes.AddChart2(Style=201, Type=51, Top=doc.Bookmarks("插入图表位置").Select())
shape_chart.WrapFormat.Type = 7 # 设置图表为嵌入型# 设置Word中的图表
chart = shape_chart.Chart
worksheet = chart.ChartData.Workbook.Worksheets(1) #图表数据对应的工作表
chart.SetSourceData("Sheet1!$A$1:$C$4") # 设置数据源范围# 簇状柱形图测试数据
chart_data = [["","系列A","系列B","系列C","系列D"],[2020,2,4,2,3],[2019,4,5,3,2]]# 清空工作表默认数据
worksheet.Range("A1:D5").value = None# 填入测试数据
for row_index,row in enumerate(chart_data):for column_index,value in enumerate(row):worksheet.Cells(row_index+1,column_index+1).Value = valuechart.SetSourceData("Sheet1!$A$1:$E$3") # 设置数据源范围# 设置图表样式示例
chart.ChartTitle.Text = '测试标题' # 设置标题
chart.FullSeriesCollection(2).Format.Fill.ForeColor.ObjectThemeColor = 10 #设置系列2的填充颜色chart.ChartData.Workbook.Close() # 关闭workbook窗口doc.Save()
doc.Close()
docApp.Quit()
使用AddChart2
方法时,word文档中已插入默认图表,如图所示。
其中,添加图表的方法AddChart2
参数考链接,图表类型对应的代码参考链接(或直接参考文末“附录-图表对应代码”)。
插入图表效果如下:
讨论
- 首先尝试思路一是发现在Word中没法录制编辑图表的宏借以参考,而在Excel中可录制,因此采用复制图表的方式。
- 实践发现,思路二也可以通过在Excel中录制宏了解图表对应的对象,Word官方文档中对chart对象的相关属性、方法描述相对简单(很多详细设置没有说明),参考Excel文档中的说明即可。
- 目前在本地测试发现某些对象不能正常调用,如调整坐标轴的字体格式,调用
Chart.Axes(Type=2).Format.TextFrame2
的TextFrame2
时报错,暂未找到解决方案,由此推测还可能存在其它坑。 - 很多方法的参数(如
doc.Shapes.AddChart2(Style=201)
)或对象的属性值(如图表系列的填充颜色)既可以使用相应数值,也可以使用类型常量。示例代码中全都使用了数字代码,是由于使用常量报错的问题尚未解决。 - 本博客主要分享解决的思路,代码在本地环境均可运行,不足之处欢迎交流~
附录
图表类型对应代码
XlChartType | 代码 | 说明 |
---|---|---|
xl3DArea | -4098 | 三维面积图 |
xl3DAreaStacked | 78 | 三维堆积面积图 |
xl3DAreaStacked100 | 79 | 100%堆叠区域 |
xl3DBarClustered | 60 | 三维簇状条形图 |
xl3DBarStacked | 61 | 三维堆积条形图 |
xl3DBarStacked100 | 62 | 三维百分比堆积条形图 |
xl3DColumn | -4100 | 三维柱形图 |
xl3DColumnClustered | 54 | 三维簇状的柱形图 |
xl3DColumnStacked | 55 | 三维堆积柱形图 |
xl3DColumnStacked100 | 56 | 三维百分比堆积条形图 |
xl3DLine | -4101 | 三维折线图 |
xl3DPie | -4102 | 三维饼图 |
xl3DPieExploded | 70 | 分离型三维饼图 |
xlArea | 1 | 区域 |
xlAreaStacked | 76 | 堆积的面积图 |
xlAreaStacked100 | 77 | 100%堆叠区域 |
xlBarClustered | 57 | 簇状条形图 |
xlBarOfPie | 71 | 复合条饼图 |
xlBarStacked | 58 | 堆积条形的图 |
xlBarStacked100 | 59 | 百分比堆积条形图 |
xlBubble | 15 | 气泡图 |
xlBubble3DEffect | 87 | 三维气泡图 |
xlColumnClustered | 51 | 三维簇状的柱形图 |
xlColumnStacked | 52 | 堆积的柱形图 |
xlColumnStacked100 | 53 | 百分比堆积柱形 |
xlCombo | -4152 | |
xlComboAreaStackedColumnClustered | 115 | |
xlComboColumnClusteredLine | 113 | |
xlComboColumnClusteredLineSecondaryAxis | 114 | |
xlConeBarClustered | 102 | 簇状条形圆锥图 |
xlConeBarStacked | 103 | 堆积条形的圆锥图 |
xlConeBarStacked100 | 104 | 百分比堆积条形圆锥图 |
xlConeCol | 105 | 三维柱形圆锥图 |
xlConeColClustered | 99 | 柱形簇状圆锥图 |
xlConeColStacked | 100 | 堆积的柱形圆锥图 |
xlConeColStacked100 | 101 | 百分比堆积柱形圆锥图 |
xlCylinderBarClustered | 95 | 簇状条形圆柱图 |
xlCylinderBarStacked | 96 | 堆积条形的圆柱图 |
xlCylinderBarStacked100 | 97 | 百分比堆积条形圆柱图 |
xlCylinderCol | 98 | 三维柱形圆柱图 |
xlCylinderColClustered | 92 | 柱形簇状圆锥图 |
xlCylinderColStacked | 93 | 堆积条形的圆柱图 |
xlCylinderColStacked100 | 94 | 百分比堆积柱形圆柱图 |
xlDoughnut | -4120 | 圆环图 |
xlDoughnutExploded | 80 | 分离型圆环图 |
xlLine | 4 | Line |
xlLineMarkers | 65 | 折线图 |
xlLineMarkersStacked | 66 | 堆积的折线图 |
xlLineMarkersStacked100 | 67 | 百分比堆积折线图 |
xlLineStacked | 63 | 堆积的折线图 |
xlLineStacked100 | 64 | 百分比堆积折线图 |
xlOtherCombinations | 116 | |
xlPie | 5 | 饼图 |
xlPieExploded | 69 | 分离型的饼图 |
xlPieOfPie | 68 | 复合饼图 |
xlPyramidBarClustered | 109 | 簇状条形棱锥图 |
xlPyramidBarStacked | 110 | 堆积条形的棱锥图 |
xlPyramidBarStacked100 | 111 | 百分比堆积条形棱锥图 |
xlPyramidCol | 112 | 三维柱形棱锥图 |
xlPyramidColClustered | 106 | 柱形簇状棱锥图 |
xlPyramidColStacked | 107 | 堆积的柱形棱锥图 |
xlPyramidColStacked100 | 108 | 百分比堆积柱形棱锥图 |
xlRadar | -4151 | 雷达图 |
xlRadarFilled | 82 | 填充的雷达图 |
xlRadarMarkers | 81 | 数据点雷达图 |
xlStockHLC | 88 | 盘高-盘低-关闭 |
xlStockOHLC | 89 | 打开高低关闭 |
xlStockVHLC | 90 | 卷高低关闭 |
xlStockVOHLC | 91 | 卷-打开-高-低-关闭 |
xlSuggestedChart | -2 | |
xlSurface | 83 | 三维曲面图 |
xlSurfaceTopView | 85 | 曲面图(俯视图) |
xlSurfaceTopViewWireframe | 86 | 曲面图(俯视线框) |
xlSurfaceWireframe | 84 | 三维曲面图(线框) |
xlXYScatter | -4169 | 散点图 |
xlXYScatterLines | 74 | 折线散点图 |
xlXYScatterLinesNoMarkers | 75 | 无数据点折线散点图 |
xlXYScatterSmooth | 72 | 平滑线散点图 |
xlXYScatterSmoothNoMarkers | 73 | 无数据点平滑的线与散点图 |
python自动生成word报表之使用win32com插入自带可编辑的图表相关推荐
- python自动汇总表格_用Python自动生成Excel报表
作者 / 来源:林骥(ID:linjiwx) 01 安装和导入模块 以 Python 中的 openpyxl 模块为例,它能够读取和修改 Excel 文件,如果你还没有安装,可以通过以下命令进行安装: ...
- 用Python自动生成Excel报表
在日常工作中,可能会有一些重复无聊的任务,比如说,从 Excel 或数据库中收集一些数据,设置相应的数据格式并做成报表. 类似这种重复无聊的任务,我们完全可以交给 Python 去自动完成,只要第一次 ...
- python新建word文档_使用Python 自动生成 Word 文档的教程
当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...
- python自动生成和读取word_使用Python自动生成Word文档的教程
当然要用第三方库啦 :) 使用以下命令安装: pip install python-docx 使用该库的基本步骤为: 1.建立一个文档对象(可自动使用默认模板建立,也可以使用已有文件). 2.设置文档 ...
- python自动生成word报告
python自动生成word报告 运用zipfile解压docx并替换模版内容 本文章主要介绍根据所提供的word模版,运用python zipfile库将word解压为xml格式,并通过文字替换自动 ...
- python自动生成word报告_python自动化生成分析报告,让你的工作效率提升10倍+
打开搜狗搜索APP,查看更多精彩资讯 如果你每天都需要输出分析报告,报告模式基本一致,只是更换里面的分析数据,每天重复着同样的工作,费时费力,工作能力没有丝毫的提升,但是如果你学过python,你就可 ...
- 用 Python 自动生成 Word 文档并在指定位置插入图片
用Python生成Word文档 在指定位置插入图片 首先当然需要第三方库啦(▽) 天才第一步,第三方的库O(∩_∩)O哈哈~ 参照转发的是这位大佬的博客:https://blog.csdn.net/c ...
- python 自动生成word文档,python实现的生成word文档功能示例
python实现的生成word文档功能示例 发布时间:2020-09-23 11:37:44 来源:脚本之家 阅读:108 作者:zhizunyu2009 本文实例讲述了python实现的生成word ...
- python 自动生成word文档_python实现的生成word文档功能示例
本文实例讲述了python实现的生成word文档功能.分享给大家供大家参考,具体如下: 每月1次的测试费用报销,需要做一个文档.干脆花点时间写个程序吧. # -*- coding: utf-8 -*- ...
最新文章
- Array.apply 方法的使用
- python基础4(来自廖雪峰的官方网站)
- 路由表及路由的选择算法
- for语句的执行过程_带你深入了解Java流程控制语句
- 基于Android NDK的交叉编译
- 【转】在.Net中关于AOP的实现
- AI学习笔记(七)图像滤波器、OpenCV算法解析
- linux 的学习笔记 tree ifconfig
- python (集合和深浅拷贝)
- 数据结构严蔚敏4.7习题2应用题(1)
- 机器学习数学基础:学习线性代数,千万不要误入歧途!推荐一个正确学习路线
- PhpStorm WebStorm IDEA 官方汉化插件
- 我眼中的程序化交易之路
- 全球制造业“看上去很美”
- 4.2.7. Aggregate Expressions
- golang 字符串转整形 string 转 int ,go string 转 int
- 输入H.264流,输出封装格式流
- 心理学上最诡异的23张图!!
- IT农民工如何来美国工作
- centos7安装gitlab-ce社区版全过程,详细到爆炸
热门文章
- matlab三点求法向量,matlab求法向量
- JAVA 1058:求一元二次方程
- 处理器仿存带宽_存储系统性能 - 带宽计算
- ECCV2022 论文最全汇总!附下载
- winedit使用教程_【STemWin教程入门篇】第43章 EDIT-编辑控件
- 【产业互联网周报】AI独角兽们集体亮相安博会,侧重点各不相同;BAT智慧城市布局进一步加深...
- 基于Bert论文构建Question-Answering模型
- 如何评价文档图片的相似度
- 计算机教案三维目标,“三维目标”的三个问题 教学设计三维目标模板
- MySQL------MySQL数据库管理(增删改查,图文详解)