资料一。

从数据库导数据至excel 容易,但要是想把excel 里的数据通过delphi写的程式导入数据库就没那么简单了,并且网上讲的都不全面,没有几个完整可行的方案,以下是我收集的个人认为比较可行的方案,不敢独享,故拿出来供大家学习参考之用!

procedure load(rowCount,colCount:integer; fileName:String; var grid:TStringGrid);
//从Excel中读取数据到 Grid
var
   v:variant;
   i,j:integer;
begin
   grid.RowCount:=rowCount;
   grid.ColCount:=colCount;
   v:=createoleobject('Excel.Application');//创建OLE对象
   try
     form2.show;
     form2.ProgressBar1.Position := 0;
     form2.ProgressBar1.Max :=   65535;
     V.workBooks.Open(fileName);
     //for i:=1 to rowCount do
     for i:=1 to 65535 do
       for j:=1 to colCount do
         //if grid.Cells[j-1,i-1] = '' then break;
         form2.ProgressBar1.Position := i;
         grid.Cells[j-1,i-1]:=v.workbooks[1].sheets[1].cells[i,j];
     v.workbooks[1].close;
   finally
     v.quit;
     form2.close;
   end
end;
{
procedure save(tableName:String;grid:TStringGrid);
// 将 Grid 中的数据保存到 SQL Server 数据表中
var
   valuesStr:string;
   i,j:integer;
begin
   if not CreateTable(tableName,grid.ColCount) then
   begin
     showmessage('Error On CreateTable');
     exit;
   end;
   for i:=1 to grid.RowCount-1 do
   begin
     valuesStr:=inttostr(i)+',';
     for j:=0 to grid.ColCount-1 do
       valuesStr:=valuesStr+Grid.Cells[j,i]+',';
     if not insertone(tableName,valuesStr) then
     begin
       showmessage('Error On Row('+inttostr(i)+')');
       exit;
     end;
   end;
   showmessage('数据导入成功');
end;

function insertone(const tableName, ValuesStr: string): boolean;
// 插入一条记录
var
   tmpstr,s:string;
   p:integer;
begin
   result:=true;
   tmpstr:=ValuesStr;
   with query1 do
   begin
     close;
     sql.Clear;
     sql.Add('insert into '+tableName+' values(');
     s:='';
     while tmpstr<>'' do
     begin
       p:=pos(',',tmpstr);
       s:=s+''''+copy(tmpstr,1,p-1)+''',';
       system.Delete(tmpstr,1,p);
     end;
     s:=copy(s,1,length(s)-1);
     sql.Add(s);
     sql.Add(')');
     try
       execsql;
     except
       result:=false;
     end;
   end;
end;

function CreateTable(const tableName:String; aFieldCount: integer): boolean;
// 创建表
var
   tmpstr:string;
   i:integer;
begin
   result:=true;
   tmpstr:='if exists (select * from sysobjects where Name='''
     +tableName+''') drop table '+tableName+' create table '+tableName+'(';
   for i:=1 to aFieldCount do
     tmpstr:=tmpstr+'F'+inttostr(i)+' varchar(50),';
   delete(tmpstr,length(tmpstr),1);
   tmpstr:=tmpstr+')';
   with query1 do
   begin
     close;
     sql.Clear;
     sql.Add(tmpstr);
     try
       execsql;
     except
       result:=false;
     end;
   end;
end;
   }

资料二:

delphi excel导入delphi

2008年02月22日 星期五 23:52

单元接口部分引用 comobj 单元(uses )
procedure TForm1.Button1Click(Sender: TObject);
var excelx,excely : string;
begin
try
ExcelApp := CreateOleObject('Excel.Application');
WorkBook := ExcelApp.WorkBooks.Open(opendialog.FileName);//使用opendialog对话框指定
//excel档路径
ExcelApp.Visible := false; ExcelRowCount := WorkBook.WorkSheets[1].UsedRange.Rows.Count;
for i := 1 to excelrowcount 1
do
begin
excelx := excelapp.Cells[i,1].Value;
excely := excelapp.Cells[i,2].Value;
if ((excelapp.Cells[i,1].Value = '') and (ExcelApp.Cells[i,2].Value = '')) then //指定excel档的第 i 行 ,第 1,2(看情况而定)行如果为空就退出,这样的设定,最好是你的档案力这两行//对应数据库中不能为空的数据
exit
else
with query1 do
begin
close;
sql.clear;
sql.add(insert into test(name,address) values(:name,:address));
parambyname('name').asstring := excelx;//excel档的第一列插入到test表的 name栏位;
parambyname('address').asstring := excely;//excel档的第二列插入到test表的 address 栏位;
execsql;
end;
end;
finally WorkBook.Close;
ExcelApp.Quit;
ExcelApp := Unassigned;
WorkBook := Unassigned;
end;
end;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
用CreateOleObject( 'Excel.Application' );打开EXCEL文件,读入想要的单元格内容,再通过数据库控件写入数据库!看看下面代码:
function import_abclib_from_excel(Gau:TGauge;var emsg:string;var errorrow:integer;total,stnum:integer):integer;
var
col:integer;
temp:string;
item_input:array[1..MAX_ABCLIB_COLS]of string;
libno:longint;
libtype:integer;
libname,libfirst,liblast,liblist:string;
begin
emsg:='';
result:=0;
ExcelApp.WorkSheets[2].Activate;
while true do
begin
// 读取一行记录
for col:=1 to MAX_ABCLIB_COLS do
begin
   temp:=create_excelrowcol_name(result+2,col);
   item_input[col]:=trim(get_excel_value(temp));
end;
if item_input[ABCLIBNUM_POS]='' then break;//导入完毕
libno:=strtoint(item_input[LIBNO_POS]);
libname:=item_input[LIBNAME_POS];
libtype:=0;
if item_input[LIBTYPE_POS]='输入' then libtype:=1;
libfirst:=item_input[LIBFIRST_POS];
liblast:=item_input[LIBLAST_POS];
liblist:=item_input[LIBLIST_POS];
liblist:=get_liblist(item_input[LIBLIST_POS]);
if not insert_abclib(libno,libname,libtype,libfirst,liblast,liblist,emsg) then
begin
   errorrow:=result+2;
   exit;
end;
result:=result+1;
Gau.Progress:=(result+stnum)*100 div total;
end;
end;
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
您正在看的DELPHI是:Excel文件导入StringGrid。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.t
您正在看的DELPHI是:Excel文件导入StringGrid。ext:=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电子表格 中的数据在应用程序中得到利用。

<--EndFragment-->

转载于:https://www.cnblogs.com/piaoliuxia/archive/2008/10/14/1937289.html

delphi 与 Excel数据交换相关推荐

  1. 基于delphi的excel数据导入导出

    因为淘宝客户的一个小需求,写了一个"基于delphi 7的excel数据导入导出"小工具.为了抛砖引玉,将这个小工具分享出来.希望对初学者和用得到的朋友有点点小小的帮助.oracl ...

  2. 认识Excel的第二天(格式的删除、数据的转置、数据交换)

    1.外侧框线的添加与删除 (1)给表格添加线框:选中需要添加的区域,在选中区域单机鼠标右键,选择外侧框线,下面有很多种外侧框线的样式,选择一种(这里选择的是所有框线) 展示的结果如下图  (2)删除格 ...

  3. Delphi控制Excel自动生成报表

    摘要:Excel是当前最流行的数据报表制作工具.本文介绍如何使用Delphi来控制Excel完成数据库与报表之间的数据交换,讨论了报表制作工程中的一些细节性问题. 关键字:Delphi,Excel,报 ...

  4. matlab与excel数据连接数据库,如何实现matlab与excel数据同步 数据交互?

    Excel Link是一个在Windows环境下实现Excel与Matlab进行链接的插件.通过连接Excel和Matlab,用户可以在Excel工作表空间和宏编程工具中使用Matlab的数值计算,图 ...

  5. java excel data 导入数据_java实现导入导出excel数据

    项目需要,要实现一个导入导出excel的功能,于是,任务驱动着我学习到了POI和JXL这2个java操作Excel的插件. 一.POI和JXL介绍 1.POI:是对所有office资源进行读写的一套工 ...

  6. 【C/C++12】天气APP:不同数据建表入表,数据交换(exptables.cpp,ftpputfiles.cpp)

    文章目录 1.分区预警信号数据:strstr,UpdateStr 1.1 数据说明:.txt后缀可改为.csv后缀 1.2 建表入表:站点代码改为街道代码,站点名称改为街道名称 2.台风(热带气旋)数 ...

  7. 并发工具类(四)两个线程进行数据交换的Exchanger

    简介 Exchanger(交换者)是一个用于线程间协作的工具类.Exchanger用于进行线程间的数据交换.它提供一个同步点,在这个同步点两个线程可以交换彼此的数据.这两个线程通过exchange方法 ...

  8. webservice 参数太大_手把手系列:常用数据交换方案Web Service接口处理法

    手把手系列:常用数据交换方案之Web Service接口处理法 Web Service是一个SOA(面向服务的编程)的架构,是一个平台独立的,低耦合的,基于可编程的web的应用程序,可使用开放的XML ...

  9. 学完这个你就成为excel高手了!(Delphi对Excel的所有操作)逐个试试!

    学完这个你就成为excel高手了!(Delphi对Excel的所有操作)逐个试试!   一) 使用动态创建的方法  首先创建 Excel 对象,使用ComObj:  var ExcelApp: Var ...

  10. 数据交换平台开发之二功能需求

    数据交换平台顾名思义是一个为不系统间提供数据交流.转换功能从而达到数据资料共享的软件产品.其处理 的主要对象就是各类业务数据,其使用者为各类参与交换的系统或数据源. 市面上的数据交换产品其功能很丰富, ...

最新文章

  1. Leetcode 391.完美矩形
  2. Timer 和TimerTask 的定时任务入门
  3. webpack常用的三种JS压缩插件
  4. 看《长安十二时辰》可以了解哪些算法知识
  5. 最近在写驱动,把所有的资料心得都贴出来啦
  6. redis3.2.8 linux集群安装
  7. (52)CSS hack
  8. LCD1602液晶显示
  9. 大事件归来,爷青回!
  10. Symbols andSymbol Tables
  11. SpringBoot SSM 心理咨询论坛社区
  12. 第二章 Jsp基本语法
  13. 期望和方差的定义与性质
  14. android禁止弹出保存此图片,安卓手机相册总是出现陌生图片?教你彻底清除!...
  15. Vistual Studio Community 2017 30天许可证过期
  16. 30行,金额转人民币大写的代码
  17. 【AI学习总结】均方误差(Mean Square Error,MSE)与交叉熵(Cross Entropy,CE)损失函数
  18. 转行学什么就业前景好
  19. 张量分解-Tucker分解
  20. 网络推广是竞价好,还是优化好

热门文章

  1. 李白的苏台览古译文赏析
  2. MySQL 日志管理、备份与恢复
  3. linux安装google浏览器
  4. jpg转换excel转换器_Excel转换功能变得简单
  5. 英文科技论文写作中常见的问题和技巧(自用整理)
  6. 以太坊 私链 节点连接(window)
  7. 解决appium中Error: The port #8100 is occupied by an other process的问题
  8. c++使用POP协议接收以及解析邮件
  9. element el-table表头添加背景图片
  10. VMware 安装心得