文本到excel工作表
在某种情况下,我的一位同事拥有一个。lsp例程,该例程将从某个文件夹中的每个图形中收集所有文本元素,并将它们全部放在excel表中(每行一个文本元素)。有人知道有什么常规可以做到这一点吗?
她有autocad 2008 LT(但有LT extender,因此她能够使用lisp例程)
这些图纸是存在的,因为有几百张,所以一次只绘制一张图纸的惯例是没有帮助的。
我会很惊讶,如果周围会有这样的东西(而且是免费的),但是嘿。。。询问是无妨的。
我相信这可以用LISP实现-我的CAD现在把我弄得一团糟,但当我把它整理好后,我很高兴看到我能为你写些什么
确实要提取每个文本元素吗?不仅仅是某一层上的一些?
需要每个文本元素的原因是,如果文本元素位于“正确”层,那么每个文本元素都不依赖于这个事实。
一旦一切都在Excel中,她就可以把它们整理出来,并很容易地将其减少到必须打印出来的几百个实体。更重要的是,在Excel中有所有可供选择的内容,然后是有一个预筛选列表,因为后者可能会或可能不会遗漏一系列元素。
除此之外,还有一个事实,那就是您必须建立检查特定图层的可能性,即使只是通过在例程中编辑,而不是通过循环来检查图形中的所有图层。
提前感谢您的调查。
我明白你的意思了-在例程中检查LISP层并不太困难,但是当文本实体被放置在错误的层上时,总是有人为错误的可能性。
关于写入Excel,我可能会将数据写入CSV文件,这是一种更容易写入的Excel文件,并且需要更少的编码。从这里,您可以将信息复制粘贴到另一个Excel文件,或者在提取完成后将CSV文件保存为XLS
李 我只是好奇,当你说每个文本元素的时候,你的意思是如果一段文本说“你好,世界”(我知道是通用的),你是想在一行上说“你好”,还是在一行上说“你好”,在另一行上说“世界”?
我把它理解为每一个文本实体在一个新的行上——但这是一个好问题。 这应该可以完成工作。
(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)
)
我一定没有读到他想在多个图纸上使用它,当然我可以让freerefill发布他的批处理程序,然后他们可以使用其中两个,这样他就不需要先打开所有的图纸。。。
不管怎样,你的代码都没有比我期望的少,李,除了你使用了(cdr(assoc 1(entget x)),而不是像李一样的vla-get文本字符串
好吧,我只是觉得DXF’ing稍微容易一点——仍然只有一行,而且比为了它而将所有对象转换为vla对象要快 这个想法是,如果一个有“hello world”和“goodmorning sunshine”,那么它将被放入一个单元格(.csv或.xls)中,作为“hello world”和另一个单元格,在下一行,“goodmorning sunshine”
谢谢你们的快速回复
Commandobill,你的代码正是我们所需要的,除了它只做一个绘图。这意味着,也许我可以通过在excel中使用宏或其他方式来解决这个问题,将所有数据附加到每个单独的表中。xls文件到一个大的。xls文件。
如果绘图位于桌面上,它确实会两次提到每个文本项。解决方案很简单,即不将图形放在桌面上,甚至不放在桌面上的文件夹中。换句话说,PEBCAK。
一旦我把测试图直接放在C上:它只复制了文本元素一次。
它确实将从每个后续图形中提取的数据附加到测试中。在其他图形中手动运行例程时的csv文件。
(仅供参考,我用直接位于C:路径上的一个文件夹中的两个图形进行了尝试)
当我有更多的时间时,我会对它进行更多的测试。
再次衷心感谢你们。非常感谢。
页:
[1]
2