乐筑天下

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

[编程交流] Excel li的更紧凑代码

[复制链接]

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:01:58 | 显示全部楼层 |阅读模式
我正试图编写一个autolisp程序,在图形中插入一行20个块(一个接一个),然后从Excel文件中的一行插入每个块的属性。我正在使用Jeffrey Sanders的“GetCells”函数。
Excel文件为“RO-16.xlsx”
以下是我到目前为止所做的:
 
(defun加法器(/cnt yval)
 
(setq cnt 1)
(setq yval 0)
(setvar“osmode”0)
(加载“getcells.lsp”)
 
(虽然(
(
 
(setq*doc*(vla get activedocument(vlax get acad object)))
 
(命令“insert”“C:\\07509\\BD”(strcat“0”,(itoa yval))“1”“1”“04”(getCellsFunction“C:\\07509\\RO-16.xlsx”“ALLOCATED”“K2”))
 
(setq cnt(1+cnt))
(setq yval(+8 yval))
)
)
)
 
因此,第一个属性“PLC”是从Excel文件中的单元格K2中读取的。共有7个属性。有没有更紧凑的方法(使用列表或数组)来实现这一点。我希望避免出现一条长线(这是对Autocad提示块属性的响应),它看起来像:(getCellsFunction“C:\\07509\\RO-16.xlsx”“ALLOCATED”“L2”)、(getCellsFunction“C:\\07509\\RO-16.xlsx”“ALLOCATED”“M2”)等等。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:15:01 | 显示全部楼层
您可能需要搜索更多的getxecel。lsp,不确定getcells中有什么。lsp但一个选项是不使用“K2”,而是使用行、列方法,这样您可以有第二个循环,K2=11,2或X Y,然后将X增加到8 K8。您可能希望对代码进行更多的黑客攻击,以便在代码的早期锁定电子表格名称和工作簿(getcellsfunction k2)。我在getxecel中注意到。lsp我刚才看到了一个名为getrows(getrows K2 7)的函数,从K2开始,得到接下来的7个单元格。
 
看了一下getcells。lsp,你可以很容易地重写一个x,y样式,加上一个额外的defun,使“k2”11,2过26对于列来说有点问题。
 
  1. (defun getCellsFunction( cellName / [color=red]fileName sheetName[/color] myXL myBook mySheet myRange cellValue) but you need to ask these two questions next two lines.
  2. ;;;--- Get the excel file
  3. [color=red](setq fileName(getfiled "Select Excel File" "" "*" 16)) ; remove from below[/color]
  4. ;;;--- Get the sheet name
  5. [color=red](setq sheetName(getstring T "\nName of sheet: ")) ; remove from below[/color]
  6. (setq myXL(vlax-get-or-create-object "Excel.Application"))
回复

使用道具 举报

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:19:23 | 显示全部楼层
 
我不明白-我应该从“getcells.lsp”中删除红色代码吗?
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 18:22:27 | 显示全部楼层
BIGAL告诉你的是在getcells中。lsp函数可以返回一个
单元格列表(不仅仅是单个单元格。
 
  1. (defun getCells (fileName sheetName cellName / xl workbook sheet range cellValue)
  2.    (setq xl(vlax-get-or-create-object "Excel.Application"))
  3.    (vla-put-visible xl :vlax-false)
  4.    (vlax-put-property xl 'DisplayAlerts :vlax-false)
  5.    (setq workbook (vl-catch-all-apply 'vla-open (list (vlax-get-property xl "WorkBooks") fileName)))
  6.    (setq sheet (vl-catch-all-apply 'vlax-get-property (list (vlax-get-property workbook "Sheets") "Item" sheetName)))
  7.    (vlax-invoke-method sheet "Activate")
  8.    (setq range (vlax-get-property (vlax-get-property sheet 'Cells) "Range" cellName))
  9.    (setq cellValue(vlax-variant-value (vlax-get-property range 'Value2)))
  10.    (vl-catch-all-apply 'vlax-invoke-method (list workbook "Close"))
  11.    (vl-catch-all-apply 'vlax-invoke-method (list xl "Quit"))
  12.    (if (not (vlax-object-released-p range))(progn(vlax-release-object range)(setq range nil)))
  13.    (if (not (vlax-object-released-p sheet))(progn(vlax-release-object sheet)(setq sheet nil)))
  14.    (if (not (vlax-object-released-p workbook))(progn(vlax-release-object workbook)(setq workbook nil)))
  15.    (if (not (vlax-object-released-p xl))(progn(vlax-release-object xl)(setq xl nil)))   
  16.    (if(= 'safearray (type cellValue))
  17.      (progn
  18.        (setq tempCellValue(vlax-safearray->list cellValue))
  19.        (setq cellValue(list))
  20.        (if(= (length tempCellValue) 1)
  21.          (progn
  22.            (foreach a tempCellValue
  23.              (if(= (type a) 'LIST)
  24.                (progn
  25.                  (foreach b a
  26.                    (if(= (type b) 'LIST)
  27.                      (setq cellValue(append cellValue (list (vlax-variant-value (car b)))))
  28.                      (setq cellValue(append cellValue (list (vlax-variant-value b))))
  29.                    )
  30.                  )
  31.                )
  32.                (setq cellValue(append cellValue (list (vlax-variant-value a))))
  33.              )
  34.            )
  35.          )
  36.          (progn
  37.            (foreach a tempCellValue
  38.              (setq tmpList(list))
  39.              (foreach b a
  40.                (setq tmp(vlax-variant-value b))
  41.                (setq tmpList(append tmpList (list tmp)))
  42.              )
  43.              (setq cellValue(append cellValue tmpList))
  44.            )
  45.          )
  46.        )
  47.      )
  48.    )
  49.    cellValue
  50. )
  51. (defun c:test ()
  52.   (vl-load-com)
  53.   (setq fname "c:\\users\\ymg\\documents\\testgetcell.xlsx"
  54.         shname "sheet1"
  55.         range  "B10:G10"
  56.   )
  57.   (setq lst (getcells fname shname range))
  58. )   

 
您将在列表中获得从B10到G10的所有值
回复

使用道具 举报

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:33:33 | 显示全部楼层
好的,谢谢你澄清
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:40:39 | 显示全部楼层
我想说的是,您可以将文件名和表声明为局部变量,因此当获取单元格时,您的代码仅为(getcell cellreq)即(setq cellreq“k2”)
 
我还有一些问题,如果你从一个电子表格中读取多个块,那么代码应该根据你给出的块名自动搜索excel,看看创建一系列defuns,这样你就可以执行多个,
 
  1. (setq row (getint "\nStart row number"))
  2. (setq x (getint "\nhow many rows"))
  3. (setq col (getstring "row name"))
  4. (repeat x
  5. (getcell (strcat col (rtos row 2 0)))
  6. (setq row (+ row 1))
  7. )
回复

使用道具 举报

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:42:20 | 显示全部楼层
好的,这应该会大大缩短我的代码。谢谢
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:50:44 | 显示全部楼层
再来一次
 
  1. (if (not AH:getval3) (load "Getvals"))
  2. (ah:getval3 "Enter Column " 5 4 "Enter Start row " 5 4 "How many down" 5 4)
  3. ; val1 val2 val3 these are returned as strings
  4. (setq col val1)
  5. (setq row val2)
  6. (setq down (atoi val3))
  7. (repeat down
  8. (setq cell (strcat col row))
  9. (setq row (rtos (+ (atoi row) 1) 2 0))
  10. (princ cell)
  11. ;(getcell here)
  12. )

 
GETVALS。lsp
回复

使用道具 举报

2

主题

8

帖子

6

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:59:20 | 显示全部楼层
 
回到这里。
 
我想知道你是怎么得到这个消息框的。有一些VB代码吗?
 
无论如何,我用值“C”、“2”和“5”运行这个,得到了以下输出:
C2C3C4C5C6“C6”
我怎样才能让它显示单元格的内容?
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 19:06:01 | 显示全部楼层
下载Getvals链接它是一个自动DCL创建器,您需要使用getcell函数,但它仍然可以为您获取多行。
190202v1e9346xei5iy434.png
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 00:12 , Processed in 0.502634 second(s), 74 queries .

© 2020-2025 乐筑天下

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