紧急求救:如何获得一个路径下的指定excel的sheet1表中的数据,并随机提取其中的五个方格里的内容。(40分)

  • 主题发起人 主题发起人 huzhaowei
  • 开始时间 开始时间
H

huzhaowei

Unregistered / Unconfirmed
GUEST, unregistred user!
如何获得一个路径下的指定excel的sheet1表中的数据,并随机提取其中的五个方格里的内容。
 
procedure TForm1.Button4Click(Sender: TObject);
var
x,y,temp:array[1..5] of integer;
rangeE:array[1..5] of excel2000.range;
strtem:string;
i,n,count:integer;
result:real;
begin
//Dim Result, Filenum
Count:= strtoint(edit1.text);
//Filenum = FreeFile
ListBox1.Items.Add('Toatal:'+edit1.Text);
for n:=1 to count do
begin
count:=strtoint(edit1.Text);
for i:=1 to 5 do
begin
x:=round(10*random(10))+1;
y:=round(10*random(10))+1;
end;

for i:=1 to 5 do
begin
rangeE:=ExcelWorksheet1.Range['A'+inttostr(x),'A'+inttostr(y)];
temp:=val(rangeE);//想随机取出数据,不知道应当怎么写
end;
Result:= round(Temp[1] * Temp[2] / (Temp[3] + Temp[4] + Temp[5]));
strTem:= floattoStr(Temp[1]) + '×' + floattoStr(Temp[2]) + '/(' + floattoStr(Temp[3]) + '+' +
floattoStr(Temp[4]) + '+' + floattoStr(Temp[5]) + ')=' + floattoStr(Result);
ListBox1.items.add(strtem);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ExcelApplication1.GetOpenFilename('d:/excel/forecast.xls');
ExcelWorksheet1.;//这里不知道如何获取sheet1;
end;
 
1. 随机取数就用
Randomize;
Row := Random(200); //0 -- 200之间的随机数
Col := Random(100); //0 -- 100 之间的随机数
然后
ExcelWorkSheet1.Cells.Item[Row,Col]取得单元格的数值

2. 指定sheet如下:
xlApp.Connect;
xlBook.ConnectTo(xlApp.Workbooks.Open('E:/book1.xls',NULL,false,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0));
xlSheet.ConnectTo(xlBook.Sheets[1] as _WorkSheet);
其中xlSheet就指向了sheet1了; xlApp : TExcelApplication;
xlBook : TExcelWorkBook, xlSheet : TExcelWorkSheet.
 
procedure TForm1.Button1Click(Sender: TObject);
var
x,y:array[1..6] of integer;
temp:array[1..6] of real;
strtem:string;
i,n,j,count:integer;
result:integer;
begin
Count:= strtoint(edit1.text);
showmessage(inttostr(count));
for n:=1 to count do
begin
for i:=1 to 5 do
begin
Randomize;
x:=round(Random(200));
y:=round(random(200));
for j:=1 to 5 do
begin
temp[j]:=ExcelWorksheet1.Cells.Item[x,y];
end;
end;
Result:= round((Temp[1] * Temp[2]) / (Temp[3] + Temp[4] + Temp[5]));//在这里无法运算,提示无效的浮点的浮点指针操作。
strTem:= floattoStr(Temp[1]) + '×' + floattoStr(Temp[2]) + '/(' + floattoStr(Temp[3]) + '+' +
floattoStr(Temp[4]) + '+' + floattoStr(Temp[5]) + ')=' + floattoStr(Result);
showmessage(inttostr(count));
ListBox1.items.add('value:'+strtem);
memo1.Lines.Add(strtem);
end;
 
不动用Server的大驾也应该可以。
提供一个思路:
使用Ado连接Excel,动态设置连接串,指向特定文件。据说文件不能含有密码。

下面是Ado连接Excel的一点Tip,在老千的论坛上找的。

设置属性ConnetionString
选择 Microsoft Jet 4.0 OLE DB provider
Select or enter a datasorce name -> 选择你要打开Excel文件
User name默认是Admin 密码默认为空,可以不用理会
Extended properties 设为:Excel 8.0
sql语句 select * from [yourtablename]
(注意要有[])

只要连接上,随机读取就好办了。
 
>> Result:= round((Temp[1] * Temp[2]) / (Temp[3] + Temp[4] + Temp[5]));//在这里无法运算,提示无效的浮点的浮点指针操作。
你跟踪看一下Temp[1] ... Temp[5]不就行了,估计 Temp[3]..Temp[5]都是零.
Delphi的debug功能又不是摆摆样子的.
另:
1.Random函数取看看帮助,返回值的范围是什么,我看你的代码里都没检验,如果返回0,0,Excel
是否知道
2.你的随机数范围内是否都是数值
3.有除法公式的时候就要考虑被0除
 
如果仅仅是取得数据,建议使用server上的东西。
上面说的对你的要求基本已经够了。
 
是这样的,每次读出来的temp[1]..temp[5]都是0,我知道是random的取的范围问题,但是我
实在不知道怎么才能让他取到0以上的数值(excel表里没有0)。还请指点,万分感谢。
 
我不建议使用server控件。
发行的时候必须带着Excel!多麻烦呀。。。。[:(]
不过不知道Ado方式打开是否只要安装Ado就可以,我想应该可以的。[8D]
 
你做这个代码干什么用的,我总觉得蛮奇怪的一个需求.
excel表里数据在哪一块区域总应该知道吧,例如区域范围是
(20,2)到(40,10),那么就取
row = 20 + random(21)
col = 2 + random(9)
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部