快过年了,首先祝各位老大新年好!
以前编程都随个人喜好,图的是痛苦又快乐着的滋味,单位有个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的帖子我看了很多很多...

解决方案 »

  1.   

    谢谢两位热心人:
    回复人: 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.
      

  2.   

    to: lgqTiger(把酒论程序__尽在笑谈间) 是Delphi7本身带的吗?速度如何?
    如果不是,发给我试试如何?谢谢.
      

  3.   

    请问楼主用ADO连接EXCEL,你是怎么区分哪个是字段名,哪个是记录。
      

  4.   

    to:回复人: lgqTiger(把酒论程序__尽在笑谈间) 
    好用吗?发给我用用?
    [email protected]
    谢谢。
    to: 回复人: xrfw(初学者) ( ) 信誉:100  2004-01-17 15:49:00  得分:0 
    Excel的第一行,就认为是字段名,其他是记录。
      

  5.   

    如果是单纯的一次性任务,可以试试SQLServer自带的导入导出数据的工具。
      

  6.   

    如果EXCEL表有表头,也就是说字段名不在第一行怎么办?
      

  7.   

    to: eastliangliang(青苹果)(行成于思毁于随) 
    需要常执行。to:xrfw(初学者) 
    打开看看就知道。
      

  8.   

    可以试试用Delphi的转换函数将各种类型转换成String,如IntToStr、DateTimeToStr等,但是要注意用异常处理。用ADOQuery['列名']的调用方法,返回的是Variant类型,下面是几个转换函数,我对操作Excel不熟,没试成功,你自己试试转换吧:)function GetTime(aField:Variant):String;
    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;
      

  9.   

    我感觉还得从这下手:
    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;的资料?越详细越好。谢谢。
      

  10.   

    有谁能提供Extended Properties的详细资料,或者有效来源就结贴了。
    我真不知道该去哪找这方面的资料,比如Extended Properties=Excel 8.0,不仅有Excel 8.0还有其他参数吧?
      

  11.   

    其它控件有XLSReadWriteII,可以去http://www.axolot.com下载,不需要excel,用ole有很多问题的
      

  12.   

    建议用Excel的话用VB编写一个Activex Dll比较不错,直接用Delphi读Excelshi
    有很多麻烦。用VB读很爽的。
      

  13.   

    to:回复人: 月光() ( ) 信誉:99  2004-01-21 08:35:00  得分:0 
     其它控件有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读很爽的。--------谁有现成的啊?
    谢谢各位的关注,这个问题我始终注意相关信息,希望继续支持。
     
     
      

  14.   

    FormulaOne 6.0吧,功能超强,可以开发自己的EXCEL,DELPHI里面自带的有,但是版本较低