从Excel表中过滤数据填入数据库中,问题很急的!!!(明天要交活儿。)

时间:2022-11-06 12:29:08
我现在需要做个程序,程序是实现从Excel文件中提取数据填入数据库中,即在Excel文件中实现像在一般数据库中使用sql语句的where的效果。声明,不能使用ADO,ODBC等方法,因为我发现在使用这些数据库的连接方法的时候,会对Excel的列进行数据转换。即如果有如下所示列:
列名        企业名称
            企业一  
            企业二
            1
            2
            3 
这时“企业名称”这列将会因为可以转化成数字的数据多:“1、2、3”共三条多于字符串“企业一、企业二”两条,这个列转化为字段的时候就会转化为ftFloat,而不会转化为ftwidestring类型。这样就造成了:“企业一、企业二”这两条信息的丢失。所以我希望大家告诉我一个可以用Server控件的解决方法。我希望提供过滤的方法,并希望给出源码。小弟曾是用过Excel中录制宏的方法,录制了过滤的VBA代码。可是由于小弟愚钝无法转换为Delphi中的Pascal。数据过滤是一个问题,还有一个问题就是数据过滤完了以后如何用程序读出已过滤出的数据。这两个问题一直困扰着我。老板催得急,希望明天出活,所以希望大家看看出主意。我这里写过了。如果分数觉得不够我可以再加。多谢!多谢!

14 个解决方案

#1


还有一点我忘了说了,千万不要说您的方法是让我一行一行的遍历数据,因为我不是操作一次。那样的话,效率会很低的。

#2


用ADO应该没什么问题吧

#3


qiujsh(qiujsh):我不知道是不是我ADO是用的问题。当我用的时候的确出现了。我上面说的现象,数据会丢失,也不是整条记录丢失,只是那条它转化过程中认为非法的那个字段的那条非法信息,会丢失。别如他认为是数值型,而你中间有“企业一”这样的字符型。就会把“企业一”给丢了,而且取都取不到。

#4


这样的话,不知道该怎么办了

#5


qiujsh(qiujsh) :谢谢你关注我的问题。
BTW,别的大侠们来关注我的问题啊!!!

#6


我熟悉的也就是ADO了,看来帮不上忙了,帮你顶吧

#7


看到没有大家的恢复。我现在有些含糊了。这么多人用ADO都没有问题。是不是我用错了呢?你们是如何使用ADO做查询的呢?你们用ADO是连接都作了那些设置?ADO对一个Sheet查询你们是如何写的呢?能写出来看看吗?请指教!

#8


用office 的excel ole对象,这个问题轻松解决。

不过,看看日子,你是不是已经交货了?god save you ~~~

if you did not ,pls mail rulioo@21cn.com  i tell u more .

#9


希望这个问题还可以继续。我的程序送测了,不过由于用了便利会被测试打回。希望知道的大侠们帮我解决问题。谢谢了。

#10


如何在DELPHI中操作EXCEL电子表格 

EXCEL电子表格作为办公软件OFFICE中的重要组成部份,是日常办公系统的主要助手,因此许多日常所需的业务方面的数据通常是通过电子表格存取。有时我们需要从日常工作中创建的EXCEL中取得数据进行操作、打印、查询,统计等工作。在这里我将介绍如何利用delphi完成EXCEL电子表格中数据的操作。

一、 新建一项目,从控件栏servers中分别选取控件:excelapplication、excelworkbook1、excelworksheet,放到主窗体from1中,并加入stringgrid、三个按钮、五个显示字段内容的EDIT、二个操作显示记录的label、一个用于打开EXCEL电子表格的控件opendialog等,如下图所示:


 


