如何使用Delphi 7从/向MSWord 2003读取/写入本地字符?

时间:2011-06-16 13:30:59

标签: delphi delphi-7 non-ascii-characters ole-automation word-2003

我的表单上有ListView包含名称和数字,我必须提供打印MSWord文档,并将这些数据填入文档表中。一切都适用于英文字符,但当我尝试发送一些东欧或俄罗斯字符时,它在文档中可见为“?”或者一些“垃圾”。此外,我无法将这些字符从文档读回应用程序。

我的问题是:

  1. 如何将"ЉЊĐŠŽČ"等字符发送到Word文档?
  2. 如何从MSWord中将这些字符读回应用程序?
  3. 简而言之,代码如下所示:

    word := CreateOleObject('Word.Application');
    word.Visible := true;
    doc := word.documents.Open(ExtractFilePath(Application.ExeName) + '\tpl.doc');
    
    table := word.ActiveDocument.Tables.Item(1);
    table.Cell(1,2).Range.Text := 'MY TEXT';
    
    word.ActiveDocument.Close;
    word.Quit;
    word := UnAssigned;
    doc := UnAssigned;
    table := UnAssigned;
    

    我可以更改字体的namesizecolor属性,但不能使用charset属性进行更改。

    任何人


    已安装软件:

    • Windows XP Professional
    • Microsoft Word 2003
    • Delphi 7企业版

1 个答案:

答案 0 :(得分:4)

问题来自于您使用后期绑定通过OLE自动化调用Word。

因此,Range.Text不是一种期望WideString(Unicode)内容的方法,而是Delphi 7下的纯ASCII文本。

首先解决方案可能是使用Delphi 2009及更高版本。新的string类型使这种Unicode赋值透明。

在Delphi 7下,强制将类型转换为WideString:

 table.Cell(1,2).Range.Text := WideString('MY TEXT'); 

或使用临时变量,如下所示:

 var tmp: WideString; 

   tmp := 'ЉЊĐŠŽČ'
   table.Cell(1,2).Range.Text := tmp; 

另一种可能是使用不后期绑定,但直接声明Office的OLE接口,从“项目”菜单导入“ Microsoft Word ???对象库” IDE。

导入的接口中将包含宽字符串类型,例如:

Range = interface(IDispatch)
  ['{0002095E-0000-0000-C000-000000000046}']
  function Get_Text: WideString; safecall;
  procedure Set_Text(const prop: WideString); safecall;
  (...)
  property Text: WideString read Get_Text write Set_Text;

所以你不再有任何关于Ansi charset的问题。