想把EXCEL文件存入ACCESS数据库中(100分)

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

h163_2

Unregistered / Unconfirmed
GUEST, unregistred user!
想把EXCEL文件存入ACCESS数据库中,如何设计ACCESS的字段?如何设计delphi端程序?
 
access的字段只能够动态生成吧,否则你EXCEL里面的各项不一定一样啊。
 
我可能没有说清情况:
用Excel做了一个文件,想把它存在access数据库中,比如用OLE对象,
问题是怎样才能方便的用delphi写个客户端程序,简单实现对此excel文件的变更(新增,修改,删除)。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
用ado连接

  1.设置ADOConnection的ConnectionString
构造ConnectionString时,OLE DB的提供者要选择Microsoft Jet 4.0 OLE DB Provider作为ADO的驱动程序。这本来是用于连接Access数据库的驱动程序,但也可打开Excel文件。
连接的数据库名称当然就是你要打开的Excel文件,注意扩展名是*.xls,而不是*.mdb。
最关键的一点是,还要设置扩展属性Extended Properties为“Excel 8.0”,否则,测试连接时会报告无法识别数据格式的错误。Extended Properties的属性值在“所有”参数页中输入。
最后,设置完成后的ConnectionString中的各项参数为:
Provider=Microsoft.Jet.OLEDB.4.0
Data Source=MyExcelFile.xls
Extended Properties=Excel 8.0
Persist Security Info=False

  2.设置ADODataSet或ADOTable
将ADODataSet或ADOTable连接到刚才的ADOConnection。如果不用ADOConnection,也可以参照上面的方法直接设置ADODataSet或ADOTable的ConnectionString属性。
对于ADODataSet,需要将CommandType属性设置为cmdTableDirect,而对于ADOTable,则将TableDirect属性设置为True。因为,访问Excel文件是直接的数据文件访问,不是通过SQL语句来操作游标访问的。如果不设置直接访问,则系统会报告SQL语句格式错误等信息。
然后,当你下拉ADODataSet中的CommandText属性或ADOTable的TableName属性时,就可以选择到要打开的工作表了。注意,表名后面多了加一个$符号。
  3.打开ADODataSet或ADOTable
 
我想h163_2说的是把一个文件插入到数据库中吧,不是把excel文件中的数据
导入数据库。
如果是把文件插入到数据库中可以参照插入图片文件的方法
添加/读出文件到access数据库-yanghaisheng
//函数名: AddDocIntoTable
//参数:
// aFileName:string 文件名,含全路径
// Table:TADOTable 表名,所用的数据表控件的名称
//返回:boolean 添加到表成功则返回true,否则返false
//描述: 本函数将指定的文件导入数据库中.
function TfrmMain.AddDocIntoTable(aFileName:string;Table:TADOTable):boolean;
var
MStream: TMemoryStream;
FileName:string;

begin
if(not FileExists(aFileName)and (ExtractFileExt(aFileName) = ''))then
begin
result:=false;
exit;
end;
try
//得到文件名
FileName:=ExtractFilename(aFileName);
if not Table.Active then Table.Active :=true;

//装载文件到流
MStream:=TMemoryStream.create;
try

MStream.LoadFromFile(aFileName);
except
ShowMessage('不能打开文件,这个文件可能被其他程序打开了。');
MStream.Free;
Result:=false;
exit;
end;
MStream.Position :=0;

//添加数据到数据库中
Table.Append ;
Table.FieldByName('FileName').asString :=FileName;
TBlobField(Table.FieldByName('File')).LoadFromStream(MStream);
Table.Post ;
//释放流
MStream.Free ;
except
//出错返回
if(MStream<>nil)then MStream:=nil ;
Result:=false;
exit;
end;
Result:=true;
end;
//函数名: SaveTableDocToFile
//参数:
// aFilePath:string 路径,最后字符不是'/'
// Table:TADOTable 表名,所用的数据表控件的名称
//返回:boolean 保存文件成功则返回true,否则返false
//描述: 本函数将从数据库读取当前指针所指记录,并写入文件中.

function TfrmMain.SaveTableDocToFile(aFilePath:string;Table:TADOTable):boolean;
var
MStream:TStream;
MFileStream:TFileStream;
pImage: pointer;
FileName:string;
aFileName:String;
begin
try
if not Table.Active then Table.Active :=true;

//从数据库读出文件信息
MStream:=Table.CreateBlobStream(Table.FieldbyName('File'),bmRead);
FileName :=Table.FieldByName('FileName').asString ;

//组合文件名
aFileName := aFilePath+'/'+ FileName;
MStream.Position:=0;
GetMem(pImage, MStream.Size);
//创建文件
MFileStream := TFileStream.Create(aFileName, fmCreate);
MStream.Read(pImage^,MStream.Size);
MFileStream.Write(pImage^ ,MStream.Size);
FreeMem(pImage);

MFileStream.Free ;
MStream.Free ;
except
if(MStream<>nil)then MStream:=nil ;
if(MFileStream<>nil)then MFileStream:=nil ;
Result:=false;
exit;
end;
Result:=true;
end;
 
access有这么大的容量吗
 
使用联接ACCESS数据库,在单元中加入COMOBJ,应用CreateOleObject创建一个EXCEL应用。

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k0,k1:integer;
ExcelID: Variant;
// excel_name:string;
begin
if opendialog1.Execute then begin
ExcelID:=CreateOleObject('Excel.Application');
ExcelID.workbooks.open(opendialog1.FileName);
//设置活动的EXCEL工作表
ExcelID.WorkSheets[1].Activate;
//EXCEL单元格中的数据
edit1.Text:=ExcelID.Cells[1,1].Value;
//EXCEL工作表的个数
edit3.text:=inttostr(excelid.sheets.count);
//活动的EXCEL工作表的行列数
i:=ExcelID.worksheets[1].UsedRange.Rows.Count;
j:=ExcelID.worksheets[1].UsedRange.columns.Count;
edit2.Text:=inttostr(i)+'-'+inttostr(j);
with table1 do begin
//指定数据库名字
databasename:='c:/';
//指定数据表名字
tablename:='zxc.aaa';
tabletype:=ttDefault;
fielddefs.Clear;
//动态增加数据表字段
for k0:=1 to j do begin
fielddefs.Add('A'+inttostr(k0),ftstring,10,false);
end;
createtable;
open;
end;
// 向动态数据表写入数据
for k0:=1 to i do begin
table1.Append;
for k1:=1 to j do begin
table1.Edit;
table1.Fields[k1-1].AsString:=ExcelID.Cells[k0,k1].Value;
end;
table1.Post;
end;
table1.First;
dbgrid1.Visible:=true;
// 关闭EXCEL工作表
ExcelID.WorkBooks.Close;
// 退出EXCEL
excelid.quit;
end else begin
showmessage('没有打开EXCEL文件');
end;
end;
 
接受yanghai0437的答案。
 
我来学习。
 
后退
顶部