#

最近突然需要用到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

留下您的意見

Theme Design by devolux.org. Converted by Wordpress To Blogger for WP Blogger Themes. Sponsored by iBlogtoBlog
This template is brought to you by : allblogtools.com | Blogger Templates