二、选择excel表'按钮,用于打开EXCEL文件,其代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
opendialog1.InitialDir:=ExtractFileDir(paramstr(0));//文件的打存放初始路径
opendialog1.Execute;
Try
ExcelApplication1.Connect;//EXCEL应用程序
Except
MessageDlg('Excel may not be installed',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
try 
excelapplication1.Workbooks.Open(opendialog1.FileName,
null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
except
begin
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;showmessage('请选择EXCEL电子表格!');
exit;
end;
end;
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);//ExcelWorkbook1与Eexcelapplication1建立连接
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);//Excelworksheet1与Excelworkbook1建立连接 
//开始从EXCEL中取数,放到stringgrid1中,取完数后关闭EXCEL
for i:=1 to 1000 do//最大取值1000
for j:=1 to 6 do
begin
if trim(excelworksheet1.cells.item[i+1,1])<>'' then
begin
stringgrid1.rowCount:=i+1;
stringgrid1.Cells[j,i]:=ExcelWorksheet1.Cells.Item[i+1,j];
end
else
begin
label3.caption:=inttostr(i-1);
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
//将第一条数据赋给编辑框
edit2.text:=stringgrid1.Cells[1,1];
edit1.text:=stringgrid1.Cells[2,1];
edit3.text:=stringgrid1.Cells[3,1];
edit4.text:=stringgrid1.Cells[4,1];
edit5.text:=stringgrid1.Cells[5,1];
exit;
end;
end;
end;

三、'下一条记录'按钮,完成记录向下移动,代码如下:
procedure TForm1.Button2Click(Sender: TObject);
var x:integer;
begin
x:=stringgrid1.row+1;
if x<> stringgrid1.RowCount then
begin
stringgrid1.row:=stringgrid1.row+1;
label1.caption:=inttostr(x);
edit2.text:=stringgrid1.Cells[1,x];
edit1.text:=stringgrid1.Cells[2,x];
edit3.text:=stringgrid1.Cells[3,x];
edit4.text:=stringgrid1.Cells[4,x];
edit5.text:=stringgrid1.Cells[5,x];
exit;
end
else
showmessage('已到第一条记录!');
end;

四、'上一条记录',完成记录上移,代码如下:
var x:integer;
begin
x:=stringgrid1.row-1;
if x<>0 then
begin
stringgrid1.row:=stringgrid1.row-1;
label1.caption:=inttostr(x);
edit2.text:=stringgrid1.Cells[1,x];
edit1.text:=stringgrid1.Cells[2,x];
edit3.text:=stringgrid1.Cells[3,x];
edit4.text:=stringgrid1.Cells[4,x];
edit5.text:=stringgrid1.Cells[5,x];
exit;
end
else
showmessage('已到最后一条记录!');
end;


五、stringgrid中上下移动时代码:
procedure TForm1.StringGrid1Click(Sender: TObject);
var i:integer;
begin
i:=stringgrid1.Row;
label1.caption:=inttostr(i);
edit1.text:=stringgrid1.Cells[2,i];
edit2.text:=stringgrid1.Cells[1,i];
edit3.text:=stringgrid1.Cells[3,i];
edit4.text:=stringgrid1.Cells[4,i];
edit5.text:=stringgrid1.Cells[5,i];
end;


六、运行程序,点击按钮1打开excel表格。程序将启动EXCEL,并打开了选择的电子表格,这时请不要关闭EXCEL,当程序从EXCEL取数完毕将自动关闭EXCEL程序,应用程序取出了EXCEL数据,显示在stringgrid中,并将第一笔数据各字段的值赋给了左边的对应的edit字段。点击按钮2、按钮3可以查看下一条或上一条记录。也可以使用光标在stringgrid1上移动。




同时我们也可以对stringgrid中的记录进行查询、定位。相反,也可以将数据库中的数据输入到EXCEL中。 总之,只要我们从EXCEL提取出数据,并保存到stringgrid中,我们就可以进行相应操作,如统计、查询、重新输出,使平进的EXCEL电子表格中的数据在应用程序中得到利用。






作者会员名:mypost
   

#11


谢谢你的程序啊!可是我在运行到ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);//Excelworksheet1与Excelworkbook1建立连接 语句是就出现问题了,请问是什么原因啊?

#12


okgxs(叶风铃1):
    谢谢。你的关注我的问题。不过,我不希望是用你这样的方法。如果是这样的话。和我把Excel中的文件一行行读到数据库中没有太大差别。我需要的使用类似Excel中那种数据筛选的功能。直接从Excel中找到相应数据,然后取出。而不是一行行的读出,然后再取。希望你给出别的方法。

