请教,为什么数据比较多时,数据倒入到 EXCEL ,可是像没有 |
尚未結案
|
lsh998
中階會員 發表:163 回覆:138 積分:60 註冊:2005-01-07 發送簡訊給我 |
请教各位大哥:
我拷贝了 讨论的一个 导入 EXCEL 程序
unit XLSFile; interface uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,db,dbctrls,comctrls; const
{BOF}
CBOF = $0009;
BIT_BIFF5 = $0800;
BOF_BIFF5 = CBOF or BIT_BIFF5;
{EOF}
BIFF_EOF = $000a;
{Document types}
DOCTYPE_XLS = $0010;
{Dimensions}
DIMENSIONS = $0000; type
TAtributCell = (acHidden,acLocked,acShaded,acBottomBorder,acTopBorder,
acRightBorder,acLeftBorder,acLeft,acCenter,acRight,acFill); TSetOfAtribut = set of TatributCell; TXLSWriter = class(Tobject)
private
fstream:TFileStream;
procedure WriteWord(w:word);
protected
procedure WriteBOF;
procedure WriteEOF;
procedure WriteDimension;
public
maxCols,maxRows:Word;
procedure CellWord(vCol,vRow:word;aValue:word;vAtribut:TSetOfAtribut=[]);
procedure CellDouble(vCol,vRow:word;aValue:double;vAtribut:TSetOfAtribut=[]);
procedure CellStr(vCol,vRow:word;aValue:String;vAtribut:TSetOfAtribut=[]);
procedure WriteField(vCol,vRow:word;Field:TField);
constructor create(vFileName:string);
destructor destroy;override;
end; procedure SetCellAtribut(value:TSetOfAtribut;var FAtribut:array of byte);
procedure DataSetToXLS(ds:TDataSet;fname:String); implementation procedure DataSetToXLS(ds:TDataSet;fname:String);
var c,r:Integer;
xls:TXLSWriter;
begin
xls:=TXLSWriter.create(fname);
if ds.FieldCount > xls.maxcols then
xls.maxcols:=ds.fieldcount 1;
try
xls.writeBOF;
xls.WriteDimension;
for c:=0 to ds.FieldCount-1 do
xls.Cellstr(0,c,ds.Fields[c].FieldName);
r:=1;
ds.first;
while not ds.eof do begin
for c:=0 to ds.FieldCount-1 do
xls.WriteField(r,c,ds.Fields[c]);
inc(r);
ds.next;
end;
if r > xls.maxrows then begin
xls.fstream.Seek(10,soFromBeginning);
xls.WriteDimension;
end;
xls.writeEOF;
finally
xls.free;
end;
end; { TXLSWriter } constructor TXLSWriter.create(vFileName:string);
begin
inherited create;
if FileExists(vFilename) then
fStream:=TFileStream.Create(vFilename,fmOpenWrite)
else
fStream:=TFileStream.Create(vFilename,fmCreate); maxCols:=100;
maxRows:=1000;
end; destructor TXLSWriter.destroy;
begin
if fStream <> nil then
fStream.free;
inherited;
end; procedure TXLSWriter.WriteBOF;
begin
Writeword(BOF_BIFF5);
Writeword(6); //count of bytes
Writeword(0);
Writeword(DOCTYPE_XLS);
Writeword(0);
end; procedure TXLSWriter.WriteDimension;
begin
Writeword(DIMENSIONS); // dimension OP Code
Writeword(8); //count of bytes
Writeword(0); // min cols
Writeword(maxRows); // max rows
Writeword(0); // min rowss
Writeword(maxcols); // max cols
end; procedure TXLSWriter.CellDouble(vCol, vRow: word; aValue: double;
vAtribut: TSetOfAtribut);
var FAtribut:array [0..2] of byte;
begin
Writeword(3); // opcode for double
Writeword(15); // count of byte
Writeword(vCol);
Writeword(vRow);
SetCellAtribut(vAtribut,fAtribut);
fStream.Write(fAtribut,3);
fStream.Write(aValue,8);
end; procedure TXLSWriter.CellWord(vCol,vRow:word;aValue:word;vAtribut:TSetOfAtribut=[]);
var FAtribut:array [0..2] of byte;
begin
Writeword(2); // opcode for word
Writeword(9); // count of byte
Writeword(vCol);
Writeword(vRow);
SetCellAtribut(vAtribut,fAtribut);
fStream.Write(fAtribut,3);
Writeword(aValue);
end; procedure TXLSWriter.CellStr(vCol, vRow: word; aValue: String;
vAtribut: TSetOfAtribut);
var FAtribut:array [0..2] of byte;
slen:byte;
begin
Writeword(4); // opcode for string
slen:=length(avalue);
Writeword(slen 8); // count of byte
Writeword(vCol);
Writeword(vRow);
SetCellAtribut(vAtribut,fAtribut);
fStream.Write(fAtribut,3);
fStream.Write(slen,1);
fStream.Write(aValue[1],slen);
end; procedure SetCellAtribut(value:TSetOfAtribut;var FAtribut:array of byte);
var
i:integer;
begin
//reset
for i:=0 to High(FAtribut) do
FAtribut[i]:=0; {Byte Offset Bit Description Contents
0 7 Cell is not hidden 0b
Cell is hidden 1b
6 Cell is not locked 0b
Cell is locked 1b
5-0 Reserved, must be 0 000000b
1 7-6 Font number (4 possible)
5-0 Cell format code
2 7 Cell is not shaded 0b
Cell is shaded 1b
6 Cell has no bottom border 0b
Cell has a bottom border 1b
5 Cell has no top border 0b
Cell has a top border 1b
4 Cell has no right border 0b
Cell has a right border 1b
3 Cell has no left border 0b
Cell has a left border 1b
2-0 Cell alignment code
general 000b
left 001b
center 010b
right 011b
fill 100b
Multiplan default align. 111b
} // bit sequence 76543210 if acHidden in value then //byte 0 bit 7:
FAtribut[0] := FAtribut[0] 128; if acLocked in value then //byte 0 bit 6:
FAtribut[0] := FAtribut[0] 64 ; if acShaded in value then //byte 2 bit 7:
FAtribut[2] := FAtribut[2] 128; if acBottomBorder in value then //byte 2 bit 6
FAtribut[2] := FAtribut[2] 64 ; if acTopBorder in value then //byte 2 bit 5
FAtribut[2] := FAtribut[2] 32; if acRightBorder in value then //byte 2 bit 4
FAtribut[2] := FAtribut[2] 16; if acLeftBorder in value then //byte 2 bit 3
FAtribut[2] := FAtribut[2] 8; if acLeft in value then //byte 2 bit 1
FAtribut[2] := FAtribut[2] 1
else
if acCenter in value then //byte 2 bit 1
FAtribut[2] := FAtribut[2] 2
else if acRight in value then //byte 2, bit 0 dan bit 1
FAtribut[2] := FAtribut[2] 3;
if acFill in value then //byte 2, bit 0
FAtribut[2] := FAtribut[2] 4;
end; procedure TXLSWriter.WriteWord(w: word);
begin
fstream.Write(w,2);
end; procedure TXLSWriter.WriteEOF;
begin
Writeword(BIFF_EOF);
Writeword(0);
end; procedure TXLSWriter.WriteField(vCol, vRow: word; Field: TField);
var FAtribut:array [0..2] of byte;
begin
case field.DataType of
ftString,ftWideString,ftBoolean,ftDate,ftDateTime,ftTime:
Cellstr(vcol,vrow,field.asstring);
ftSmallint,ftInteger,ftWord:
CellWord(vcol,vRow,field.AsInteger);
ftFloat, ftBCD:
CellDouble(vcol,vrow,field.AsFloat);
end;
end; end. 数据量小是没有错误的 可是数据量很大时,好象就不行了, 我把数据导入到 excel11.xls ,可是 打开 excel11 却看不到数据, 不过 excel11 有 8.46 M 请教各位大哥,是不是数据太多了,就不能导入了,还是这个导入程序本身有问题呢? 还有请各位大哥,介绍一个稳定的 从 DBGRID 倒入到 EXCEL 的程序? 谢谢!
|
Fishman
尊榮會員 發表:120 回覆:1949 積分:2163 註冊:2006-10-28 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
lsh998您好;
这是因为
constructor TXLSWriter.create(vFileName:string); begin inherited create; if FileExists(vFilename) then fStream:=TFileStream.Create(vFilename,fmOpenWrite) else fStream:=TFileStream.Create(vFilename,fmCreate); maxCols:=100; maxRows:=10000; //给定的最大行数,只有1000,您数据比较多,已经超出范围,所以显示不出来 。改为maxRows:=65535 end;参考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22849 您可以新的修正版的XLSFile.pas文件,下载路径: http://delphi.ktop.com.tw/loadfile.php?TOPICID=7196822&CC=160958 改正之后就没问题了,试试看 >[>>]>……>[>/>]> 这样方便阅读,请查看相关的版规说明。 <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ > |
lsh998
中階會員 發表:163 回覆:138 積分:60 註冊:2005-01-07 發送簡訊給我 |
|
lsh998
中階會員 發表:163 回覆:138 積分:60 註冊:2005-01-07 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |