因工作需要,自动化处理一些文件,需要将excel中的图表,写入到word文件中,在过程中,需要了读不出来,不知道如何写到图形文件,写入到word中,只能环绕方式采取嵌入型,显示图片为一条线,还要手工改,而且位置不容易控制,往往不是自己当初写入的初衷,经过多次尝试,终于把所有的问题解决了,能有个比较理想的解决方案。结合代码,将自己的思路与朋友们共分享。
from PIL import ImageGrab, Image #pip pillow
import docx
from docx.shared import Inches
from docx import Document
import time
import win32com.client as win32
import os
myDocument = Document()
chartlocation = ['N20:Z50', 'A20:M50', 'A53:M83',
'N53:Z83', 'A86:M116', 'N86:Z116', 'A119:M149']
# 循环处理每个截图区域
# 能把所有图片按原图象素导出来
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False #True #可视化
excel.DisplayAlerts = False #是否显示警告
workbook = excel.Workbooks.Open(os.path.join(os.getcwd(),'2020年公司经营对比表.xlsx'))
for sheet in workbook.Worksheets:
if sheet.Name=='集团合计':
for i, shape in enumerate(sheet.Shapes):
print(sheet.Name,shape.Name)
if shape.Name.startswith('Chart'): # 'Picture'为图,Chart 为图形
getclip=None
while getclip==None:
time.sleep(0.3)
shape.Copy()
image = ImageGrab.grabclipboard()
if image==None:
print("末获取图像,重试............")
else:
getclip="yes"
image.save('temp{}.jpg'.format(i+1), 'jpeg')
time.sleep(0.3)
myDocument.add_paragraph('第{}张图'.format(i+1))
myDocument.add_picture('temp{}.jpg'.format(i+1), width=Inches(6.0))
#myDocument.add_picture(image, width=Inches(6.0))
excel.Quit()
myDocument.save('out.docx')
其中,读取excel,在sheet名为“集团合计”中查找图形,用图表类型区分后,将图形粘贴到粘贴板上,用pil模块中的图形、粘贴板拷贝,判断非空后,将图形加入到WORD文档中。
关于图形变为一条线,解决方案是设置行距为单倍或1.5倍,如设置为固定行距,则不能显示完全图形,因写入WORD文档需要很长代码,我只把有关的几行解决问题的代码写上。
paragraph_format = paragraph.paragraph_format
paragraph_format.line_spacing = WD_LINE_SPACING.ONE_POINT_FIVE
paragraph.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE #设置1.5倍行距,则图表全
paragraph.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
# ONE_POINT_FIVE,1.5倍行距
# AT_LEAST,最小行距
# DOUBLE,双倍行距
# EXACTLY,固定值
# MULTIPLE,多倍行距
# SINGLE,单倍行距
# 当line_spacing_rule的值设置为EXACTLY和MULTIPLE时,需要line_spacing属性进行设置具体的数值。
如这几个参数用PT(30)等固定行距表示,则会出现一条线的问题。
完成的效果如图: