最近突然需要用到Excel做動態報表,所以就把很久沒用的DDE拿了出來。這篇文章以一個很簡的例子來說明,Excel透過DDE讀取Tcl變數的方法。
E05.1 註冊DDE服務
要讓Excel透過DDE讀取Tcl裡的變數,是很簡單的,只要註冊一組DDE的服務就可以了,如下的例子:
package require dde
dde servername MyTopic
set var1 "abc"
set var2 "123"
entry .t1 -textvariable ::var1
entry .t2 -textvariable ::var2
button .btn -text "exit" -command {exit}
pack .t1 .t2 .btn -expand 1 -fill both
這個程式的重點在第3行,它在目前的Tcl直譯器,註冊1個service name為TclEval(必然是這個值)且topic name為MyTopic的DDE服務。一但Tcl程式的DDE服務註冊完成,你就可以在Excel的任一儲存格中用DDE的連結語法來讀取Tcl的變數。
E05.2 DDE連結語法
在Excel中你可以在任一儲存格用下列的DDE連結語法來存取Tcl的變數值,當然前提是Tcl對應的DDE服務必需存在。=TclEval|MyTopic!'變數名稱'
這個語法的開頭是一個「=」等號,然後TclEval及MyTopic中間有一個「|」管號,然後MyTopic及變數名稱中間用「!」驚嘆號隔開。如下圖,我在Excel的A1及A2儲存格上讀取var1及var2變數的值,請注意!! A1及A2中輸入的是DDE的連結語法,並不是「abc」及「123」。
e05-1
按右上方的「#」號切換側邊欄
11 個意見
shawn.chen | 2010年7月12日 上午11:07
你好,我又來問問題了
你的範例是從execl讀取出tcl變數
那請問一下
有沒有辦法用tcl去讀取execl檔的資料
我想要讀取不同的頁籤的不同欄位資料
我有試著把excel另存成別的檔案格式也是沒辦法存到別的頁籤的資料
有什麼其它方法可以把excel內的資料讀取進來的嗎?
dai | 2010年7月12日 中午12:42
HI,
其實DDE是可以反向操作的,但如果要做Excel的報表處理,我比較喜用COM
請參考下面的例子,這個例子會把c:\test.xls裡每一個sheet的第一個欄位讀出來
package require tcom
set excel [::tcom::ref createobj Excel.Application]
$excel Visible 1
set workbooks [$excel Workbooks]
set workbook [$workbooks Open {c:\test.xls}]
set worksheets [$workbook Worksheets]
set count [$worksheets Count]
for {set i 1} {$i <= $count} {incr i} {
set worksheet [$worksheets Item [expr $i]]
set cells [$worksheet Cells]
set cell [$cells Item 1 A]
puts [$cell Value]
}
$excel Quit
shawn.chen | 2010年7月12日 下午4:33
抱歉 我又延伸出另一個問題
tcom要怎麼在linux上安裝
我用這個指令 "./teacup install tcom" 出現錯誤
好像有一些檔案要設定的樣子 是嗎?
還是我指令有下錯?
我的作業系統是用centOS
TCL版本是用8.4版
又要再次請教麻煩你了
囧rz...
謝謝你!!
sam | 2010年7月12日 下午6:39
Hi,DDE的讀取方法,試試看下面的程式:
package require dde
#This also returns a list of available book/worksheets
puts [dde request Excel System Topics]
#a.xls是我在程式目錄下建立的excel檔案
#RxCy表示第Row x,Col y的意思,R2C1若以Excel來說就是A2
#下面這一行表示寫入
dde poke Excel {[a.xls]Sheet1} "R2C1" "HelloTcl"
#下面這一行表示讀出
set chill [dde request Excel {[a.xls]Sheet1} "R2C1"]
puts $chill
sam | 2010年7月12日 下午6:40
忘了補上其它DDE/EXCEL用法:
Google到的參考連結
http://coding.derkeiler.com/Archive/Tcl/comp.lang.tcl/2009-06/msg00318.html
dai | 2010年7月12日 晚上7:38
sam 有你幫忙真好 ~~
shawn.chen : COM及DDE都是Windows專有的東西 也就是說在Linux下是沒辦法使用的。
shawn.chen | 2010年7月13日 上午8:48
謝謝sam大跟dai版大的資訊分享!!
我自己再試看看 ^_^
謝謝你們!!
匿名 | 2014年6月16日 晚上11:59
請問一下要怎麼安裝tcom?
我下載8.6執行package require tcom
還是找不到
匿名 | 2014年6月17日 上午10:06
如果是裝 ActiveTcl的話 可以在 命令提示字元下 執行
teacup install tcom
* 記得確定 C:\Tcl\bin 有加入PATH 環境變數裡
匿名 | 2014年6月19日 晚上11:27
我可以由tcl寫入數值到excel,
但怎麼寫入數值到工作表2裡?
另外如何變更工作表的名子?
匿名 | 2014年6月20日 中午12:45
這一篇 http://blog.got7.org/2012/04/e08-tcomexcel.html 應該可以找到靈感
Excel COM 物件不會用的話可以查 http://msdn.microsoft.com/en-us/library/fp179694(v=office.15).aspx
留下您的意見