MS Word Ole 自动化、ADO 和外来字符

Posted

技术标签:

【中文标题】MS Word Ole 自动化、ADO 和外来字符【英文标题】:MS Word Ole Automation, ADO and foreign characters 【发布时间】:2009-06-02 15:10:49 【问题描述】:

我正在尝试将 WideString 文本从数据库 (ADO / MS Access) 导出到 MS Word 文档 (Delphi 7),但未正确传输外来字符(即“è” "č"):

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

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

我错过了什么?

谢谢!

【问题讨论】:

【参考方案1】:

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

上面的代码使用来自Utility Library v.2.0.18的免费软件单元CodecUtilsWin32.pas

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

【讨论】:

虽然数据库中的字段被标记为 Unicode,但此解决方案有效。非常感谢你,做得很好! :)【参考方案2】:

您是否尝试过使用

WordApplication1.Selection.TypeText(ADOQuery1Text.AsWideString); 

除此之外,我知道 Delphi 2009 可以更好地处理 Unicode(现在整个 VCL 都直接支持它),这很可能会解决您的问题。

【讨论】:

不,Delphi 7 中没有 AsWideString 方法。在其他情况下,AsVariant 工作正常。 不幸的是,Delphi 7 是客户的要求(这是他们唯一拥有的版本)。

以上是关于MS Word Ole 自动化、ADO 和外来字符的主要内容,如果未能解决你的问题,请参考以下文章

使用 java 中的 OLE 自动化将 word 文件拆分为多个较小的 word 文件

如何使用 OLE 自动化关闭 Word 文档?

OLE 自动化 - WORD 表格 (Delphi)

C++中ADO访问数据库方法?

带有 OLE DB SQLServer2000 数据源的 ADO.NET 实体框架

转载OLE DB, ADO, ODBC关系与区别