乐筑天下

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

用EXCEL数据做图的小问题

[复制链接]

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2004-4-12 11:13:00 | 显示全部楼层 |阅读模式
以下是论坛现成的读取EXCEL数据的LSP程序,只是稍稍改了一下,测试时读取1万个单元格只用1分钟多一点,我听版主说用REPEAT读取数据很慢,可以说详细一点吗?另外我在处理数据时发现,用(command "text" "j" "c"        '(10 20 0) 2 "" "我爱CAD")添加对中样式的文字很容易,用(vla-AddText mspace (vlax-3d-point '(10 20 0)) "我爱CAD")))只能添加左对齐样式的文字,怎样才能方便地用 ActiveX方式添加对中样式的文字呢。由于只能看书或查看论坛上现成的代码,一个看似简单的问题也要有劳各位了。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-12 11:38:00 | 显示全部楼层
把你的测试程序和数据也给一份吧
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-12 12:19:00 | 显示全部楼层
你不能一个一个地循环去读,要一次读一块或一条,我用了读取列的方式,读同样的数据,你的程序用了0.017136335秒,你的程序用了11.15724444秒
回复

使用道具 举报

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2004-4-12 14:58:00 | 显示全部楼层

我看了你的评论,我认为还不够详细,至少我还看不懂,能不能说多一些?把压箱货拿出来有点舍不得吧。以下是我的数据、程序和图件,这只是最简单的,数据多时,要反复调用Cammand 达上千次,据说调用Cammand 过多容易使CAD崩溃,所以我想用ActiveX方式添加对中样式的文字。谢了。
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:2ckvrgrnrnl.rar 
下载次数:0  文件大小:62.57 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]


传错了一个文件,应该是这个
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:yspf4h3hpsf.lsp 
下载次数:0  文件大小:2.52 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]

回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-12 21:55:00 | 显示全部楼层
本来我写了上面的回答后,就在写一个读取EXCEL的通用函数,现在也写好了,不过我不喜欢被激将。。。你可以看看我的帖子,我什么时候有舍不得过。。。等你自己根据我3楼说的要求你自己先琢磨一下,等差不多了,我在把通用函数给你吧
你也可以用entmake来创建文字,根据你自己需要进行修改。。。
(defun MakeText(pt1 str / ptInsert TextDxf)
         (setq TextDxf '(
                                         (0 . "MTEXT")
                                         (100 . "AcDbEntity")                                         ; 需要所有 R12 之后版本的图元
                                         (100 . "AcDbMText")                ; 将图元标记为 MTEXT
                                         )
         )
         (setq TextDxf (append TextDxf (list
                                         (cons 10 pt1)
                                         (cons 1 str)
                                         (cons 40 14)
                                         ;(cons 7         "HZ")
                                )
                )
         )
         (entmake TextDxf)
         (princ)
)
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-12 22:29:00 | 显示全部楼层
给你个编译过的,你先用用:  函数(GetRange sheet sCELL nRow),读取范围,用法:;参数说明:sheet——  excel的sheet对象
;sCELL——起始单元
;eCELL——结束单元
;如:(GetRang sheet "A1" "C10");表示从"A1"到"C10"之间所有范围  函数(GetCol sheet sCELL nRow),读取列,用法:;参数说明:sheet——  excel的sheet对象
;sCELL——起始单元
;nRow——行数
;如:(GetCol sheet "A1" 10);表示读取"A"列1到11行之间所有范围函数(GetRow sheet sCELL nCol),读取行,用法:;参数说明:sheet——  excel的sheet对象
;sCELL——起始单元
;eCol——列数;如:(GetRow sheet "A1" 10);表示读取1行A开始读11个单元
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:szvup5jcgdz.rar 
下载次数:0  文件大小:1.82 KB  售价:2银币 [记录]
下载权限: 不限 以上或 Vip会员   [开通Vip]   [签到领银币]  [免费赚银币]


