乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 296|回复: 12

分享一个自己CAD表格转EXCEL源程序

[复制链接]

11

主题

38

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2018-8-22 09:34:00 | 显示全部楼层 |阅读模式
本人水平有限,大部分CAD编程技能从乐筑天下论坛学习的,刚刚写了个CAD表格转EXCEL源程序,分享大家,一起进步!
程序说明:把PT1和pT2范围内的文字转换成数组,输出到excel表格1里面,所以一定要打开EXCEL才行。具体用法可以根据自己的需求修改。
  1. Option Explicit
  2. Public Sub Cad表格转Excel()
  3. Dim objEntArr() As Object, i As Long
  4. Dim objSset As AcadSelectionSet
  5. Dim Y As AcadSelectionSet
  6. Dim pt1(2) As Double, pt2(2) As Double, na$
  7. Dim p, j, A(1 To 990, 1 To 7), B(), C(), D(), n, m, k
  8. 'pt1,pt2是表格的位置,左下,右上
  9. pt1(0) = -1500
  10. pt1(1) = -1500
  11. pt1(2) = 0
  12. pt2(0) = 43200
  13. pt2(1) = 43200
  14. pt2(2) = 0
  15. na = "QQQ"
  16. On Error Resume Next
  17. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  18.     Set Y = ThisDrawing.SelectionSets.Item(na)
  19.     Y.Delete
  20. End If
  21. Set Y = ThisDrawing.SelectionSets.Add(na)
  22.       Dim gpCode(0) As Integer
  23.       Dim dataValue(0) As Variant
  24.       gpCode(0) = 0
  25.       dataValue(0) = "text,mtext"
  26.       Dim groupCode As Variant, dataCode As Variant
  27.       groupCode = gpCode
  28.       dataCode = dataValue
  29. Y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode
  30.     For i = 0 To Y.Count - 1
  31.         A(i + 1, 1) = i
  32.         A(i + 1, 2) = Y.Item(i).TextString
  33.         p = Y.Item(i).InsertionPoint
  34.         A(i + 1, 3) = p(0)
  35.         A(i + 1, 4) = p(1)
  36.     Next i
  37. Y.Delete
  38. k = 50     'k是过滤间隙
  39. B = 过滤数组(A, 4, k)
  40. C = 过滤数组(A, 3, k + 5)
  41. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  42. For i = 1 To UBound(A)
  43.     If A(i, 2) = "" Then Exit For
  44.     For n = 0 To UBound(B)
  45.         '行的位置
  46.         If Abs(B(n) - A(i, 4))  A(j + 1) Then
  47.             n = A(j + 1)
  48.             A(j + 1) = A(j)
  49.             A(j) = n
  50.         End If
  51.     Next j
  52. Next i
  53. 冒泡排序 = A
  54. End Function

ii443wutrhg.jpg

ii443wutrhg.jpg


vt5nb3lvw1y.jpg

vt5nb3lvw1y.jpg


回复

使用道具 举报

11

主题

38

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2018-8-23 16:40:00 | 显示全部楼层

是的,先如果某行某列全空,是被删除掉的。如果要精准判断,后续可以加入线条的坐标进行定位判断。
本程序流程

da3dpvng4kq.jpg

da3dpvng4kq.jpg


回复

使用道具 举报

85

主题

1175

帖子

11

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1518
发表于 2018-8-23 16:53:00 | 显示全部楼层

无论怎么判断,总能找出破绽,做不出通用的。只要能胜任要处理的表格就可以了。现在已经很不错了。
回复

使用道具 举报

11

主题

