明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2650|回复: 8

AutoCad+vb+excel+CopyFromRecordset

[复制链接]
发表于 2008-3-27 22:01:00 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2008-5-5 15:26:32 编辑

遍历图形文件的所有实体数据到excel,
用CopyFromRecordset效率要比用ExcelAndMdbData.xlSheet.Cells(ii, 1) = .Backward方法快数据倍.
遍历图形实体数据后,用CopyFromRecordset到excel用时为
遍历图形实体数据到数据集,用时:21:35:03-21:36:35
数据集:用CopyFromRecordset到excel用时为 21:36:35 -- 21:36:35
而用逐行逐列循环,将ExcelAndMdbData.xlSheet.Cells(ii, 1) = .Backward输到excel,用时约3分钟.
程序如下:
  1. [code]Option Explicit
  2. Dim boo As Boolean
  3. Dim obj_Acad As Object, obj_Doc As Object, obj_ModelSpace As Object
  4. Const RadianToDegree As Double = 180 / 3.1415926535897
  5. Const DegreeToRadian As Double = 3.1415926535897 / 180
  6. Const Pi = 3.1415926535897
  7. Dim BaseGraphic As New BaseGraphic
  8. Dim ExcelAndMdbData As New ExcelAndMdbData
  9. Public Function rr()
  10.   Debug.Print Time()
  11.   Dim Ent As Object
  12.   Dim ii As Integer, jj As Integer
  13.   Dim TitleVar As Variant
  14.   Dim adoRecordset     As ADODB.Recordset, rs As ADODB.Recordset
  15.   ''
  16.   TitleVar = Array("Backward", "Height", "InsertionPoint0", "InsertionPoint(1)", "InsertionPoint(2)", "Layer", "Linetype", "LinetypeScale", "Lineweight", "ObliqueAngle", "OwnerID", "PlotStyleName", "Rotation", "ScaleFactor", "StyleName", "TextAlignmentPoint(0)", "TextAlignmentPoint(1)", "TextAlignmentPoint(2)", "Alignment", "TextString", "Visible")
  17.   For jj = 0 To 20
  18.     ExcelAndMdbData.xlSheet.Cells(1, jj + 1) = TitleVar(jj)
  19.   Next jj
  20.   
  21.   
  22.   Dim pp As Variant, ppp As Variant
  23.   Dim ExcelData As Variant
  24.    '根据数组的大小初始化记录集
  25.    Set adoRecordset = New ADODB.Recordset
  26.    Set rs = New ADODB.Recordset
  27.   ''
  28.   
  29.   For jj = 0 To 20
  30.     'adoRecordset.Fields.Append TitleVar(jj), adVariant, , adFldMayBeNull
  31.     adoRecordset.Fields.Append TitleVar(jj), adBSTR
  32. 特别关注:
  33. , adVariant, , adFldMayBeNull---------出现如下错误:对象‘CopyFromRecordset’的方法‘Range’失败   
  34.    
  35. 改为, adBSTR以下程序通过
  36.   adoRecordset.Open
  37.   ''数组到数据集
  38.   
  39.   
  40.   ii = 0: jj = 1
  41.   For Each Ent In BaseGraphic.obj_ModelSpace
  42.     ReDim ExcelData(ii, 20)
  43.     With Ent
  44.    
  45.       Select Case .ObjectName
  46.         Case "AcDbText"
  47.           adoRecordset.AddNew   '加n条记录,即为   DataGrid   添加n空行
  48.           pp = .InsertionPoint
  49.           ppp = .TextAlignmentPoint
  50.           ii = ii
  51.           adoRecordset.Fields(0) = .Backward
  52.           adoRecordset.Fields(1) = .Height
  53.           adoRecordset.Fields(2) = pp(0)
  54.           adoRecordset.Fields(3) = pp(1)
  55.           adoRecordset.Fields(4) = pp(2)
  56.           adoRecordset.Fields(5) = .Layer
  57.           adoRecordset.Fields(6) = .Linetype
  58.           adoRecordset.Fields(8 - 1) = .LinetypeScale
  59.           adoRecordset.Fields(9 - 1) = .Lineweight
  60.           adoRecordset.Fields(10 - 1) = .ObliqueAngle
  61.           adoRecordset.Fields(11 - 1) = .OwnerID
  62.           adoRecordset.Fields(12 - 1) = .PlotStyleName
  63.           adoRecordset.Fields(13 - 1) = .Rotation
  64.           adoRecordset.Fields(14 - 1) = .ScaleFactor
  65.           adoRecordset.Fields(15 - 1) = .StyleName
  66.           adoRecordset.Fields(16 - 1) = ppp(0)
  67.           adoRecordset.Fields(17 - 1) = ppp(1)
  68.           adoRecordset.Fields(18 - 1) = ppp(2)
  69.           adoRecordset.Fields(19 - 1) = .TextString
  70.           adoRecordset.Fields(20 - 1) = .Alignment
  71.           'adoRecordset.Fields(21 - 1) = .UpsideDown
  72.           adoRecordset.Fields(21 - 1) = .Visible
  73.      '     ExcelAndMdbData.xlSheet.Cells(ii, 0) = .ObjectName
  74.           ii = ii + 1
  75.       End Select
  76.       
  77.     End With
  78.    
  79.   Next Ent
  80.   Debug.Print Time
  81.   rs.Fields.Append "aa", adBSTR
  82.   rs.Open
  83.   rs.AddNew
  84.   rs.Fields(0).Value = "aaaa"
  85.   'ExcelAndMdbData.xlSheet.Cells(2, 1).CopyFromRecordset rs
  86.   ExcelAndMdbData.xlSheet.Range("A2").CopyFromRecordset adoRecordset
  87.   Debug.Print Time()
  88. End Function