以下是测试程序,你可以跟你原来的比较一下时间,我想,读1万个数据应该在1秒以内完成(只是读取数据的时间,不包括建立EXCEL对象时间)
  1. (defun Exl-Open (dmode / )
  2.    (princ "\n创建一个新的 Excel 电子表格文件...")
  3.    (cond
  4.        ((setq appsession (vlax-create-object "Excel.Application"))
  5.          (vlax-invoke-method (vlax-get-property appsession 'WorkBooks) 'open (getfiled "打开存放数据的Excel电子表格文档" "" "XLS" 8))
  6.          (if (= (strcase dmode) "SHOW")
  7.              (vla-put-visible appsession 1)
  8.              (vla-put-visible appsession 0)
  9.          );IF
  10.        );COND1
  11.    );COND
  12. )
  13. (defun Exl-quit ()
  14.    (cond
  15.        ((not (vlax-object-released-p appsession))
  16.          (vlax-invoke-method appsession 'QUIT)
  17.          (vlax-release-object appsession)
  18.        )
  19.    )
  20. )
  21. (defun main( / points)
  22.    (Exl-Open "SHOW")
  23.    (setq sheet (vlax-get-property appsession 'ActiveSheet))
  24.    (setq time (getvar "cdate"))
  25.    (GetRange sheet "E24" "F323")
  26.    (princ "\n")
  27.    (princ (rtos (- (getvar "cdate") time) 2 14))
  28.    (setvar "cmdecho" 0)
  29.    (Exl-quit)
  30.    (princ)
  31. )
回复

使用道具 举报

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2004-4-13 09:59:00 | 显示全部楼层
这么简明,还加上了测试时间的小程序,非常感谢!我试试看。本来我认为用entmake写文字太麻烦,在看了版主用子程序写文字的方法后,我觉得还是比较方便。再次感谢!!
回复

使用道具 举报

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2004-4-13 11:52:00 | 显示全部楼层
版主,我在测试时发现速度的确快得惊人,但加载程序时要有先后顺序,ExcelLib.VLX文件必须先加载,再加载后面主程序来刷新它,大概是        ExcelLib.VLX中有一些东西没删完罢,我只是猜测。
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2004-4-13 12:04:00 | 显示全部楼层
哈哈,被你猜到了...确实这样的,不过发现时已经传上来了,就算了...其实很简单的,主要是对EXCEL对象模型要熟悉,我也不是很熟悉,不知道哪儿能有这方面资料...把代码给你吧,或许能让你对EXCEL对象模型又多了解一点:
  1. ;根据起始单元和水平垂直移动单元数目,算出下一单元
  2. (defun CalCell(Cell nRow nCol / i n h str sRow sCol sum pos)
  3.    (setq sRow nil sCol "" sum 0 h nil pos nil)
  4.    (setq i 1)   
  5.    (repeat (strlen Cell)
  6.        (setq str (substr Cell i 1))
  7.        (if (/= (type (read str)) 'INT)
  8.            (setq sRow (append sRow (list str)))
  9.            (setq sCol (strcat sCol str))
  10.        )
  11.        (setq i (1+ i))
  12.    )
  13.    (setq sRow (mapcar '(lambda(e) (- (ascii (strcase e)) 64)) sRow))
  14.    (setq n (length sRow) i n sum 0)
  15.    (repeat n
  16.        (setq sum (+ sum (* (nth (1- i) sRow) (expt 26 (- n i)))))
  17.        (setq i (1- i))
  18.    )
  19.    (setq sum (+ sum nCol))
  20.    (setq pos nil)
  21.    (while (> (setq n (/ sum 26)) 0)
  22.        (setq h n)
  23.        (setq sum (- sum (* 26 (/ sum 26))))
  24.        (setq pos (cons sum pos ))
  25.    )
  26.    (if h
  27.        (setq pos (cons h pos))
  28.        (setq pos (cons sum pos ))
  29.    )
  30.    (strcat (apply 'strcat (mapcar '(lambda(e) (chr (+ e 64))) pos))
  31.      (itoa (+ (atoi sCol) nRow)))
  32. );函数(GetRange sheet sCELL nRow),读取范围,用法:
  33. ;参数说明:
  34. ;sheet—— excel的sheet对象
  35. ;sCELL——起始单元
  36. ;eCELL——结束单元
  37. ;如:(GetRang sheet "A1" "C10");表示从"A1"到"C10"之间所有范围
  38. (defun GetRange(sheet sCELL eCELL / val items )
  39.    (setq val (vlax-get-property sheet 'range sCELL eCELL))
  40.    (setq val (vlax-variant-value (vlax-get-property val 'value)))
  41.    (if (/= (type val) 'REAL)
  42.        (progn
  43.            (setq items (vlax-safearray->list val))
  44.            (setq items (mapcar '(lambda(e) (mapcar 'vlax-variant-value e)) items))
  45.        )
  46.        (setq items val)
  47.    )
  48. )
  49. ;函数(GetCol sheet sCELL nRow),读取列,用法:
  50. ;参数说明:
  51. ;sheet—— excel的sheet对象
  52. ;sCELL——起始单元
  53. ;nRow——行数
  54. ;如:(GetCol sheet "A1" 10);表示读取"A"列1到11行之间所有范围
  55. (defun GetCol(sheet sCELL nRow / Rows)
  56.    (setq Rows (GetRange sheet sCELL (CalCell sCell nRow 0)))
  57.    (if (/= (type Rows) 'REAL)
  58.        (apply 'append Rows)
  59.        Rows
  60.    )
  61. )
  62. ;函数(GetRow sheet sCELL nCol),读取行,用法:
  63. ;参数说明:
  64. ;sheet—— excel的sheet对象
  65. ;sCELL——起始单元
  66. ;nCol——列数
  67. ;如:(GetRow sheet "A1" 10);表示读取1行A开始读11个单元
  68. (defun GetRow(sheet sCELL nCol / Cols)
  69.    (setq Cols (GetRange sheet sCELL (CalCell sCell 0 nCol)))
  70.    (if (/= (type Cols) 'REAL)
  71.        (car Cols)
  72.        Cols
  73.    )
  74. )
回复

使用道具 举报

10

主题

131

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
171
发表于 2004-4-13 13:13:00 | 显示全部楼层
和VBA上读EXCEL表的方法有些类似,再次感谢!
版主真是一个热心人。。。。。。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-15 23:54 , Processed in 2.971969 second(s), 81 queries .

© 2020-2025 乐筑天下

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