38

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2018-9-17 09:39:00 | 显示全部楼层
已经改成新建一个sheet,放入其中了
  1. Option Explicit
  2. Public Sub Cad表格转Excel()
  3. Dim objEntArr() As Object, i As Long
  4. Dim objSset As AcadSelectionSet
  5. Dim y As AcadSelectionSet
  6. 'Dim pt1(2) As Double, pt2(2) As Double
  7. Dim p, j, A(1 To 990, 1 To 7), B(), C(), D(), n, m, k, ky, kx, m1, m2, na$
  8. Dim E()
  9. 'pt1,pt2是表格的位置,左下,右上
  10. 'pt1(0) = -1500
  11. 'pt1(1) = -1500
  12. 'pt1(2) = 0
  13. 'pt2(0) = 43200
  14. 'pt2(1) = 43200
  15. 'pt2(2) = 0
  16. Dim pt1, pt2
  17. pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  18. pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  19. na = "QQQ"
  20. k = 0
  21. On Error Resume Next
  22. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  23.     Set y = ThisDrawing.SelectionSets.Item(na)
  24.     y.Delete
  25. End If
  26. Set y = ThisDrawing.SelectionSets.Add(na)
  27.       Dim gpCode(0) As Integer
  28.       Dim dataValue(0) As Variant
  29.       gpCode(0) = 0
  30.       dataValue(0) = "text,mtext"
  31.       Dim groupCode As Variant, dataCode As Variant
  32.       groupCode = gpCode
  33.       dataCode = dataValue
  34.   '    pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  35.   '    pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  36. y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode
  37.     For i = 0 To y.Count - 1
  38.         A(i + 1, 1) = i
  39.         A(i + 1, 2) = y.Item(i).TextString
  40.         p = y.Item(i).InsertionPoint
  41.         k = IIf(y.Item(i).Height - k > 0, y.Item(i).Height, k)       'k是过滤间隙
  42.         y.Item(i).GetBoundingBox m1, m2
  43.         A(i + 1, 3) = p(0)
  44.         A(i + 1, 4) = p(1)
  45.         A(i + 1, 5) = (m1(0) + m2(0)) / 2          '文字中心坐标
  46.         A(i + 1, 6) = (m2(0) - m1(0)) / 2          '文字长度的一半
  47.         A(i + 1, 7) = (p(0) + A(i + 1, 5)) / 2     '插入点与文字中心坐标的中心点
  48.         A(i + 1, 5) = A(i + 1, 5) + A(i + 1, 6) / 2.5    '文字中心坐标往右偏
  49.     Next i
  50. y.Delete
  51. ' Stop
  52. 'k = 50     'k是过滤间隙
  53. ky = k
  54. kx = k * 1.2
  55. B = 过滤数组(A, 4, ky)
  56. C = 过滤数组(A, 7, kx)
  57. 'Stop
  58. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  59. For i = 1 To UBound(A)
  60.     If A(i, 2) = "" Then Exit For
  61.     For n = 0 To UBound(B)
  62.         '行的位置
  63.         If Abs(B(n) - A(i, 4))  A(j + 1) Then
  64.             n = A(j + 1)
  65.             A(j + 1) = A(j)
  66.             A(j) = n
  67.         End If
  68.     Next j
  69. Next i
  70. 冒泡排序 = A
  71. End Function
  72. Function 整合数组列(ByVal A, ByVal D, ByVal n)
  73. '以中心点和插入点间距为判断
  74. '当相连两列n列与n+1列比较,n+1列文字插入点或中心点在n列的插入点与中心点之间时,合并
  75. 'n列的插入点与中心点之间距离取该列最大值
  76. Dim i, j, L, p, q, x1, x2, y, B, x3, x4
  77. Dim C()
  78. L = 0
  79. If n >= UBound(D, 2) Then
  80.     整合数组列 = D
  81.     Exit Function
  82. End If
  83. 'n列的插入点与中心点之间距离取该列最大值L及插入点和中心点X坐标
  84. For i = 1 To UBound(D)
  85.     If D(i, n)  "" Then
  86.         If InStr(D(i, n), "~~") > 0 Then
  87.             B = Split(D(i, n), "~~")
  88.             For j = 0 To UBound(B)
  89.                 y = Abs(A(B(j), 5) - A(B(j), 3))
  90.                 If L  "" Then
  91.     'Stop
  92.         If InStr(D(i, n + 1), "~~") > 0 Then
  93.             B = Split(D(i, n + 1), "~~")
  94.             For j = 0 To UBound(B)
  95.                 x3 = A(B(j), 3): x4 = A(B(j), 5)
  96.                 If IIf(x3 > x4, x4, x3)  x1, x2, x1) Then
  97.                     p = 1
  98.                     Exit For
  99.                 End If
  100.             Next j
  101.             Erase B
  102.         Else
  103.             x3 = A(D(i, n + 1), 3): x4 = A(D(i, n + 1), 5)
  104.             If IIf(x3 > x4, x4, x3)  x1, x2, x1) Then p = 1
  105.         End If
  106.         If p = 1 Then
  107.             If D(i, n) = "" Then
  108.                 D(i, n) = D(i, n + 1)
  109.             Else
  110.                 D(i, n) = 纵向排列同一单元格文字(A, D(i, n) & "~~" & D(i, n + 1))
  111.             End If
  112.             D(i, n + 1) = ""
  113.         End If
  114.     End If
  115. Next i
  116. 'Call excelqingchu(n)
  117. 'Call EXCEL输出(D)
  118. C = 去除数组第N列空列(D, n + 1)
  119. If UBound(C, 2)  "" Then 去除数组第N列空列 = D: Exit Function
  120. Next i
  121. ReDim C(1 To UBound(D), 1 To UBound(D, 2) - 1)
  122. For i = 1 To UBound(D)
  123.     For j = 1 To UBound(C, 2)
  124.         If j = n Then
  125.             C(i, j) = D(i, j + 1)
  126.         End If
  127.     Next j
  128. Next i
  129. 去除数组第N列空列 = C
  130. End Function
  131. Function 替换文字内容(ByVal A, ByVal D)
  132. Dim B, i, j, k, n, m
  133. For i = 1 To UBound(D)
  134.     For j = 1 To UBound(D, 2)
  135.         m = ""
  136.         If D(i, j)  "" Then
  137.             If InStr(D(i, j), "~~") > 0 Then
  138.                 B = Split(D(i, j), "~~")
  139.                 For k = 0 To UBound(B)
  140.                     If m = "" Then m = A(B(k), 2) Else m = m & Chr(10) & A(B(k), 2)
  141.                 Next k
  142.                 Erase B
  143.             Else
  144.                 m = A(D(i, j), 2)
  145.             End If
  146.             D(i, j) = m
  147.         End If
  148.     Next j
  149. Next i
  150. 替换文字内容 = D
  151. End Function
  152. Sub EXCEL输出(ByVal D)
  153. Dim i, j, r
  154. i = UBound(D)
  155. j = UBound(D, 2)
  156. Dim exlh As Object
  157. Set exlh = GetObject(, "excel.application")
  158. With exlh
  159.     .workbooks(1).worksheets(1).Select
  160.     .Sheets.Add
  161.     'r = .cells(9999, 1).End(3).row + 2
  162.     'If r
  163. 5pakz0oqxpx.jpg

    5pakz0oqxpx.jpg
  164. zsmlovwmfgk.jpg

    zsmlovwmfgk.jpg
  165. [code]
  166. Option Explicit
  167. Public Sub Cad表格转Excel()
  168. Dim objEntArr() As Object, i As Long
  169. Dim objSset As AcadSelectionSet
  170. Dim y As AcadSelectionSet
  171. Dim pt1(2) As Double, pt2(2) As Double
  172. Dim p, j, A(1 To 990, 1 To 7), B(), C(), D(), n, m, k, ky, kx, m1, m2, na$
  173. Dim E()
  174. 'pt1,pt2是表格的位置,左下,右上
  175. pt1(0) = -1500
  176. pt1(1) = -1500
  177. pt1(2) = 0
  178. pt2(0) = 43200
  179. pt2(1) = 43200
  180. pt2(2) = 0
  181. na = "QQQ"
  182. k = 0
  183. On Error Resume Next
  184. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  185.     Set y = ThisDrawing.SelectionSets.Item(na)
  186.     y.Delete
  187. End If
  188. Set y = ThisDrawing.SelectionSets.Add(na)
  189.       Dim gpCode(0) As Integer
  190.       Dim dataValue(0) As Variant
  191.       gpCode(0) = 0
  192.       dataValue(0) = "text,mtext"
  193.       Dim groupCode As Variant, dataCode As Variant
  194.       groupCode = gpCode
  195.       dataCode = dataValue
  196.   '    pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  197.   '    pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  198. y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode
  199.     For i = 0 To y.Count - 1
  200.         A(i + 1, 1) = i
  201.         A(i + 1, 2) = y.Item(i).TextString
  202.         p = y.Item(i).InsertionPoint
  203.         k = IIf(y.Item(i).Height - k > 0, y.Item(i).Height, k)       'k是过滤间隙
  204.         y.Item(i).GetBoundingBox m1, m2
  205.         A(i + 1, 3) = p(0)
  206.         A(i + 1, 4) = p(1)
  207.         A(i + 1, 5) = (m1(0) + m2(0)) / 2          '文字中心坐标
  208.         A(i + 1, 6) = (m2(0) - m1(0)) / 2          '文字长度的一半
  209.         A(i + 1, 7) = (p(0) + A(i + 1, 5)) / 2     '插入点与文字中心坐标的中心点
  210.     Next i
  211. y.Delete
  212. ' Stop
  213. 'k = 50     'k是过滤间隙
  214. ky = k
  215. kx = k * 1.2
  216. B = 过滤数组(A, 4, ky)
  217. C = 过滤数组(A, 7, kx)
  218. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  219. For i = 1 To UBound(A)
  220.     If A(i, 2) = "" Then Exit For
  221.     For n = 0 To UBound(B)
  222.         '行的位置
  223.         If Abs(B(n) - A(i, 4))  A(j + 1) Then
  224.             n = A(j + 1)
  225.             A(j + 1) = A(j)
  226.             A(j) = n
  227.         End If
  228.     Next j
  229. Next i
  230. 冒泡排序 = A
  231. End Function
  232. Function 整合数组列(ByVal A, ByVal D, ByVal n)
  233. '以中心点和插入点间距为判断
  234. '当相连两列n列与n+1列比较,n+1列文字插入点或中心点在n列的插入点与中心点之间时,合并
  235. 'n列的插入点与中心点之间距离取该列最大值
  236. Dim i, j, L, p, q, x1, x2, y, B, x3, x4
  237. Dim C()
  238. L = 0
  239. If n >= UBound(D, 2) Then
  240.     整合数组列 = D
  241.     Exit Function
  242. End If
  243. 'n列的插入点与中心点之间距离取该列最大值L及插入点和中心点X坐标
  244. For i = 1 To UBound(D)
  245.     If D(i, n)  "" Then
  246.         If InStr(D(i, n), "~~") > 0 Then
  247.             B = Split(D(i, n), "~~")
  248.             For j = 0 To UBound(B)
  249.                 y = Abs(A(B(j), 5) - A(B(j), 3))
  250.                 If L > y Then
  251.                     L = y
  252.                     x1 = A(B(j), 3): x2 = A(B(j), 5)
  253.                 End If
  254.             Next j
  255.             Erase B
  256.         Else
  257.             y = Abs(A(D(i, n), 5) - A(D(i, n), 3))
  258.             If L  "" Then
  259.         If InStr(D(i, n + 1), "~~") > 0 Then
  260.             B = Split(D(i, n + 1), "~~")
  261.             For j = 0 To UBound(B)
  262.                 x3 = A(B(j), 3): x4 = A(B(j), 5)
  263.                 If IIf(x3 > x4, x4, x3)  x1, x2, x1) Then
  264.                     p = 1
  265.                     Exit For
  266.                 End If
  267.             Next j
  268.             Erase B
  269.         Else
  270.             x3 = A(D(i, n + 1), 3): x4 = A(D(i, n + 1), 5)
  271.             If IIf(x3 > x4, x4, x3)  x1, x2, x1) Then p = 1
  272.         End If
  273.         If p = 1 Then
  274.             If D(i, n) = "" Then
  275.                 D(i, n) = D(i, n + 1)
  276.             Else
  277.                 D(i, n) = 纵向排列同一单元格文字(A, D(i, n) & "~~" & D(i, n + 1))
  278.             End If
  279.             D(i, n + 1) = ""
  280.         End If
  281.     End If
  282. Next i
  283. C = 去除数组第N列空列(D, n + 1)
  284. If UBound(C, 2)  "" Then 去除数组第N列空列 = D: Exit Function
  285. Next i
  286. ReDim C(1 To UBound(D), 1 To UBound(D, 2) - 1)
  287. For i = 1 To UBound(D)
  288.     For j = 1 To UBound(C, 2)
  289.         If j = n Then
  290.             C(i, j) = D(i, j + 1)
  291.         End If
  292.     Next j
  293. Next i
  294. 去除数组第N列空列 = C
  295. End Function
  296. Function 替换文字内容(ByVal A, ByVal D)
  297. Dim B, i, j, k, n, m
  298. For i = 1 To UBound(D)
  299.     For j = 1 To UBound(D, 2)
  300.         m = ""
  301.         If D(i, j)  "" Then
  302.             If InStr(D(i, j), "~~") > 0 Then
  303.                 B = Split(D(i, j), "~~")
  304.                 For k = 0 To UBound(B)
  305.                     If m = "" Then m = A(B(k), 2) Else m = m & Chr(10) & A(B(k), 2)
  306.                 Next k
  307.                 Erase B
  308.             Else
  309.                 m = A(D(i, j), 2)
  310.             End If
  311.             D(i, j) = m
  312.         End If
  313.     Next j
  314. Next i
  315. 替换文字内容 = D
  316. End Function

