示例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()