特殊要求:运行环境为没有安装Excel的Windows系统,Delphi中表数据与Excel文件(*.xls)之间导入导出。

dulei115 2005-04-22 09:59:43
数据表与*.xls文件之间的导入导出功能的实现方法已经知道,问题是系统有新要求,不能指望用户的的计算机(Windows系统)上安装有Excel,各位大哥帮忙想一想应该怎么办?

说明:看清楚要求,谢绝再说Excel的导入导出功能的实现,谢谢!!!!
...全文
268 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dulei115 2005-04-26
结贴!!!!!!!!11
  • 打赏
  • 举报
回复
force2004 2005-04-24
up
  • 打赏
  • 举报
回复
dvdcnc 2005-04-23
用ExpressQuantumGrid轻松实现。给分!
  • 打赏
  • 举报
回复
qiujsh 2005-04-22
导出可以用dxdbgrid的导出功能,导入恐怕很难实现了
  • 打赏
  • 举报
回复
jinjazz 2005-04-22
这个恐怕很难实现吧
  • 打赏
  • 举报
回复
smiler007 2005-04-22
用CSV格式..
  • 打赏
  • 举报
回复
jms2812405 2005-04-22
'SELECT * FROM [sheet1$]是什么想导入的EXECL表.
  • 打赏
  • 举报
回复
jms2812405 2005-04-22

procedure TForm3.BitBtn2Click(Sender: TObject);用SQL操作比较灵活.你看看下面的
var
i:Integer;
begin //厂商资料表
OpenDialog1.Title := '请选择相应的Excel文件';
OpenDialog1.Filter := 'Excel(*.xls)|*.xls';
try
begin
if OpenDialog1.Execute then
MyExcelFile :=OpenDialog1.FileName;
ADOConnection1.Close;
ADOConnection1.ConnectionString :='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+MyExcelFile+';Extended Properties=excel 8.0;Persist Security Info=False';
ADOConnection1.Connected :=true;
adoquery1.Close;
ADOQuery1.SQL.Clear;
adoquery1.SQL.Add( 'SELECT * FROM [sheet1$]');
adoquery1.Open;
ProgressBar1.Max := ADOQuery1.RecordCount;

Label2.Caption:='0';
Label4.Caption:='0';
BitBtn1.Enabled:=False;
BitBtn2.Enabled:=False;
for i:=1 to ADOQuery1.RecordCount do
begin
Application.ProcessMessages;
self.refresh;
ADOQuery2.Close;
ADOQuery2.ConnectionString:=constring;
ADOQuery2.SQL.Clear;
ADOQuery2.SQL.Add('select csbh from changshang where csbh='+QuotedStr(Trim(ADOQuery1.fieldbyName('供应商').AsString)));
ADOQuery2.Open;
if ADOQuery2.FieldByName('csbh').AsString='' then
begin
Label2.Caption:=IntToStr(StrTOint(Label2.caption)+1);
// ShowMessage(IntToStr(ADOQuery2.RecordCount));
ADOQuery2.Close;
ADOQuery2.SQL.Clear; // 1 2 3 4 5 6 7 8 9 10 11 12 13 14
ADOQuery2.SQL.Add('insert into changshang(csbh,csmc,lxr,dz,csdh1,csdh2,csdh3,cz,sj,dzyx,wz,yhzh,khyh,bz)'); //

ADOQuery2.SQL.Add('Values('+QuotedStr(ADOQuery1.fieldbyName('供应商').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('供应商名称').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('联系人').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('地址').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('电话1').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('电话2').AsString)+
','+QuotedStr(ADOQuery1.fieldbyName('电话3').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('传真').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('手机').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('E-mail').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('网址').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('银行帐号').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('开户银行').AsString)+','+QuotedStr(ADOQuery1.fieldbyName('备注').AsString)+')');
// ShowMessage(ADOQuery2.SQL.text);
try
ADOQuery2.ExecSQL;
except

end;