回复

使用道具 举报

11

主题

38

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2018-8-23 13:58:00 | 显示全部楼层
有没有测试一下,如果这个CAD表格中有空数据的时候,输出到EXCEL中的对应单元格是否也是空的?
回复

使用道具 举报

16

主题

129

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
196
发表于 2018-8-22 09:56:00 | 显示全部楼层
靠判断单元格文字位置这种思路不太可行,实际应用会有很多问题,我以前也有过类似思路的东西,最后只能是放弃
回复

使用道具 举报

23

主题

561

帖子

13

银币

中流砥柱

Rank: 25

铜币
653
发表于 2018-8-22 10:52:00 | 显示全部楼层
我是根据对齐点的位置,X/Y小于误差值内的算一行/列,然后遍历文本,看属于第几行第几列,然后填到相应单元格。
回复

使用道具 举报

85

主题

1175

帖子

11

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1518
发表于 2018-8-22 13:12:00 | 显示全部楼层

刚刚测试,可以的。附上测试结果对比

d51zzxgj3zk.jpg

d51zzxgj3zk.jpg


1ey5p53hrr0.jpg

1ey5p53hrr0.jpg


回复

使用道具 举报

11

主题

38

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2018-8-22 13:33:00 | 显示全部楼层

我也是这样的思想写的程序,根据不同情况改变文字间距的误差,小于误差属于同一行,或同一列。

g3d3a1gx32g.jpg

g3d3a1gx32g.jpg


回复

使用道具 举报

11

主题

38

帖子

1

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
82
发表于 2018-8-22 13:35:00 | 显示全部楼层

暂时没发现问题,是否可赐教,或出现问题的情况
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 03:53 , Processed in 0.730067 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表