2009-06-02 61 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