实用而有难度的问题,希望大家参加讨论(全部分数)(230分)

  • 主题发起人 主题发起人 angleli1981
  • 开始时间 开始时间
A

angleli1981

Unregistered / Unconfirmed
GUEST, unregistred user!
数据导出成Excel文件的问题(如果有代码请贴出来)
1.如何快速地导出数据成Excel文件
2.如何在没有安装Office的环境中快速地导出数据成Excel文件
3.以上问题在分布式环境的客户端如何实现
4.赠品,以下是我把数据导出成Excel文件的程序,程序没问题
,但速度不行,在没有装Office环境中运行就有错。
procedure TForm1.saveexcelExecute(Sender: TObject);
var
row,col:integer;
begin
if adoq.State=dsInactive then
begin
application.MessageBox('没有可导出的数据!','导出',mb_iconinformation+mb_ok);
exit;
end;
if adoq.RecordCount =0 then
begin
application.MessageBox('没有可导出的数据!','导出',mb_iconinformation+mb_ok);
exit;
end;
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=false;

ExcelApplication1.Workbooks.Add(NULL,0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Sheets[1] as _WorkSheet);
for col:=1 to adoq.Fields.Count do
begin
ExcelWorksheet1.Cells.Item[1,col]:=adoq.Fields[col-1].FieldName;
end;
adoq.First;
for row:=2 to adoq.RecordCount+1 do
begin
for col:=1 to adoq.Fields.Count do
begin
ExcelWorksheet1.Cells.Item[row,col]:=adoq.Fields[col-1].Value;
end;
adoq.Next;
end;

ExcelApplication1.Quit;
ExcelWorksheet1.Disconnect;
ExcelWorkbook1.Disconnect;
ExcelApplication1.Disconnect;

end;
 
有难度么。
 
到网上去找一些不需要安装OFFice的组件吧,很多的,
以前我都找过,不过现在都不知道放到哪儿去了,
另外,devexpress的一个数据库表格,有这种功能
 
如果不需要不同的SHEEET的话

可以存成CSV格式,Excel直接可以识别。速度也很快
procedure ExportDataSetToCSVFile(const aDataSet:TDataSet;
const aFileName:string);
procedure ImportFromCSVFile(const AFileName:String;
const ADataSet:TDataSet);function GetLeftWord(var ASentence:string; ADelimiter:char):string;

function AddZero(ASentence:string):String;


function AddZero(ASentence:string):String;
var
TempString:String;
begin
if Pos('.',ASentence)>0 then
begin
TempString:=ASentence;
Delete(TempString,1,Pos('.',ASentence));
if Length(TempString)<2 then
Result:=ASentence+'0'
else
Result:=ASentence;
end
else begin
result:=ASentence+'.00';
end;
end;

