Peter K 发表于 2022-7-6 06:32:50

文本到excel工作表

在某种情况下,我的一位同事拥有一个。lsp例程,该例程将从某个文件夹中的每个图形中收集所有文本元素,并将它们全部放在excel表中(每行一个文本元素)。
 
有人知道有什么常规可以做到这一点吗?
 
她有autocad 2008 LT(但有LT extender,因此她能够使用lisp例程)
 
这些图纸是存在的,因为有几百张,所以一次只绘制一张图纸的惯例是没有帮助的。
 
我会很惊讶,如果周围会有这样的东西(而且是免费的),但是嘿。。。询问是无妨的。
 

Lee Mac 发表于 2022-7-6 06:38:26

我相信这可以用LISP实现-我的CAD现在把我弄得一团糟,但当我把它整理好后,我很高兴看到我能为你写些什么
 
确实要提取每个文本元素吗?不仅仅是某一层上的一些?

Peter K 发表于 2022-7-6 06:41:37

 
需要每个文本元素的原因是,如果文本元素位于“正确”层,那么每个文本元素都不依赖于这个事实。
一旦一切都在Excel中,她就可以把它们整理出来,并很容易地将其减少到必须打印出来的几百个实体。更重要的是,在Excel中有所有可供选择的内容,然后是有一个预筛选列表,因为后者可能会或可能不会遗漏一系列元素。
 
除此之外,还有一个事实,那就是您必须建立检查特定图层的可能性,即使只是通过在例程中编辑,而不是通过循环来检查图形中的所有图层。
 
提前感谢您的调查。

Lee Mac 发表于 2022-7-6 06:45:04

 
我明白你的意思了-在例程中检查LISP层并不太困难,但是当文本实体被放置在错误的层上时,总是有人为错误的可能性。
 
关于写入Excel,我可能会将数据写入CSV文件,这是一种更容易写入的Excel文件,并且需要更少的编码。从这里,您可以将信息复制粘贴到另一个Excel文件,或者在提取完成后将CSV文件保存为XLS
 

Commandobill 发表于 2022-7-6 06:46:56

我只是好奇,当你说每个文本元素的时候,你的意思是如果一段文本说“你好,世界”(我知道是通用的),你是想在一行上说“你好”,还是在一行上说“你好”,在另一行上说“世界”?

Lee Mac 发表于 2022-7-6 06:49:04

 
我把它理解为每一个文本实体在一个新的行上——但这是一个好问题。

Commandobill 发表于 2022-7-6 06:52:21

这应该可以完成工作。
 
(defun c:ttx ( / xlCells xlSheet xlSheets xlBook xlBooks xlApp column row drac ss ent expo x)
         
(vl-load-com)

(setq    xlApp       (vlax-get-or-create-object "Excel.Application")
   xlBooks(vlax-get-property xlApp "Workbooks")
   xlBook       (vlax-invoke-method xlBooks "Add")
   xlSheets (vlax-get-property xlBook "Sheets")
   xlSheet       (vlax-get-property xlSheets "Item" 1)
   xlCells       (vlax-get-property xlSheet "Cells"))

(vla-put-visible xlApp :vlax-true)

(setq column 1
   row    1
   drac   -1
   ss   (ssget "_X" (list (cons 0 "*TEXT"))))

(repeat (sslength ss)
   (setq ent(ssname ss (setq drac (1+ drac)))
         expo (vla-get-textstring (vlax-ename->vla-object ent)))
   (if (<= row 65536)
   (vlax-put-property xlCells "Item" row column expo)
   (progn
   (setq row    1
         column (1+ column))
   (vlax-put-property xlCells "Item" row column expo)
   ); /else progn
   ); /if
   (setq row (1+ row))
   ); /repeat

(mapcar (function (lambda(x)
             (vl-catch-all-apply
         (function (lambda()
                   (progn
                     (vlax-release-object x)
                     (setq x nil)))))))
   (list xlCells xlSheet xlSheets xlBook xlBooks xlApp))

(alert "Close Excel file manually")

(gc)(gc)

(princ)

)

Lee Mac 发表于 2022-7-6 06:57:46

 
我一定没有读到他想在多个图纸上使用它,当然我可以让freerefill发布他的批处理程序,然后他们可以使用其中两个,这样他就不需要先打开所有的图纸。。。
 
不管怎样,你的代码都没有比我期望的少,李,除了你使用了(cdr(assoc 1(entget x)),而不是像李一样的vla-get文本字符串

Commandobill 发表于 2022-7-6 07:00:48

 
好吧,我只是觉得DXF’ing稍微容易一点——仍然只有一行,而且比为了它而将所有对象转换为vla对象要快

Lee Mac 发表于 2022-7-6 07:02:39

这个想法是,如果一个有“hello world”和“goodmorning sunshine”,那么它将被放入一个单元格(.csv或.xls)中,作为“hello world”和另一个单元格,在下一行,“goodmorning sunshine”
 
谢谢你们的快速回复
 
Commandobill,你的代码正是我们所需要的,除了它只做一个绘图。这意味着,也许我可以通过在excel中使用宏或其他方式来解决这个问题,将所有数据附加到每个单独的表中。xls文件到一个大的。xls文件。
 
如果绘图位于桌面上,它确实会两次提到每个文本项。解决方案很简单,即不将图形放在桌面上,甚至不放在桌面上的文件夹中。换句话说,PEBCAK。
一旦我把测试图直接放在C上:它只复制了文本元素一次。
 
它确实将从每个后续图形中提取的数据附加到测试中。在其他图形中手动运行例程时的csv文件。
(仅供参考,我用直接位于C:路径上的一个文件夹中的两个图形进行了尝试)
 
当我有更多的时间时,我会对它进行更多的测试。
 
再次衷心感谢你们。非常感谢。
页: [1] 2
查看完整版本: 文本到excel工作表