ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python使用win32com模块向word中插入自带可编辑的图表

2021-07-13 09:34:13  阅读:732  来源: 互联网

标签:word python chart 三维 图表 docApp win32com 堆积


解决问题

使用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应用。

步骤

数据准备:

  1. Excel文件中保存生成图表的测试数据。
  2. 在word文档中插入书签,此处方便选择图表插入位置。也可调用Selection对象设置插入位置,具体可参考官方文档说明
    在这里插入图片描述

具体代码如下:

import win32com
from win32com.client import Dispatch

docApp = win32com.client.Dispatch('Word.Application')
excelAPP = win32com.client.Dispatch('Excel.Application')
docApp.Visible = True
docApp.DisplayAlerts = 0
excelAPP.Visible = True
excelAPP.DisplayAlerts = 0

doc = 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 Dispatch

docApp = 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 = value

chart.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.TextFrame2TextFrame2时报错,暂未找到解决方案,由此推测还可能存在其它坑。
  • 很多方法的参数(如doc.Shapes.AddChart2(Style=201))或对象的属性值(如图表系列的填充颜色)既可以使用相应数值,也可以使用类型常量。示例代码中全都使用了数字代码,是由于使用常量报错的问题尚未解决。
  • 本博客主要分享解决的思路,代码在本地环境均可运行,不足之处欢迎交流~

附录

图表类型对应代码

XlChartType代码说明
xl3DArea-4098三维面积图
xl3DAreaStacked78三维堆积面积图
xl3DAreaStacked10079100%堆叠区域
xl3DBarClustered60三维簇状条形图
xl3DBarStacked61三维堆积条形图
xl3DBarStacked10062三维百分比堆积条形图
xl3DColumn-4100三维柱形图
xl3DColumnClustered54三维簇状的柱形图
xl3DColumnStacked55三维堆积柱形图
xl3DColumnStacked10056三维百分比堆积条形图
xl3DLine-4101三维折线图
xl3DPie-4102三维饼图
xl3DPieExploded70分离型三维饼图
xlArea1区域
xlAreaStacked76堆积的面积图
xlAreaStacked10077100%堆叠区域
xlBarClustered57簇状条形图
xlBarOfPie71复合条饼图
xlBarStacked58堆积条形的图
xlBarStacked10059百分比堆积条形图
xlBubble15气泡图
xlBubble3DEffect87三维气泡图
xlColumnClustered51三维簇状的柱形图
xlColumnStacked52堆积的柱形图
xlColumnStacked10053百分比堆积柱形
xlCombo-4152
xlComboAreaStackedColumnClustered115
xlComboColumnClusteredLine113
xlComboColumnClusteredLineSecondaryAxis114
xlConeBarClustered102簇状条形圆锥图
xlConeBarStacked103堆积条形的圆锥图
xlConeBarStacked100104百分比堆积条形圆锥图
xlConeCol105三维柱形圆锥图
xlConeColClustered99柱形簇状圆锥图
xlConeColStacked100堆积的柱形圆锥图
xlConeColStacked100101百分比堆积柱形圆锥图
xlCylinderBarClustered95簇状条形圆柱图
xlCylinderBarStacked96堆积条形的圆柱图
xlCylinderBarStacked10097百分比堆积条形圆柱图
xlCylinderCol98三维柱形圆柱图
xlCylinderColClustered92柱形簇状圆锥图
xlCylinderColStacked93堆积条形的圆柱图
xlCylinderColStacked10094百分比堆积柱形圆柱图
xlDoughnut-4120圆环图
xlDoughnutExploded80分离型圆环图
xlLine4Line
xlLineMarkers65折线图
xlLineMarkersStacked66堆积的折线图
xlLineMarkersStacked10067百分比堆积折线图
xlLineStacked63堆积的折线图
xlLineStacked10064百分比堆积折线图
xlOtherCombinations116
xlPie5饼图
xlPieExploded69分离型的饼图
xlPieOfPie68复合饼图
xlPyramidBarClustered109簇状条形棱锥图
xlPyramidBarStacked110堆积条形的棱锥图
xlPyramidBarStacked100111百分比堆积条形棱锥图
xlPyramidCol112三维柱形棱锥图
xlPyramidColClustered106柱形簇状棱锥图
xlPyramidColStacked107堆积的柱形棱锥图
xlPyramidColStacked100108百分比堆积柱形棱锥图
xlRadar-4151雷达图
xlRadarFilled82填充的雷达图
xlRadarMarkers81数据点雷达图
xlStockHLC88盘高-盘低-关闭
xlStockOHLC89打开高低关闭
xlStockVHLC90卷高低关闭
xlStockVOHLC91卷-打开-高-低-关闭
xlSuggestedChart-2
xlSurface83三维曲面图
xlSurfaceTopView85曲面图(俯视图)
xlSurfaceTopViewWireframe86曲面图(俯视线框)
xlSurfaceWireframe84三维曲面图(线框)
xlXYScatter-4169散点图
xlXYScatterLines74折线散点图
xlXYScatterLinesNoMarkers75无数据点折线散点图
xlXYScatterSmooth72平滑线散点图
xlXYScatterSmoothNoMarkers73无数据点平滑的线与散点图

标签:word,python,chart,三维,图表,docApp,win32com,堆积
来源: https://blog.csdn.net/weixin_42927998/article/details/115086797

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有