Pergunta

Eu estou tentando exportar WideString textos do banco de dados (ADO / MS Access) para o documento MS Word (Delphi 7), mas caracteres estrangeiros não são transferidos corretamente (ou seja, " e " em vez de " C "):

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

Eu também tentei usar CreateOleObject() diretamente, mas nenhuma diferença.

O que eu estou ausente?

Obrigado!

Foi útil?

Solução

Eu acho que não é um problema com a Palavra, mas sim com a forma como as cordas são armazenados no banco de dados. Eles provavelmente são salvos como strings ANSI, não como strings Unicode / WideString. E se isso for verdade, então eles são salvos em alguns codificação que você deve saber se você quer que eles sejam decodificados corretamente.

Aqui está um exemplo de aplicativo que demonstra como converter seqüência ANSI em WideString e guardá-lo no 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.

O código acima usa o freeware CodecUtilsWin32.pas unidade de Utility Biblioteca v.2.0.18

Então, eu sugiro usar TStringField vez de TWideStringField e convertendo as cordas para widestrings como no exemplo acima.

Outras dicas

Você tentou usando

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

curta do que, eu sei que o Delphi 2009 tem uma melhor manipulação de Unicode (inteira VCL agora suporta-lo diretamente) que provavelmente corrigir seu problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top