1

我试图让 FreePascal 打开一个 word 文档,将一些文本和数据附加到它,然后关闭它。我已经成功连接,并且可以在文档中写一行,但是任何超过这个的东西都让我失望。目前我正在尝试这个 Visual Basic 参考中的方法细节,这与我期望 FreePascal 处理事情的方式非常相似。

基本上我想我误解了 Lazarus 和 Word OLE 之间的关系实际上是如何工作的,谁能给我任何关于如何构建一个我可以构建的简单文档的例子?

以下代码打开文档,然后完全替换其内容

program officAuto;

{$IFDEF FPC}
{$MODE Delphi}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
   SysUtils, Variants, ComObj;

const
   ServerName = 'Word.Application';

var
   Server, Doc : Variant;
   oPara : Variant;
   w:widestring;

begin
   if Assigned(InitProc) then
   TProcedure(InitProc);

try
   Server := CreateOleObject(ServerName);
   except
        WriteLn('Unable to start Word.');
   Exit;
end;

w:= UTF8Decode('c:\mydoc.docx');
Server.Visible := True;  {Make Word visible}
Doc := Server.Documents.Open(w); 

Doc.Range.Text := 'This is a Heading';
Doc.Range.Font.Bold := True;
Doc.Format.SpaceAfter := 24; 
end.

然而,根据上面的代码,在尝试在书签上打印字符串时,打开文档,保留内容,移动到书签,然后什么都不做。

w:= UTF8Decode('c:\mydoc.docx');
Server.Visible := True;  
Doc := Server.Documents.Open(w); 

oPara := Doc.Content.Paragraphs.Add(Doc.Bookmarks.Item('\Bookmark1').Range);
oPara := Doc.Range.Text('Where will this appear if at all!');
4

1 回答 1

1

啊,我解决了。以下代码按预期工作:

program officAuto;

{$IFDEF FPC}
  {$MODE Delphi}
{$ELSE}
  {$APPTYPE CONSOLE}
{$ENDIF}

uses
   SysUtils, Variants, ComObj;

var
  Server, Connect : Variant;
  oWord, oPara1, oPara2 : Variant;

  w:widestring;

  begin
    if Assigned(InitProc) then
    TProcedure(InitProc);

  try
    Server := CreateOleObject('Word.Application');
  except
    WriteLn('Unable to start Word.');
    Exit;
  end;


  // oWord := Server.Documents.Add;
  w:= UTF8Decode('c:\mydoc.docx');
  Server.Visible := True;  
  Server.Documents.Open(w); 

  oPara1 := Server.ActiveDocument.Content.Paragraphs.Add;
  oPara1.Range.Text := 'This is a Heading';
  oPara1.Range.Font.Bold := True;
  oPara1.Format.SpaceAfter := 24;
  oPara1.Range.InsertParagraphAfter();

  oPara2 := Server.ActiveDocument.Content.Paragraphs.Add;
  oPara2.Range.Text := 'Where will this appear if at all!';
  oPara2.Range.Font.Bold := False;
  oPara2.Format.SpaceAfter := 24;
  oPara2.Range.InsertParagraphAfter();
end. 
于 2013-07-31T13:29:39.920 回答