大俠救命﹗打印WORD表格遭遇問題﹗(100分)

  • 主题发起人 主题发起人 databox
  • 开始时间 开始时间
D

databox

Unregistered / Unconfirmed
GUEST, unregistred user!
大俠們﹕
我要將資料打印到WORD中﹐于是在WORD中插入表格。但是﹐在輸出資料的過程中﹐經常
出現"伺服器丟出一個例外"這種錯誤﹐而這個錯誤并不是我的資料哪兒有問題﹐因為若我設
置斷點一筆一筆的過﹐就不會出現問題。而若編譯成可執行擋后﹐有時輸出3頁后就出問題﹐
有時在5頁﹐反正一樣的資料它出問題的概率和出錯的地方都不一樣。請問這是為什么﹐怎么
解決呀﹖出錯后﹐再去打印﹐就出現"無法連結RPC伺服器"。哪位大俠遇到過這種情況﹐請告
訴我﹗萬分感謝﹗﹗我必須用WORD打出來﹐而且很急﹗
 
请在程序退出时,把word关闭(注意检查内存中的运行的),试一试
 
它是在正在運算中出的問題呢。也就是說正在往WORD中輸入資料的時候﹐隨機的出問題。
 
极有可能是打印机驱动程序的问题,这种问题较易在打印质量较高的激光打印机上
出现(可能是内存溢出),你可以安装与你的打印机兼容的其他型号打印机的驱动
程序或换台针式打印机试试。
 
西山居士﹕感謝您的回答。但是﹐那個時候我還沒有打印的﹐只是還在往WORD檔中加入資料﹐
所以不存在打印機的問題。(我上面的提問不太清楚)我是往WORD檔這個文件中加入表格的
時候﹐就像手工往里面加表格一樣﹐只是我用程序來代替了。但是在這個過程中﹐比如我有
100筆資料﹐就要加入100個表格﹐但也許在加第5個表格時﹐也許在第10個表格時﹐就會出
現上述錯誤。不知是什么原因﹖
 
当宽度不够需要回车时用的参数中有一个会从1变成2,若还用1就会出错。
至于RFC服务器,是指你所调用的word等作为服务器的外部程序。
 
sunhood﹐請問你有沒有用WORD的實例(要對WORD檔有修飾方面的﹐就是能直接打出所隨的文
檔﹐不需要再手工排版的)﹐能否發給我學習一下。若對我有幫助﹐200分酬謝﹗我現在很
需要這方面的東西﹐謝謝﹗
 
我有这方面的实例:
var
OUnit,OCount,OExtend,OCount_1 : OleVariant;
begin
OUnit := wdCharacter;
OCount := 1;
OExtend := wdMove;
OCount_1 := 2;

WordApplication.Selection.TypeText(ADOQuery1.FieldByName('Name').AsString);
WordApplication.Selection.MoveRight(OUnit,OCount,OExtend);

WordApplication.Selection.TypeText(ADOQuery1.FieldByName('Phone').AsString);
WordApplication.Selection.MoveRight(OUnit,OCount,OExtend);

WordApplication.Selection.TypeText(ADOQuery1.FieldByName('Fax').AsString);
WordApplication.Selection.MoveRight(OUnit,OCount,OExtend);

WordApplication.Selection.TypeText(ADOQuery1.FieldByName('Email').AsString);
WordApplication.Selection.MoveRight(OUnit,OCount,OExtend);

WordApplication.Selection.TypeText(ADOQuery1.FieldByName('Remark').AsString);
WordApplication.Selection.MoveRight(OUnit,OCount_1,OExtend);
end;
这是一条纪录有5个字段,全列出来的例子。
如果有n条纪录,且每条纪录都为5个字段,可用循环方式控制。
 
sunhood:非常感謝你的例子﹐但是我就是在這兒出錯。因為我的代碼很長﹐沒有貼出來。這
會兒我貼出來。謝謝哪位幫我解決﹗
procedure TFrmCompany.WriteToWord;
var Template,NewTemplate,ItemIndex,PageNumberAlignment:OleVariant;
Count_Var:OleVariant;
un_Var,un_DownVar,ex_Var,Start_var,End_Var,Down_Var,Up_Var:OleVariant;
Bool_var:OleVariant;
i:integer;
CWidth:array[0..8] of single;
begin
CWidth[0]:=45;
CWidth[1]:=80;
CWidth[2]:=35;
CWidth[3]:=240;
CWidth[4]:=400;
CWidth[5]:=355;
CWidth[6]:=150;
CWidth[7]:=275;
CWidth[8]:=55;
Template := EmptyParam;
NewTemplate := False;
ItemIndex:=1;
WA.Connect;
WA.Visible:=True;
WA.Documents.Add(Template, NewTemplate);
WD.ConnectTo(WA.Documents.Item(ItemIndex));