function GetLeftWordCSV(var ASentence:string):string;
begin
Result:='';
ASentence:=Trim(ASentence
if Length(ASentence)=0 then exit;
if ASentence[1]='"' then begin
Delete(ASentence,1,1);
Result:=GetLeftWord(ASentence,'"');
GetLeftWord(ASentence,',');
end else Result:=GetLeftWord(ASentence,',');
end;

function GetLeftWord(var ASentence:string; ADelimiter:char):string;
var i:integer;
begin
Result := '';
i := Pos(ADelimiter,ASentence);
if i = 0 then begin
Result := Trim(ASentence);
ASentence := '';
end else begin
Result:=trim(Copy(ASentence,1,i-1));
Delete(ASentence,1,i);
end;
end;

function DeleteFileWithUndo(
sFileName : string )
: boolean;
var
fos : TSHFileOpStruct;
begin
FillChar( fos, SizeOf( fos ), 0 );
with fos do
begin
wFunc := FO_DELETE;
pFrom := PChar( sFileName );
fFlags := FOF_ALLOWUNDO
or FOF_NOCONFIRMATION
or FOF_SILENT;
end;
Result := ( 0 = ShFileOperation( fos ) );
end;

procedure ExportDataSetToCSVFile(const aDataSet:TDataSet;
const aFileName:string);
var aTextFile:TextFile;
i:integer;
aValue,LineStr:string;
DataSetActive:boolean;
begin
DataSetActive := aDataSet.Active;
if not aDataSet.Active then aDataSet.Open;
aDataSet.DisableControls;
try
aDataSet.FieldDefs.Update;
if aDataSet.RecordCount=0 then exit;
try
AssignFile(aTextFile,aFileName);
Rewrite(aTextFile);
LineStr := '';
for i:=0 to aDataSet.FieldCount-1 do begin
aValue := aDataSet.Fields.DisplayName ;
if Pos(',',aValue) > 0 then aValue:='"' + aValue + '"';
LineStr := LineStr + aValue + ',';
end;
Delete(LineStr,length(LineStr),1);
Writeln(aTextFile,LineStr);
aDataSet.First;
while not aDataSet.EOF do begin
LineStr := '';
for i := 0 to aDataSet.FieldCount-1 do begin
if aDataSet.Fields.IsBlob then begin
if aDataSet.Fields.DataType=ftMemo then
aValue :=StringReplace(aDataSet.Fields.AsString,#13+#10,'#',[rfReplaceAll]);
end else begin
aValue := aDataSet.Fields.AsString;
end;
if Pos(',',aValue) > 0 then aValue := '"' + aValue + '"';
LineStr := LineStr+aValue+',';
end;
Delete(LineStr,length(LineStr),1);// remove extra ','
Writeln(aTextFile,LineStr);
aDataSet.Next;
end;// while
finally
try
Flush(aTextFile);
CloseFile(aTextFile);
except
end;
end;
finally
aDataSet.EnableControls;
aDataset.Active := DataSetActive;
end;
end;

procedure ImportFromCSVFile(const AFileName:String;
const ADataSet:TDataSet);
const cMaxFields=1023;
var
aTextFile:TextFile;
i,j,HeaderCount:integer;
FldPtr:array[0..cMaxFields] of integer;
aColValue,aLineString,aValue:string;
HasCommonField,DataSetActive:boolean;
begin
if not FileExists(AFileName) then exit;
AssignFile(aTextFile,AFileName);
Reset(aTextFile);
try
Readln(aTextFile, ALineString);
HasCommonField:=False;
HeaderCount:=0;
DataSetActive:=ADataSet.Active;
if not ADataset.Active then ADataset.Open;
ADataSet.FieldDefs.Update;
while (length(ALineString) > 0) and (HeaderCount < cMaxFields) do begin
aColValue := GetLeftWordCSV(ALineString);
for i:=0 to ADataSet.FieldCount-1 do
if Trim(ADataSet.Fields.DisplayName)=trim(aColValue) then
begin
j :=i;
FldPtr[HeaderCount] := j;
if j > -1 then HasCommonField:=True;
inc(HeaderCount);
break;
end;
end;
if not HasCommonField then exit;
ADataSet.DisableControls;
try
while not EOF(aTextFile) do begin
Readln(aTextFile,ALineString);
j := -1;
ADataSet.Append;
while (length(ALineString) > 0) and (j < HeaderCount-1) do begin
aColValue := GetLeftWordCSV(ALineString);
inc(j);
if FldPtr[j] = -1 then continue;
try
if Trim(aColValue)<>'' then
begin
if ADataSet.Fields[FldPtr[j]].DataType=ftMemo then
ADataSet.Fields[FldPtr[j]].AsString :=StringReplace(aColValue,'#',#13+#10,[rfReplaceAll])
else
ADataSet.Fields[FldPtr[j]].AsString := aColValue;
end;
except

end;
end;
ADataSet.Post;
end;
finally
ADataSet.EnableControls;
ADataSet.Active := DataSetActive;
end;
finally
CloseFile(aTextFile);
end;
end;
 
To LiChaoHui:
整天都要靠控件,我并不喜欢,会做也不算什么高手啊

TO wk_knife:
用CSV文件格式是:
数据;数据;数据;
如果是自己看当然没问题那,但那些是给别人看的就不能这样那,除非找到转换的方法那
 
出声都有分啊,快来吧
在线等待
 
To 大梦:
你有什么好方法说来听听

等待
 
To EveryOne
http://military.china.com/zh_cn/
 
我有另一个问题,大家来看那
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1544688
 
procedure TForm.BackupTableToCSV(TableName: TADOQuery);
var
i: integer;
s: string;
theStringList: Tstringlist;
FileName:string;
begin
s:='';
theStringList:=TStringList.Create;
with TableName do
begin
if Active=False then Exit;
try
DisableControls;
for i:=0 to (Fields.Count-1) do s:=s+Fields.DisplayName+',';
theStringList.Add(s);
First;
While not Eof do
begin
s:='';
for i:=0 to (Fields.Count-1) do s:=s+(Fields.AsString)+',';
theStringList.add(s);
Next;
end;
SaveDialog.Execute;
FileName:=SaveDialog1.FileName;
if FileName='' then Exit;
theStringList.SaveToFile(FileName+'.csv');
ShowMessage('导完!');
finally
EnableControls;
end;
end;
end;
 
照你这么说,用Delphi编程序,如果用了窗体和控件,那就不算是高手,
用纯的API编出复杂的程序那才算是高手,是吧?

别人写组件也是为了给使用者提供方便,提高靠发效率,
可以让你把精力集中在更重要的东西上,

OK,你喜欢写代码是吧?你看看人家的源代码怎么写的,
仿照者写一个不就行了,你匆匆忙忙仿做一个,还不如用人家的,
不但有充足的时间开发,并且也经过了较长时间的测试,
比你的代码要可靠一点,也省时间了
 
你试过了吗?

csv叫逗号分隔文件,如果你安装了EXCEL,它是一个EXCEL带个逗号的图标,已经默认关联用
EXCEL直接打开。根本无需多余的转换!

如果是分号分隔文件,却另做别论

另外难道EXCEL就不是数据、数据、数据吗?
 
object + vba 很简单。
 
To wk_knife:
你的程序不能运行啊
TO nickylin:
速度可以,但有没导入的方法啊
 
to angleli1981 :
你的代码是 COM 服务,当然需要安装服务自己了。有 excel 文件格式说明吗 ?
使用 csv 在一般使用中没什么不好啊,可能是你的应用需要直接的 excel 格式吧。
 
同意LiChaoHui说的!吸取别人的精华!
 
不可能嘛,我一直在用,
当然如果你用TADOQuery,
代码估计要修改一下了。
 
你要用ExcelApplication1,不安装office当然不行了。
 
在有excel的情况下用ole
没有excel下用csv嘛
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部