**先说结论:**经过尝试,我发现用LibreOffice生成或者更新的文档目录(TOC:Table of Contents),用WPS Office打开,按Ctrl键再点击无法跟踪链接;用LibreOffice或者Microsoft Word打开按住Ctrl键可以点击跳转
例如,这个文档目录是用python通过UNO访问LibreOffice更新过的:
1、用LibreOffice打开,按住Ctrl键,然后点击某个目录项,是可以跳转到链接的标题处的。
2、但是,用WPS Office打开,按住Ctrl键,然后点击某个目录项,出现出错提示,无法跳转到链接的标题处。看起来,WPS的兼容性是有点问题:
下面,说说我对这个问题的发现、定位过程。
我本来是借鉴别人的代码,在python中通过UNO调用LibreOffice来更新用python-docx生成的文档的目录(TOC:table of contents)。
我参考了:https://github.com/typhoon-hil/LibreOfficeToPDF和https://www.linuxjournal.com/content/starting-stopping-and-connecting-openoffice-python
代码片段:
# 更新文档目录
dispatcher.executeDispatch(doc, ".uno:UpdateAllIndexes", "", 0, ())
# Saving
opts = []
if ext == '.docx':
struct = uno.createUnoStruct("com.sun.star.beans.PropertyValue")
struct.Name = "FilterName"
# docx文档格式
struct.Value = "MS Word 2007 XML"
opts.append(struct)
struct = uno.createUnoStruct('com.sun.star.beans.PropertyValue')
struct.Name = 'URL'
struct.Value = fileUrl_new
opts.append(struct)
# 另存为
dispatcher.executeDispatch(doc, ".uno:SaveAs", "", 0, tuple(opts))
# 关闭文档。如果不关闭的话,文档会被lock
dispatcher.executeDispatch(doc, ".uno:CloseDoc", "", 0, ())
用WPS Office打开上面python代码生成的文档,我此处是D:/temp/pang_new.docx
发现文档目录是更新了,但按住Ctrl键然后点击某一个项,无法跳转到具体的标题处,也就是说超链接没有起作用:
我开始以为是不是我python代码中的更新命令不全或者不对,于是将代码dispatcher.executeDispatch(doc, “.uno:UpdateAllIndexes”, “”, 0, ())中的UpdateAllIndexes分别用下面的命令代替尝试:
StyleUpdateByExample
UpdateAll
UpdateAllIndexes
UpdateAllLinks
UpdateCharts
UpdateCurIndex
UpdateFields
UpdateInputFields
折腾了一顿,发现问题依然存在。冥思苦想,问题到底出在什么地方呢?我又尝试了下面方法,最终发现python代码的命令没有问题,而是WPS Office的兼容性有点问题:
用WPS打开,点击一下“更新目录”,然后按住Ctrl键点击,就可以跳转了。
或者用LibreOffice打开,点击目录中的项是可以跳转的。
或者另外直接用WPS创建一篇新文档,填写内容,插入目录并更新保存,然后用LibreOffice打开这篇文档,点击目录中的项是可以跳转的。
或者另外直接用LibreOffice创建一篇新文档,填写内容,插入目录并更新保存,点击可以跳转。然后用WPS打开这篇文档,点击目录中的项却不能跳转。
我又装了Microsoft Office 2010,用其中的Microsoft word打开前面在WPS中点击不能跳转的文档目录,是可以跳转的。
总结:经过上面方法的尝试发现:同一个文档目录,尽管用WPS打开点击不能跳转,但用LibreOffice或者Microsoft Word打开点击都是可以跳转的,这证明了是WPS的兼容性有点问题。