如何使用 Delphi 7 从 MSWord 2003 读取/写入本地字符?

发布于 2024-11-15 21:16:54 字数 903 浏览 6 评论 0原文

我的表单上有 ListView,其中包含姓名和数字,我必须提供打印 MSWord 文档,并将这些数据填充到文档的表格中。英语字符一切正常,但当我尝试发送一些东欧或俄语字符时,它在文档中显示为“?”或者一些“垃圾”。我也无法将这些字符从文档读回应用程序。

我的问题是:

  1. 如何将 "ЉЊĐŠŽČ" 等字符发送到 Word 文档?
  2. 如何将这些字符从 MSWord 读回应用程序?

简而言之,代码如下所示:

word := CreateOleObject('Word.Application');
word.Visible := true;
doc := word.documents.Open(ExtractFilePath(Application.ExeName) + '\tpl.doc');

table := word.ActiveDocument.Tables.Item(1);
table.Cell(1,2).Range.Text := 'MY TEXT';

word.ActiveDocument.Close;
word.Quit;
word := UnAssigned;
doc := UnAssigned;
table := UnAssigned;

我可以更改字体的 namesizecolor 属性,但不能使用 charset 做到这一点 属性。

有人吗?


安装的软件:

  • Windows XP Professional
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition

I have ListView on my form containing names and numbers and I have to provide printing MSWord document with those data filled into document's tables. Everything works fine with english characters but when I try to send some eastern European or Russian characters it is visible in document as "?" or some "trash". Also I can't read those characters from document back to application.

My questions are:

  1. How to send characters like "ЉЊĐŠŽČ" to Word document?
  2. How to read these characters from MSWord back to application?

In short, code looks like this:

word := CreateOleObject('Word.Application');
word.Visible := true;
doc := word.documents.Open(ExtractFilePath(Application.ExeName) + '\tpl.doc');

table := word.ActiveDocument.Tables.Item(1);
table.Cell(1,2).Range.Text := 'MY TEXT';

word.ActiveDocument.Close;
word.Quit;
word := UnAssigned;
doc := UnAssigned;
table := UnAssigned;

I can change font's name, size and color properties but can't do that with charset property.

Anybody?


Software installed:

  • Windows XP Professional
  • Microsoft Word 2003
  • Delphi 7 Enterprise Edition

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

ら栖息 2024-11-22 21:16:54

问题源于您使用后期绑定通过 OLE 自动化调用 Word。

因此,在 Delphi 7 下,Range.Text 不被认为是期望 WideString (Unicode) 内容的方法,而是纯 ASCII 文本。

第一个解决方案可能是使用 Delphi 2009 及更高版本。新的 string 类型使这种 Unicode 分配变得透明。

在 Delphi 7 下,如何强制类型转换为 WideString:

 table.Cell(1,2).Range.Text := WideString('MY TEXT'); 

或使用临时变量,如下所示:

 var tmp: WideString; 

   tmp := 'ЉЊĐŠŽČ'
   table.Cell(1,2).Range.Text := tmp; 

另一种可能性是不使用后期绑定,而是直接声明 Office 的 OLE 接口,导入“Microsoft Word ??? 对象库”,来自 IDE 的“项目”菜单。

您将在导入的接口中拥有宽字符串类型,例如:

Range = interface(IDispatch)
  ['{0002095E-0000-0000-C000-000000000046}']
  function Get_Text: WideString; safecall;
  procedure Set_Text(const prop: WideString); safecall;
  (...)
  property Text: WideString read Get_Text write Set_Text;

因此您将不再遇到任何 Ansi 字符集问题。

The issue comes from the fact that you're calling Word via OLE Automation using late binding.

So Range.Text is not known as a method expecting a WideString (Unicode) content, but plain ASCII text, under Delphi 7.

First solution could be to use Delphi 2009 and later. The new string type made such Unicode assignment transparent.

Under Delphi 7, what about forcing the type cast to WideString:

 table.Cell(1,2).Range.Text := WideString('MY TEXT'); 

or using a temporary variable, like this:

 var tmp: WideString; 

   tmp := 'ЉЊĐŠŽČ'
   table.Cell(1,2).Range.Text := tmp; 

Another possibility could be to use not late-binding, but direct declaration of the OLE interface of Office, importing the "Microsoft Word ??? Object library" from the "Project" menu of the IDE.

You'll have widestring types in the imported interfaces, e.g:

Range = interface(IDispatch)
  ['{0002095E-0000-0000-C000-000000000046}']
  function Get_Text: WideString; safecall;
  procedure Set_Text(const prop: WideString); safecall;
  (...)
  property Text: WideString read Get_Text write Set_Text;

So you won't have any issue with Ansi charset any more.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文