PageNumberAlignment:=wdAlignPageNumberCenter;
Bool_var:=True;
WA.Selection.Sections.Item(1).Footers.Item(1).PageNumbers.Add(PageNumberAlignment,Bool_Var);

Bool_var:=False;
AdoQryCompany.First;
i:=1;
while not AdoQryCompany.Eof do
begin
WD.Tables.Add(WA.selection.Range,9,4);

un_Var:=wdCharacter; //第一行
Start_Var:=1;
End_Var:=4;
ex_Var:=wdExtend;
WA.Selection.MoveRight(un_Var,End_Var,ex_Var);
WA.Selection.Cells.Merge;
WA.Selection.TypeText(AdoQryCompany.FieldByName('province').AsString);
WA.Selection.Cells.Item(1).SetWidth(CWidth[4],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;

un_DownVar:=wdLine;
Down_Var:=1;
ex_Var:=wdMove;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var); //第二行
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[2],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[7],wdAdjustNone);

WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
Start_Var:=1;
End_Var:=3;
ex_Var:=wdMove;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
ex_Var:=wdExtend;
WA.Selection.MoveRight(un_Var,End_Var,ex_Var);
WA.Selection.Cells.Merge;
WA.Selection.Cells.Item(1).SetWidth(CWidth[5],wdAdjustNone);

ex_Var:=wdMove;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);

WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone); //第四行
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
Count_Var:=3;
WA.Selection.Cells.Split(Down_var,Count_var,Bool_Var);
WA.Selection.MoveLeft(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[1],wdAdjustNone);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[2],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[6],wdAdjustNone);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);

WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone); //第五行
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[1],wdAdjustNone);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[2],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[3],wdAdjustNone);

ex_Var:=wdMove;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var); //第六行
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[2],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[7],wdAdjustNone);

ex_Var:=wdMove; //第七行
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
End_Var:=3;
ex_Var:=wdExtend;
WA.Selection.MoveRight(un_Var,End_Var,ex_Var);
WA.Selection.Cells.Merge;
WA.Selection.Cells.Item(1).SetWidth(CWidth[5],wdAdjustNone);

ex_Var:=wdMove;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var); //第八行
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
End_Var:=3;
ex_Var:=wdExtend;
WA.Selection.MoveRight(un_Var,End_Var,ex_Var);
WA.Selection.Cells.Merge;
WA.Selection.Cells.Item(1).SetWidth(CWidth[5],wdAdjustNone);

ex_Var:=wdMove;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
WA.Selection.Cells.Item(1).SetWidth(CWidth[0],wdAdjustNone);
WA.Selection.ParagraphFormat.Alignment:=wdAlignParagraphCenter;
WA.Selection.MoveRight(un_Var,Start_Var,ex_Var);
End_Var:=3;
ex_Var:=wdExtend;
WA.Selection.MoveRight(un_Var,End_Var,ex_Var);
WA.Selection.Cells.Merge;
WA.Selection.Cells.Item(1).SetWidth(CWidth[5],wdAdjustNone);
ex_Var:=wdMove;

if txtOK then
WD.Tables.Item(i).Cell(2,1).Range.Text:=lblData[0]
else
WD.Tables.Item(i).Cell(2,1).Range.Text:='ID';
WD.Tables.Item(i).Cell(2,2).Range.Text:=AdoQryCompany.FieldByName('ID').AsString;
if txtOK then
WD.Tables.Item(i).Cell(2,3).Range.Text:=lblData[1]
else
WD.Tables.Item(i).Cell(2,3).Range.Text:='Name';
WD.Tables.Item(i).Cell(2,4).Range.Text:=AdoQryCompany.FieldByName('name').AsString;
if txtOK then
WD.Tables.Item(i).Cell(3,1).Range.Text:=lblData[5]
else
WD.Tables.Item(i).Cell(3,1).Range.Text:='Address';
WD.Tables.Item(i).Cell(3,2).Range.Text:=AdoQryCompany.FieldByName('address').AsString;
if txtOK then
WD.Tables.Item(i).Cell(4,1).Range.Text:=lblData[6]
else
WD.Tables.Item(i).Cell(4,1).Range.Text:='Tel';
WD.Tables.Item(i).Cell(4,2).Range.Text:=AdoQryCompany.FieldByName('tel').AsString;
if txtOK then
WD.Tables.Item(i).Cell(4,3).Range.Text:=lblData[7]
else
WD.Tables.Item(i).Cell(4,3).Range.Text:='Fax';
WD.Tables.Item(i).Cell(4,4).Range.Text:=AdoQryCompany.FieldByName('fax').AsString;
if txtOK then
WD.Tables.Item(i).Cell(4,5).Range.Text:=lblData[17]
else
WD.Tables.Item(i).Cell(4,5).Range.Text:='Post No';
WD.Tables.Item(i).Cell(4,6).Range.Text:=AdoQryCompany.FieldByName('postno').AsString;
if txtOK then
WD.Tables.Item(i).Cell(5,1).Range.Text:=lblData[8]
else
WD.Tables.Item(i).Cell(5,1).Range.Text:='LXR';
WD.Tables.Item(i).Cell(5,2).Range.Text:=AdoQryCompany.FieldByName('lxr').AsString;
if txtOK then
WD.Tables.Item(i).Cell(5,3).Range.Text:=lblData[9]
else
WD.Tables.Item(i).Cell(5,3).Range.Text:='Tel';
WD.Tables.Item(i).Cell(5,4).Range.Text:=AdoQryCompany.FieldByName('l_tel').AsString;

