快过年了,首先祝各位老大新年好!
以前编程都随个人喜好,图的是痛苦又快乐着的滋味,单位有个EXCEL数据导入SQL数据库的任务就美滋滋地接受了,没想到…..
1. 以前用的OLE方式,导入特慢,没使用。
2. 接着使用了ADO方式,速度很理想,以为没啥问题了,可是昨天发现了一个致命故障:打开EXCEL文件时某列(也称之为字段)ADO认为字段类型有ftFloat、ftString、ftInteger、ftDateTime等,如果认为字段类型为ftFloat的列,在这列中假如有cx2345,AsString读取时就为空,我希望所有的字段类型都为ftString,这样的话只要有数据就能读出,就最理想了,可是无论如何设置EXCEL的为文本方式,当用ADO连接时仍为ftFloat类型!看了EXCEL帮助:《将数字作为文本输入 即使用“单元格”命令将包含数字的单元格设置为“文本”格式,Excel 仍将其保存为数字型数据。如果要使 Microsoft Excel 将类似于学号之类的数字解释为文本,需要先将空单元格设置为“文本”格式,再输入数字。如果单元格中已经输入了数字,需要对其应用“文本”格式,然后单击每一个单元格并按 F2 键,再按 ENTER 键重新确认数据。》是有效果,但是EXCEL有几千行几十列的话,那不累死????又在网上搜索到这方面的问题是ADO识别前8行确定字段类型,当用F2+回车设置为文本后,字段类型果然为ftString类型,而且这8行也能看到,其余行就看不到了!!!又试着把一个空EXCEL先设置为文本,再只粘贴数值,仍然无效。
附:ADOQuery的ConnectionString:=Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=test.xls;Mode=Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=True;Jet OLEDB:SFP=True
SQL语句:'select * from ['+SheetN+'$]'使用ADO方式我放弃?!?请指点。
3. 走投无路,只好上网找EXCEL控件,有:SMImport Suite v1.96 For Delphi.7.CR,在componet->install pakages安装了,使用时老提示输入SMCells.pas所在的路径,安装包里没有啊!在http://soft.ttdown.com:8080/SoftView/SoftView_18704.html下载的,说是全免费的啊,还是我用的不对?4. 由SQL数据库写入EXCEL就好些,我也是在本论坛里搜刮到一个很好的方法,直接安装EXCEL格式写,速度很快,很理想,在此非常感谢热心的Delphi的朋友,谢谢……
特别感谢:
回复人: jingpingyi(jingpingyi) ( ) 信誉:100 2003-7-23 10:19:30 得分:30总结:读EXCEL因为其格式不定所以存在很多不定因素所以难度很大,我还在不停第寻找解决方式……写EXCEL就要容易些,关于读EXCEL的问题希望各位老大多多指点,谢谢.
在本坛中关于EXCEL的帖子我看了很多很多...
回复人: linjie208(御风而行) ( ) 信誉:100 2004-01-17 11:52:00 得分:0
回复人: xiaoxiaobai(小白.net) ( ) 信誉:95 2004-01-17 11:26:00 得分:0 谁有好用的读EXCEL的控件也可以啊。
这是控件提供的一个例子:请注意下行,找不到SMCells, SMXLS!
uses SMCells, SMXLS;procedure TForm1.btnLoadXLSClick(Sender: TObject);
var
i, j, k: Integer;
tab: TTabSheet;
grid: TStringGrid;
sheet: TSpreadSheet;
Value: Variant;
begin
{destroy all tabs/grids for previous loaded wordbook}
for i := PageControl1.PageCount-1 downto 0 do
PageControl1.Pages[i].Free; with TMSExcel.Create(Self) do
try
LoadFromFile(edFileName.Text); for k := 0 to Sheets.Count-1 do
begin
sheet := Sheets.SpreadSheet(k);
if Assigned(sheet) then
begin
{create a tab and grid for each sheet in workbook}
tab := TTabSheet.Create(PageControl1);
tab.Caption := sheet.Caption;
tab.PageControl := PageControl1; grid := TStringGrid.Create(tab);
grid.DefaultRowHeight := 21;
grid.Options := [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goColSizing];
grid.Parent := tab;
grid.Align := alClient; grid.RowCount := sheet.Cells.UsedRowCount+1;
grid.ColCount := sheet.Cells.UsedColCount+1; for i := 1 to sheet.Cells.UsedRowCount+1 do
begin
for j := 1 to sheet.Cells.UsedColCount+1 do
begin
Value := sheet.Cells.GetValue(j-1, i-1);
if (VarType(Value) = varBoolean) then
begin
if Value then
grid.Cells[j, i] := 'True'
else
grid.Cells[j, i] := 'False'
end
else
grid.Cells[j, i] := VarToStr(Value);
end;
end; for i := 1 to grid.RowCount-1 do
grid.Cells[0, i] := IntToStr(i);
for j := 1 to grid.ColCount-1 do
grid.Cells[j, 0] := Chr(Ord('A') + j - 1);
end
end
finally
Free
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
edFileName.Text := ExtractFilePath(Application.ExeName) + edFileName.Text;
end;end.
如果不是,发给我试试如何?谢谢.
好用吗?发给我用用?
[email protected]
谢谢。
to: 回复人: xrfw(初学者) ( ) 信誉:100 2004-01-17 15:49:00 得分:0
Excel的第一行,就认为是字段名,其他是记录。
需要常执行。to:xrfw(初学者)
打开看看就知道。
begin
try
if aField = Null then
result := ''
else
result := DateTimeToStr(aField);
except
result := '';
end;
end;function GetString(aField:Variant):String;
begin
try
result := trim(aField);
except
result := '';
end;
end;function GetInt(aField:Variant):String;
begin
try
result := IntToStr(aField);
except
result := '';
end;
end;
function GetFloat(aField:Variant):String;
begin
try
result := FloatToStr(aField);
except
result := '';
end;
end;
ADOQuery的ConnectionString:=Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source=test.xls;Mode=Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=True;Jet OLEDB:SFP=True谁有设置Extended Properties=Excel 8.0;的资料?越详细越好。谢谢。
我真不知道该去哪找这方面的资料,比如Extended Properties=Excel 8.0,不仅有Excel 8.0还有其他参数吧?
有很多麻烦。用VB读很爽的。
其它控件有XLSReadWriteII,可以去http://www.axolot.com下载,不需要excel,用ole有很多问题的
----------------收费啊XLS ReadWriteII only costs US $99to:如果没有理解错的话,你的文件内容是文本/数字混合的,你只要在
连接字串设置一下即可读出内容。----------------可以读出,但是不能更改EXCEL的内容,提示:不可更新
to:回复人: zdk(Anakin) ( ) 信誉:100 2004-01-22 11:31:00 得分:0
建议用Excel的话用VB编写一个Activex Dll比较不错,直接用Delphi读Excelshi
有很多麻烦。用VB读很爽的。--------谁有现成的啊?
谢谢各位的关注,这个问题我始终注意相关信息,希望继续支持。