明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: qwh923820

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

    [复制链接]
发表于 2018-8-22 14:50:51 | 显示全部楼层
zzyong00 发表于 2018-8-22 13:41
再来个稍差一点的,更差的,就不上了

这个会有什么问题?单元格内有两个text?这个不在此程序的处理范围内。

点评

.................  发表于 2018-8-22 15:22
发表于 2018-8-23 09:22:47 | 显示全部楼层
代码如何使用
发表于 2018-8-23 12:34:26 | 显示全部楼层
有时候你很努力了,但就是不成功,为什么,可能原因就是方向错了!
如著名典故,南辕北辙.
发表于 2018-8-23 12:38:56 | 显示全部楼层
我十多年前就有类似的程序,还设置了容差对话框,但发现在实际使用时,问题太多了,才知道,当时的出发点就不对

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-8-23 13:15:20 | 显示全部楼层
zzyong00 发表于 2018-8-23 12:38
我十多年前就有类似的程序,还设置了容差对话框,但发现在实际使用时,问题太多了,才知道,当时的出发点就 ...

能具体说说问题是什么么?表格太乱了?或者是多个text?我用坐标位置判断,对于基本规则的表格,没发现什么问题。如果表格实在太乱,那是制图人的制图太差,应该由制图人去改正。同样多个text也让制图改正。一个只有一个text并基本规范的表格,是对制图的基本要求,并且是可以实现的。
当然对于由于上下标导致多个text,我的具体应用中极少碰到,也就不考虑了。

点评

多个text我尝试着合在一起了,刚刚更新了源码,经测试,单独的上标或下标不行,其他还可以。源码在回复的楼层  发表于 2018-8-23 14:01
 楼主| 发表于 2018-8-23 13:58:42 | 显示全部楼层
zzyong00 发表于 2018-8-23 12:38
我十多年前就有类似的程序,还设置了容差对话框,但发现在实际使用时,问题太多了,才知道,当时的出发点就 ...

