情况是这样的,我有一个软件提供了EXCEL模式的实时保存记录功能,我想用DELPHI做一个将EXCEL文档实时导入至MSSQL数据库的小软件,要求就是一旦发现EXCEL文档记录发生改变(例如增加了1条记录)就实时的将这条记录导入到MSSQL中,全程用TIMER自动导入,无需要工操作!EXCEL文档(CVS格式)是在不停增加记录的(其它软件自动产生的相关记录),我想设定一个TIMER时间间隔,写一段Excel to Mssql的语句,将新产生的数据从Excel导入到Mssql数据库中,要保证数据无重复导入的情况!那位仁兄可否源码参考一二。
unit ExcelCounts;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, ComObj;type
ExcelCount = class
Index: Integer;
private
{ Private declarations }
public
function FileIsNull(fName: String): Boolean; //记录数是否为空
function FileIsEdit(fName: String): Boolean; //记录数是否被修改
function IsFileCount(fName: String): integer; //获取Excel记录行数
procedure ExcelToSql(fName: String; TableName: String); //将Excel记录导入MSSQL库 { Public declarations }
end;implementationuses IsFile, udmUser;function ExcelCount.IsFileCount(fName: String): Integer; //获取Excel记录行数
var
ExcelApp: Variant;
begin
ExcelApp := CreateOleObject( 'Excel.Application' ); //创建Excel实例
ExcelApp.WorkBooks.Open( 'fName',0,False ); //打开已存在的工作簿
ExcelApp.visible:=false; //不显示当前窗口
ExcelApp.Worksheets[1].activate; //设置第1个工作表为活动工作表
Result := ExcelApp.WorkSheets[1].UsedRange.Rows.Count; //得到excel的行数
end;
function ExcelCount.FileIsNull(fName: String): Boolean;
var
MaxCount: Integer;
begin
Result := False;
MaxCount := IsFileCount(fName);
if MaxCount = 0 then
Result := False
else
Result := True;
end;function ExcelCount.FileIsEdit(fName: String): Boolean;
var
MaxCount: Integer;
begin
Result := False;
MaxCount := IsFileCount(fName);
if MaxCount>Index then
Result := True
else
Result := False;
Index := MaxCount;
end;procedure ExcelCount.ExcelToSql(fName: String; TableName: String);
var
excelx,excely : string;
ExcelApp,WorkBook: Variant;
ExcelRowCount: integer;
i: integer;
begin
try
ExcelApp := CreateOleObject('Excel.Application');
WorkBook := ExcelApp.WorkBooks.Open(fName);//使用参数fName调用excel档路径
ExcelApp.Visible := false;
Index := 1;
for i := Index 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 UserDM.adqTemp do
begin
Close;
Sql.clear;
sql.add(insert into TableName(name,address) values(:name,:address));
parambyname('name').asstring := excelx;//excel档的第一列插入到TableName表的 name栏位;
parambyname('address').asstring := excely;//excel档的第二列插入到TableName表的 address 栏位;
execsql;
end;
end;
finally
WorkBook.Close;
ExcelApp.Quit;
ExcelApp := Unassigned;
WorkBook := Unassigned;
end;
end;end.
也往MSSQL写记录
/*
--下边是sql语句的实现,写到你的程序里就可以了(注意标点符号)
--data 是数据库表名
--在查出excel表中数据后给sheet1$加个别名,如: A
加入这句 where not exists(select 1 from data where id = A.id)
*/
insert into data
select * from
OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source="Data Source";Extended Properties="Excel 8.0;HDR=Yes;";Persist Security Info=False'')'...sheet1$ A
where not exists(select 1 from data where id = A.id)