Microsoft Excel
在当今世界上的电子表格应用软件产品中占有绝对的统治地位。我们经常可以看到财会部门或人事部门利用它来处理日常的一些数据。虽然说
Access
在数据处理方面会比Excel好些,但它在一些简单的日常事务中象执行一些快速输入或排序时却不那么方便简单。它是一个常用的事务处理工具。
这10年来,有许多AutoCAD程序是用于将提取数据并将其输出为报告。不论什么原因,它是很必要的。近10年来所见到的除了极少部分外(如Terry
Dotson的 http://www.dotsoft.com/), 输出的机制均为输出为
ASCII文本文件,或有些是带格式文件。这是因为10年来,我们没有 Visual LISP 或 VBA
使程序与其它应用软件相连通并在相互之间传递信息。现在可以了。
如果你还一直在使用逗号或TAB分界符的文本来区分你的数据,你应该好好地看看这篇文章了。
Visual LISP (VBA也可以)
提供了必要的函数来接触和与任何提供了类型库(内部暴露API[应用程序接口程序]的应用程序相联系。通常它是VB或VBA。这一类应用程序包括
Microsoft Office (Access, Excel, Word, 还有象Outlook 和 PowerPoint),
以及象 MathCAD, Visio、Actrix等产品。
在你的代码中的第一件事就是必需在Visual LISP中加载ActiveX/COM。它是通过(vl-load-com)
函数来完成的。第一件事尝试与 Excel 连接上就是搜索Excel的类型库文件。这里使用了Excel 2000 (9.0)
作为例子。示例1演示了怎样通过Excel不同版本来取得与其类型库相关联。注意 Excel 2002
用的是可执行文件来身来代替在以往版本中所使用的分离的TLB或OLB文件。
Figure 1: 加载Excel 97 类型库
(vl-load-com)
(defun DSX-TypeLib-Excel ( / sysdrv tlb)
(setq sysdrv (getenv "systemdrive"))
(cond
( (setq tlb (findfile (strcat sysdrv "\Program Files\Microsoft
Office\Office\Excel8.olb")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\Program Files\Microsoft
Office\Office\Excel9.olb")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\Program Files\Microsoft
Office\Office\Excel10.olb")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\Program Files\Microsoft
Office\Office\Excel.exe")))
tlb
)
( (setq tlb (findfile (strcat sysdrv "\Program Files\Microsoft
Office\Office10\Excel.exe")))
tlb
)
)
)
下一步是加载类型库并定义内部接口的属性、方法和恒量。这些都可以使用任意名称的前缀,该前缀只是用于对外部应用程序的快速及合理地调用。
以下的文章内容将把类型库的前缀均置为斜体以方便区分。
示例2演示了一个简单的函数来加载类型库并判断是否成功返回T或nil:
Figure 2: 定义类型库接口
(defun DSX-Load-TypeLib-Excel ( / tlbfile tlbver out)
(cond
( (null msxl-xl24HourClock)
(if (setq tlbfile (DSX-TypeLib-Excel))
(progn
(setq tlbver (substr (vl-filename-base tlbfile) 6))
(cond
( (= tlbver "9")
(princ "n初始化 Microsoft Excel 2000...") )
( (= tlbver "8")
(princ "n初始化 Microsoft Excel 97...") )
( (= (vl-filename-base tlbfile) "Excel.exe")
(princ "n初始化 Microsoft Excel XP...")
)
)
(vlax-import-type-library
:tlb-filename tlbfile
:methods-prefix "msxl-"
:properties-prefix "msxl-"
:constants-prefix "msxl-"
)
(if msxl-xl24HourClock (setq out T))
)
)
)
( T (setq out T) )
)
out
)
现在你已经在敲Excel的门并且得到“我在家!哪位,有什么事?”这样的回答。你必须温和地回答,象“你好!我这里有一个新的文件想存些数据进来!”
示例3给出了一个简单的函数来打开 Excel
并利用缺省的工作簿(一般为3个工作表)来创建一个新的空白工作簿。工作表1将作为缺省的活动工作表。该函数返回vla-object
指向新的 Excel 进程对象。
Figure 3: 打开带有新的工作簿的 Excel</