如何更新;“目录”;在带有Delphi和com接口的ODT文档中

如何更新;“目录”;在带有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更新的宏,并尝试使用它,但不知何故它不起作用。

首先是我想达到的目标。 我基本上是创建一个报告,并根据用户选择将其导出为不同的格式(odt、doc和pdf)

因此,我的方法是以开放文档格式odt生成整个文档(在您完成规范和XML之后,这非常整洁),然后使用openoffice com接口以编程方式打开文档,并将其保存在word或pdf中

到目前为止,这是完美的,但我有一个问题,内容表没有得到更新

在DOC格式中,这并不重要,因为用户可以在以后手动执行,但在PDF中,用户没有这个选项

我记录了TOC更新的宏,并尝试使用它,但不知何故它不起作用。我没有给我一个错误消息,但它就是不点火。。 下面是Makro:

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);
  • 我使用了一种非常简单和高效的解决方法,在OpenOffice中添加了一个全局Makro,当打开文档时,它将自动执行我的Makro。Makro所做的只是查看文本“Content”,下移一行并更新所选的内容表。但这只有在openOffice ist开始对用户可见时才起作用。否则就不行了。 用于更新它的脚本如下所示:

    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时,代码已经准备好了。谢谢,顺便说一句。