Pregunta

Estoy tratando de exportar WideString textos de la base de datos (ADO / MS Access) al documento de MS Word (Delphi 7), pero los caracteres extranjeros no se transfieren correctamente (es decir, " e " en vez de " c "):

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

También he intentado usar CreateOleObject() directamente, pero no hay diferencia.

¿Qué me falta?

Gracias!

¿Fue útil?

Solución

Creo que no es un problema con la palabra sino con la forma en que las cadenas se almacenan en la base de datos. Probablemente se guardan como cadenas ANSI, no como cadenas Unicode / WideString. Y si eso es cierto, entonces ellos se guardan en alguna codificación que debe saber si usted quiere que sean decodificados correctamente.

Esta es una aplicación de ejemplo que muestra cómo convertir cadena ANSI en WideString y guardarlo en 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.

El código anterior utiliza CodecUtilsWin32.pas unidad de software gratuito de biblioteca de utilidades v.2.0.18

Así que me gustaría sugerir el uso de TStringField en lugar de TWideStringField y la conversión de las cadenas de WideStrings como en el ejemplo anterior.

Otros consejos

¿Ha intentado utilizar

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

A falta de eso, sé que Delphi 2009 tiene un mejor manejo de Unicode (VCL todo ahora soporta directamente) que lo más probable corregir su problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top