如何使用Delphi和com接口更新ODT文档中的“目录”

时间:2013-09-12 04:28:16

标签: delphi com openoffice.org ole openoffice-writer

首先是我尝试实现的背景。 我基本上创建一个报告,并根据用户选择将其导出为不同的格式(odt,doc& pdf)。

所以我的方法是以开放文档格式odt生成整个文档(在通过规范和XML之后,这非常简洁),然后我使用openoffice com接口以编程方式打开文档并保存用词或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”才能完成这项工作。

2 个答案:

答案 0 :(得分:2)

您是否在某个活动中尝试过自动更新?

sub OnOpenDocumentUpdateAllDocumentIndexes
oIndexes = ThisComponent.getDocumentIndexes()

for i = 0 to oIndexes.getCount () - 1
 oIndexes (i).update
next i
end sub 

答案 1 :(得分:0)

好的,现在我发现了问题并提出了解决方法! 1.目录的更新仅在documnet打开时才有效! 所以我不得不将我的代码更改为:

wProperties[0] := MakePropertyValue('Hidden', False);
  1. 我使用了一个非常简单有效的工作方法,向OpenOffice添加了一个全局的Makro,当文档打开时,它将自动执行我的Makro。所有Makro正在做的是查看文本“内容”,向下移动一行并更新选定的内容表。但这仅在openOffice开始对用户可见时才有效。否则它不起作用。 更新它的脚本如下:

    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