#

最近因為工作的關係需要分析Excel工作表的內容,一直在考慮要用VBA好還是用Tcl+tcom好,掙扎了好久最後還是選了Tcl+tcom,採用這種方法是因為....我是Tcl的熱愛者!!哈~。接下來的內容是操作Excel時常遇到的問題,我把它們都部落格下來給大家參考。

E08.1 開啟Excel文件並取得控制儲存格的COM物件

用tcom開啟Excel文件是很容易的一件事,慣用的程式片段如下:


set excel [::tcom::ref createobj Excel.Application]
$excel Visible 1

set workbooks [$excel Workbooks]
set workbook [$workbooks Open "要開啟的Excel檔案"]

當開啟成功,下一步通常是要取得Sheet1 ~ SheetX 的COM物件參考 :


set worksheets [$workbook Worksheets]
    
set sheet1 [$worksheets Item [expr 1]]
set sheet2 [$worksheets Item [expr 2]]

取得了工作表的COM物件參考後,接下來只要再取得每個工作表的「儲存格集合」的COM物件參考, 就可以隨心所欲的操控每一個儲存格了,程式片斷如下 :


set cells1 [$sheet1 Cells]
set cells2 [$sheet2 Cells]

E08.2 設定及取得指定儲存格的資料

在開始之前,我們要先知道Excel的儲存格中「顯示的資料」及「原始的資料」很有可能是不一樣的,時常「顯示的資料」是「原始的資料」經過格式化的結果,如果說你要取出某個儲存格中原始的資料,可以這麼做 :


set R [expr 1]
set C "A"
set R1C1 [[$cells1 Item $R $C] Value]

上面的程式中cells1 Item 後面可以給兩個參數,分別用來指定儲存格集合中的第「R」列,第「C」行,當命令執行成功後,會回傳對應儲存格的COM物件參考。我們透過儲存格物件的Value屬性把值取出來。

如果你要取出的是格式化後的內容,也就是顯示在儲存格上的內容,要改用Text屬性,像這樣 :


puts [[$cells1 Item $R $C] Text]

如果你想要的是設定儲存格的內容,可以這樣做 :


$cells1 Item $R $C  "要設定給儲存格的值"

E08.3 變更儲存格的背景/前景顏色

如果要更改儲存格的背景顏色,則需要使用到儲存格Interior屬性的COM物件參考,使用的方法如下:


set interior [[$cell1 Item $R $C] Interior]
   
$interior Color [expr 0x0000FF]

上面的例子透過Interior物件把儲存格的背景設為紅色(0xBBGGRR)。 若要改變的是前景顏色,也就是文字的顏色要改用Font屬性的COM物件參考,範例如下 :


set fnt [[$cell1 Item $R $C] Font]
   
$fnt Color [expr 0xFF0000]
$fnt Bold [expr 1]

上面的例子把文字的顏色設定為藍色,也順道把文字設定為粗體了。 其它常用的功能還有,儲存格文字對齊的功能,像這樣把文字水平及垂直都置中 :


[$cells1 Item $R $C] HorizontalAlignment [expr -4108]
[$cells1 Item $R $C] VerticalAlignment  [expr -4108]

如果不了解上面的設定值,不要緊 ~ 請自己看看MSDN就知道了!!

20 個意見

cshben | 2012年7月19日 下午5:06

加油~我也是碰到才學的 ^^"

陳貴鑫 | 2013年1月2日 下午2:48

感謝大大寫了很多 tcl/tk 相關的教學
不過有個疑問
大大說未經同意不得轉載
那我可以把文字留下來收藏嗎?
當作電子書

dai | 2013年1月3日 下午4:22

ok 沒問題的!!

匿名 | 2013年2月8日 下午1:39

使用完畢後要怎麼樣才可以關掉啊?
我去開啟excel 他說編輯已被鎖定
我想應該是沒有放掉才對!
大大知道要怎麼放嗎?

dai | 2013年2月10日 下午5:46

hi
像這樣就可以關閉了

$excel Quit

匿名 | 2013年5月30日 下午4:22

請教dai
要下怎樣指令 才能刪除excel的列或行
目前只找到存取cell的值
如果我要刪除第20列的資料 (不是清除資料而已 是整個列消除)

dai | 2013年5月30日 下午8:26

嗯 你可以參考 MSDN

http://msdn.microsoft.com/en-us/library/office/ff821382.aspx

匿名 | 2013年6月11日 下午9:40

dai 我又來問了
excel 數值轉成文字
通常都是手動加' 就會轉成文字
假設想對第I行 整行轉成文字格式
set column1 [ [$::worksheet Columns] Item I]
$column1 ???
請問要加什麼比較適合
謝謝

jimmy | 2013年6月13日 上午8:37

要用tcom控excel可以利用excel的巨集功能
先錄製巨集,然後操作一次想完成的動作,再去檢視巨集
例如:選取column A,儲存格格式的數值改為文字,錄出來的結果是下面2行
Columns("A:A").Select
Selection.NumberFormatLocal = "@"

用tcl的tcom去控的話就是
$column1 NumberFormatLocal "@"
使用這種方式很多複雜的步驟也都能做得到

匿名 | 2013年6月13日 下午1:39

嗯嗯
謝謝jimmy的經驗教學
看來要學怎樣用巨集

dai | 2013年6月13日 下午3:27

謝謝jimmy的分享!! 感謝!!

匿名 | 2013年7月22日 下午4:54

DAI 大
有辦法讓 SHEET 是用 SHEET NAME 來表示嗎?
而不是利用數字

set sheet1 [$worksheets Item [expr 1]]
set sheet2 [$worksheets Item [expr 2]]

感謝!....

dai | 2013年7月22日 下午5:56

抱歉!!這個我不知道也,其實關於execl的操作我也沒有使用的很深入。

jimmy | 2013年7月23日 上午8:36

http://msdn.microsoft.com/en-us/library/office/ff822101.aspx
這個參數可以是數字index或是sheet name
set sheet1 [$worksheets Item Sheet1]
set sheet2 [$worksheets Item Sheet2]
特殊狀況是當sheet name是數字時,例如第一個分頁把他叫做2
set sheet [$worksheets Item "2"]
$sheet Name #讀出sheet name
Sheet2 #2被當成index number

set sheet [$worksheets Item [string trim 2]] #先把2做一下字串的運算
$sheet Name # 這時2就被當成 sheet name了
2

dai | 2013年7月23日 上午9:57

說明的很清礎,謝謝 jimmy ~

karthik | 2013年9月3日 上午11:55

this is such a nice and useful information for us...i appreciate urs word Free Blogger premium Themes

karthik | 2013年9月6日 上午12:34

this is such a nice and useful information for us...i appreciate urs word Free Blogger premium Themes

匿名 | 2014年4月1日 下午3:18

请问如何取消背景颜色呢?宏录制得到的xlNone似乎不好用

Yen-Chih Huang | 2014年7月3日 下午4:16

作者已經移除這則留言。

Pang yoyo | 2015年10月23日 下午12:25

HI 你好:
想請問我想把 excel A 的 sheet copy 到excel B上

TCL有這個語法嗎??

感謝唷

留下您的意見

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