if txtOK then
WD.Tables.Item(i).Cell(6,1).Range.Text:=lblData[11]
else
WD.Tables.Item(i).Cell(6,1).Range.Text:='FeedBack';
WD.Tables.Item(i).Cell(6,2).Range.Text:=AdoQryCompany.FieldByName('feedback').AsString;
WD.Tables.Item(i).Cell(6,3).Range.Text:='Email';
WD.Tables.Item(i).Cell(6,4).Range.Text:=AdoQryCompany.FieldByName('email').AsString;

if txtOK then
WD.Tables.Item(i).Cell(7,1).Range.Text:=lblData[16]
else
WD.Tables.Item(i).Cell(7,1).Range.Text:='Memo';
WD.Tables.Item(i).Cell(7,2).Range.Text:=AdoQryCompany.FieldByName('memo').AsString;

if txtOK then
WD.Tables.Item(i).Cell(8,1).Range.Text:=lblData[18]
else
WD.Tables.Item(i).Cell(8,1).Range.Text:='Products';
WD.Tables.Item(i).Cell(8,2).Range.Text:=AdoQryCompany.FieldByName('products').AsString;

if txtOK then
WD.Tables.Item(i).Cell(9,1).Range.Text:=lblData[10]
else
WD.Tables.Item(i).Cell(9,1).Range.Text:='Notice';
WD.Tables.Item(i).Cell(9,2).Range.Text:=AdoQryCompany.FieldByName('notice').AsString;

Down_Var:=1;
ex_Var:=wdMove;
if ex_Var<>0 then showmessage('!!!');//就是這個地方出錯﹐我一看ex_Var就成了几萬﹐而本應該是1.
//所以加了一個ShowMessage,但這個很隨機﹐并不是我實際超出了。有時候第三筆﹑五筆時就出問題﹐而我
//用斷點來一筆一筆的執行就不會出問題﹐很正常。WHY?
try
WA.Selection.MoveDown(un_DownVar,Down_Var,ex_Var); //提一行
except
ShowMessage(AdoQryCompany.FieldByName('tel').AsString);
end;
WD.Range.InsertAfter(#13);
Down_Var:=2;
ex_Var:=wdMove;
WA.Selection.MoveDown(un_DownVar,Down_Var,ex_Var);
AdoQryCompany.Next;
inc(i);
end;
end;
 
因该不是ex_Var:=wdMove这里错,可能在别处。
比如:WA.Selection.MoveDown(un_DownVar,Down_Var,ex_Var)处,
有可能Down_Var需要的是2而不是1。
你把你的完整程序法过来,我帮你看看,到底是怎么回事。
 
我的打印內容都在里面了﹐跟其它部分沒多大關系。
 
我想你应该在WD.Tables.Add(WA.selection.Range,9,4);前面加上一句
WD.Range.InsertAfter(#13);
因为有时候到一页的最后一行的时候,就会出现问题,两个表会接在一起。
另外,你写出错那个地方,你不要用MoveDown,你还是用MoveRight试试看,
我以前也打过表格,出过问题,但不知是不是你的那个问题。呵呵,你直接打到EXCEL
里不是更好?!
 
在换页时,应该是自动的,打表格可以不考虑页的问题。
 
>>我想你应该在WD.Tables.Add(WA.selection.Range,9,4);前面加上一句
>>WD.Range.InsertAfter(#13);
我以前是在后面加上兩個WD.Range.InsertAfter(#13);還是出問題﹐加上三個也出問題﹐為
什么加在前面就不出問題﹖我覺得這個好難控制。不過﹐加在前面的確沒問題了﹐這是怎么
回事﹖
 
可看我在 http://www.delphibbs.com/delphibbs/dispq.asp?LID=458661
的回答。
 
謝謝各位﹗
 
后退
顶部