又修修改改,那个上标次方实在搞不定,其他帮忙鉴定下,后面附上源码




  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. na = "QQQ"
  17. k = 0
  18. On Error Resume Next
  19. If Not IsNull(ThisDrawing.SelectionSets.Item(na)) Then
  20.     Set y = ThisDrawing.SelectionSets.Item(na)
  21.     y.Delete
  22. End If
  23. Set y = ThisDrawing.SelectionSets.Add(na)
  24.       Dim gpCode(0) As Integer
  25.       Dim dataValue(0) As Variant
  26.       gpCode(0) = 0
  27.       dataValue(0) = "text,mtext"
  28.       Dim groupCode As Variant, dataCode As Variant
  29.       groupCode = gpCode
  30.       dataCode = dataValue
  31.   '    pt1 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  32.   '    pt2 = ThisDrawing.Utility.GetPoint(, "Enter a point: ")
  33. y.Select acSelectionSetCrossing, pt1, pt2, groupCode, dataCode

  34.     For i = 0 To y.Count - 1
  35.         A(i + 1, 1) = i
  36.         A(i + 1, 2) = y.Item(i).TextString
  37.         p = y.Item(i).InsertionPoint
  38.         k = IIf(y.Item(i).Height - k > 0, y.Item(i).Height, k)       'k是过滤间隙
  39.         y.Item(i).GetBoundingBox m1, m2
  40.         A(i + 1, 3) = p(0)
  41.         A(i + 1, 4) = p(1)
  42.         A(i + 1, 5) = (m1(0) + m2(0)) / 2          '文字中心坐标
  43.         A(i + 1, 6) = (m2(0) - m1(0)) / 2          '文字长度的一半
  44.         A(i + 1, 7) = (p(0) + A(i + 1, 5)) / 2     '插入点与文字中心坐标的中心点
  45.     Next i
  46. y.Delete
  47. ' Stop
  48. 'k = 50     'k是过滤间隙
  49. ky = k
  50. kx = k * 1.2
  51. B = 过滤数组(A, 4, ky)
  52. C = 过滤数组(A, 7, kx)
  53. ReDim D(1 To UBound(B) + 1, 1 To UBound(C) + 1)
  54. For i = 1 To UBound(A)
  55.     If A(i, 2) = "" Then Exit For
  56.     For n = 0 To UBound(B)
  57.         '行的位置
  58.         If Abs(B(n) - A(i, 4)) < ky Then
  59.             Exit For
  60.         End If
  61.     Next n
  62.     For m = 0 To UBound(B)
  63.         '列的位置
  64.         If Abs(C(m) - A(i, 7)) < kx Then
  65.             Exit For
  66.         End If
  67.     Next m
  68.     If D(UBound(B) + 1 - n, 1 + m) = "" Then
  69.         D(UBound(B) + 1 - n, 1 + m) = i
  70.     Else
  71.         D(UBound(B) + 1 - n, 1 + m) = i & "~~" & D(UBound(B) + 1 - n, 1 + m)
  72.     End If
  73. Next i
  74. E = 整合数组列(A, D, 1)
  75. E = 替换文字内容(A, E)
  76. Dim exlh As Object
  77. Set exlh = GetObject(, "excel.application")
  78. With exlh
  79.     .workbooks(1).worksheets(1).Select
  80.     .cells.Select
  81.     .Selection.Clear
  82.     '.cells(1, 1).resize(990, 7) = A
  83.     '.cells(1, 9).resize(UBound(B) + 1, UBound(C) + 1) = D
  84.     .cells(1, 1).resize(UBound(E), UBound(E, 2)) = E
  85.    
  86. End With
  87. End Sub

  88. Function 过滤数组(ByVal A, ByVal n, ByVal k) As Variant
  89. 'A是数组,n是过滤的列,k是过滤的间隙
  90. Dim B(), i, j, p, m
  91. j = 0
  92. ReDim B(0)
  93. B(0) = A(1, n)
  94. For i = 2 To UBound(A)
  95.     m = 0
  96.     If A(i, n) = "" Then Exit For
  97.     For p = 0 To j
  98.         If Abs(A(i, n) - B(p)) < k Then
  99.             m = 1
  100.             Exit For
  101.         End If
  102.     Next p
  103.     If m = 0 Then
  104.         j = j + 1
  105.         ReDim Preserve B(j)
  106.         B(j) = A(i, n)
  107.     End If
  108. Next i
  109. 过滤数组 = 冒泡排序(B)
  110. End Function
  111. Function 冒泡排序(ByVal A) As Variant
  112. '从小到大
  113. Dim i, j, n
  114. For i = 0 To UBound(A) - 1
  115.     For j = 0 To UBound(A) - 1 - i
  116.         If A(j) > A(j + 1) Then
  117.             n = A(j + 1)
  118.             A(j + 1) = A(j)
  119.             A(j) = n
  120.         End If
  121.     Next j
  122. Next i
  123. 冒泡排序 = A
  124. End Function
  125. Function 整合数组列(ByVal A, ByVal D, ByVal n)
  126. '以中心点和插入点间距为判断
  127. '当相连两列n列与n+1列比较,n+1列文字插入点或中心点在n列的插入点与中心点之间时,合并
  128. 'n列的插入点与中心点之间距离取该列最大值
  129. Dim i, j, L, p, q, x1, x2, y, B, x3, x4
  130. Dim C()
  131. L = 0
  132. If n >= UBound(D, 2) Then
  133.     整合数组列 = D
  134.     Exit Function
  135. End If
  136. 'n列的插入点与中心点之间距离取该列最大值L及插入点和中心点X坐标
  137. For i = 1 To UBound(D)
  138.     If D(i, n) <> "" Then
  139.         If InStr(D(i, n), "~~") > 0 Then
  140.             B = Split(D(i, n), "~~")
  141.             For j = 0 To UBound(B)
  142.                 y = Abs(A(B(j), 5) - A(B(j), 3))
  143.                 If L > y Then
  144.                     L = y
  145.                     x1 = A(B(j), 3): x2 = A(B(j), 5)
  146.                 End If
  147.             Next j
  148.             Erase B
  149.         Else
  150.             y = Abs(A(D(i, n), 5) - A(D(i, n), 3))
  151.             If L < y Then
  152.                 L = y
  153.                 x1 = A(D(i, n), 3): x2 = A(D(i, n), 5)
  154.             End If
  155.         End If
  156.     End If
  157. Next i
  158. 'Stop
  159. For i = 1 To UBound(D)
  160. p = 0
  161.     If D(i, n + 1) <> "" Then
  162.         If InStr(D(i, n + 1), "~~") > 0 Then
  163.             B = Split(D(i, n + 1), "~~")
  164.             For j = 0 To UBound(B)
  165.                 x3 = A(B(j), 3): x4 = A(B(j), 5)
  166.                 If IIf(x3 > x4, x4, x3) < IIf(x2 > x1, x2, x1) Then
  167.                     p = 1
  168.                     Exit For
  169.                 End If
  170.             Next j
  171.             Erase B
  172.         Else
  173.             x3 = A(D(i, n + 1), 3): x4 = A(D(i, n + 1), 5)
  174.             If IIf(x3 > x4, x4, x3) < IIf(x2 > x1, x2, x1) Then p = 1
  175.         End If
  176.         If p = 1 Then
  177.             If D(i, n) = "" Then
  178.                 D(i, n) = D(i, n + 1)
  179.             Else
  180.                 D(i, n) = 纵向排列同一单元格文字(A, D(i, n) & "~~" & D(i, n + 1))
  181.             End If
  182.             D(i, n + 1) = ""
  183.         End If
  184.     End If
  185. Next i
  186. C = 去除数组第N列空列(D, n + 1)
  187. If UBound(C, 2) < UBound(D, 2) Then n = n - 1
  188. 整合数组列 = 整合数组列(A, C, n + 1)
  189. End Function
  190. Function 纵向排列同一单元格文字(ByVal A, ByVal t)
  191. Dim B, i, j, k, C(), D(), E()
  192. B = Split(t, "~~")
  193. k = ""
  194. ReDim C(UBound(B))
  195. ReDim E(0 To UBound(B), 1 To 2)
  196. For i = 0 To UBound(C)
  197.     C(i) = A(B(i), 4)
  198.     E(i, 1) = C(i)
  199.     E(i, 2) = B(i)
  200. Next i
  201. Erase B
  202. D = 冒泡排序(C)
  203. For i = UBound(D) To 0 Step -1
  204.     For j = 0 To UBound(D)
  205.         If Abs(D(i) - E(j, 1)) < 0.001 Then
  206.             If k = "" Then
  207.                 k = E(j, 2)
  208.             Else
  209.                 k = k & "~~" & E(j, 2)
  210.             End If
  211.             E(j, 1) = -1235.778
  212.         End If
  213.     Next j
  214. Next i
  215. 纵向排列同一单元格文字 = k
  216. End Function
  217. Function 去除数组第N列空列(ByVal D, ByVal n)
  218. Dim B(), i, j
  219. For i = 1 To UBound(D)
  220.     If D(i, n) <> "" Then 去除数组第N列空列 = D: Exit Function
  221. Next i
  222. ReDim C(1 To UBound(D), 1 To UBound(D, 2) - 1)
  223. For i = 1 To UBound(D)
  224.     For j = 1 To UBound(C, 2)
  225.         If j < n Then
  226.             C(i, j) = D(i, j)
  227.         ElseIf j >= n Then
  228.             C(i, j) = D(i, j + 1)
  229.         End If
  230.     Next j
  231. Next i
  232. 去除数组第N列空列 = C
  233. End Function
  234. Function 替换文字内容(ByVal A, ByVal D)
  235. Dim B, i, j, k, n, m
  236. For i = 1 To UBound(D)
  237.     For j = 1 To UBound(D, 2)
  238.         m = ""
  239.         If D(i, j) <> "" Then
  240.             If InStr(D(i, j), "~~") > 0 Then
  241.                 B = Split(D(i, j), "~~")
  242.                 For k = 0 To UBound(B)
  243.                     If m = "" Then m = A(B(k), 2) Else m = m & Chr(10) & A(B(k), 2)
  244.                 Next k
  245.                 Erase B
  246.             Else
  247.                 m = A(D(i, j), 2)
  248.             End If
  249.             D(i, j) = m
  250.         End If
  251.     Next j
  252. Next i
  253. 替换文字内容 = D
  254. End Function




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-8-23 14:14:07 | 显示全部楼层