#13


okgxs(叶风铃1) 的方法我试过了,虽然可以实现,不过如果是针对不同的表,在界面设定和修改上都会有些困难,而且好象效率比较低。不知道有没有其它什么比较好的方法?

#14


大家有什么建议都可以提啊。rulioo(西区可可) 不是有个好方法吗?我给你写信,你也没有理我啊。是忙吗?大家帮忙。

#1


还有一点我忘了说了,千万不要说您的方法是让我一行一行的遍历数据,因为我不是操作一次。那样的话,效率会很低的。

#2


用ADO应该没什么问题吧

#3


qiujsh(qiujsh):我不知道是不是我ADO是用的问题。当我用的时候的确出现了。我上面说的现象,数据会丢失,也不是整条记录丢失,只是那条它转化过程中认为非法的那个字段的那条非法信息,会丢失。别如他认为是数值型,而你中间有“企业一”这样的字符型。就会把“企业一”给丢了,而且取都取不到。

#4


这样的话,不知道该怎么办了

#5


qiujsh(qiujsh) :谢谢你关注我的问题。
BTW,别的大侠们来关注我的问题啊!!!

#6


我熟悉的也就是ADO了,看来帮不上忙了,帮你顶吧

#7


看到没有大家的恢复。我现在有些含糊了。这么多人用ADO都没有问题。是不是我用错了呢?你们是如何使用ADO做查询的呢?你们用ADO是连接都作了那些设置?ADO对一个Sheet查询你们是如何写的呢?能写出来看看吗?请指教!

#8


用office 的excel ole对象,这个问题轻松解决。

不过,看看日子,你是不是已经交货了?god save you ~~~

if you did not ,pls mail rulioo@21cn.com  i tell u more .

#9


希望这个问题还可以继续。我的程序送测了,不过由于用了便利会被测试打回。希望知道的大侠们帮我解决问题。谢谢了。

#10


如何在DELPHI中操作EXCEL电子表格 

EXCEL电子表格作为办公软件OFFICE中的重要组成部份,是日常办公系统的主要助手,因此许多日常所需的业务方面的数据通常是通过电子表格存取。有时我们需要从日常工作中创建的EXCEL中取得数据进行操作、打印、查询,统计等工作。在这里我将介绍如何利用delphi完成EXCEL电子表格中数据的操作。

一、 新建一项目,从控件栏servers中分别选取控件:excelapplication、excelworkbook1、excelworksheet,放到主窗体from1中,并加入stringgrid、三个按钮、五个显示字段内容的EDIT、二个操作显示记录的label、一个用于打开EXCEL电子表格的控件opendialog等,如下图所示:


 


二、选择excel表'按钮,用于打开EXCEL文件,其代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
opendialog1.InitialDir:=ExtractFileDir(paramstr(0));//文件的打存放初始路径
opendialog1.Execute;
Try
ExcelApplication1.Connect;//EXCEL应用程序
Except
MessageDlg('Excel may not be installed',mtError, [mbOk], 0);
Abort;
End;
ExcelApplication1.Visible[0]:=True;
ExcelApplication1.Caption:='Excel Application';
try 
excelapplication1.Workbooks.Open(opendialog1.FileName,
null,null,null,null,null,null,null,null,null,null,null,null,0);//打开指定的EXCEL 文件
except
begin
ExcelApplication1.Disconnect;//出现异常情况时关闭
ExcelApplication1.Quit;showmessage('请选择EXCEL电子表格!');
exit;
end;
end;
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);//ExcelWorkbook1与Eexcelapplication1建立连接
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);//Excelworksheet1与Excelworkbook1建立连接 
//开始从EXCEL中取数,放到stringgrid1中,取完数后关闭EXCEL
for i:=1 to 1000 do//最大取值1000
for j:=1 to 6 do
begin
if trim(excelworksheet1.cells.item[i+1,1])<>'' then
begin
stringgrid1.rowCount:=i+1;
stringgrid1.Cells[j,i]:=ExcelWorksheet1.Cells.Item[i+1,j];
end
else
begin
label3.caption:=inttostr(i-1);
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
//将第一条数据赋给编辑框
edit2.text:=stringgrid1.Cells[1,1];
edit1.text:=stringgrid1.Cells[2,1];
edit3.text:=stringgrid1.Cells[3,1];
edit4.text:=stringgrid1.Cells[4,1];
edit5.text:=stringgrid1.Cells[5,1];
exit;
end;
end;
end;