[/code]
  1. Sub ls()
  2.   Dim xlApp As Excel.Application
  3.   Dim xlBook As Excel.Workbook
  4.   Dim xlSheet As Excel.Worksheet
  5.   Set xlApp = GetObject(, "Excel.Application") '创建EXCEL对象
  6.   
  7.   'Set xlBook = xlApp.Workbooks.Open("d:\Attribute.xls") '打开已经存
  8.   xlApp.Visible = True '设置EXCEL对象可见(或不可见)
  9.   Set xlSheet = xlApp.ActiveWorkbook.Sheets("sheet2")    'xlBook.Worksheets("Sheet2") '设置活动工作表,sheet1表示表名,可以使用字符型变量代替。
  10.   xlSheet.Activate '激活工作表,让它处于前台活动中。
  11.   Dim FileTitle
  12.   FileTitle = Array("LineStartPoint0", "LineStartPoint1", "LineStartPoint2", "LineEndPoint0", "LineEndPoint1", "LineEndPoint2")
  13.   For ii = 0 To UBound(FileTitle)
  14.     xlSheet.Cells(1, ii + 1) = FileTitle(ii)
  15.   Next ii
  16.   Dim Ent As AcadEntity, EntLine As AcadLine
  17.   Dim RowCount As Integer
  18.   RowCount = 2
  19.   For Each Ent In ThisDrawing.ModelSpace
  20.     Select Case Ent.ObjectName
  21.       Case "AcDbLine"
  22.          Set EntLine = Ent
  23.          For ii = 0 To 2
  24.            xlSheet.Cells(RowCount, ii + 1) = EntLine.StartPoint(ii)
  25.            xlSheet.Cells(RowCount, ii + 4) = EntLine.EndPoint(ii)
  26.          Next
  27.     End Select
  28.     RowCount = RowCount + 1
  29.   Next
  30. End Sub
发表于 2008-3-27 22:30:00 | 显示全部楼层

有注解就好了,研究一下

发表于 2008-3-28 12:05:00 | 显示全部楼层
能否把dvb文件传上来
发表于 2008-3-28 12:05:00 | 显示全部楼层
能否把dvb文件传上来
 楼主| 发表于 2008-3-28 13:31:00 | 显示全部楼层
本帖最后由 作者 于 2008-3-28 14:30:27 编辑

用VB编的,有基本图形类模块和excel And Access类模块组成。

在VBA程序同样运行,只是将BaseGraphic.obj_ModelSpace改为Thisdrawing.ModelSpace而宜。
在此,给各位大侠出道题,就是如何将上面的程序,自己能够随心所欲得到应用。

1、AutoCAD+VBA与Excel有几种通迅方式:ADO,DAO,open

2、数据集的建立方式:SQL方式,以及实体变量数据直接赋值到数据集方式。如:

Dim TextRecordSet As ADODB.Recordset

Set TextRecordSet = New ADODB.Recordset

'设置Text数据集字段
  For jj = 0 To 22
    TextRecordSet.Fields.Append TextTitleVar(jj), adBSTR
  Next jj
  TextRecordSet.Open

  TextRecordSet.AddNew   '加n条记录

谢谢各位大侠的捧场,希望大家积极参与共同提高。

结论:CopyFromRecordset将采集到AutoCAD的实体数据,用数据集方式,将数据传递到excel,Access是一种比较快的数据传递方法。

发表于 2008-3-28 20:14:00 | 显示全部楼层

收下

学习一下

发表于 2008-4-1 22:36:00 | 显示全部楼层
楼主真牛
发表于 2008-4-18 11:19:00 | 显示全部楼层
没看懂!
发表于 2008-4-19 09:03:00 | 显示全部楼层
好好学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-26 08:29 , Processed in 0.159560 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表