[英]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.