三、'下一条记录'按钮,完成记录向下移动,代码如下:
procedure TForm1.Button2Click(Sender: TObject);
var x:integer;
begin
x:=stringgrid1.row+1;
if x<> stringgrid1.RowCount then
begin
stringgrid1.row:=stringgrid1.row+1;
label1.caption:=inttostr(x);
edit2.text:=stringgrid1.Cells[1,x];
edit1.text:=stringgrid1.Cells[2,x];
edit3.text:=stringgrid1.Cells[3,x];
edit4.text:=stringgrid1.Cells[4,x];
edit5.text:=stringgrid1.Cells[5,x];
exit;
end
else
showmessage('已到第一条记录!');
end;

四、'上一条记录',完成记录上移,代码如下:
var x:integer;
begin
x:=stringgrid1.row-1;
if x<>0 then
begin
stringgrid1.row:=stringgrid1.row-1;
label1.caption:=inttostr(x);
edit2.text:=stringgrid1.Cells[1,x];
edit1.text:=stringgrid1.Cells[2,x];
edit3.text:=stringgrid1.Cells[3,x];
edit4.text:=stringgrid1.Cells[4,x];
edit5.text:=stringgrid1.Cells[5,x];
exit;
end
else
showmessage('已到最后一条记录!');
end;


五、stringgrid中上下移动时代码:
procedure TForm1.StringGrid1Click(Sender: TObject);
var i:integer;
begin
i:=stringgrid1.Row;
label1.caption:=inttostr(i);
edit1.text:=stringgrid1.Cells[2,i];
edit2.text:=stringgrid1.Cells[1,i];
edit3.text:=stringgrid1.Cells[3,i];
edit4.text:=stringgrid1.Cells[4,i];
edit5.text:=stringgrid1.Cells[5,i];
end;


六、运行程序,点击按钮1打开excel表格。程序将启动EXCEL,并打开了选择的电子表格,这时请不要关闭EXCEL,当程序从EXCEL取数完毕将自动关闭EXCEL程序,应用程序取出了EXCEL数据,显示在stringgrid中,并将第一笔数据各字段的值赋给了左边的对应的edit字段。点击按钮2、按钮3可以查看下一条或上一条记录。也可以使用光标在stringgrid1上移动。




同时我们也可以对stringgrid中的记录进行查询、定位。相反,也可以将数据库中的数据输入到EXCEL中。 总之,只要我们从EXCEL提取出数据,并保存到stringgrid中,我们就可以进行相应操作,如统计、查询、重新输出,使平进的EXCEL电子表格中的数据在应用程序中得到利用。






作者会员名:mypost
   

#11


谢谢你的程序啊!可是我在运行到ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);//Excelworksheet1与Excelworkbook1建立连接 语句是就出现问题了,请问是什么原因啊?

#12


okgxs(叶风铃1):
    谢谢。你的关注我的问题。不过,我不希望是用你这样的方法。如果是这样的话。和我把Excel中的文件一行行读到数据库中没有太大差别。我需要的使用类似Excel中那种数据筛选的功能。直接从Excel中找到相应数据,然后取出。而不是一行行的读出,然后再取。希望你给出别的方法。

#13


okgxs(叶风铃1) 的方法我试过了,虽然可以实现,不过如果是针对不同的表,在界面设定和修改上都会有些困难,而且好象效率比较低。不知道有没有其它什么比较好的方法?

#14


大家有什么建议都可以提啊。rulioo(西区可可) 不是有个好方法吗?我给你写信,你也没有理我啊。是忙吗?大家帮忙。