繁体   English   中英

MS Word Ole Automation,ADO和外来字符

[英]MS Word Ole Automation, ADO and foreign characters

我正在尝试将WideString文本从数据库(ADO / MS Access)导出到MS Word文档(Delphi 7),但是未正确传输外来字符(即“ è ”而不是“ č ”):

while not ADOQuery1.Eof do
begin
  WordApplication1.Selection.TypeText(ADOQuery1Text.AsVariant); // TWideStringField
  WordApplication1.Selection.TypeParagraph;
  ADOQuery1.Next;
end;

我也尝试过直接使用CreateOleObject() ,但没有区别。

我想念什么?

谢谢!

我认为这不是Word的问题,而是字符串在数据库中存储方式的问题。 它们可能保存为Ansi字符串,而不是Unicode / WideString字符串。 如果是这样,则它们将以某种编码保存,您必须知道是否希望它们正确解码。

这是一个示例应用程序,演示如何将Ansi字符串转换为WideString并将其保存在Word中:

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils,
  ComObj,
  ActiveX,
  CodecUtilsWin32;

procedure Test();
var
  wordApp, wordDoc: Variant;
  ansiStr: string;
  codec: TUnicodeCodec;

  function str2WideStr(const s: string): WideString;
  var
    i: Integer;
  begin
    codec.DecodeStr(@s[1], Length(s), Result);
  end;

begin
  codec := TEncodingRepository.CreateCodecByAlias('ISO-8859-2');

  ansiStr := #$BF#$F3#$B3#$E6; //"zólc"

  wordApp := CreateOleObject('Word.Application'); 
  wordDoc := wordApp.Documents.Add;
  wordApp.Selection.TypeText(str2WideStr(ansiStr));
  wordDoc.SaveAs('C:\sample.doc');
  wordDoc.Close();
  wordApp.Quit(False);
end;

begin
  CoInitialize(nil);
  Test();
end.

上面的代码使用实用程序库v.2.0.18中的免费软件单元CodecUtilsWin32.pas

因此,我建议使用TStringField而不是TWideStringField并将字符串转换为WideStrings,如上面的示例所示。

您是否尝试过使用

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

简而言之,我知道Delphi 2009具有更好的Unicode处理能力(整个VCL现在直接支持它),很可能会解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM