如何用delphi操作word

z_ 2005-11-28 03:31:50
急待解决的问题就是如何用delphi实现word中的统计字数
另外想多了解一些关于操作word的相关内容
比如用ole动态创建的和TWordApplication的偏重点在哪里,有什么不同等等……

大号没分了,只好找出尘封已久的马甲(还是为了顶群星闪耀贴注册的,呵呵)
...全文
888 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellolongbin 2005-12-01
  • 打赏
  • 举报
回复
可以了
Thanks a lot!
alexanda2000 2005-11-30
  • 打赏
  • 举报
回复
这些结果类的内置对话框好像总要执行一下,否则它的数值就不能保证。

在WordDialog:=WordApp.Dialogs.Item(wdDialogToolsWordCount);的后面加上一句:

WordDialog.Execute;

就可以了。
hellolongbin 2005-11-30
  • 打赏
  • 举报
回复
已经发了

我在word里看的是11396和14994,用程序跑出来是
字符数(不计空格)14202
字符数(计空格)16660
alexanda2000 2005-11-30
  • 打赏
  • 举报
回复
alexanda@126.com,你把文件发过来我试一下
hellolongbin 2005-11-30
  • 打赏
  • 举报
回复
我的是XP+officeXP
我在另一台2000+office2000的机器上试也是一样不行,它好像把回车也算进去了

你有没有邮箱,我发一个我要跑的正式文件给你
alexanda2000 2005-11-29
  • 打赏
  • 举报
回复
试了很久终于搞定了,呵呵。微软的帮助看来还是有些讲得不清楚。下面是完整的代码。

uses ComObj;

const
wdDialogToolsWordCount = $000000E4;

var
WordApp,WordDoc,WordDialog:OleVariant;

begin
WordApp:=CreateOleObject('Word.Application');
WordDoc:=WordApp.Documents.Open('E:\Test.Doc');
// WordApp.Visible:=True;
WordDialog:=WordApp.Dialogs.Item(wdDialogToolsWordCount);
Memo1.Lines.Add('字数:'+InttoStr(WordDialog.Words));
Memo1.Lines.Add('字符数(不计空格)'+InttoStr(WordDialog.Characters));
Memo1.Lines.Add('字符数(计空格)'+InttoStr(WordDialog.CharactersIncludingSpaces));
WordDoc.Saved:=True;
WordDoc.Close;
WordApp.Quit;
WordDialog:=Unassigned;
WordDoc:=Unassigned;
WordApp:=Unassigned;
end;
alexanda2000 2005-11-29
  • 打赏
  • 举报
回复
回头试了一下字数那里是有问题
alexanda2000 2005-11-29
  • 打赏
  • 举报
回复
字数统计里关于字数的有三项,一是字数,二是字符数(不计空格),三是字符数(计空格)

Memo1.Lines.Add('字数'+InttoStr(WordDoc.Words.Count));
是对应"字数统计"对话框中"字数"那一项,即第一项,意思是"包括空格的字数",不是不包括空格.在我机上测试的时候没有问题啊,回头我再试一试.

Memo1.Lines.Add('字符数(包括空格)'+InttoStr(WordDoc.Characters.Count-WordDoc.Paragraphs.Count));对应的是第三项,即"包括空格的字符数"

至于第二项我也不知道怎么求.如果一定要弄的话,我只有一个笨办法就是每个字符判断是不是空格,计出空格数后再从字符总数中扣了.

退出代码:

WordDoc.Saved:=True; //不保存文件.如果不保存设Saved为真,否则为假.
WordDoc.Close;
WordApp.Quit;
WordDoc:=Unassigned;
WordApp:=Unassigned;
alexanda2000 2005-11-29
  • 打赏
  • 举报
回复
我在两台机上试了都没有问题。另一台是winxp+D2005+office2003
搞不懂为什么在你机上的结果会不同,不知是不是office版本不同的原因。
hellolongbin 2005-11-29
  • 打赏
  • 举报
回复
另外如何退出上面的代码也没提供
hellolongbin 2005-11-29
  • 打赏
  • 举报
回复
多谢楼上

上面的程序包括空格的统计结果是正确的,但不包含空格的WordDoc.Words.Count跟word里面的结果还是不一样,而且差的很多,能不能再帮忙看看,谢谢
alexanda2000 2005-11-29
  • 打赏
  • 举报
回复
我试了,报的也是19和20啊,没问题。

winxp + D7 + office2003
hellolongbin 2005-11-29
  • 打赏
  • 举报
回复
多谢,我试过了,小文件可以,但是如果文章里面包含过多回车或段落还是会有错误,你可以拷下面的内容到word里试一试:
1
11111111






































3333333333

我在3的后面加了个空格,正常应该报19和20(包含空格),但上面的方法就多报了许多
我也是在试过我要跑的文件后不行才一步步找出来的,小的文件都可以
alexanda2000 2005-11-28
  • 打赏
  • 举报
回复
用OLE的方法控制Word几乎和VBA一样,可以控制Word的所有功能,缺点是没有代码提示,要参照Word的帮助和VBA。

用TWordApplication组件的方式有代码提示,但有很多功能用不了,而且在调用Word的一些方法时,不能省略默认的参数,写参数写到手软。

Word里面的字数统计是特殊的内置对话框,用宏是录制不下来的。

var
WordApp,WordDoc:OleVariant;

begin
WordApp:=CreateOleObject('Word.Application');
WordDoc:=WordApp.Documents.Open('f:\Test.Doc');
WordApp.Visible:=True;
Memo1.Lines.Add('字数'+InttoStr(WordDoc.Words.Count));
Memo1.Lines.Add('字符数(包括空格)'+InttoStr(WordDoc.Characters.Count-WordDoc.Paragraphs.Count));
//
// 退出Word
//
end;
hellolongbin 2005-11-28
  • 打赏
  • 举报
回复
多谢楼上,我试过了,有的文件可以,有的不可以,而且可以的统计出来的数据也跟用word-工具-字数统计的结果对不起来

我试过录制宏,可是什么都没录下来

有谁知道如何直接调用“字数统计”功能么?
leonkim 2005-11-28
  • 打赏
  • 举报
回复
procedure TForm2.Button3Click(Sender: TObject);
var
ItemIndex :OleVariant;
FileName, ConfirmConversions, ReadOnly, AddToRecentFiles,
PasswordDocument, PasswordTemplate, Revert,
WritePasswordDocument, WritePasswordTemplate, Format: OleVariant;
begin
WordApplication1.Connect;
try
ItemIndex := 1;
FileName := 'H:\工作报告\下阶段计划.doc';

//参数赋值
ConfirmConversions := False;
ReadOnly := False;
AddToRecentFiles := False;
PasswordDocument := '';
PasswordTemplate := '';
Revert := True;
WritePasswordDocument := '';
WritePasswordTemplate := '';
Format := wdOpenFormatDocument;


WordApplication1.Documents.Openold( FileName, ConfirmConversions,
ReadOnly, AddToRecentFiles, PasswordDocument, PasswordTemplate,
Revert, WritePasswordDocument, WritePasswordTemplate, Format );

WordDocument1.ConnectTo(WordApplication1.Documents.Item(ItemIndex));
ShowMessage(INttostr(WordDocument1.Characters.Count));
ShowMessage(INttostr(WordDocument1.Words.Count));
finally
WordApplication1.Disconnect;
end;
end;
z_ 2005-11-28
  • 打赏
  • 举报
回复
up1
z_ 2005-11-28
  • 打赏
  • 举报
回复
那么如何用程序实现统计字数的功能呢?这个要求比较急的说
leonkim 2005-11-28
  • 打赏
  • 举报
回复
http://www.caiblog.com/245/tiger12/56245.shtml
leonkim 2005-11-28
  • 打赏
  • 举报
回复
http://www.yesky.com/401/1700901.shtml

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