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

XLSfile.pas 的修訂版

 
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-18 09:32:49 IP:61.231.xxx.xxx 未訂閱
之前使用 csv 的格式,一直覺得還不錯用,但最近資料量大了,才發現有 64K 的限制,於是看了大家努力作出的 XLSfile.pas http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22849    本來想要把它改成 BCB 的,但在改寫的過程又遇到困難,主要是 Delphi 在單一 Unit 內可以任意使用別人的 private 及 protected 屬性,如果要快速轉換,變成要將大部分的 method 及 property 都變成 public,另外還有 Set 的 Default 值在 Delphi 用 [] 即可:    procedure CellStr(vCol,vRow:word;aValue:String;vAtribut:TSetOfAtribut=[]);    但是在 BCB 中,不知道該用什麼,變成,所有的 CellXXX 都要再作一份沒有設定 Atribut 的... 實在是有點麻煩  於是決定直接修改 > 另外,加入了自己常用的 ><>< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=6939849&CC=155211">
C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
------
http://www.ViewMove.com
附加檔案:22993_XLSfile.pas
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-18 09:54:34 IP:61.231.xxx.xxx 未訂閱
給站長天使大人: 為什麼小弟所 post 出的分享或發表文章都不會出現 針對這一篇【分享】文章,您可以如下回應 針對這一篇【發表】文章,您可以如下回應 還是說這樣的選項是自己看不見的呢? 我的系統是 Win98,IE5.00.2614.3500, 有使用類似 KKman 的 Scope (http://cyberian.tripod.com) 沒空更新的網頁...
C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
------
http://www.ViewMove.com
領航天使
站長


發表:12216
回覆:4186
積分:4084
註冊:2001-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-18 10:03:46 IP:192.168.xxx.xxx 未訂閱
引言: 給站長天使大人: 為什麼小弟所 post 出的分享或發表文章都不會出現 針對這一篇【分享】文章,您可以如下回應 針對這一篇【發表】文章,您可以如下回應 還是說這樣的選項是自己看不見的呢? 我的系統是 Win98,IE5.00.2614.3500, 有使用類似 KKman 的 Scope (http://cyberian.tripod.com) 沒空更新的網頁...
C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
1.因為是自己發表的【分享】【發表】..文章,自己是無法對自己推薦給分的. 2.若是自己發表的【問題】,可以對答題者給分 3.還有KKMAN是完全與IE相容的. ~~~Delphi K.Top討論區站長~~~
------
~~~Delphi K.Top討論區站長~~~
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-18 16:35:48 IP:61.231.xxx.xxx 未訂閱
引言: 1.因為是自己發表的【分享】【發表】..文章,自己是無法對自己推薦給分的. 2.若是自己發表的【問題】,可以對答題者給分 3.還有KKMAN是完全與IE相容的. ~~~Delphi K.Top討論區站長~~~
了解了 在修改這個 ><>< src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=6939849&CC=155211">C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
------
http://www.ViewMove.com
newbie
初階會員


發表:81
回覆:45
積分:25
註冊:2002-11-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-12-02 20:15:50 IP:61.220.xxx.xxx 未訂閱
不好意思請問一下...    因為小弟還沒學過  Delphi 但是想用一下這個功能    我在 BCB5 的 Project 直接 Add XLSFile.pas    然後在我作的一個 Form 裡面 StrinGrid    呼叫  StringGridToXLS(strGrid, "C:\testxls.xls");    我不知道該怎麼使用才正確...< >可否指點一下哩...< >
shishan
一般會員


發表:1
回覆:10
積分:2
註冊:2002-10-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-12-09 14:30:31 IP:163.26.xxx.xxx 未訂閱
引言: 在修改這個 Unit 後的心得是... 如果有空,還是要多多學學 Delphi 的語法,因為真的是比較「自由」,而且,作出來的 Unit 不但 Delphi 能用,在 BCB 也是一樣好用。 另外還更正之前所說的 csv 64K 的限制... 其實是如同 XLSfile.pas 的限制,有 64K Row 的限制才對。 不過,用 XLSfile.pas 還是比 csv 好,因為可以設定每個欄位的格式。 每次由 Excel 自行判斷時,總是將 000 001 002 ... 之類的編號轉為 0 1 2 ... 使用 XLSfile.pas 就能定出每格都是「字串」,請 Excel 不要自作聰明將它們轉成「數字」。
使用XLSfile.pas匯出資料,可以成功且方便的匯出.xls!! 可是,所匯出的資料,不知是否因為資料還透過delphi資料型態(word,string)之暫存等原因,所以對於為unicode的文字則無法順利直接匯出,會變成 "?" 呢??!!
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-12-15 11:28:15 IP:203.204.xxx.xxx 未訂閱
引言: 不好意思請問一下... 因為小弟還沒學過 Delphi 但是想用一下這個功能 我在 BCB5 的 Project 直接 Add XLSFile.pas 然後在我作的一個 Form 裡面 StrinGrid 呼叫 StringGridToXLS(strGrid, "C:\testxls.xls"); 我不知道該怎麼使用才正確...< >可否指點一下哩...< >
如果您的 TStringGrid 就叫作 strGrid ,則叫用 StringGridToXLS(strGrid, "C:\\testxls.xls"); 即可。在 C/C++ 中要產生 '\' 可是要用 '\\' 才行。 沒空更新的網頁...
C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
------
http://www.ViewMove.com
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-12-15 11:31:55 IP:203.204.xxx.xxx 未訂閱
引言: 使用XLSfile.pas匯出資料,可以成功且方便的匯出.xls!! 可是,所匯出的資料,不知是否因為資料還透過delphi資料型態(word,string)之暫存等原因,所以對於為unicode的文字則無法順利直接匯出,會變成 "?" 呢??!!
對於 UniCode 我是不太了解啦,因為有 Source ,如果可以的話,您可以試著將 XLSfile.pas 中的 String 改成 WideString 試試看。 沒空更新的網頁...
C及指標教學,計算機概論,資訊管理導論... http://coolsite.to/dllee 介紹Shells,LiteStep,GeoShell.... http://coolsite.to/ushells
------
http://www.ViewMove.com
zong
初階會員


發表:11
回覆:51
積分:42
註冊:2002-08-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-01-13 13:59:51 IP:61.219.xxx.xxx 未訂閱
XSLfile 寫的真的不錯! 但 小弟來遇到一到問題! 就是轉出的檔案可以正常在EXCEL讀出來! 但若以openoffice 開時就讀不出來了! 可以先以EXCEL開後再存檔(不做異動) openoffice就可正常開啟了! 好奇怪??? 好像是檔頭少了識別字串的樣子! 不知各位先進有遇過這樣問題嗎??
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-01-13 16:13:31 IP:61.219.xxx.xxx 未訂閱
引言: XSLfile 寫的真的不錯! 但 小弟來遇到一到問題! 就是轉出的檔案可以正常在EXCEL讀出來! 但若以openoffice 開時就讀不出來了! 可以先以EXCEL開後再存檔(不做異動) openoffice就可正常開啟了! 好奇怪??? 好像是檔頭少了識別字串的樣子! 不知各位先進有遇過這樣問題嗎??
1. XSLFile用的是舊版的Excel, 才有這樣問題, 包括上面所說Unicode也是同樣 2. 領航天使貼了較完整的Excel Formate, 我可能找時間擴充一下改為BIFF8格式, 同時如果忽略Excel太複雜的format, 只考慮Table型態, 應可同時讀寫 3. dllee所說, delphi可任意讀寫private是不正確的, 只有protected可以.
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-01-15 11:56:19 IP:211.22.xxx.xxx 未訂閱
謝謝各位的心得分享。 也提出小弟的小小心得: 1.因為 Integer 寫出是以 Word 的型態寫出,所以當值的大小大於65535時會產生溢位的問題,所以建議用 Double 的型態寫出。 2.當為字串型態時,常會用A.B.C.D...代表某些意義,是故會在TField.OnGetText去設定所代表的意義,若用TField.AsString則不會顯示所設定值,所以建議用TField.DisplayText來取代。
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-01-15 14:19:00 IP:61.231.xxx.xxx 未訂閱
關於 Excel 格式的相關資料可以由以下的網頁取得: http://chicago.sourceforge.net/devel/docs/excel/    看過該網頁後,發現,現有的版本中,只有限制最大 row 數為 65535,但此格式最大的 col 數也只能 255,但因為在修改時不知道,所以沒有判斷,如果您的資料欄位數大於 255 那這個版本就不能用了。 這個限制好像也是 Excel 本身的限制。    另外,ccchen 所說的並不正確喔,DELPHI 真的是可以讓別人存取 private 只要是同一個 unit ,因為我已實驗過(在 BCB5),您可以試試本範例,將 TXLSWriter 物件改宣告如下:(即所有都是 private 只有 create/destroy 是 public)
  TXLSWriter = class(Tobject)
  private
    fStream:TMemoryStream;
    FileName:String;
    maxCols,maxRows:Word;
    procedure WriteWord(w:word);
    procedure WriteBOF;
    procedure WriteEOF;
    procedure WriteDimension;
    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);
  public    
    constructor create(vFileName:string);
    destructor destroy;override;
  end;
用 BCB5 compile 照過,也正常執行沒有問題! 我之前會說「Delphi 在單一 Unit 內可以任意使用別人的 private 及 protected 屬性」,是因為曾經試著轉過本例及其他 DELPHI code 所得到的教訓,如果 Delphi/BCB 共同開發,Delphi 的開發成員如果將屬性都設成了 private ,那他自己用的很爽,用 BCB 的就會很X,因為連繼承都無法使用!! 現在看到許多的 Delphi Code(Delphi Open Source 的比 BCB Open Source 的多蠻多的) 似乎很好用,但想轉 BCB 或修改(有時真的是看不太懂 ),就會遇到許多問題。 沒空更新的網頁...<><>>介紹>
------
http://www.ViewMove.com
shing.net
中階會員


發表:207
回覆:124
積分:66
註冊:2002-03-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-01-16 17:33:42 IP:140.122.xxx.xxx 未訂閱
可否加入自動調整欄寬功能,因為字串太大使用者要去調整較麻煩
lulun
一般會員


發表:1
回覆:4
積分:1
註冊:2003-10-23

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-11-25 10:22:57 IP:211.74.xxx.xxx 未訂閱
請教先進們: run 這支程式時,是不是超過1000筆record,資料就無法轉至excel, 我測試過超過1000筆,excel打開時就完全是空白的, 是我錯亂了嗎???
lulun
一般會員


發表:1
回覆:4
積分:1
註冊:2003-10-23

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-11-25 10:43:14 IP:211.74.xxx.xxx 未訂閱
哈哈~~對不起~的確是我錯亂了,我看到預設值那行程式了....
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-12-21 16:56:11 IP:202.181.xxx.xxx 未訂閱
請問一下,我有各問題,當我的欄位值大於64938時,轉出到excel的數字都不對,但是欄位只有三各,資料筆數也才不到一百筆,請問是為什麼???
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-04-28 13:54:11 IP:61.221.xxx.xxx 未訂閱
小弟用D7轉出沒問題,但是要開EXCEL時卻打不開,會出現記憶體不足的錯誤訊息。 DataSetToXLS沒問題 但StringGridToXLS卻發生上述的情形 ~~應無所住而生其心~~ 發表人 - Terrychen 於 2004/04/28 14:03:51
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-05-02 22:05:50 IP:211.76.xxx.xxx 未訂閱
看最近還有許多人有使用上的問題...    但因為我自己已不使用 MS-Office 了,只使用 OpenOffice,而 OpenOffice 又開不了這種格式... 所以不太想繼續修改此版本。    只有說抱歉了... 如果遇到問題,就只有請您自行 DEBUG 了,如果您找到 BUG,願意分享,那就再好也不過了  如果有新的 >沒空更新的網頁... href="http://dllee.adsldns.org">http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
pillar62
資深會員


發表:9
回覆:324
積分:271
註冊:2002-04-15

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-03-07 11:54:13 IP:210.64.xxx.xxx 未訂閱
請問各位大大,如果說在excel裡面要有兩個sheet的話,這一段程式要怎麼處理呢??因為這一個功能只能轉單一的dataset 如果我有兩個dataset要處理,可以怎麼做呢??謝謝各位高手指點!! Pillar Wang
------
Pillar Wang
richcomp
中階會員


發表:18
回覆:66
積分:51
註冊:2002-10-18

發送簡訊給我
#20 引用回覆 回覆 發表時間:2008-12-04 11:32:09 IP:117.82.xxx.xxx 訂閱
这个程式很好用,在DELPHI7中一直使用,但现在DELPHI2009中由于使用UNICODE,导出的文字部分,英文每个字符后面加了空格,中文变成了乱码,长度也变为只有原来的一半,估计是CELLSTR中哪里有问题,烦请各位给个修改的方法
系統時間:2024-04-27 7:48:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!