python复制visio图形到word文档中

示例1:一个visio文档每一页的图形,复制到新的word文档中

示例2:把visio图形复制到一个已有的word文档中的指定位置。

示例1、将visio图形内容复制到一个新的word文档

1、visio图形内容

visio文件中有两页,内容如下:

第1页图形

第2页图形

2、运行效果

word粘贴效果

因为粘贴的时候,没有分段,所有两个图形,都粘贴在同一个段落中。

3、脚本

 
import win32com.client as win32
from win32com.client import constants

appVisio = win32.gencache.EnsureDispatch("Visio.Application")

vdoc = appVisio.Documents.Open(r"D:\示意图.vsdx")

appDoc = win32.gencache.EnsureDispatch("Word.Application")
appDoc.Visible = True
doc = appDoc.Documents.Add()#创建新得文档

for page in vdoc.Pages: #遍历所有的visio页
	act_win = appVisio.ActiveWindow
	act_win.Page = page# 切换页
	act_win.SelectAll() # 选择页内所有的形状
	act_win.Selection.Copy() #复制visio
	wdRange = doc.Content #
	wdRange.Collapse(1) # 指向内容的末尾
	wdRange.Paste() #在末尾粘贴visio图形

示例中是一边遍历visio的页,然后复制页内所有的shape,粘贴到word中。但是没有分段,排版就由word自由决定了。

其中每粘贴一次,移动word当前内容到最后,保证是粘贴顺序。如果需要分段粘贴,就还需要创建word的段落后,再粘贴。

4、还可以把visio图形粘贴为图片

需要用到PasteSpecial函数。这里的立即数4,代表粘贴为Bitmap。

wdRange.PasteSpecial(DataType=4)

示例2、把visio图形粘贴到word中的指定位置

分别把visio的2个图形插入到原文第一段的下一行,以及原文第二段的下一行。

1、word原始样子

 2、插入后的效果

3、脚本 

这个脚本,最麻烦的是word插入位置的处理。

import win32com.client as win32
from win32com.client import constants
import os 
appVisio = win32.gencache.EnsureDispatch("Visio.Application")
curr_path = os.getcwd()
vdoc = appVisio.Documents.Open(r"%s\示意图.vsdx"%curr_path)

appDoc = win32.gencache.EnsureDispatch("Word.Application")
doc = appDoc.Documents.Open(r"%s\word待插图.docx"%curr_path)
appDoc.Visible = True

parag_idx = 2
for page in vdoc.Pages: #遍历所有的visio页
	act_win = appVisio.ActiveWindow
	act_win.Page = page# 切换页
	act_win.SelectAll() # 选择页内所有的形状
	act_win.Selection.Copy() #复制visio
	# Add(range)只能在某个range之前插入行
	print(doc.Paragraphs.Count,parag_idx)
	if(parag_idx<=doc.Paragraphs.Count):
		new_parag= doc.Paragraphs.Add(doc.Paragraphs(parag_idx).Range)
		wdRange = new_parag.Range #
		wdRange.Collapse(1) # 确保粘贴后,当前行不会和下一行合并
	else:
		new_parag = doc.Paragraphs.Add()# 在最后一行插入新行,但是返回的new_parag并没有指向最后一行
		wdRange = doc.Paragraphs.Last.Range
		# 因为是最后一行了,不用collapse

	wdRange.Paste() #在末尾粘贴visio图形
	parag_idx +=2

Paragraphs.Add方法在某个段落前插入时,返回的是新插入的段落。但是在最最后面插入一行,返回的是倒数第二段。因此在最后面插入一段后,需要用Last指向最后一段。

Word的保存

doc.Save()    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值