2009-06-02 3 views
1

Я пытаюсь экспортировать тексты WideString из базы данных (ADO/MS Access) в документ MS Word (Delphi 7), но внешние символы переносятся неправильно (например, «» è "вместо" č «):MS Word Ole Automation, 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

Хотя поля в базе данных отмечены как Unicode, это решение работает. Спасибо вам большое и молодец! :) – vrad

0

Вы пробовали использовать

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

Без этого, я знаю, что Delphi 2009 имеет лучшую обработку Unicode (весь VCL теперь поддерживает его напрямую), что, скорее всего, исправить вашу проблему.

+0

Нет, в Delphi нет метода AsWideString 7. В других случаях AsVariant работает нормально. – vrad

+0

И, к сожалению, Delphi 7 является требованием клиента (это единственная версия, которую они имеют). – vrad

Смежные вопросы