python自动生成word报表之使用win32com插入自带可编辑的图表

您所在的位置:网站首页 建立三维柱形圆柱图 python自动生成word报表之使用win32com插入自带可编辑的图表

python自动生成word报表之使用win32com插入自带可编辑的图表

2023-12-18 22:12| 来源: 网络整理| 查看: 265

解决问题

在做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 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.TextFrame2的TextFrame2时报错,暂未找到解决方案,由此推测还可能存在其它坑。很多方法的参数(如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-4152xlComboAreaStackedColumnClustered115xlComboColumnClusteredLine113xlComboColumnClusteredLineSecondaryAxis114xlConeBarClustered102簇状条形圆锥图xlConeBarStacked103堆积条形的圆锥图xlConeBarStacked100104百分比堆积条形圆锥图xlConeCol105三维柱形圆锥图xlConeColClustered99柱形簇状圆锥图xlConeColStacked100堆积的柱形圆锥图xlConeColStacked100101百分比堆积柱形圆锥图xlCylinderBarClustered95簇状条形圆柱图xlCylinderBarStacked96堆积条形的圆柱图xlCylinderBarStacked10097百分比堆积条形圆柱图xlCylinderCol98三维柱形圆柱图xlCylinderColClustered92柱形簇状圆锥图xlCylinderColStacked93堆积条形的圆柱图xlCylinderColStacked10094百分比堆积柱形圆柱图xlDoughnut-4120圆环图xlDoughnutExploded80分离型圆环图xlLine4LinexlLineMarkers65折线图xlLineMarkersStacked66堆积的折线图xlLineMarkersStacked10067百分比堆积折线图xlLineStacked63堆积的折线图xlLineStacked10064百分比堆积折线图xlOtherCombinations116xlPie5饼图xlPieExploded69分离型的饼图xlPieOfPie68复合饼图xlPyramidBarClustered109簇状条形棱锥图xlPyramidBarStacked110堆积条形的棱锥图xlPyramidBarStacked100111百分比堆积条形棱锥图xlPyramidCol112三维柱形棱锥图xlPyramidColClustered106柱形簇状棱锥图xlPyramidColStacked107堆积的柱形棱锥图xlPyramidColStacked100108百分比堆积柱形棱锥图xlRadar-4151雷达图xlRadarFilled82填充的雷达图xlRadarMarkers81数据点雷达图xlStockHLC88盘高-盘低-关闭xlStockOHLC89打开高低关闭xlStockVHLC90卷高低关闭xlStockVOHLC91卷-打开-高-低-关闭xlSuggestedChart-2xlSurface83三维曲面图xlSurfaceTopView85曲面图(俯视图)xlSurfaceTopViewWireframe86曲面图(俯视线框)xlSurfaceWireframe84三维曲面图(线框)xlXYScatter-4169散点图xlXYScatterLines74折线散点图xlXYScatterLinesNoMarkers75无数据点折线散点图xlXYScatterSmooth72平滑线散点图xlXYScatterSmoothNoMarkers73无数据点平滑的线与散点图


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3