2
2
2
2003 年第 7 期
文章编号 :1006
计 算 机 与 现 代 化
J ISUANJ I YU XIANDAIHUA
总第 95 期
02
2475 (2003) 07
0084
AutoCAD 属性块与 Excel 电子表格的双向存取
张小红1 ,吴伟晖2
(1. 南方冶金学院 ,江西 赣州 341000 ;2. 江西省公安厅 ,江西 南昌 330006)
摘要 : 通过编写 Visual Basic 及 VBA 的代码 ,完整地实现了 AutoCAD 属性块与 Excel 电子表格的双向存取 ,并提供全部程
序代码注释及运行步骤 。
关键词 : AutoCAD 属性块 ; Excel 电子表格 ; 双向存取 ; VBA ; 宏
中图分类号 : TP311. 52 文献标识码 : A
Double Access on AutoCAD Piece and Excel Electronic Form
ZHANG Xiao
hong1 ,WU Wei
hui2
(1. Southern Institute of Metallurgy , Ganzhou 341000 ,China ;
2. Jiangxi Province Public Security Official Hall ,Nanchang 330006 ,China)
Abstract :Writes Visual Basic and VBA codes ,completely realizes double access on AutoCAD piece and Excel electronic form ,and pro
vides all code remarks and running steps.
Keywords :AutoCAD property piece ; Excel electronic form ;double access ;VBA ;macro
0 引 言
由于 CAD 软件技术迅猛发展 ,它所支持的应用范
畴越来越广 ,众多企业为维持竞争力和分析追踪设计
产品制造所需的大量资料和信息 ,纷纷将需求指向图
纸与数据上的结合。在当今的办公室里 ,许多人员对
Word 字处理软件和 Excel 电子表格软件都已充分熟
悉 ,将 AutoCAD 属性数据资料转入熟悉的 Excel 电子表
格中 ,反过来将 Excel 中处理过的数据绘制回到 Auto
CAD 图形文件中 ,是工程人员急切想掌握的技术 ,本文
提供的 AutoCAD 属性块与 Excel 电子表格的双向存取
程序均在 Visual Basic 6. 0、AutoCAD 2000 中调试成功。
1 将 AutoCAD 属性存入 Excel 电子表格
假设我们有一个 AutoCAD 图纸文件 :结晶器振动
装置. dwg ,希望将它的属性块中的内容 (如图 1 所示)
全部转入到 Excel 电子表格 :“属性导出. xls”文件中 。
操作步骤 :
(1) 新建一个 Excel 电子表格文件 ,取名为 :属性导出. xls ;
(2) 打开需要导出的 AutoCAD 文件 :结晶器振动装置. dwg ;
(3) 单击“工具”菜单 ,选择“宏”→“Visual Basic 编辑器”,
添加以下代码 :
图 1 结晶器振动装置. dwg 文件中的属性块内容
Public acad As Object
Public mspace As Object
Public excel As Object
Public AcadRunning As Integer
Public excelSheet As Object
Sub obtain()
Dim elem As Object
Dim RowNum As Integer
Dim Array1 As Variant ,Array2 As Variant
Dim Count As Integer
Set excel = GetObject ( ,″Excel. Application″)‘打开一个 Excel
电子表格文件 ,如 :属性导入. xls Worksheets (″sheet1″) . Activate
‘激活 sheet1 表单
收稿日期 :2003
作者简介 :张小红 (1966
04
16
) ,女 ,河北秦皇岛人 ,南方冶金学院副教授 ,北京科技大学博士研究生 ,研究方向 :计算机应用 。
© 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
2003 年第 7 期
张小红等 :AutoCAD 属性块与 Excel 电子表格的双向存取
58
Set excelSheet = excel. ActiveWorkbook. Sheets(″sheet1″)
Set acad = GetObject ( ,″AutoCAD. Application″)‘打 开 一 个
AutoCAD 文件 ,如 :结晶器振动装置. dwg
Set doc = acad. ActiveDocument‘doc 变量指向 AutoCAD 目前
文件
Set mspace = doc. ModelSpace‘mspace 变量指向 AutoCAD 目
前文件模型空间
RowNum = 1
Dim Header As Boolean
Header = False‘Header 将标记是否读出 Excel 标题栏
For Each elem In mspace
With elem
If StrComp (. EntityName ,″AcDbBlockReference″,1) = 0 Then
If . HasAttributes Then
Array1 = . GetAttributes‘Array1 表示属性数组
Array2 = . GetConstantAttributes‘Array2 表示常数属性数组
For Count = LBound(Array1) To UBound(Array1)
If Header = False Then‘将 Array1 的标签文字 tagstring 作为
Excel 的标题
If StrComp (Array1 (Count) . EntityName ,″AcDbAttribute″,1) =
0 Then
excelSheet. Cells ( RowNum , Count + 1 ) . Value = Array1
(Count) . TagString
End If
End If
Next Count
For Count = LBound(Array2) To UBound(Array2)
If Header = False Then‘将 Array2 的标签文字 tagstring 作为
Excel 的标题
If StrComp ( Array2 ( Count ) . EntityName ,″AcDbAttribut
eDefinition″,1) = 0 Then
excelSheet. Cells(RowNum ,UBound(Array1) + 1 + Count +
1) . Value = Array2(Count) . TagString
End If
End If
Next Count
RowNum = RowNum + 1‘Excel 的行号加 1
For Count = LBound(Array1) To UBound(Array1)
excelSheet. Cells ( RowNum , Count + 1 ) . Value = Array1
(Count) . TextString
Next Count
For Count = LBound(Array2) To UBound(Array2)
excelSheet. Cells(RowNum ,UBound(Array1) + 1 + Count +
1) . Value = Array2(Count) . TextString‘将 Array1 和 Array2 的标签
属性读出 ,存入 Excel 中
Next Count
Header = True‘结束读取标题栏
End If
End If
End With
Next elem
Set acad = Nothing
End Sub
(4) 单击“工具”菜单 ,选择“宏”→“宏. . . ”,在弹出的对
话框中 ,单击“执行”。图 1 中的属性块内容就完整地导入在
Excel 表格中 。
(5) 若上述. dwg 的属性块中的内容进行过修改 ,可重新
打开属性导出. xls ,并在打开文件的提示框中回答“启用宏”,
直接运行步骤 (4) 即可 。
2 Excel 电子表格中数据导入 Auto
CAD 属性块
现在我们要做一个逆向工作 ,将修改整理过的
Excel 电子表格中数据完整导入 AutoCAD 属性块 ,这
项工作量相对而言难度更大 ,但对于工程人员实用性
更强 ,操作步骤如下 :
(1) 先在 AutoCAD 中制作好两个. dwg 块文件 :imptitle. dwg
和 impline. dwg ,前者为绘出属性表表头 ,后者为分别绘制线
条 ,注意各字段的宽度要一致 ,如图 2、图 3 所示 。
图 3 impline. dwg 线条
(2) 打开一个已编辑好的 Excel 电子表格文件 。
(3) 打开一个欲嵌入 Excel 数据值的 AutoCAD 文件 ,单击
“工具”菜单 ,选择“宏”→“Visual Basic 编辑器”,添加以下代
码 :
Public acad As Object
Public mspace As Object
Public excel As Object
Public AcadRunning As Integer
Public excelSheet As Object
Sub import ()
Dim shapes As Object
Dim RowNum As Integer
Dim Array1 As Variant ,Array2 As Variant
Dim Count As Integer
excel. Worksheets(″sheet1″) . Activate
Set excelSheet = excel. ActiveWorkbook. Sheets(″sheet1″)
Set acad = GetObject ( ,″AutoCAD. Application″)
Dim insertpt
Dim ipt (0 To 2) As Double ,nipt (0 To 2) As Double
Dim blkref As AcadBlockReference
Dim imptitle As String ,impline As String
Dim atr As Variant ,catr As Variant
Dim i As Integer
imptitle = ″D : \ imptitle. dwg″
impline =″D : \ impline. dwg″
insertpt = ThisDrawing. Utility. GetPoint( ,″请点击属性块内容
的插入位置 :″)
(下转第 88 页)
© 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net
3
3 其他 U dw 和 DataWindow 服务
DataWindow 是 PowerBuilder 产品最强大的特征之
一 ,DataWindow 用户对象和 DataWindow 服务自然也
就成了 PFC 功能的核心内容 。除了上面详细介绍的
Dropdown Search (下拉搜索) , PFC 还为 DataWindow 提
供了一些其他服务 (详情见 PowerBuilder 光盘 Online
Book) ,这些功能也是常用的 。现摘列在文章的最后 ,
读者可以模仿上例把其中有用的对象从 PFC 中分离
出来 ,加入自己的框架包 。
4 结束语
本文通过一个实例简单介绍了怎样抽取 PFC 的
DataWindow 服务来构建自己的开发框架包的方法 (其
他有关 PFC 的内容请参考 PowerBuilder Online Book) 。
掌握了这些技术 ,剩下的具体实现比较简单 ,不再赘
述 。需要说明的是 ,在具体的领域中 ,应结合本领域
的特点构建相应的开发包 ,以提高软件开发的效率和
质量 。本文是作者根据多年的开发经历做出的经验
总结 ,所介绍的技术在《上海关西 MRPII 系统》和《中
远大连船厂 MIS 系统》中应用 ,并取得了良好的效果 。
参考文献 :
1 Simon Gallagher ,Simon Herbert. PowerBuilder 6. 0 程序设计
大全 M . 北京 :机械工业出版社 ,1998.
2 刘红岩. PowerBuilder 高级开发技术 M . 北京 :电子工
(上接第 85 页)
Set blkref = ThisDrawing. ModelSpace. InsertBlock(insertpt ,imp
title ,1 ,1 ,1 ,0)‘插入标题图块
0. 4 :ipt (2) = 0
7 :ipt (1) = insertpt (1)
ipt (0) = insertpt (0)
‘计算下一个插入点位置
RowNum = 2
Count = 1
While excelSheet. Cells(RowNum ,1) . Value < > Empty
Set blkref = ThisDrawing. ModelSpace. InsertBlock(ipt ,impline ,
1 ,1 ,1 ,0)
0. 25 :ipt (2) = 0
ipt (0) = ipt (0) :ipt (1) = ipt (1)
‘插入表格行 ,并计算下一个插入点位置
With blkref
atr = . GetAttributes
For i = 0 To 3
atr (i) . TextString = excelSheet. Cells(RowNum ,i + 1)
Next
End With
RowNum = RowNum + 1‘对应的标签内容读出 ,并将 Excel
的指针向下移一行
Wend
Set acad = Nothing
End Sub
(4) 以 AutoCAD VBA 源代码
88
计 算 机 与 现 代 化
2003 年第 7 期
业出版社 ,2000.
表 1 PFC 为 DataWindow提供的常用服务
Filter (过滤服务)
Find (查找服务)
Linkage ( 链 接 服
务)
Multitable Update
(多表更新服务)
Property ( 属 性 服
务)
Print Preview (打印
预览服务)
QueryMode (查询模
式服务)
Reporting ( 报 表 服
务)
ReqColumn ( 必 须
列服务)
Resize ( 数 据 窗 口
尺寸调整服务)
Row Management
(行管理服务)
Row Selection(行选
择服务)
Sort (排序服务)
u calculator (计算
器)
u calendar (日历)
为 DataWindow 加入过滤器 ,提供三种方式过
滤 DataWindow 数据。
为 DataWindow 中数据提供一种易于使用查找
和替换的方法。
提供一种在 DataWindow 之间建立联系的方
法 ,典型用于主控
处理一个 DataWindow 对象内两个或多个表的
更新。
详细结构。
该对象用来控制 DataWindow 属性窗口。
提供功能性的打印预览功能 (如下页 ,上页 ,
缩放等) 。
提供对特定查询实现 Query 模式的能力 ,提供
保存和调入查询条件功能。
提供增强的报表特征 (如添加项目、缩放、改
变字体、颜色等) 和打印功能。
提供为必须列启用或者禁止默认数据窗口进
程 ,使得用户应用程序处理相互依赖的列时
更方便。
当调整 DataWindow 的大小时调整 DataWindow
对象 (包含列 ,计算列、位图和文本) 的大小。
提供普通的在 DataWindow 最后插入空行、两
列之间加空白列、删除一到多列和恢复最后
一次删除的服务。
使用户具有单选、多选和扩展选择的能力。
提供四种不同的风格对 DataWindow 数据进行
排序。
生成一个下拉计算器用于计算 DataWindow 内
某个栏的值。
生成一个下拉日历用于在 DataWindow 的日期
栏内方便地选择日期。
行 ,当 AutoCAD 图形命令窗口出现提示 :“请点击属性块内容
的插入位置 :”时 ,在欲插入属性块位置单击鼠标 ,则 Excel 表
格中的内容全部整齐地嵌入在 AutoCAD 图形窗口中 。
(5) 若今后想在别的. dwg 文件中进行同样属性块的内容
导入 ,可免去步骤 (1) ,重复步骤 (2) ,打开一个欲嵌入 Excel 数
据值的 AutoCAD 文件 ,单击“工具”菜单 ,选择“宏”→“加载工
程 …”,添加步骤 (4) 中保存的. dvb 文件 ,再点击“宏”→“宏 …”
中的“运行”即可 。
3 结束语
以上程序使用了 AutoCAD 中的 VBA 及 Excel 中
的 VBA 程序设计 ,代码经过严格的调试通过 ,因为具
有相当的通用性 ,所以使用方便 ,易读性强 。也可将
此代码改编成一段 VB 小程序 ,直接在应用程序中调
用运行 ,性能稳定 。
参考文献 :
1 [美 E Winemiller ,J Roff ,B Heyman ,R Groom. Visual Basic
6. 0 数据库开发 M . 北京 :清华大学出版社 ,1999.
2 二代龙震工作室. AutoCAD&数据库整合运用实作 M .
北京 :电子工业出版社 ,2002.
3 六木工作室. Visual Basic 6. 0 中文版实用编程技巧 M .
. dvb 格式保存代码并运
北京 :人民邮电出版社 ,1999.
© 1994-2009 China Academic Journal Electronic Publishing House. All rights reserved. http://www.cnki.net