如何更新;“目录”;在带有Delphi和com接口的ODT文档中
首先是我想达到的目标。 我基本上是创建一个报告,并根据用户选择将其导出为不同的格式(odt、doc和pdf) 因此,我的方法是以开放文档格式odt生成整个文档(在您完成规范和XML之后,这非常整洁),然后使用openoffice com接口以编程方式打开文档,并将其保存在word或pdf中 到目前为止,这是完美的,但我有一个问题,内容表没有得到更新 在DOC格式中,这并不重要,因为用户可以在以后手动执行,但在PDF中,用户没有这个选项 我记录了TOC更新的宏,并尝试使用它,但不知何故它不起作用。我没有给我一个错误消息,但它就是不点火。。 下面是Makro:如何更新;“目录”;在带有Delphi和com接口的ODT文档中,delphi,com,openoffice.org,ole,openoffice-writer,Delphi,Com,Openoffice.org,Ole,Openoffice Writer,首先是我想达到的目标。 我基本上是创建一个报告,并根据用户选择将其导出为不同的格式(odt、doc和pdf) 因此,我的方法是以开放文档格式odt生成整个文档(在您完成规范和XML之后,这非常整洁),然后使用openoffice com接口以编程方式打开文档,并将其保存在word或pdf中 到目前为止,这是完美的,但我有一个问题,内容表没有得到更新 在DOC格式中,这并不重要,因为用户可以在以后手动执行,但在PDF中,用户没有这个选项 我记录了TOC更新的宏,并尝试使用它,但不知何故它不起作用。
sub Main
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:UpdateCurIndex", "", 0, Array())
end sub
基本上我用这个来创建它:
oDispatcher := fOpenOffice.createInstance('com.sun.star.frame.DispatchHelper');
oDispatcher.executeDispatch(fDocument.CurrentController.Frame
, '.uno:UpdateCurIndex', '', 0
, VarArrayCreate([0, 0], varVariant));
对于这些变体:
fOpenOffice := CreateOleObject('com.sun.star.ServiceManager');
wProperties := VarArrayCreate([0, 0], varVariant);
wProperties[0] := MakePropertyValue('Hidden', True);
fDocument := fDesktop.loadComponentFromURL('file:///' + FileName
, '_blank', 0, wProperties);`
在这个过程中有什么我忘了的吗?我还没有列出完整的源代码,这是相当标准和完美的作品。只有带有“oDispatcher”的那两行代码不起作用。您在事件中尝试过自动更新吗
sub OnOpenDocumentUpdateAllDocumentIndexes
oIndexes = ThisComponent.getDocumentIndexes()
for i = 0 to oIndexes.getCount () - 1
oIndexes (i).update
next i
end sub
好的,现在我发现了这个问题,并提出了解决办法! 1.目录的更新仅在documnet打开而非隐藏时有效! 因此,我必须将代码更改为:
wProperties[0] := MakePropertyValue('Hidden', False);
sub UpdateTOC
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
sub UpdateTOC
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dim args1(18) as new com.sun.star.beans.PropertyValue
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.Backward"
args1(4).Value = false
args1(5).Name = "SearchItem.Pattern"
args1(5).Value = false
args1(6).Name = "SearchItem.Content"
args1(6).Value = false
args1(7).Name = "SearchItem.AsianOptions"
args1(7).Value = false
args1(8).Name = "SearchItem.AlgorithmType"
args1(8).Value = 0
args1(9).Name = "SearchItem.SearchFlags"
args1(9).Value = 65536
args1(10).Name = "SearchItem.SearchString"
args1(10).Value = "Contents"
args1(11).Name = "SearchItem.ReplaceString"
args1(11).Value = ""
args1(12).Name = "SearchItem.Locale"
args1(12).Value = 255
args1(13).Name = "SearchItem.ChangedChars"
args1(13).Value = 2
args1(14).Name = "SearchItem.DeletedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.InsertedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.TransliterateFlags"
args1(16).Value = 1024
args1(17).Name = "SearchItem.Command"
args1(17).Value = 0
args1(18).Name = "Quiet"
args1(18).Value = true
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())
dim args2(1) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Count"
args2(0).Value = 1
args2(1).Name = "Select"
args2(1).Value = false
dispatcher.executeDispatch(document, ".uno:GoDown", "", 0, args2())
dispatcher.executeDispatch(document, ".uno:UpdateCurIndex", "", 0, Array())
end sub
你能给我们看一下文件名的确切内容吗?嗨,moskito-x,文件名的确切内容是:
c:/temp/report\u 3388.odt
,但到目前为止,当我加载和保存文档时,它工作正常,所以这不成问题。呵呵,我一直在想为什么这里的代码是错误的;但我忽略了它,主要是将它用作模板,然后我查看文档并编写我的版本。当我意识到它不是python时,代码已经准备好了。谢谢,顺便说一句。