end
else
begin
Label4.Caption:=IntToStr(StrTOint(Label4.caption)+1);
// ShowMessage(IntToStr(ADOQuery2.RecordCount));
ADOQuery2.Close;
ADOQuery2.SQL.Clear; // 1 2 3 4 5 6
ADOQuery2.SQL.Add('update changshang set csbh='+QuotedStr(ADOQuery1.fieldbyName('供应商').AsString)+',csmc='+QuotedStr(ADOQuery1.fieldbyName('供应商名称').AsString)+',lxr='+QuotedStr(ADOQuery1.fieldbyName('联系人').AsString)+',dz='+QuotedStr(ADOQuery1.fieldbyName('地址').AsString)+',csdh1='+QuotedStr(ADOQuery1.fieldbyName('电话1').AsString)+',csdh2='+QuotedStr(ADOQuery1.fieldbyName('电话2').AsString)+
',csdh3='+QuotedStr(ADOQuery1.fieldbyName('电话3').AsString)+',cz='+QuotedStr(ADOQuery1.fieldbyName('传真').AsString)+',sj='+QuotedStr(ADOQuery1.fieldbyName('手机').AsString)+',dzyx='+QuotedStr(ADOQuery1.fieldbyName('E-mail').AsString)+',wz='+QuotedStr(ADOQuery1.fieldbyName('网址').AsString)+',yhzh='+QuotedStr(ADOQuery1.fieldbyName('银行帐号').AsString)+',khyh='+QuotedStr(ADOQuery1.fieldbyName('开户银行').AsString)+' ,bz='+QuotedStr(ADOQuery1.fieldbyName('备注').AsString)+'where csbh='+QuotedStr(ADOQuery1.fieldbyName('供应商').AsString));
// ShowMessage(ADOQuery2.SQL.text); // 7 8 9 10 11 12 13 14
try
ADOQuery2.ExecSQL;
except

end;

end;
Application.ProcessMessages;
ADOQuery1.Next;
ProgressBar1.Position :=i;
end;

BitBtn1.Enabled:=true;
BitBtn2.Enabled:=true;
Application.MessageBox('导入完毕!','提示',MB_OK+MB_Iconinformation);

end;
except
Application.MessageBox('打开Excel失败,错误;请重启软件再试。','错误信息',MB_Ok);
end;

end;
  • 打赏
  • 举报
回复
dulei115 2005-04-22
const
ConStr = 'Provider=Microsoft.Jet.OLEDB.4.0;Password="";'
+ 'Data Source=%s;Extended Properties=Excel 8.0;';
begin
//利用ADODataSet打开*.xls文件
OpenDialog1.InitialDir := ExtractFileDir(Application.ExeName);
OpenDialog1.Filter := 'XLS文件|*.xls';
if OpenDialog1.Execute then
begin
try
ADOConnection1.Connected := false;
ADOConnection1.ConnectionString := format(Constr, [OpenDialog1.FileName]);
ADOConnection1.LoginPrompt := false;
ADOConnection1.Connected := true;
ADODataSet1.Close;
ADODataSet1.CommandType := cmdTableDirect;
try
TableList := TStringList.Create;
ADOConnection1.GetTableNames(TableList);
ADODataSet1.CommandText := TableList[0];
finally
TableList.Free;
end;//end of try
ADODataSet1.Open;
except
on e: Exception do
begin
ADODataSet1.Close;
raise e.Create('打开Excel文件错误!如果你已经打开Excel,请先关闭Excel文件!' +
#13 + e.Message);
end;
end;//end of try
end;
  • 打赏
  • 举报
回复
dulei115 2005-04-22
已经知道了,和fanyufanyu(反语) 的方法第一种一样,用的是Excel 8.0


暂时不结贴,看看还有没有什么其它的方法!!!!
  • 打赏
  • 举报
回复
崔作非 2005-04-22
也不是很难的,给楼主两种方法。
第一种,适合于处理简单数据的,把Excel当成Access数据库来进行连接。
方法如下,先选择Jet 4.0。然后选择你的Excel文件(XLS).
然后,进入最后一个页(所有)设置属性,选择Extended Properties一项,输入Excel版本号
office 2003为Excel 11.0。
然后,再改一下下面的Jet OLEDB:Engine Type属性,值为35。
最后,测试一下连接,没有错误是能连接上的,生成连接字符串。
利用现有的数据库技术就可以往下做了,要注意,Excel中的表单名在这里的引用是[Sheet1$]。

第二种方法是利用现成的控件,华表(Cell)就可以。可惜我手头上没那玩艺,不能详细的告诉你该如何连接,楼主可以在网上找一找关于华表方面的东西。华表是ActiveX控件。
  • 打赏
  • 举报
回复
ghy412 2005-04-22
导出的时候先导出为TxT文件,各个数据项之间加Tab键,然后再把文件的后缀名改为.xls就可以了,这样的速度很快的~
  • 打赏
  • 举报
回复
cncharles 2005-04-22
把你的电脑上的EXCEL9.OLB(excel2000)拷到没有安装Excel的电脑的
System32(2000/XP)或 System (98/ME)的文件夹里面试试看。
  • 打赏
  • 举报
回复
发帖
语言基础/算法/系统设计

1.6w+

社区成员

Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
帖子事件
创建了帖子
2005-04-22 09:59
社区公告
暂无公告