2009-06-02 26 views
1

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

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

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

我错过了什么?

谢谢!

回答

3

我认为这不是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. 

上面的代码使用免费单元CodecUtilsWin32.pas从Utility Library v.2.0.18

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

0

您是否尝试过使用

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

短的,我知道,德尔福2009年有更好的操控性统一的(整个VCL现在可以直接支持的话),将最有可能解决您的问题。

+0

不,在Delphi 7中没有AsWideString方法。在其他情况下,AsVariant可以正常工作。 – vrad 2009-06-02 16:35:22

+0

不幸的是,Delphi 7是客户的要求(这是他们唯一的版本)。 – vrad 2009-06-02 16:41:26