全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1118
推到 Plurk!
推到 Facebook!

请教,为什么数据比较多时,数据倒入到 EXCEL ,可是像没有&#2

尚未結案
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-16 14:59:07 IP:219.128.xxx.xxx 未訂閱
请教各位大哥: 我拷贝了 讨论的一个 导入 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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-16 16:01:39 IP:210.65.xxx.xxx 未訂閱
Hi lsh998,    會不會是資料筆數超過 65536 Excel 的限制?     ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-16 16:16:56 IP:218.15.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-16 16:19:24 IP:219.128.xxx.xxx 未訂閱
Fishman 大哥: 65536 Excel 还限制 资料笔数啊?是不是可以自己设置 最大多少笔的! 谢谢 Fishman 大哥!
lsh998
中階會員


發表:163
回覆:138
積分:60
註冊:2005-01-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-16 16:28:07 IP:219.128.xxx.xxx 未訂閱
谢谢 deity 大哥 和 Fishman 大哥: 我以后会注意的! 發表人 - lsh998 於 2005/06/16 16:31:37
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-16 16:37:45 IP:218.15.xxx.xxx 未訂閱
lsh998您好: 65536笔是Excel 最大显示行数了,列数最大为256列,这是Excel本身的问题了~ 如果您的数据有超过这个限制的话,小弟建议可以分开来进行导出~ 另您可以参考我所PS的修正版,里面修正了原版本的几个BUG,参考看看     ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================ 發表人 - deity 於 2005/06/16 16:43:23
系統時間:2024-06-27 0:04:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!