从Excel导出的数据生成记事本文件,数据之间的空格是TAB。
把数据从记事本导入到一个表格控件显示,
然后可以选择从第几行开始到第几行结束导入数据库
1.我该用那种表格控件
2.如何判断tab把数据写到表格控件里
3.有什么好的可以彩色或颜色渐变的ProgressBar控件

解决方案 »

  1.   

    unit DataTxt;interfaceuses
      Windows, Messages, SysUtils, Classes,
      DBCtrls,DB,ComObj,Dialogs,Clipbrd;type
      TDataTxt = class(Tcomponent)
      private
        FDataLink :TFieldDataLink;
        FFilePath,FFileName :string;
        function GetDataSource :TDataSource;
        procedure SetDataSource(Value :TDataSource);
        { Private declarations }
      protected
        constructor Create(AOwner :TComponent);Override;
        destructor Destroy;Override;
        procedure DataToExcel(Data :TDataSet;FilePath :string);
        { Protected declarations }
      public
        procedure Export;
        { Public declarations }
      published
        property DataSource :TDataSource read GetDataSource write SetDataSource;
        property FilePath :string read FFilePath write FFilePath;
        property TxtName :string read FFileName write FFileName;
        { Published declarations }
      end;
    implementation{ TDataExcel }constructor TDataTxt.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FDataLink := TFieldDataLink.Create;
      FFilePath :='C:\Temp';
      FFileName :='TxtTemp';
    end;procedure TDataTxt.DataToExcel(Data: TDataSet; FilePath: string);
    const
      BlobFields = [ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary];
    var
      slTemp :TStrings;
      RTemp :string;
      i,j :integer;
      ExcelApp : Variant;
      MSBlob,MSTemp :TMemoryStream;
    begin
      try
        ExcelApp := CreateOleObject('Excel.Application');
      except
        Exit;
        ShowMessage('没有安装Excel');
      end;
      try
        ExcelApp.Caption :='数据导出';
        ExcelApp.WorkBooks.Add;
        ExcelApp.Visible := False;
        slTemp := TStringList.Create;
        try
          MSBlob := TMemoryStream.Create;
          MSTemp := TMemoryStream.Create;
          try
            if not Data.Active then Data.Active :=True;
            for j:=0 to Data.FieldCount-1 do
              RTemp := RTemp + Data.Fields[j].FieldName+#9;
            slTemp.Add(RTemp);
            Data.First;
            while not Data.Eof do
              begin
                RTemp :='';
                for i:=0 to Data.FieldCount-1 do
                  begin
                    if not (Data.Fields[i].DataType in BlobFields) then
                      RTemp := RTemp +Data.Fields[i].AsString+#9
                    else
                    begin
                      MSTemp.Clear;
                      (Data.Fields[i] as TBlobField).SaveToStream(MSTemp);
                      MSBlob.CopyFrom(MSTemp,0);
                      RTemp := RTemp + IntToStr(MSTemp.Size)+#9;
                    end;
                  end;
                Delete(RTemp,Length(RTemp),1);
                slTemp.Add(RTemp);
                Data.Next;
              end;
            Clipboard.AsText := slTemp.Text;
            try
              ExcelApp.ActiveSheet.Paste;
              ExcelApp.ActiveWorkBook.SaveAs(FilePath+'\'+FFileName+'.xls');
            except
              ExcelApp.WorkBooks.Close;
              ExcelApp.Quit;
            end;
            if MSBlob.Size<>0 then
              MSBlob.SaveToFile(FilePath+'\'+FFileName+'.Blob');
          finally
            MSBlob.Free;
            MSTemp.Free;
          end;
        finally
          slTemp.Free;
        end;
      finally
        ExcelApp.WorkBooks.Close;
        ExcelApp.Quit;
      end;
    end;destructor TDataTxt.Destroy;
    begin
      FDataLink.Free;
      inherited Destroy;
    end;procedure TDataTxt.Export;
    begin
      if FDataLink.DataSource=nil then Exit;
      if FDataLink.DataSource.DataSet=nil then Exit;
      if (FFilePath='') or (FFileName='') then Exit;
      if not DirectoryExists(FFilePath) then MkDir(FFilePath);
      DataToExcel(FDataLink.DataSet,FFilePath);
    end;function TDataTxt.GetDataSource: TDataSource;
    begin
      Result := FDataLink.DataSource;
    end;procedure TDataTxt.SetDataSource(Value: TDataSource);
    begin
      FDataLink.DataSource := Value;
    end;end.unit TxtData;interfaceuses
      Windows, Messages, SysUtils, Classes,
      DBCtrls,DB,Dialogs;type
      TTxtData = class(Tcomponent)
      private
        FDataLink :TFieldDataLink;
        FFileName :string;
        function GetDataSource :TDataSource;
        procedure SetDataSource(Value :TDataSource);
        { Private declarations }
      protected
        constructor Create(AOwner :TComponent);Override;
        destructor Destroy;Override;
        procedure ExcelData(Data :TDataSet;ExcelFile :string);
        { Protected declarations }
      public
        procedure Import;
        { Public declarations }
      published
        property DataSource :TDataSource read GetDataSource write SetDataSource;
        property TxtFileName :string read FFileName write FFileName;
        { Published declarations }
      end;implementation
      
    procedure Register;
    begin
      
    end;{ TExcelData }constructor TTxtData.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      FDataLink := TFieldDataLink.Create;
      FFileName :=' ';
    end;destructor TTxtData.Destroy;
    begin
      FDataLink.Free;
      inherited Destroy;
    end;procedure TTxtData.ExcelData(Data: TDataSet; ExcelFile: string);
    const
      BlobFields = [ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary];
    var
      MSBlob,MSTemp :TMemoryStream;
      slTemp :TStrings;
      RTemp,fldNext :string;
      i,j :integer;
      function NextField(var S1 : string) : string;
      var
        p : integer;
      begin
        p := Pos(#9, S1);
        if p=0 then
          begin
            Result := S1;S1 := '';
          end
        else
        begin
          Result := Copy(S1,1,p-1);
          Delete(S1,1, p);
        end;
      end;
    begin
      try
        slTemp := TStringList.Create;
        try
          MSBlob := TMemoryStream.Create;
          MSTemp := TMemoryStream.Create;
          try
            slTemp.LoadFromFile(ExcelFile);
            if FileExists(Copy(ExcelFile,0,Length(ExcelFile)-4)+'.Blob') then
              MSBlob.LoadFromFile(Copy(ExcelFile,0,Length(ExcelFile)-4)+'.Blob');
            MSBlob.Position :=0;
            for i:=0 to slTemp.Count-1 do
              begin
                Data.Append;
                RTemp := slTemp[i];
                fldNext := NextField(RTemp);
                for j:=0 to Data.FieldCount-1 do
                  begin
                    if not (Data.Fields[j].DataType in BlobFields) then
                      Data.Fields[j].AsString := fldNext
                    else
                    begin
                      if StrToInt(fldNext)>0 then
                        begin
                          MSTemp.CopyFrom(MSBlob,StrToInt(fldNext));
                          MSTemp.Position :=0;
                          (Data.Fields[j] as TBlobField).LoadFromStream(MSTemp);
                          MSTemp.Clear;
                        end;
                    end;
                    fldNext := NextField(RTemp);
                  end;
                Data.Post;
              end;
          finally
            MSBlob.Free;
            MSTemp.Free;
          end;
        finally
          slTemp.Free;
        end;
      except
        Raise;
      end; 
    end;function TTxtData.GetDataSource: TDataSource;
    begin
      Result := FDataLink.DataSource;
    end;procedure TTxtData.Import;
    begin
      if FDataLink.DataSource=nil then Exit;
      if FDataLink.DataSource.DataSet=nil then Exit;
      if not FDataLink.DataSet.Active then FDataLink.DataSet.Active := True; 
      if FFileName='' then Exit;
      ExcelData(FDataLink.DataSet,FFileName);
    end;procedure TTxtData.SetDataSource(Value: TDataSource);
    begin
      FDataLink.DataSource := Value;
    end;end.这里用的是#9,不是你的Tab