1.制定要转换的CAD表格位置,如果你想改成插件用,可以采用getpoint方法(就是注释掉的),如果你是写在批量操作的程序里面,每次把PT1,PT2的值传入一遍。


2、根据实际情况选择允许同行同列偏移位置误差,默认k是文字高度,ky是行偏移误差。kx是列偏移误差,可以根据实际情况进行调整


3、输出位置自行修改,你想要输出装excel那个位置,自行修改,并且去掉.selection.clear这句,不然全清空了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2018-8-23 15:46:12 | 显示全部楼层
小白 不会用 平时都是用些lsp程序。大佬们能不能讲下要怎么使用?
发表于 2018-8-23 16:01:10 | 显示全部楼层
如何判断是同一个单元格的?代码看起来太累,能说说么。粗略扫了一下,似乎是如果XY在前后行列的值之间,就被认为是合并的,感觉你的判断依据很依赖表格的样式,如果某行或者某列全空,仅有中间一个格子有内容,是不是会被合并到其它行列了?
另外关于后面这个例子,实际上的工作流程应该是excel里填好,然后再生成dwg,顺序反了哈。

点评

excel 生成 DWG就简单多了,我以前写过,待会分享出来  发表于 2018-8-23 16:42
 楼主| 发表于 2018-8-23 16:40:56 | 显示全部楼层
mikewolf2k 发表于 2018-8-23 16:01
如何判断是同一个单元格的?代码看起来太累,能说说么。粗略扫了一下,似乎是如果XY在前后行列的值之间,就 ...

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 2金钱 +60 收起 理由
zzyong00 + 30 赞一个!
mikewolf2k + 30 很给力!

查看全部评分

回复 支持 2 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 05:52 , Processed in 0.178418 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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