- UID
- 215173
- 积分
- 411
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2005-1-29
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
最近看到論壇上關于如何用VLISP將CAD與EXCEL聯系起來的討論
比較多,看來還是有許多愛好者喜歡進行這方面的探索,以前有看過衛文斑竹的几篇文章和程序覺得很不錯,今天一時技癢,也想來對EXCEL發表一些見解。因為在我工作中經常需要將CAD與EXCEL聯系起來用所以我也是在沒有辦法的情況下才去進行這方面的研究,寫的不好還希望大家多提出意見。。多多討論。。
首先我認為想要學好這個并不難要有耐心,比如有些屬性我不知道怎么去使用,沒有關系VLISP給了我們一個很好的函數VLAX-DUMP-OBJECT函數去查詢然后對照他所有的功能用VLAX-GET-PROPERTY和VLAX-PUT-PROPERTY兩個功能基本上都可以實現屬性的編輯。。
我的調用習慣是 1.初始化EXCEL---2.新建進程----3.設定版面
4.表格處理(如:何處需要合并單元格以及邊框線
設定等)
5.存儲數據
1....初始化進程
(Defun hyxls-app-Init (/ OSVar GGG Olb8 Olb9 Olb10 TLB Out msg msg1 msg2)
;;;;;;;;;;該程序實現了初始化EXCEL應用程序!
(if *Chinese*
(setq msg "\n 初始化微軟Excel "
msg1 "\042初始化Excel失敗\042"
msg2 (strcat "\042 警告""\n ====""\n 無法在您的計算机上檢測到微軟Excel軟件"
"\n 如果您确認已經安裝Excel, 請發送電子郵"
"\n 件到99849930449@sina.com獲取更多的解決方案\042"))
(setq msg "\n Initializing Microsoft Excel "
msg1 "\042Initialization Error\042"
msg2 (strcat "\042 WARNING""\n ======="
"\n Can NOT detect Excel97/200X/XP in your computer"
"\n If you already have Excel installed, please email"
"\n us to get more solution via yota@ikozmos.com\042"))
)
(if (null msxl-xl24HourClock)
(progn (if (and (setq GGG (vl-registry-read
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\Excel.EXE"
"Path"))
(setq GGG (strcase (strcat GGG "Excel.EXE"))))
(progn (foreach OSVar (list "SYSTEMROOT" "WINDIR""WINBOOTDIR" "SYSTEMDRIVE"
"USERNAME" "COMPUTERNAME" "HOMEDRIVE" "HOMEPATH" "PROGRAMFILES")
(if (vl-string-search (strcat "%" OSVar "%") GGG)
(setq GGG (vl-string-subst (strcase (getenv OSVar))
(strcat "%" OSVar "%")GGG)))
)
(setq Olb8 (findfile (vl-string-subst "EXCEL8.OLB" "EXCEL.EXE" GGG))
Olb9 (findfile (vl-string-subst "EXCEL9.OLB" "EXCEL.EXE" GGG))
Olb10 (findfile (vl-string-subst "EXCEL10.OLB" "EXCEL.EXE" GGG)))
(cond ((= (vl-filename-base (vl-filename-directory GGG))"OFFICE11")
(setq TLB GGG Out "2003"))
((= (vl-filename-base (vl-filename-directory GGG))
"OFFICE10")
(setq TLB GGG Out "XP"))
(Olb9 (setq TLB Olb9 Out "2000"))
(Olb8 (setq TLB Olb8 Out "97"))
(t (setq Out "Version Unknown"))
)
(if TLB (progn (princ (strcat MSG Out "..."))
(vlax-import-type-library
:tlb-filename TLB
:methods-prefix "msxl-"
:properties-prefix "msxl-"
:constants-prefix "msxl-"))
)
)(progn (if vldcl-msgbox
(vldcl-msgbox "x" msg1 msg2)
(alert (read msg2)))
(exit)))
)
)
msxl-xl24HourClock
)
進程初始化完畢,已經找到你電腦上EXCEL所在位置及版本下面就可以新建立檔案了。
2...新建檔案
(Defun hyxls-app-New (UnHide / Rtn)
;;;; 該程序實現功能:新建一個excel格
;;;;;;;;;; THIS PROGRAM CAN BUILD A NEW EXCELFILE
(if (hyxls-app-init)
(progn
(if *Chinese* (princ "\n 新建微軟Excel工作表...")
(princ "\n Creating new Excel Spreadsheet file..."))
(if (setq Rtn (vlax-get-or-create-object "Excel.Application"))
(progn (vlax-invoke-method
(vlax-get-property Rtn 'WorkBooks)
'Add)
(if UnHide (vla-put-visible Rtn 1)
(vla-put-visible Rtn 0))
)
)
)
)
Rtn
)
用UNHIDE來控制是否為隱藏功能。
如果說你需要的不是新建檔案而是需要調用一個就檔案的話。
(Defun hyxls-app-open(XLSFile UnHide / ExcelApp WorkSheet Sheets ActiveSheet Rtn)
;;;function: this program can open an excelfile
(setq XLSFile (strcase XLSFile))
(if (null (wcmatch XLSFile "*.XLS"))
(setq XLSFile (strcat XLSFile ".XLS")))
(if (and (findfile XLSFile)
(setq Rtn (vlax-get-or-create-object "Excel.Application")))
(progn (vlax-invoke-method (vlax-get-property Rtn 'WorkBooks)
'Open XLSFile)
(if UnHide
(vla-put-visible Rtn 1)
(vla-put-visible Rtn 0))))
Rtn)
3..好了,現在檔案進程已經取得那么就可以開始設計你需要的版面了.(打印時需要的格式,此時你電腦上必須有安裝打印設備,要不然VLISP將無法取得屬性,產生錯誤)
(defun hyxls-put-pagesetup(xlapp top bot lef rig hea fot flh flv);;設置版面
(setq sheet (vlax-get-property xlapp "ActiveSheet"))
(setq page (vlax-get-property sheet "pagesetup"))
(vlax-put-property page "footermargin" (* fot 28.3465))
(vlax-put-property page "headermargin" (* hea 28.3465))
(vlax-put-property page "leftmargin" (* lef 28.3465))
(vlax-put-property page "rightmargin" (* 28.3465 rig))
(vlax-put-property page "topmargin" (* top 28.3465))
(vlax-put-property page "bottommargin" (* bot 28.3465))
(vlax-put-property page "CenterHorizontally" flh)
(vlax-put-property page "CenterVertically" flv )
)
;;top為頂部距離,bot為底部距離,......flh,和flv是表示水平和垂直置中設定為1表示選定0表示取消,其中的每一項參數大家可以自己逐個去使用一下我就不多講了
4.版面設定好下面就是設定格式
;;; 更改范圍中邊框形式
(defun hyxls-Excel-rangeborder (xlapp star end style1 style2 style3 style4 style5 style6
/ sheet range borders left top right bottom)
(setq sheet (vlax-get-property xlapp "ActiveSheet"))
(setq range (msxl-get-range sheet (STRCAT star ":" end)))
(setq borders (msxl-get-borders range))
(setq left(vlax-get-property borders 'item 1)
top(vlax-get-property borders 'item 3)
right(vlax-get-property borders 'item 2)
bottom(vlax-get-property borders 'item 4)
)
(if style1 (vlax-put-property left 'linestyle style1))
(if style2 (vlax-put-property top 'linestyle style2))
(if style3 (vlax-put-property right 'linestyle style3))
(if style4 (vlax-put-property bottom 'linestyle style4))
(if (and style5 (= star end)) (progn (setq mid1(vlax-get-property borders 'item 5)
)
(vlax-put-property mid1 'linestyle style5)
)
)
(if (and style6 (= star end)) (progn (setq mid2(vlax-get-property borders 'item 6)
)
(vlax-put-property mid2 'linestyle style6)
)
)
)
;;;;;;;注: 1............單細線
;;; 2............細虛線
;;; 3............細虛線(比例比2小)
;;; 4............點划線
;;; 5............雙點划線
;;; 6............雙重雙點划線
;;; 7............=1
;;; 8............=2
;;; 9............雙划線
;;; 10...........=4
;;; 11...........=5
;;; 12...........=9
;;; 13...........=6
;;;合并單元格
(Defun hyxls-cell-merge (xl id / vllist-explode Val Rtn)
;;;;;;;;;合并單元格
(Defun vllist-explode2 (lst)
(cond ((not lst) nil)
((atom lst) (list lst))
((append (vllist-explode2 (car lst))
(vllist-explode2 (cdr lst))
)
)
)
)
(setq val (vllist-explode2 (hyxls-cell-get-value xl id)))
(while (vl-position "" val)
(setq val (vl-remove "" val))
)
(setq val (car val)
Rtn (msxl-get-range xl id)
)
(msxl-clear Rtn)
(msxl-merge Rtn nil)
(msxl-put-value2 Rtn Val)
(msxl-put-HorizontalAlignment Rtn -4108)
Rtn
)
;;;Examples:
;;;(hyxls-cell-merge *xlapp* “C1:F14”)
5..好了,一切前提工作全部做好了下面的就是要存儲數據了
(Defun hyxls-range-autofit (range);;自動調整范圍內存儲格
(equal (vlax-variant-value
(msxl-autofit
(msxl-get-columns (msxl-get-Cells range))
)
)
:vlax-true
)
)
;;存儲信息到一橫行。。(信息為列表形式)
(Defun hyxls-put-row-value (xl id data flg / Rtn);;;單列輸入信息并且flg為t則自動調整尺寸
(if (= (type data) 'str)
(setq data (list data))
)
(setq id (car (hyxls-cellid id))
id (hyxls-cellid-calc id (1- (length data)) 0)
)
(setq Rtn (hyxls-cell-put-value xl id (list data)))
(if flag
(hyxls-range-autofit
rtn
))
Rtn
)
;;;;存儲信息到一豎列。。(信息為列表形式)
Defun hyxls-put-column-value (xl id data flg / item Rtn);;;單列輸入信息并且flg為t則自動調整尺寸
(if (= (type data) 'str)
(setq data (list data))
)
(setq id (car (hyxls-cellid id))
id (hyxls-cellid-calc id 0 (1- (length data)))
)
(foreach item data
(setq Rtn (cons (list item) Rtn)))
(setq Rtn (hyxls-cell-put-value xl id (reverse Rtn)))
(if flg
(hyxls-range-autofit
rtn
))
Rtn
)
6...信息存儲完畢,我們將需要存盤并退出.
(Defun hyxls-app-save (xlapp)
;;;;保存文件
(equal (vlax-invoke-method
(vlax-get-property Xlapp "ActiveWorkbook")"Save")
:vlax-true)
)
(Defun hyxls-app-quit (ExlObj SaveYN);;退出應用程序
(if SaveYN
(vlax-invoke-method
(vlax-get-property ExlObj "ActiveWorkbook")
'Close
)
(vlax-invoke-method
(vlax-get-property ExlObj "ActiveWorkbook")
'Close
:vlax-False
)
)
(vlax-invoke-method ExlObj 'QUIT)
(vlax-release-object ExlObj)
(setq ExlObj nil)
(gc)
)
。。。大致一個使用過程就是這樣了。。
其他還有一些細節,比如如何改變字體字型,顏色,加信息,
調整字高等大家可以自己慢慢研究。。
再加几個相關程序。。
(defun hyxls-Excel-textAlignment(xlapp row col hal val / sheet cell)
(setq sheet (vlax-get-property xlapp "ActiveSheet"))
(setq cell (hyxls-get-cell sheet row col))
(vlax-put-property cell "HorizontalAlignment" hal)
(vlax-put-property cell "VerticalAlignment" val))
;;;注:水平方式 1 ----------一般
;;;;;;;;; -4131----------左縮排 ;;;;或2
;;;;;;;;; -4108----------置中對齊 ;;或3
;;;;;;;;; -4152----------靠右對齊 ;;或4
;;;;;;;;; 5 ----------填滿 ;;或5
;;;;;;;;; -4130----------水平對齊 ;;或6
;;;;;;;;; 7----------跨欄置中
;;;;;;;;; -4117----------分散對齊 ;;或8
;;;注:垂直方式 -4160 ----------靠上 或1
;;;;;;;;; -4108----------置中對齊 或2
;;;;;;;;; -4107----------靠下 或3
;;;;;;;;; -4130----------垂直對齊 或4
;;;;;;;;; -4117 ----------分散對齊 或5
(defun hyxls-Excel-textunderline(xlapp row col underline / sheet cell)
(setq sheet (vlax-get-property xlapp "ActiveSheet"))
(setq cell (hyxls-get-cell sheet row col))
(vlax-put-property (vlax-get-property cell "font") "Underline" underline))
;;;;;注: underline 1---------無下划線
;;;;; 2---------單線
;;;;; 3---------雙線
;;;;; 4---------會計用單線
;;;;; 5---------會計用雙線
(defun hyxls-Excel-textsize(xlapp row col size / sheet cell)
(setq sheet (vlax-get-property xlapp "ActiveSheet"))
(setq cell (hyxls-get-cell sheet row col))
(vlax-put-property (vlax-get-property cell "font") "Size" size)) |
|