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