[300分求助]关于控制Word的问题(300分)

  • 主题发起人 主题发起人 懒虫007
  • 开始时间 开始时间

懒虫007

Unregistered / Unconfirmed
GUEST, unregistred user!
A 最近编写一个报表打印的程序,需要调用WORD文档,并向其中的表格中添加数据库中的数据。参考了从前论坛中的问题,自己试了一下用WordApplication和WordDocument连接,可是程序运行时在启动WORD时总是提示“存储空间不足,不能完成此操作。”后来改为用CreateOLEObject方式启动WORD问题解决,今天再打开昨天的程序发现这个也不行了,还是“存储空间不足,不能完成此操作。”,不知道是什么意思,该如何解决,请大家帮忙。

B 在程序中如何根据数据库中的记录数量来控制WORD建立新的一页,并把空表格复制到新的一页里面,并保留表头信息,如:姓名、性别、年龄......
 

首先用Word编辑报表格式,并排好版,把将要输出的数据项用表单域代替,并取名。
这里我们暂时假设有表单域Item1及Item2(均为文本型),将这个文档存为模板文件
Example.dot,然后按如下步骤进行:
  1)运行Delphi3,在Form1里加入一个System部件集里的TDdeClientCov部件,取名
为DdeExample,将其ConnectMode设为ddeManual(手动方式);将DdeService设为
‘(WinWord)';将ServiceApplication设为‘WinWord'。
  2)编写一个自定义过程,以激活Word,如下:
  procedure Tform1.WordActive(Cmds: TStrings);
  var
   WordPath: String;
  begin
   if(not DdeExample.OpenLink) then {判断是否巳动态链接}
   begin
  if(FindWindow(′OpusApp′, nil)=0) then
  begin
  WordPath := ′C:/msoffice/winword′;
  if(WordPath=′′) then
  ShowMessage(′中文Word未安装或未设置路径,请安装设置Word中文版。′)
  else
  begin
  DdeExample.ServiceApplication := WordPath+′/Winword.exe′;
  if(DdeExample.OpenLink) {如果巳动态链接执行宏命令}
  then DdeExample.ExecuteMacroLines(Cmds,False)
  else ShowMessage(′无法启动Word中文版!′);
  DdeExample.ServiceApplication := ′WinWord.exe′;
  end;
  end
  else
  begin{如果巳动态链接执行宏命令}
  DdeExample.ExecuteMacroLines(Cmds,False);
  end;
  end
  else
  DdeExample.ExecuteMacroLines(Cmds,false);
  end;
  在private声明区里加入如下:
  procedure ActiveWord(Cmds: TStrings);
  3)在Form1中加入一个按钮Button1,在其onclick事件里写如下代码:
  procedure TForm1.Button1Click(Sender: TObject);
  var
  Cmds:TStringList;{创建Cmds}
  TempItem1,TempItem2:String;
  begin
  cmds:=TStringList.Create;
  cmds.Clear;
  TempItem1:=′数据项一′;
  TempItem2:=′数据项二′;
  with Cmds do
  begin
  Clear;
  Add(′[FileNew.Template = ″Example.Dot″]′);{打开模板文件Example.Dot}
  Add(′[AppMaximize]′);{文档最大化}
  Add(′[SetFormResult ″Item1″,″′+TempItem1+′″]′);{将数据TempItem1传
给表单域Item1}
  Add(′[SetFormResult ″Item2″,″′+TempItem2+′″]);{将数据TempItem2传给
表单域Item2}
  end;
  WordActive(DdeExample,Cmds);{调用自定义过程}
  Cmds.Free;{释放Cmds}
  end;
  运行这个程序,单击Button1,可以发现Word被启动了,屏幕上出现了&ldquo:
数据项一”数据项二&rdquo两个数据项。
 
http://www.delphibbs.com/delphibbs/dispq.asp?LID=1507227
这里面有一个
在delphi里将word的光标定位到某word文件的最后一页的最后一行,然后在该行插入一些内容的例子,看一下吧
 
感谢以上两位,用表单域的方式还没试过,不过原本我的程序是可以的,不知道究竟是什么原因造成它总是说“存储空间不足,不能完成此操作。”,估计是系统的原因吧,DELPHI自带的例子都没有办法运行,但有时候就可以,我想知道究竟如何才能解决这个问题。

感谢app2001您的例子对我非常有用。
 
你是不是打开了含有公式的文档?
 
“存储空间不足,不能完成此操作。”这个问题我在WIN98下也遇到过,改装XP后解决。
在WORD下打印报表最好使用模板,将模板设计成一页,数据量大时再自动增加即可,如:
if ((xh mod XX)=0) then //如果一页填满后添加新页,XH:行号,xx:模板中数据行数
begin
yh:=yh+1;//页码加1
i:=3;//在新页中复位行的初始值
//复制新的一页
pm1:=0;
pm2:=worddoc1.Content.End_-1;
worddoc1.Range(pm1,pm2).Copy;//COPY整段内容
worddoc1.Range(pm2).InsertParagraph;//插入一个空段落(回车)
pm2:=worddoc1.Content.End_-1;
worddoc1.Range(pm2).Paste;//粘贴拷贝的内容
end;
如要完整程序,留下你的EMAIL
 
打开的是纯文档,没有任何公式的。

谢谢Blyb,我的email:wyd007@163.com,系统XP,D6+office2000。
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=4601
请参考
 
to 懒虫007
发了
 
:),那你要注意Word的剪贴板的使用,最好是加入清空处量!
我做了三四十M的都没问题!
 
感谢大家的帮忙,“存储空间不足,不能完成此操作。”的问题已经找到答案了,我的机器装了江民2004的软件,当打开病毒防火墙的时候就会出现此提示,程序无法运行。关闭后问题解决了,有些莫名其妙,这居然也有冲突。谢谢大家了。

To:blyb您发过来的代码已经收到,谢谢
 
把我的代码也拿出来大家看看吧。

procedure TForm1.Button1Click(Sender: TObject);
var
MyWord, MyDoc: Variant;
begin
MyWord := CreateOleObject('Word.Application');
MyDoc := CreateOleObject('Word.Document');
MyWord.Visible := 1;
MyDoc := MyWord.Documents.Open(FileName:='c:/person.doc', ReadOnly:=True);//打开外部Word文档
{复制整个页面,并插入新页,粘贴}
MyWord.Selection.WholeStory;
MyWord.Selection.Copy;
MyWord.Selection.MoveDown( Unit:=wdLine, Count:=4 );
MyWord.Selection.InsertBreak( Type:=wdPageBreak );
MyWord.Selection.Paste;
MyWord.Selection.MoveDown( Unit:=wdLine, Count:=4 );
MyWord.Selection.InsertBreak( Type:=wdPageBreak );
MyWord.Selection.Paste;
MyWord.Selection.MoveDown( Unit:=wdLine, Count:=4 );
MyWord.Selection.InsertBreak( Type:=wdPageBreak );
MyWord.Selection.Paste; //以上可以根据需要复制的次数来完成
MyDoc.Tables.Item(1).Cell(3,4).range.text := 'abcd'; //向表格中插入数据
MyDoc.Tables.Item(2).Cell(2,4).range.text := 'abcd';
MyDoc.Tables.Item(3).Cell(3,5).range.text := 'dksdfk';
end;

其中插入新页面和复制表格那部分是查阅离线数据库中荼叶蛋的解答位置稍微有些不对,
但效果很好。
 
后退
顶部