我使用python uno脚本创建的邮件合并文件有问题。使用mailmerge向导在LibreOffice本身中运行mailmerge的工作方式与隐藏字段相同,并且文档中的其他字段被展平/执行,并且生成的文档具有正确的最终展平输出。
相反,当使用下面的代码运行时,生成的是一系列输出文档,这些输出文档中仍然包含域代码,并且隐藏的段落仍然可见。每个文档都设置到mailmerge数据库的相应行,这与设置Mailmerge时在LibreOffice中的预览很相似。在其他计算机上打开这些文档时,数据不会显示,因为它需要首先访问后端数据库才能获取字段数据。
如果在我的脚本中将SaveFilter设置为“ HTML(StarWriter)”或“ writer_pdf_export”,则它会展平文件,但无法从输出中删除隐藏的段落。
请帮助我复制LibreOffice使用uno python接口进行邮件合并的方式吗?
import uno
def mergeit():
localContext = uno.getComponentContext()
resolver = localContext.ServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", localContext )
ctx = resolver.resolve( "uno:socket,host=localhost,port=2002;urp;StarOffice.ComponentContext" )
smgr = ctx.ServiceManager
oMailMerge = smgr.createInstanceWithContext( "com.sun.star.text.MailMerge",ctx)
oMailMerge.DocumentURL = "file:////home/user/templates/testtemplate.odt" #Source document (forward slashes only)
oMailMerge.DataSourceName = "jdbcpostgresmailmerge" #name of data source (included in source document)
oMailMerge.CommandType = 0 #0 = table name, 1 = query name, 3 = SQL command
oMailMerge.Command = "public.mailmergedata" #name of table in data source
oMailMerge.OutputType = 2 #1 = printer, 2 = file, 3 = email
oMailMerge.OutputURL = uno.systemPathToFileUrl("/home/user/output/") #output directory (forward slashes only)
oMailMerge.SaveFilter = "writer8"
oMailMerge.FileNameFromColumn = True #get file name from data source column
oMailMerge.FileNamePrefix = "mergefilename" #name of data source column
oMailMerge.SaveAsSingleFile = False #save as multiple files
oMailMerge.execute([])
# Do a nasty thing before exiting the python process. In case the
# last call is a oneway call (e.g. see idl-spec of insertString),
# it must be forced out of the remote-bridge caches before python
# exits the process. Otherwise, the oneway call may or may not reach
# the target object.
# I do this here by calling a cheap synchronous call (getPropertyValue).
ctx.ServiceManager
def main():
mergeit()
if __name__ == '__main__':
main()
系统在Ubuntu 18 x64上运行LibreOffice 6.0.6.2
这是我在调用脚本之前启动LibreOffice的方法:
libreoffice --headless --accept="socket,host=localhost,port=2002;urp;"
答案 0 :(得分:0)
这不是真正的解决方案,而是更多解决方法。我无法使其与LibreOffice一起使用。但是,如果我更改了调用函数:
oMailMerge.execute([])
传递一个空的元组:
oMailMerge.execute((),)
现在,它可以在OpenOffice 4.1.6上作为后端运行,并且与LibreOffice不同,它可以按预期的功能输出html,text和pdf类型。它也可以输出writer8文件,因为它仍在输出域代码,但是即使数据源不存在,它也可以填充正确的值,并且重要的是正确处理隐藏的段落。
OOo 4.1.6获胜,LibreOffice 6.0.6.2失败。