Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
caothang

Kết hợp Excel-AutoLisp-AutoCAD

Các bài được khuyến nghị

ntSon đã thông hiểu với file *.txt, *.csv. Rất mong SSG nói về cách lấy dữ liệu ở file *.xls, và có 1 ví dụ cụ thể

vd tách dữ liệu từ 1 file *.xls như sau:

A1 A2 A3 A4

B1 B2 B4

C1 C2 C3

D1 D2 D3 D4

E1 E2

(Nhiều nhất có 4 cột)

Cảm ơn SSG rất nhiều.

Các file *.txt, *.csv có cách tổ chức data khác nhau nhưng bản chất của chúng đều là TextFile (bao gồm các ký tự ASCII, có thể đọc hiểu được một cách tường minh). Với *.xls thì không phải như vậy. Ví dụ, bạn thử dùng NotePad để open *.xls xem, chỉ thấy một đám ký tự lằng nhằng chẳng hiểu gì cả. Hàm read-line cũng chào thua!

 

AutoLisp "cổ điển" không thể truy xuất *.xls được. Từ khi Autodesk phát triển Visual Lisp (bắt đầu từ version nào ssg không nhớ chính xác, nhưng chắc chắn phải từ 2000 trở đi), kỹ thuật ActiveX được đưa vào, mở ra một khả năng ứng dụng rộng rãi, có thể giao tiếp được với nhiều phần mềm khác nhau, không riêng gì với Excel. Kỹ thuật ActiveX là một mảng rất rộng, có lẽ còn tốn nhiều... giấy mực cho đề tài này. Hãy đợi đấy!

 

Trong Visual Lisp, các function sử dụng kỹ thuật ActiveX được bắt đầu bằng tiếp đầu ngữ VLA. Bạn dùng function GET_xl (lưu ý: luôn luôn phải kèm theo nó function phụ rec-rem-dupl) trong bài ssg trả lời bạn caothang sẽ truy xuất được dữ liệu từ bất kỳ cell nào bạn muốn trong file *.xls. Lưu ý thêm, trước khi gọi các function VLA, bạn phải gọi (vl-load-com) và chỉ cần 1 lần duy nhất trong 1 tài liệu *.dwg đang mở.

Ví dụ:

(defun C:E2C ()
(vl-load-com)
(setq
   fn (getfiled "Select Data File" "" "xls" 0)
   d  (get_xl fn)
)
)

 

Bạn chạy E2C cho file *.xls hôm nọ, kết quả d bạn nhận được là:

Command: E2C

Return:

(("Sheet1$" ("STT" "Ho" "TenDem" "Ten") (1.0 "Kha" "Tran" "Ac") (2.0 "Au" "Duong" "Phong") (3.0 "Hoang" "Duoc" "Su") (4.0 "Hoang" nil "Dung") (5.0 "Quach" nil "Tinh") (6.0 "Hong" "That" "Cong")) ("Sheet2$") ("Sheet3$"))

 

Đây là một list 3 cấp:

- Cấp 1: chứa các sheet

- Cấp 2: chứa các record trong sheet

- Cấp 3: thành phần field trong record

 

Lấy toàn bộ nội dung của sheet1:

Command: (setq s1 (cdr (car d)))

Return:

(("STT" "Ho" "TenDem" "Ten") (1.0 "Kha" "Tran" "Ac") (2.0 "Au" "Duong" "Phong")

(3.0 "Hoang" "Duoc" "Su") (4.0 "Hoang" nil "Dung") (5.0 "Quach" nil "Tinh")

(6.0 "Hong" "That" "Cong"))

 

Cell B4 chẳng hạn (họ của đảo chủ đảo Đào hoa) được lấy như sau:

Command: (nth 1 (nth 3 s1))

Return:

"Hoang"

 

Tương tự như vậy, bạn có thể truy xuất bất kỳ cell nào trong cả file *.xls mà bạn muốn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Các file *.txt, *.csv có cách tổ chức data khác nhau nhưng bản chất của chúng đều là TextFile (bao gồm các ký tự ASCII, có thể đọc hiểu được một cách tường minh). Với *.xls thì không phải như vậy. Ví dụ, bạn thử dùng NotePad để open *.xls xem, chỉ thấy một đám ký tự lằng nhằng chẳng hiểu gì cả. Hàm read-line cũng chào thua!

 

AutoLisp "cổ điển" không thể truy xuất *.xls được. Từ khi Autodesk phát triển Visual Lisp (bắt đầu từ version nào ssg không nhớ chính xác, nhưng chắc chắn phải từ 2000 trở đi), kỹ thuật ActiveX được đưa vào, mở ra một khả năng ứng dụng rộng rãi, có thể giao tiếp được với nhiều phần mềm khác nhau, không riêng gì với Excel. Kỹ thuật ActiveX là một mảng rất rộng, có lẽ còn tốn nhiều... giấy mực cho đề tài này. Hãy đợi đấy!

 

Trong Visual Lisp, các function sử dụng kỹ thuật ActiveX được bắt đầu bằng tiếp đầu ngữ VLA. Bạn dùng function GET_xl (lưu ý: luôn luôn phải kèm theo nó function phụ rec-rem-dupl) trong bài ssg trả lời bạn caothang sẽ truy xuất được dữ liệu từ bất kỳ cell nào bạn muốn trong file *.xls. Lưu ý thêm, trước khi gọi các function VLA, bạn phải gọi (vl-load-com) và chỉ cần 1 lần duy nhất trong 1 tài liệu *.dwg đang mở.

Ví dụ:

(defun C:E2C ()
(vl-load-com)
(setq
   fn (getfiled "Select Data File" "" "xls" 0)
   d  (get_xl fn)
)
)

 

Bạn chạy E2C cho file *.xls hôm nọ, kết quả d bạn nhận được là:

Command: E2C

Return:

(("Sheet1$" ("STT" "Ho" "TenDem" "Ten") (1.0 "Kha" "Tran" "Ac") (2.0 "Au" "Duong" "Phong") (3.0 "Hoang" "Duoc" "Su") (4.0 "Hoang" nil "Dung") (5.0 "Quach" nil "Tinh") (6.0 "Hong" "That" "Cong")) ("Sheet2$") ("Sheet3$"))

 

Đây là một list 3 cấp:

- Cấp 1: chứa các sheet

- Cấp 2: chứa các record trong sheet

- Cấp 3: thành phần field trong record

 

Lấy toàn bộ nội dung của sheet1:

Command: (setq s1 (cdr (car d)))

Return:

(("STT" "Ho" "TenDem" "Ten") (1.0 "Kha" "Tran" "Ac") (2.0 "Au" "Duong" "Phong")

(3.0 "Hoang" "Duoc" "Su") (4.0 "Hoang" nil "Dung") (5.0 "Quach" nil "Tinh")

(6.0 "Hong" "That" "Cong"))

 

Cell B4 chẳng hạn (họ của đảo chủ đảo Đào hoa) được lấy như sau:

Command: (nth 1 (nth 3 s1))

Return:

"Hoang"

 

Tương tự như vậy, bạn có thể truy xuất bất kỳ cell nào trong cả file *.xls mà bạn muốn.

Cảm ơn SSG

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Một ví dụ minh hoạ về kết hợp Lisp - Excel - AutoCAD:

 

http://www.cadviet.com/upfiles/ThenBang.zip

 

Chương trình tra số liệu và vẽ mặt cắt của rãnh then bằng trên trục hoặc lỗ. Ví dụ của Cơ khí nhưng có lẽ các bạn ở các ngành khác cũng có thể tham khảo được. Sơ đồ tổng quát của chương trình như sau:

 

1. Nhập "dữ liệu thô" vào Excel: số liệu đo, tính được hoặc có sẵn từ các bảng tiêu chuẩn kỹ thuật

2. Dùng các công thức, công cụ của Excel để tính toán, xử lý thành "dữ liệu tinh"

3. Trình lisp đọc dữ liệu tinh từ file *.xls, xử lý tiếp tuỳ theo yêu cầu và thể hiện kết quả bằng các đối tượng AutoCAD

 

Các functions liên quan đến Excel trong trình Lisp là của... Tây nó viết, member CadViet đã post lên diễn đàn (ở chỗ nào ssg không nhớ nữa). Để hiểu hết các code của nó còn phải dày công. Tuy nhiên, dù chưa hiểu lắm, các bạn cũng có thể sử dụng chúng rất hiệu quả. Cụ thể:

 

1. GetExcel: đọc data trong 1 file *.xls mà không cần khởi động Excel

2. GetExcel0: đọc data trong 1 file *.xls đang open. Cái này ssg modify từ cái trên và chưa chỉnh sửa gì nhiều

3. GetCell: đọc dữ liệu từ 1 cell

4. PutCell: ghi dữ liệu vào 1 cell

5. OpenExcel: mở 1 file *.xls

6. CloseExcel: thoát trình Excel đang chạy

 

Chương trình còn đang ở dạng sơ khai. Bạn nào thấy thích thì "ngâm cứu" tiếp. Thấy cái gì hay hay thì post lên để anh em cùng học hỏi.

 

PS: Sau khi load file lsp, gõ FK để chạy

Chỉnh sửa theo ssg
  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bác Ssg chưa hiểu toàn bộ ý của PP.

PP muốn là sẽ xuất ra các bản vẽ hoàn chỉnh ngoài cái hình "ban ve gia cong" post ở trên thì còn chứa mọi thông tin của 1 bản vẽ chi tiết cần phải có như khung tên, tên project, chi tiết gia công, yêu cầu kỹ thuật, BOM, chi tiết người vẽ, duyệt, kiểm tra, khách hàng, thời gian, liệt kê mọi chi tiết các revisions liên quan vv... Bời vậy phải cần có sheet Info, để điền các data này sau đó LISP mới đọc và input tự động vào bv. (Lợi ích của bảng Excel này còn giúp người quản lý chỉ cần mở bảng này ra xem là biết mọi information của mọi bv, Excel cho phép copy các text giống nhau trong các bv bằng 1 vài cái "click", giúp cho Drafter khỏi phải đánh text trong bv).....

 

 

Y tưởng này của Phiphi đúng là thứ mình đang tìm kiếm. Tuyệt vời.... ^_^

 

Tại chỗ mình làm hiện nay đang phải chuyển đổi tất cả các bản vẽ để quản lý theo sheet set. Có rất nhiều bản vẽ, và việc nhập lại, đánh lại tên các bản vẽ mất rất nhiều thời gian, thêm vào đó, cái list dwgs (bằng Excel) thì thay đổi liên miên.

 

Các bạn có thể giúp mình tạo 1 lisp mà có thể: cập nhật Rivision, số bản vẽ, tên bản vẽ TV, tên bản vẽ TA, tỉ lệ bản vẽ từ 1 file list dwg bằng Excel vào trong Sheet set, (Vì các bản vẽ đã đc tạo các att tương ứng với các trường của sheet set), từ đó khi muốn thay đổi tên bản vẽ, số hiện bản vẽ v.v.... ta chỉ việc thay đổi ở Excel, thì các bản vẽ sẽ được tự cập nhật tương ứng.

 

cảm ơn rất nhiều

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Y tưởng này của Phiphi đúng là thứ mình đang tìm kiếm. Tuyệt vời.... ^_^

 

Tại chỗ mình làm hiện nay đang phải chuyển đổi tất cả các bản vẽ để quản lý theo sheet set. Có rất nhiều bản vẽ, và việc nhập lại, đánh lại tên các bản vẽ mất rất nhiều thời gian, thêm vào đó, cái list dwgs (bằng Excel) thì thay đổi liên miên.

 

Các bạn có thể giúp mình tạo 1 lisp mà có thể: cập nhật Rivision, số bản vẽ, tên bản vẽ TV, tên bản vẽ TA, tỉ lệ bản vẽ từ 1 file list dwg bằng Excel vào trong Sheet set, (Vì các bản vẽ đã đc tạo các att tương ứng với các trường của sheet set), từ đó khi muốn thay đổi tên bản vẽ, số hiện bản vẽ v.v.... ta chỉ việc thay đổi ở Excel, thì các bản vẽ sẽ được tự cập nhật tương ứng.

 

cảm ơn rất nhiều

Bạn post lên 1 file *.xls và vài file *.dwg (có ký hiệu tương ứng trong file *.xls), có khung tên thiết kế bằng att theo mẫu chuẩn nhất của bạn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn post lên 1 file *.xls và vài file *.dwg (có ký hiệu tương ứng trong file *.xls), có khung tên thiết kế bằng att theo mẫu chuẩn nhất của bạn.

 

Cảm ơn Ssg đã quan tâm đến câu hỏi của mình.

 

Để mọi người tiện theo dõi là giúp đỡ, mình xin post 1 ví dụ giữa Sheet set và Excel.

 

Trong ví dụ này, tất cả các bản vẽ trong thư mục HVAC\Hotel đc quản lý bởi sheet set đặt tại thư mục Stds. Giữa file Excel và sheet set hiện giờ chưa có sự liên kết nào. Khi nhập, sửa dữ liệu tại file Excel thì sau đó lại phải vào sheet set để sửa lại bằng tay, rất mất thời gian và hay bị nhầm lẫn khi mà số lượng bản vẽ lớn.

 

Các bạn có thể giúp mình tạo lisp để liên kết 2 thằng lại với nhau: khi chỉnhh sửa gì ở Excel thì thằng sheet set tự cập nhật --> bản vẽ cũng đc cập nhật theo.

 

Cảm ơn rất nhiều.

 

Đây là link để down file ví dụ:

http://www.4shared.com/file/80727660/2ada1995/sample.html

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cảm ơn Ssg đã quan tâm đến câu hỏi của mình.

 

Để mọi người tiện theo dõi là giúp đỡ, mình xin post 1 ví dụ giữa Sheet set và Excel.

 

Trong ví dụ này, tất cả các bản vẽ trong thư mục HVAC\Hotel đc quản lý bởi sheet set đặt tại thư mục Stds. Giữa file Excel và sheet set hiện giờ chưa có sự liên kết nào. Khi nhập, sửa dữ liệu tại file Excel thì sau đó lại phải vào sheet set để sửa lại bằng tay, rất mất thời gian và hay bị nhầm lẫn khi mà số lượng bản vẽ lớn.

 

Các bạn có thể giúp mình tạo lisp để liên kết 2 thằng lại với nhau: khi chỉnhh sửa gì ở Excel thì thằng sheet set tự cập nhật --> bản vẽ cũng đc cập nhật theo.

 

Cảm ơn rất nhiều.

 

Đây là link để down file ví dụ:

http://www.4shared.com/file/80727660/2ada1995/sample.html

Sheet Set là một dạng quản lý bản vẽ mới. Bản thân ssg cũng chưa dùng cái này bao giờ. Có yêu cầu của bạn, ssg mới xem qua một lượt, khá hay! Ssg cũng đã tìm trong Developer Help của Cad2007, nhưng thật đáng tiếc, chỉ có VBA tương tác được với Sheet Set (VBA không phải là sở trường của ssg), còn với Lisp thì theo ssg là "bó tay chấm com"! Dù sao thì ssg cũng ghi nhận, sẽ tìm hiểu kỹ hơn, có phát hiện gì mới ssg sẽ post lên cho bạn.

Hơi thắc mắc một chút: bạn đã dùng Sheet Set thì cần gì đến file *.xls? Tự thân file *.dst đã chứa đầy đủ thông tin cần thiết rồi?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Sheet Set là một dạng quản lý bản vẽ mới. Bản thân ssg cũng chưa dùng cái này bao giờ. Có yêu cầu của bạn, ssg mới xem qua một lượt, khá hay! Ssg cũng đã tìm trong Developer Help của Cad2007, nhưng thật đáng tiếc, chỉ có VBA tương tác được với Sheet Set (VBA không phải là sở trường của ssg), còn với Lisp thì theo ssg là "bó tay chấm com"! Dù sao thì ssg cũng ghi nhận, sẽ tìm hiểu kỹ hơn, có phát hiện gì mới ssg sẽ post lên cho bạn.

Hơi thắc mắc một chút: bạn đã dùng Sheet Set thì cần gì đến file *.xls? Tự thân file *.dst đã chứa đầy đủ thông tin cần thiết rồi?

 

SSG nói hoàn toàn chính xác.

 

Thắng sheet set sau khi mình tạo xong, có có thể xuất ra 1 bảng dạng Table của CAD với đầy đủ các thông tin mình có trong sheet set, Table đó còn insert được thêm các cột theo mục đích sử dụng của người dùng và có thể export ra file *.CSV.

để thay đổi cái dữ liệu của bản vẽ, mình buộc phải thực hiện trên sheet set, sau đó update ra table, mà thực hiện trên thằng sheet set thì tương đối mất thời gian và khó làm, trong khi các yêu cầu sửa đổi thường đc đưa ra bằng file Excel.

 

Như vậy cái mình muốn nói đến ở đây là quá trình thực hiện công việc ở thưc tế, và nó lại ngược với những cái CAD cho làm. ^_^, tức là khi có dự liệu thay đổi tại file excel, thằng sheet set sẽ đc cập nhật ( bằng lệch update hay gì đó ) để tự động thay đổi các bản vẽ mà nó quản lý....

 

Mình nghĩ bài toán này tương đối hay, mong đc các cao thủ quan tâm, trợ giúp.hi hi...

 

Cảm ơn các bạn nhiều.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Đó là vì chế độ security ở mức cao.

Vào Tools->Marcro->security và chọn mức medium

Sau đó khi mở file thì chọn enable macro là chạy được

Nếu bạn đưa bản vẽ hoàn chỉnh, tôi sẽ giúp 100% thời gian làm công việc này

Dĩ nhiên là phải làm chi tiết bên excel rồi

^_^ Hinh như là file excell này ko update được đâu. có nghĩa như sau nè. Nếu bạn làm xong rùi mà có chỉnh sửa thì bạn đành vào cad chỉnh chứ ko chỉnh từ excell rồi update qua cad được đâu. Mong được bác giúp đở dùm . Thanks . Chúc anh em có 1 ngày cuối tuần thật là vui vẽ & hạnh phúc :D

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
SSG nói hoàn toàn chính xác.

 

Thắng sheet set sau khi mình tạo xong, có có thể xuất ra 1 bảng dạng Table của CAD với đầy đủ các thông tin mình có trong sheet set, Table đó còn insert được thêm các cột theo mục đích sử dụng của người dùng và có thể export ra file *.CSV.

để thay đổi cái dữ liệu của bản vẽ, mình buộc phải thực hiện trên sheet set, sau đó update ra table, mà thực hiện trên thằng sheet set thì tương đối mất thời gian và khó làm, trong khi các yêu cầu sửa đổi thường đc đưa ra bằng file Excel.

 

Như vậy cái mình muốn nói đến ở đây là quá trình thực hiện công việc ở thưc tế, và nó lại ngược với những cái CAD cho làm. ^_^, tức là khi có dự liệu thay đổi tại file excel, thằng sheet set sẽ đc cập nhật ( bằng lệch update hay gì đó ) để tự động thay đổi các bản vẽ mà nó quản lý....

 

Mình nghĩ bài toán này tương đối hay, mong đc các cao thủ quan tâm, trợ giúp.hi hi...

 

Cảm ơn các bạn nhiều.

Gần Tết rồi nên pà con bận rộn, sau Tết sẽ có bài giải.

PP có 1 bài tham khảo này: http://www.cadviet.com/forum/index.php?sho...art=#entry48708

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

tôi đã lấy được dữ liệu từ exel liên kết vào cad

nhưng khi dữ liệu trong exel là 1 chuỗi string có dấu thì mọi việc trở nên phức tạp

nó không còn nguyên dạng được nữa kể cả tôi đã dùng field để liên kết (sau khi đổi font cho trùng giữa cad và exel)

ssg có cách nào không

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
tôi đã lấy được dữ liệu từ exel liên kết vào cad

nhưng khi dữ liệu trong exel là 1 chuỗi string có dấu thì mọi việc trở nên phức tạp

nó không còn nguyên dạng được nữa kể cả tôi đã dùng field để liên kết (sau khi đổi font cho trùng giữa cad và exel)

ssg có cách nào không

Ssg dùng Get_XL (đã post hôm nọ) vẫn chuyển được "dấu má" đầy đủ từ Excel qua đối tượng Text của Acad.

Font trong Excel: .VnArial, .VnTime, ...

Font trong CAD: như trên, hoặc vnsimple.shx, vnsimli.shx, ...

Bạn thử xem sao!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình dùng theo cái này

bạn có cách gì để sử dụng nó không

 

(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)
(if (= (type ExcelFile$) 'STR)
(if (not (findfile ExcelFile$))
(progn
(alert (strcat "Excel file " ExcelFile$ " not found."))
(exit)
);progn
);if
(progn
(alert "Excel file not specified.")
(exit)
);progn
);if
(gc)
(if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
(progn
(alert "Close all Excel spreadsheets to continue!")
(vlax-release-object *ExcelApp%)(gc)
);progn
);if
(setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
(if SheetName$
(vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
(if (= (vlax-get-property Worksheet "Name") SheetName$)
(vlax-invoke-method Worksheet "Activate")
);if
);vlax-for
);if
(setq ColumnRow@ (ColumnRow MaxRange$))
(setq MaxColumn# (nth 0 ColumnRow@))
(setq MaxRow# (nth 1 ColumnRow@))
(setq *ExcelData@ nil)
(setq Row# 1)
(repeat MaxRow#
(setq Data@ nil)
(setq Column# 1)
(repeat MaxColumn#
(setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
(setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
(setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
(setq ExcelValue (vlax-variant-value ExcelVariant^))
(setq ExcelValue
(cond
((= (type ExcelValue) 'INT) (itoa ExcelValue))
((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
((/= (type ExcelValue) 'STR) "")
);cond
);setq
(setq Data@ (append Data@ (list ExcelValue)))
(setq Column# (1+ Column#))
);repeat
(setq *ExcelData@ (append *ExcelData@ (list Data@)))
(setq Row# (1+ Row#))
);repeat
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
(vlax-invoke-method *ExcelApp% 'Quit)
(vlax-release-object *ExcelApp%)(gc)
(setq *ExcelApp% nil)
*ExcelData@
);defun GetExcel
;-------------------------------------------------------------------------------
; GetCell - Returns the cell value from the *ExcelData@ list
; Arguments: 1
; Cell$ = Cell ID
; Syntax example: (GetCell "E19") = value of cell E19
;-------------------------------------------------------------------------------
(defun GetCell (Cell$ / Column# ColumnRow@ Return Row#)
(setq ColumnRow@ (ColumnRow Cell$))
(setq Column# (1- (nth 0 ColumnRow@)))
(setq Row# (1- (nth 1 ColumnRow@)))
(setq Return "")
(if *ExcelData@
(if (and (>= (length *ExcelData@) Row#)(>= (length (nth 0 *ExcelData@)) Column#))
(setq Return (nth Column# (nth Row# *ExcelData@)))
);if
);if
Return
);defun GetCell
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
; Arguments: 3
; ExcelFile$ = Excel filename or nil for new spreadsheet
; SheetName$ = Sheet name or nil for not specified
; Visible = t for visible or nil for hidden
; Syntax examples:
; (OpenExcel "C:\\Temp\\Temp.xls" "Sheet2" t) = Opens C:\Temp\Temp.xls on Sheet2 as visible session
; (OpenExcel "C:\\Temp\\Temp.xls" nil nil) = Opens C:\Temp\Temp.xls on current sheet as hidden session
; (OpenExcel nil "Parts List" nil) = Opens a new spreadsheet and creates a Part List sheet as hidden session
;-------------------------------------------------------------------------------
(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
(if (= (type ExcelFile$) 'STR)
(if (findfile ExcelFile$)
(setq *ExcelFile$ ExcelFile$)
(progn
(alert (strcat "Excel file " ExcelFile$ " not found."))
(exit)
);progn
);if
(setq *ExcelFile$ "")
);if
(gc)
(if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
(progn
(alert "Close all Excel spreadsheets to continue!")
(vlax-release-object *ExcelApp%)(gc)
);progn
);if
(setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
(if ExcelFile$
(if (findfile ExcelFile$)
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
);if
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
);if
(if Visible
(vla-put-visible *ExcelApp% :vlax-true)
);if
(if (= (type SheetName$) 'STR)
(progn
(vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
(setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
);vlax-for
(if (member SheetName$ Sheets@)
(vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
(if (= (vlax-get-property Worksheet "Name") SheetName$)
(vlax-invoke-method Worksheet "Activate")
);if
);vlax-for
(vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
);if
);progn
);if
(princ)
);defun OpenExcel
;-------------------------------------------------------------------------------
; PutCell - Put values into Excel cells
; Arguments: 2
; StartCell$ = Starting Cell ID
; Data@ = Value or list of values
; Syntax examples:
; (PutCell "A1" "PART NUMBER") = Puts PART NUMBER in cell A1
; (PutCell "B3" '("Dim" 7.5 "9.75")) = Starting with cell B3 put Dim, 7.5, and 9.75 across
;-------------------------------------------------------------------------------
(defun PutCell (StartCell$ Data@ / Cell$ Column# ExcelRange Row#)
(if (= (type Data@) 'STR)
(setq Data@ (list Data@))
)
(setq ExcelRange (vlax-get-property *ExcelApp% "Cells"))
(if (Cell-p StartCell$)
(setq Column# (car (ColumnRow StartCell$))
Row# (cadr (ColumnRow StartCell$))
);setq
(if (vl-catch-all-error-p
(setq Cell$ (vl-catch-all-apply 'vlax-get-property
(list (vlax-get-property *ExcelApp% "ActiveSheet") "Range" StartCell$))
);setq
);vl-catch-all-error-p
(alert (strcat "The cell ID \"" StartCell$ "\" is invalid."))
(setq Column# (vlax-get-property Cell$ "Column")
Row# (vlax-get-property Cell$ "Row")
);setq
);if
);if
(if (and Column# Row#)
(foreach Item Data@
(vlax-put-property ExcelRange "Item" Row# Column# (vl-princ-to-string Item))
(setq Column# (1+ Column#))
);foreach
);if
(princ)
);defun PutCell
;-------------------------------------------------------------------------------
; CloseExcel - Closes Excel spreadsheet
; Arguments: 1
; ExcelFile$ = Excel saveas filename or nil to close without saving
; Syntax examples:
; (CloseExcel "C:\\Temp\\Temp.xls") = Saveas C:\Temp\Temp.xls and close
; (CloseExcel nil) = Close without saving
;-------------------------------------------------------------------------------
(defun CloseExcel (ExcelFile$ / Saveas)
(if ExcelFile$
(if (= (strcase ExcelFile$) (strcase *ExcelFile$))
(if (findfile ExcelFile$)
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") "Save")
(setq Saveas t)
);if
(if (findfile ExcelFile$)
(progn
(vl-file-delete (findfile ExcelFile$))
(setq Saveas t)
);progn
(setq Saveas t)
);if
);if
);if
(if Saveas
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook")
"SaveAs" ExcelFile$ -4143 "" "" :vlax-false :vlax-false nil
);vlax-invoke-method
);if
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
(vlax-invoke-method *ExcelApp% 'Quit)
(vlax-release-object *ExcelApp%)(gc)
(setq *ExcelApp% nil *ExcelFile$ nil)
(princ)
);defun CloseExcel
;-------------------------------------------------------------------------------
; ColumnRow - Returns a list of the Column and Row number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Cell$ = Cell ID
; Syntax example: (ColumnRow "ABC987") = '(731 987)
;-------------------------------------------------------------------------------
(defun ColumnRow (Cell$ / Column$ Char$ Row#)
(setq Column$ "")
(while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
(setq Column$ (strcat Column$ Char$)
Cell$ (substr Cell$ 2)
);setq
);while
(if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
(list (Alpha2Number Column$) Row#)
'(1 1);default to "A1" if there's a problem
);if
);defun ColumnRow
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
(defun Alpha2Number (Str$ / Num#)
(if (= 0 (setq Num# (strlen Str$)))
0
(+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
(Alpha2Number (substr Str$ 2))
);+
);if
);defun Alpha2Number
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
(defun Number2Alpha (Num# / Val#)
(if (< Num# 27)
(chr (+ 64 Num#))
(if (= 0 (setq Val# (rem Num# 26)))
(strcat (Number2Alpha (1- (/ Num# 26))) "Z")
(strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
);if
);if
);defun Number2Alpha
;-------------------------------------------------------------------------------
; Cell-p - Evaluates if the argument Cell$ is a valid cell ID
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Cell$ = String of the cell ID to evaluate
; Syntax examples: (Cell-p "B12") = t, (Cell-p "BT") = nil
;-------------------------------------------------------------------------------
(defun Cell-p (Cell$)
(and (= (type Cell$) 'STR)
(or (= (strcase Cell$) "A1")
(not (equal (ColumnRow Cell$) '(1 1)))
);or
);and
);defun Cell-p
;-------------------------------------------------------------------------------
; Row+n - Returns the cell ID located a number of rows from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
; Cell$ = Starting cell ID
; Num# = Number of rows from cell
; Syntax examples: (Row+n "B12" 3) = "B15", (Row+n "B12" -3) = "B9"
;-------------------------------------------------------------------------------
(defun Row+n (Cell$ Num#)
(setq Cell$ (ColumnRow Cell$))
(strcat (Number2Alpha (car Cell$)) (itoa (max 1 (+ (cadr Cell$) Num#))))
);defun Row+n
;-------------------------------------------------------------------------------
; Column+n - Returns the cell ID located a number of columns from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
; Cell$ = Starting cell ID
; Num# = Number of columns from cell
; Syntax examples: (Column+n "B12" 3) = "E12", (Column+n "B12" -1) = "A12"
;-------------------------------------------------------------------------------
(defun Column+n (Cell$ Num#)
(setq Cell$ (ColumnRow Cell$))
(strcat (Number2Alpha (max 1 (+ (car Cell$) Num#))) (itoa (cadr Cell$)))
);defun Column+n
;-------------------------------------------------------------------------------
; rtosr - Used to change a real number into a short real number string
; stripping off all trailing 0's.
; Arguments: 1
; RealNum~ = Real number to convert to a short string real number
; Returns: ShortReal$ the short string real number value of the real number.
;-------------------------------------------------------------------------------
(defun rtosr (RealNum~ / DimZin# ShortReal$)
(setq DimZin# (getvar "DIMZIN"))
(setvar "DIMZIN" 8)
(setq ShortReal$ (rtos RealNum~ 2 8))
(setvar "DIMZIN" DimZin#)
ShortReal$
);defun rtosr

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
mình dùng theo cái này

bạn có cách gì để sử dụng nó không

Người ta đã ghi rõ comment và cách sử dụng rồi mà. Bạn tham khảo code sau, có thêm vài dòng comment của ssg và các ví dụ ở cuối file. Bạn appload, chạy lần lượt các lệnh từ VD1 đến VD5, quan sát các phản ứng trên Cad lẫn Excel sẽ hiểu rõ hơn:

;;;(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
;;;ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)

(defun GetExcel (ExcelFile$ SheetName$ MaxRange$)
(if (= (type ExcelFile$) 'STR)
   (if (not (findfile ExcelFile$))
       (progn
           (alert (strcat "Excel file " ExcelFile$ " not found."))
           (exit)
       );progn
   );if
   (progn
       (alert "Excel file not specified.")
       (exit)
   );progn
);if
(gc)
(if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
       (alert "Close all Excel spreadsheets to continue!")
       (vlax-release-object *ExcelApp%)
       (gc)
   );progn
);if

;;;Phan chu yeu cua function
(setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
(if SheetName$
   (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
       (if (= (vlax-get-property Worksheet "Name") SheetName$)
           (vlax-invoke-method Worksheet "Activate")
       );if
   );vlax-for
);if
(setq ColumnRow@ (ColumnRow MaxRange$))
(setq MaxColumn# (nth 0 ColumnRow@))
(setq MaxRow# (nth 1 ColumnRow@))
(setq *ExcelData@ nil)
(setq Row# 1)
(repeat MaxRow#
   (setq Data@ nil)
   (setq Column# 1)
   (repeat MaxColumn#
       (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
       (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
       (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
       (setq ExcelValue (vlax-variant-value ExcelVariant^))
       (setq ExcelValue
           (cond
               ((= (type ExcelValue) 'INT) (itoa ExcelValue))
               ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
               ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
               ((/= (type ExcelValue) 'STR) "")
           );cond
       );setq
       (setq Data@ (append Data@ (list ExcelValue)))
       (setq Column# (1+ Column#))
   );repeat
   (setq *ExcelData@ (append *ExcelData@ (list Data@)))
   (setq Row# (1+ Row#))
);repeat
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
(vlax-invoke-method *ExcelApp% 'Quit)
(vlax-release-object *ExcelApp%)(gc)
(setq *ExcelApp% nil)
*ExcelData@
)
;-------------------------------------------------------------------------------
; GetCell - Returns the cell value from the *ExcelData@ list
; Arguments: 1
; Cell$ = Cell ID
; Syntax example: (GetCell "E19") = value of cell E19
;-------------------------------------------------------------------------------
(defun GetCell (Cell$ / Column# ColumnRow@ Return Row#)
(setq ColumnRow@ (ColumnRow Cell$))
(setq Column# (1- (nth 0 ColumnRow@)))
(setq Row# (1- (nth 1 ColumnRow@)))
(setq Return "")
(if *ExcelData@
(if (and (>= (length *ExcelData@) Row#)(>= (length (nth 0 *ExcelData@)) Column#))
(setq Return (nth Column# (nth Row# *ExcelData@)))
);if
);if
Return
);defun GetCell
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
; Arguments: 3
; ExcelFile$ = Excel filename or nil for new spreadsheet
; SheetName$ = Sheet name or nil for not specified
; Visible = t for visible or nil for hidden
; Syntax examples:
; (OpenExcel "C:\\Temp\\Temp.xls" "Sheet2" t) = Opens C:\Temp\Temp.xls on Sheet2 as visible session
; (OpenExcel "C:\\Temp\\Temp.xls" nil nil) = Opens C:\Temp\Temp.xls on current sheet as hidden session
; (OpenExcel nil "Parts List" nil) = Opens a new spreadsheet and creates a Part List sheet as hidden session
;-------------------------------------------------------------------------------
(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
(if (= (type ExcelFile$) 'STR)
(if (findfile ExcelFile$)
(setq *ExcelFile$ ExcelFile$)
(progn
(alert (strcat "Excel file " ExcelFile$ " not found."))
(exit)
);progn
);if
(setq *ExcelFile$ "")
);if
(gc)
(if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
(progn
(alert "Close all Excel spreadsheets to continue!")
(vlax-release-object *ExcelApp%)(gc)
);progn
);if
(setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
(if ExcelFile$
(if (findfile ExcelFile$)
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
);if
(vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
);if
(if Visible
(vla-put-visible *ExcelApp% :vlax-true)
);if
(if (= (type SheetName$) 'STR)
(progn
(vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
(setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
);vlax-for
(if (member SheetName$ Sheets@)
(vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
(if (= (vlax-get-property Worksheet "Name") SheetName$)
(vlax-invoke-method Worksheet "Activate")
);if
);vlax-for
(vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
);if
);progn
);if
(princ)
);defun OpenExcel
;-------------------------------------------------------------------------------
; PutCell - Put values into Excel cells
; Arguments: 2
; StartCell$ = Starting Cell ID
; Data@ = Value or list of values
; Syntax examples:
; (PutCell "A1" "PART NUMBER") = Puts PART NUMBER in cell A1
; (PutCell "B3" '("Dim" 7.5 "9.75")) = Starting with cell B3 put Dim, 7.5, and 9.75 across
;-------------------------------------------------------------------------------
(defun PutCell (StartCell$ Data@ / Cell$ Column# ExcelRange Row#)
(if (= (type Data@) 'STR)
(setq Data@ (list Data@))
)
(setq ExcelRange (vlax-get-property *ExcelApp% "Cells"))
(if (Cell-p StartCell$)
(setq Column# (car (ColumnRow StartCell$))
Row# (cadr (ColumnRow StartCell$))
);setq
(if (vl-catch-all-error-p
(setq Cell$ (vl-catch-all-apply 'vlax-get-property
(list (vlax-get-property *ExcelApp% "ActiveSheet") "Range" StartCell$))
);setq
);vl-catch-all-error-p
(alert (strcat "The cell ID \"" StartCell$ "\" is invalid."))
(setq Column# (vlax-get-property Cell$ "Column")
Row# (vlax-get-property Cell$ "Row")
);setq
);if
);if
(if (and Column# Row#)
(foreach Item Data@
(vlax-put-property ExcelRange "Item" Row# Column# (vl-princ-to-string Item))
(setq Column# (1+ Column#))
);foreach
);if
(princ)
);defun PutCell
;-------------------------------------------------------------------------------
; CloseExcel - Closes Excel spreadsheet
; Arguments: 1
; ExcelFile$ = Excel saveas filename or nil to close without saving
; Syntax examples:
; (CloseExcel "C:\\Temp\\Temp.xls") = Saveas C:\Temp\Temp.xls and close
; (CloseExcel nil) = Close without saving
;-------------------------------------------------------------------------------
(defun CloseExcel (ExcelFile$ / Saveas)
(if ExcelFile$
(if (= (strcase ExcelFile$) (strcase *ExcelFile$))
(if (findfile ExcelFile$)
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") "Save")
(setq Saveas t)
);if
(if (findfile ExcelFile$)
(progn
(vl-file-delete (findfile ExcelFile$))
(setq Saveas t)
);progn
(setq Saveas t)
);if
);if
);if
(if Saveas
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook")
"SaveAs" ExcelFile$ -4143 "" "" :vlax-false :vlax-false nil
);vlax-invoke-method
);if
(vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
(vlax-invoke-method *ExcelApp% 'Quit)
(vlax-release-object *ExcelApp%)(gc)
(setq *ExcelApp% nil *ExcelFile$ nil)
(princ)
);defun CloseExcel
;-------------------------------------------------------------------------------
; ColumnRow - Returns a list of the Column and Row number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Cell$ = Cell ID
; Syntax example: (ColumnRow "ABC987") = '(731 987)
;-------------------------------------------------------------------------------
(defun ColumnRow (Cell$ / Column$ Char$ Row#)
(setq Column$ "")
(while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
(setq Column$ (strcat Column$ Char$)
Cell$ (substr Cell$ 2)
);setq
);while
(if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
(list (Alpha2Number Column$) Row#)
'(1 1);default to "A1" if there's a problem
);if
);defun ColumnRow
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
(defun Alpha2Number (Str$ / Num#)
(if (= 0 (setq Num# (strlen Str$)))
0
(+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
(Alpha2Number (substr Str$ 2))
);+
);if
);defun Alpha2Number
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
(defun Number2Alpha (Num# / Val#)
(if (< Num# 27)
(chr (+ 64 Num#))
(if (= 0 (setq Val# (rem Num# 26)))
(strcat (Number2Alpha (1- (/ Num# 26))) "Z")
(strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
);if
);if
);defun Number2Alpha
;-------------------------------------------------------------------------------
; Cell-p - Evaluates if the argument Cell$ is a valid cell ID
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
; Cell$ = String of the cell ID to evaluate
; Syntax examples: (Cell-p "B12") = t, (Cell-p "BT") = nil
;-------------------------------------------------------------------------------
(defun Cell-p (Cell$)
(and (= (type Cell$) 'STR)
(or (= (strcase Cell$) "A1")
(not (equal (ColumnRow Cell$) '(1 1)))
);or
);and
);defun Cell-p
;-------------------------------------------------------------------------------
; Row+n - Returns the cell ID located a number of rows from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
; Cell$ = Starting cell ID
; Num# = Number of rows from cell
; Syntax examples: (Row+n "B12" 3) = "B15", (Row+n "B12" -3) = "B9"
;-------------------------------------------------------------------------------
(defun Row+n (Cell$ Num#)
(setq Cell$ (ColumnRow Cell$))
(strcat (Number2Alpha (car Cell$)) (itoa (max 1 (+ (cadr Cell$) Num#))))
);defun Row+n
;-------------------------------------------------------------------------------
; Column+n - Returns the cell ID located a number of columns from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
; Cell$ = Starting cell ID
; Num# = Number of columns from cell
; Syntax examples: (Column+n "B12" 3) = "E12", (Column+n "B12" -1) = "A12"
;-------------------------------------------------------------------------------
(defun Column+n (Cell$ Num#)
(setq Cell$ (ColumnRow Cell$))
(strcat (Number2Alpha (max 1 (+ (car Cell$) Num#))) (itoa (cadr Cell$)))
);defun Column+n
;-------------------------------------------------------------------------------
; rtosr - Used to change a real number into a short real number string
; stripping off all trailing 0's.
; Arguments: 1
; RealNum~ = Real number to convert to a short string real number
; Returns: ShortReal$ the short string real number value of the real number.
;-------------------------------------------------------------------------------
(defun rtosr (RealNum~ / DimZin# ShortReal$)
(setq DimZin# (getvar "DIMZIN"))
(setvar "DIMZIN" 8)
(setq ShortReal$ (rtos RealNum~ 2 8))
(setvar "DIMZIN" DimZin#)
ShortReal$
);defun rtosr
;-------------------------------------------------------------------------------
(princ);End of GetExcel.lsp 
;;;******************************************************************

;;;Vi du ap dung cac function tren
;;;---------------------------------------------------------------------
(defun C:VD1()
(vl-load-com)
(setq fn (getfiled "Select Excel File" "" "xls" 0))
(getexcel fn "sheet1" "d11")
)
;;;---------------------------------------------------------------------
(defun C:VD2() (alert (strcat "B3 = " (getcell "B3"))))
;;;---------------------------------------------------------------------
(defun C:VD3() (openexcel fn "sheet4" T))
;;;---------------------------------------------------------------------
(defun C:VD4()
   (putcell "B10" (list "How"  "are you?"))
   (setq mycell (getstring "\nCell address:"))
   (putcell mycell "I'm fine, thank you!")
)
;;;---------------------------------------------------------------------
(defun C:VD5() (closeExcel fn))
;;;----------------------------------------------------------------------

 

Góp ý:

Các nội dung code bạn nên cho vào codebox để topic được gọn gàng. Mặt khác, các định dạng code (như các chỗ ra vô đầu dòng chẳng hạn) sẽ được bảo toàn y như nguyên mẫu. Ssg đã edit bài của bạn và cho nó vô rồi đó, nhìn tổng thể trang topic cảm thấy dễ chịu hơn!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

tôi hiểu cách sử dụng của nó rồi

cái mà tôi muốn hỏi là nếu dùng theo cách này thì không đưa dữ liệu từ exel vào lispvariable nguyên vẹn được:

chẳng hạn trên exel là:

tiểu khu

thì lispvariable là:

ti?u khu

và tôi ko có cách nào để lấy nguyên nó được

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

còn đây là code của get_xl

 

;|
    GET_XL.LSP
    Created by Elpanov Evgeniy
    842@list.ru
    elpanov@gmail.com

Data reading from Microsoft Excel not using Excel.
This code, can read diverse data from all tables.

ARGUMENTS:
A string containing a complete file name, including the path.
(setq tbl "D:\\7.xls")

USAGE:
(GET_xl tbl)

RETURN VFALUES
The list of all pages in a file with all data
|;
(defun rec-rem-dupl (lst)
(if lst
 (cons (car lst) (rec-rem-dupl (vl-remove (car lst) (cdr lst))))
) ;_  if
) ;_  defun
(defun GET_xl (tbl / ADOCONNECT ADORECORDSET LST)
(setq
 ADOConnect   (vlax-get-or-create-object "ADODB.Connection")
 ADORecordset (vlax-get-or-create-object "ADODB.Recordset")
) ;_  setq
(if (not
     (vl-catch-all-error-p
      (vl-catch-all-apply
       (function vlax-invoke-method)
       (list
        ADOConnect
        "Open"
        (strcat
         "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
         tbl
         ";Extended Properties=;Excel 8.0;HDR=No"
        ) ;_  strcat
        "admin"
        ""
        nil
       ) ;_  list
      ) ;_  vl-catch-all-apply
     ) ;_  vl-catch-all-error-p
    ) ;_  not
 (progn
  (setq
   lst (mapcar
        (function
         (lambda (l / i c)
          (vlax-invoke-method
           ADORecordset
           "Open"
           (strcat "SELECT * FROM [" l "]")
           ADOConnect
           1
           3
           nil
          ) ;_  vlax-invoke-method
          (setq
           i (length
              (car
               (vlax-safearray->list
                (vlax-variant-value
                 (vlax-invoke-method
                  ADORecordset
                  "GetRows"
                  65535
                 ) ;_  vlax-invoke-method
                ) ;_  vlax-variant-value
               ) ;_  vlax-safearray->list
              ) ;_  car
             ) ;_  length
          ) ;_  setq
          (vlax-invoke-method ADORecordset "Close")
          (while (not (zerop i))
           (vlax-invoke-method
            ADORecordset
            "Open"
            (strcat "SELECT * FROM [" l "a" (itoa i) ":IV" (itoa i) "]")
            ADOConnect
            1
            3
            nil
           ) ;_  vlax-invoke-method
           (setq
            c (cons
               (car
                (apply
                 (function mapcar)
                 (cons
                  'list
                  (mapcar
                   (function
                    (lambda (a)
                     (mapcar
                      (function
                       (lambda (:cheers:
                        (vlax-variant-value :cheers:
                       ) ;_  lambda
                      ) ;_  function
                      a
                     ) ;_  mapcar
                    ) ;_  lambda
                   ) ;_  function
                   (vlax-safearray->list
                    (vlax-variant-value
                     (vlax-invoke-method
                      ADORecordset
                      "GetRows"
                      65535
                     ) ;_  vlax-invoke-method
                    ) ;_  vlax-variant-value
                   ) ;_  vlax-safearray->list
                  ) ;_  mapcar
                 ) ;_  cons
                ) ;_  apply
               ) ;_  car
               c
              ) ;_  cons
            i (1- i)
           ) ;_  setq
           (vlax-invoke-method ADORecordset "Close")
          ) ;_  while
          (if (equal c '((nil) (nil)))
           (list l)
           (cons l c)
          ) ;_  if
         ) ;_  lambda
        ) ;_  function
        (rec-rem-dupl
         (caddr
          (mapcar
           (function
            (lambda (a)
             (mapcar
              (function vlax-variant-value)
              a
             ) ;_  mapcar
            ) ;_  lambda
           ) ;_  function
           (vlax-safearray->list
            (vlax-variant-value
             (vlax-invoke-method
              (vlax-invoke-method
               ADOConnect
               "OpenSchema"
               4
              ) ;_  vlax-invoke-method
              "GetRows"
              65535
             ) ;_  vlax-invoke-method
            ) ;_  vlax-variant-value
           ) ;_  vlax-safearray->list
          ) ;_  apply
         ) ;_  caddr
        ) ;_  rec-rem-dupl
       ) ;_  mapcar
  ) ;_  setq
  (vlax-invoke-method ADOConnect "Close")
  (vlax-release-object ADORecordset)
  (vlax-release-object ADOConnect)
  (setq ADORecordset nil
        ADOConnect nil
  ) ;_  setq
  lst
 ) ;_  progn
 (progn
  (vl-catch-all-apply
   'vlax-invoke-method
   (list ADOConnect "Close")
  ) ;_  vl-catch-all-apply
  (vlax-release-object ADORecordset)
  (vlax-release-object ADOConnect)
  (setq ADORecordset nil
        ADOConnect nil
  ) ;_  setq
  nil
 ) ;_  progn
) ;_  if
) ;_  defun

;|
    GET_XL.LSP
    Created by Elpanov Evgeniy
    842@list.ru
    elpanov@gmail.com

Data reading from Microsoft Excel not using Excel.
This code, can read diverse data from all tables.

ARGUMENTS:
A string containing a complete file name, including the path.
(setq tbl "D:\\7.xls")

USAGE:
(GET_xl tbl)

RETURN VFALUES
The list of all pages in a file with all data
|;
(defun rec-rem-dupl (lst)
(if lst
 (cons (car lst) (rec-rem-dupl (vl-remove (car lst) (cdr lst))))
) ;_  if
) ;_  defun
(defun GET_xl (tbl / ADOCONNECT ADORECORDSET LST)
(setq
 ADOConnect   (vlax-get-or-create-object "ADODB.Connection")
 ADORecordset (vlax-get-or-create-object "ADODB.Recordset")
) ;_  setq
(if (not
     (vl-catch-all-error-p
      (vl-catch-all-apply
       (function vlax-invoke-method)
       (list
        ADOConnect
        "Open"
        (strcat
         "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
         tbl
         ";Extended Properties=;Excel 8.0;HDR=No"
        ) ;_  strcat
        "admin"
        ""
        nil
       ) ;_  list
      ) ;_  vl-catch-all-apply
     ) ;_  vl-catch-all-error-p
    ) ;_  not
 (progn
  (setq
   lst (mapcar
        (function
         (lambda (l / i c)
          (vlax-invoke-method
           ADORecordset
           "Open"
           (strcat "SELECT * FROM [" l "]")
           ADOConnect
           1
           3
           nil
          ) ;_  vlax-invoke-method
          (setq
           i (length
              (car
               (vlax-safearray->list
                (vlax-variant-value
                 (vlax-invoke-method
                  ADORecordset
                  "GetRows"
                  65535
                 ) ;_  vlax-invoke-method
                ) ;_  vlax-variant-value
               ) ;_  vlax-safearray->list
              ) ;_  car
             ) ;_  length
          ) ;_  setq
          (vlax-invoke-method ADORecordset "Close")
          (while (not (zerop i))
           (vlax-invoke-method
            ADORecordset
            "Open"
            (strcat "SELECT * FROM [" l "a" (itoa i) ":IV" (itoa i) "]")
            ADOConnect
            1
            3
            nil
           ) ;_  vlax-invoke-method
           (setq
            c (cons
               (car
                (apply
                 (function mapcar)
                 (cons
                  'list
                  (mapcar
                   (function
                    (lambda (a)
                     (mapcar
                      (function
                       (lambda (:s_big:
                        (vlax-variant-value B)
                       ) ;_  lambda
                      ) ;_  function
                      a
                     ) ;_  mapcar
                    ) ;_  lambda
                   ) ;_  function
                   (vlax-safearray->list
                    (vlax-variant-value
                     (vlax-invoke-method
                      ADORecordset
                      "GetRows"
                      65535
                     ) ;_  vlax-invoke-method
                    ) ;_  vlax-variant-value
                   ) ;_  vlax-safearray->list
                  ) ;_  mapcar
                 ) ;_  cons
                ) ;_  apply
               ) ;_  car
               c
              ) ;_  cons
            i (1- i)
           ) ;_  setq
           (vlax-invoke-method ADORecordset "Close")
          ) ;_  while
          (if (equal c '((nil) (nil)))
           (list l)
           (cons l c)
          ) ;_  if
         ) ;_  lambda
        ) ;_  function
        (rec-rem-dupl
         (caddr
          (mapcar
           (function
            (lambda (a)
             (mapcar
              (function vlax-variant-value)
              a
             ) ;_  mapcar
            ) ;_  lambda
           ) ;_  function
           (vlax-safearray->list
            (vlax-variant-value
             (vlax-invoke-method
              (vlax-invoke-method
               ADOConnect
               "OpenSchema"
               4
              ) ;_  vlax-invoke-method
              "GetRows"
              65535
             ) ;_  vlax-invoke-method
            ) ;_  vlax-variant-value
           ) ;_  vlax-safearray->list
          ) ;_  apply
         ) ;_  caddr
        ) ;_  rec-rem-dupl
       ) ;_  mapcar
  ) ;_  setq
  (vlax-invoke-method ADOConnect "Close")
  (vlax-release-object ADORecordset)
  (vlax-release-object ADOConnect)
  (setq ADORecordset nil
        ADOConnect nil
  ) ;_  setq
  lst
 ) ;_  progn
 (progn
  (vl-catch-all-apply
   'vlax-invoke-method
   (list ADOConnect "Close")
  ) ;_  vl-catch-all-apply
  (vlax-release-object ADORecordset)
  (vlax-release-object ADOConnect)
  (setq ADORecordset nil
        ADOConnect nil
  ) ;_  setq
  nil
 ) ;_  progn
) ;_  if
) ;_  defun

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
tôi hiểu cách sử dụng của nó rồi

cái mà tôi muốn hỏi là nếu dùng theo cách này thì không đưa dữ liệu từ exel vào lispvariable nguyên vẹn được:

chẳng hạn trên exel là:

tiểu khu

thì lispvariable là:

ti?u khu

và tôi ko có cách nào để lấy nguyên nó được

Ssg đã thử, kết quả nhận được từ function GetCell chẳng hạn. Trong TextWindow của Acad có thể loằng ngoằng, nhưng dùng giá trị của variable để thể hiện ra đối tượng Text thì vẫn "dấu má" đầy đủ. Bạn thử lại đi, nếu vẫn không được, ssg sẽ post file đã làm ví dụ cho bạn xem.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Bạn thử đoạn code và file *.xls này, chọn font trong Cad là vnsimple.shx (và nói chung là dòng họ TCVN3-ABC):

 

;;;---------------------------------------------------------------------
(defun wtxt (txt p / sty d h) ;;;Write txt on graphic screen, defaul setting
(setq
   sty (getvar "textstyle")
   d (tblsearch "style" sty)
   h (cdr (assoc 40 d))
)
(if (= h 0) (setq h (cdr (assoc 42 d))))
(entmake
   (list (cons 0 "TEXT") (cons 7 sty) (cons 1 txt) (cons 10 p) (cons 40 h) (assoc 41 d))
)
)
;;;---------------------------------------------------------------------
(defun C:VD()
(vl-load-com)
(setq fn (getfiled "Select Excel File" "" "xls" 0))
(getexcel fn "sheet1" "C15")
(setq x (getcell "C8"))
(wtxt x (getpoint "\nChon diem dat text lay tu cell C8:"))
)
;;;---------------------------------------------------------------------

 

http://www.cadviet.com/upfiles/vidu_1.zip

 

Kết quả

Nội dung cell C8 hiện ra đầy đủ dấu tiếng Việt. Nếu bạn thử không được có nghĩa là System hoặc Cad của bạn "có vấn đề"!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

sgs nói đúng

tôi dùng .VnArial thì tất cả ngon rồi

giờ đang tìm cách đưa các font khác về .Vnarial

sgs có hiểu lí do của việc buộc fải dùng .Vnarial ko?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Các đoạn code này PP thấy trong trang http://web2.airmail.net/terrycad , ngoài ra còn có nhiều CODE khác nữa. Hope this help.

;-------------------------------------------------------------------------------
; Program Name: GetExcel.lsp [GetExcel R4]
; Created By:   Terry Miller (Email: terrycadd@yahoo.com)
;               (URL: [url="http://web2.airmail.net/terrycad)"]http://web2.airmail.net/terrycad)[/url]
; Date Created: 9-20-03
; Function:     Several functions to get and put values into Excel cells.
;-------------------------------------------------------------------------------
; Revision History
; Rev  By     Date    Description
;-------------------------------------------------------------------------------
; 1    TM   9-20-03   Initial version
; 2    TM   8-20-07   Rewrote GetExcel.lsp and added several new sub-functions
;                     including ColumnRow, Alpha2Number and Number2Alpha written
;                     by Gilles Chanteau from Marseille, France.
; 3    TM   12-1-07   Added several sub-functions written by Gilles Chanteau
;                     including Cell-p, Row+n, and Column+n. Also added his
;                     revision of the PutCell function.
; 4    GC   9-20-08   Revised the GetExcel argument MaxRange$ to accept a nil
;                     and get the current region from cell A1.
;-------------------------------------------------------------------------------
; Overview of Main functions
;-------------------------------------------------------------------------------
; GetExcel - Stores the values from an Excel spreadsheet into *ExcelData@ list
;   Syntax:  (GetExcel ExcelFile$ SheetName$ MaxRange$)
;   Example: (GetExcel "C:\\Folder\\Filename.xls" "Sheet1" "L30")
; GetCell - Returns the cell value from the *ExcelData@ list
;   Syntax:  (GetCell Cell$)
;   Example: (GetCell "H15")
; Function example of usage:
; (defun c:Get-Example ()
;   (GetExcel "C:\\Folder\\Filename.xls" "Sheet1" "L30");<-- Edit Filename.xls
;   (GetCell "H21");Or you can just use the global *ExcelData@ list
; );defun
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
;   Syntax:  (OpenExcel ExcelFile$ SheetName$ Visible)
;   Example: (OpenExcel "C:\\Folder\\Filename.xls" "Sheet1" nil)
; PutCell - Put values into Excel cells
;   Syntax:  (PutCell StartCell$ Data$) or (PutCell StartCell$ DataList@)
;   Example: (PutCell "A1" (list "GP093" 58.5 17 "Base" "3'-6 1/4\""))
; CloseExcel - Closes Excel session
;   Syntax:  (CloseExcel ExcelFile$)
;   Example: (CloseExcel "C:\\Folder\\Filename.xls")
; Function example of usage:
; (defun c:Put-Example ()
;   (OpenExcel "C:\\Folder\\Filename.xls" "Sheet1" nil);<-- Edit Filename.xls
;   (PutCell "A1" (list "GP093" 58.5 17 "Base" "3'-6 1/4\""));Repeat as required
;   (CloseExcel "C:\\Folder\\Filename.xls");<-- Edit Filename.xls
;   (princ)
; );defun
;-------------------------------------------------------------------------------
; Note: Review the conditions of each argument in the function headings
;-------------------------------------------------------------------------------
; GetExcel - Stores the values from an Excel spreadsheet into *ExcelData@ list
; Arguments: 3
;   ExcelFile$ = Path and filename
;   SheetName$ = Sheet name or nil for not specified
;   MaxRange$ = Maximum cell ID range to include or nil to get the current region from cell A1
; Syntax examples:
; (GetExcel "C:\\Temp\\Temp.xls" "Sheet1" "E19") = Open C:\Temp\Temp.xls on Sheet1 and read up to cell E19
; (GetExcel "C:\\Temp\\Temp.xls" nil "XYZ123") = Open C:\Temp\Temp.xls on current sheet and read up to cell XYZ123
;-------------------------------------------------------------------------------
(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
 ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (not (findfile ExcelFile$))
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (progn
     (alert "Excel file not specified.")
     (exit)
   );progn
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq ExcelFile$ (findfile ExcelFile$))
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
 (if SheetName$
   (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
     (if (= (vlax-get-property Worksheet "Name") SheetName$)
       (vlax-invoke-method Worksheet "Activate")
     );if
   );vlax-for
 );if
 (if MaxRange$
   (progn
     (setq ColumnRow@ (ColumnRow MaxRange$))
     (setq MaxColumn# (nth 0 ColumnRow@))
     (setq MaxRow# (nth 1 ColumnRow@))
   );progn
   (progn
     (setq CurRegion (vlax-get-property (vlax-get-property
       (vlax-get-property *ExcelApp% "ActiveSheet") "Range" "A1") "CurrentRegion")
     );setq
     (setq MaxRow# (vlax-get-property (vlax-get-property CurRegion "Rows") "Count"))
     (setq MaxColumn# (vlax-get-property (vlax-get-property CurRegion "Columns") "Count"))
   );progn
 );if
 (setq *ExcelData@ nil)
 (setq Row# 1)
 (repeat MaxRow#
   (setq Data@ nil)
   (setq Column# 1)
   (repeat MaxColumn#
     (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
     (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
     (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
     (setq ExcelValue (vlax-variant-value ExcelVariant^))
     (setq ExcelValue
       (cond
         ((= (type ExcelValue) 'INT) (itoa ExcelValue))
         ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
         ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
         ((/= (type ExcelValue) 'STR) "")
       );cond
     );setq
     (setq Data@ (append Data@ (list ExcelValue)))
     (setq Column# (1+ Column#))
   );repeat
   (setq *ExcelData@ (append *ExcelData@ (list Data@)))
   (setq Row# (1+ Row#))
 );repeat
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil)
 *ExcelData@
);defun GetExcel
;-------------------------------------------------------------------------------
; GetCell - Returns the cell value from the *ExcelData@ list
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (GetCell "E19") = value of cell E19
;-------------------------------------------------------------------------------
(defun GetCell (Cell$ / Column# ColumnRow@ Return Row#)
 (setq ColumnRow@ (ColumnRow Cell$))
 (setq Column# (1- (nth 0 ColumnRow@)))
 (setq Row# (1- (nth 1 ColumnRow@)))
 (setq Return "")
 (if *ExcelData@
   (if (and (>= (length *ExcelData@) Row#)(>= (length (nth 0 *ExcelData@)) Column#))
     (setq Return (nth Column# (nth Row# *ExcelData@)))
   );if
 );if
 Return
);defun GetCell
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
; Arguments: 3
;   ExcelFile$ = Excel filename or nil for new spreadsheet
;   SheetName$ = Sheet name or nil for not specified
;   Visible = t for visible or nil for hidden
; Syntax examples:
; (OpenExcel "C:\\Temp\\Temp.xls" "Sheet2" t) = Opens C:\Temp\Temp.xls on Sheet2 as visible session
; (OpenExcel "C:\\Temp\\Temp.xls" nil nil) = Opens C:\Temp\Temp.xls on current sheet as hidden session
; (OpenExcel nil "Parts List" nil) =  Opens a new spreadsheet and creates a Part List sheet as hidden session
;-------------------------------------------------------------------------------
(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (findfile ExcelFile$)
     (setq *ExcelFile$ ExcelFile$)
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (setq *ExcelFile$ "")
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (if ExcelFile$
   (if (findfile ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
   );if
   (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
 );if
 (if Visible
   (vla-put-visible *ExcelApp% :vlax-true)
 );if
 (if (= (type SheetName$) 'STR)
   (progn
     (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
       (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
     );vlax-for
     (if (member SheetName$ Sheets@)
       (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
         (if (= (vlax-get-property Worksheet "Name") SheetName$)
           (vlax-invoke-method Worksheet "Activate")
         );if
       );vlax-for
       (vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
     );if
   );progn
 );if
 (princ)
);defun OpenExcel
;-------------------------------------------------------------------------------
; PutCell - Put values into Excel cells
; Arguments: 2
;   StartCell$ = Starting Cell ID
;   Data@ = Value or list of values
; Syntax examples:
; (PutCell "A1" "PART NUMBER") = Puts PART NUMBER in cell A1
; (PutCell "B3" '("Dim" 7.5 "9.75")) = Starting with cell B3 put Dim, 7.5, and 9.75 across
;-------------------------------------------------------------------------------
(defun PutCell (StartCell$ Data@ / Cell$ Column# ExcelRange Row#)
 (if (= (type Data@) 'STR)
   (setq Data@ (list Data@))
 )
 (setq ExcelRange (vlax-get-property *ExcelApp% "Cells"))
 (if (Cell-p StartCell$)
   (setq Column# (car (ColumnRow StartCell$))
         Row# (cadr (ColumnRow StartCell$))
   );setq
   (if (vl-catch-all-error-p
         (setq Cell$ (vl-catch-all-apply 'vlax-get-property
           (list (vlax-get-property *ExcelApp% "ActiveSheet") "Range" StartCell$))
         );setq
       );vl-catch-all-error-p
       (alert (strcat "The cell ID \"" StartCell$ "\" is invalid."))
       (setq Column# (vlax-get-property Cell$ "Column")
             Row# (vlax-get-property Cell$ "Row")
       );setq
   );if
 );if
 (if (and Column# Row#)
   (foreach Item Data@
     (vlax-put-property ExcelRange "Item" Row# Column# (vl-princ-to-string Item))
     (setq Column# (1+ Column#))
   );foreach
 );if
 (princ)
);defun PutCell
;-------------------------------------------------------------------------------
; CloseExcel - Closes Excel spreadsheet
; Arguments: 1
;   ExcelFile$ = Excel saveas filename or nil to close without saving
; Syntax examples:
; (CloseExcel "C:\\Temp\\Temp.xls") = Saveas C:\Temp\Temp.xls and close
; (CloseExcel nil) = Close without saving
;-------------------------------------------------------------------------------
(defun CloseExcel (ExcelFile$ / Saveas)
 (if ExcelFile$
   (if (= (strcase ExcelFile$) (strcase *ExcelFile$))
     (if (findfile ExcelFile$)
       (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") "Save")
       (setq Saveas t)
     );if
     (if (findfile ExcelFile$)
       (progn
         (vl-file-delete (findfile ExcelFile$))
         (setq Saveas t)
       );progn
       (setq Saveas t)
     );if
   );if
 );if
 (if Saveas
   (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook")
     "SaveAs" ExcelFile$ -4143 "" "" :vlax-false :vlax-false nil
   );vlax-invoke-method
 );if
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil *ExcelFile$ nil)
 (princ)
);defun CloseExcel
;-------------------------------------------------------------------------------
; ColumnRow - Returns a list of the Column and Row number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (ColumnRow "ABC987") = '(731 987)
;-------------------------------------------------------------------------------
(defun ColumnRow (Cell$ / Column$ Char$ Row#)
 (setq Column$ "")
 (while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
   (setq Column$ (strcat Column$ Char$)
         Cell$ (substr Cell$ 2)
   );setq
 );while
 (if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
   (list (Alpha2Number Column$) Row#)
   '(1 1);default to "A1" if there's a problem
 );if
);defun ColumnRow
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
(defun Alpha2Number (Str$ / Num#)
 (if (= 0 (setq Num# (strlen Str$)))
   0
   (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
      (Alpha2Number (substr Str$ 2))
   );+
 );if
);defun Alpha2Number
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
(defun Number2Alpha (Num# / Val#)
 (if (< Num# 27)
   (chr (+ 64 Num#))
   (if (= 0 (setq Val# (rem Num# 26)))
     (strcat (Number2Alpha (1- (/ Num# 26))) "Z")
     (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
   );if
 );if
);defun Number2Alpha
;-------------------------------------------------------------------------------
; Cell-p - Evaluates if the argument Cell$ is a valid cell ID
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = String of the cell ID to evaluate
; Syntax examples: (Cell-p "B12") = t, (Cell-p "BT") = nil
;-------------------------------------------------------------------------------
(defun Cell-p (Cell$)
 (and (= (type Cell$) 'STR)
   (or (= (strcase Cell$) "A1")
     (not (equal (ColumnRow Cell$) '(1 1)))
   );or
 );and
);defun Cell-p
;-------------------------------------------------------------------------------
; Row+n - Returns the cell ID located a number of rows from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of rows from cell
; Syntax examples: (Row+n "B12" 3) = "B15", (Row+n "B12" -3) = "B9"
;-------------------------------------------------------------------------------
(defun Row+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (car Cell$)) (itoa (max 1 (+ (cadr Cell$) Num#))))
);defun Row+n
;-------------------------------------------------------------------------------
; Column+n - Returns the cell ID located a number of columns from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of columns from cell
; Syntax examples: (Column+n "B12" 3) = "E12", (Column+n "B12" -1) = "A12"
;-------------------------------------------------------------------------------
(defun Column+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (max 1 (+ (car Cell$) Num#))) (itoa (cadr Cell$)))
);defun Column+n
;-------------------------------------------------------------------------------
; rtosr - Used to change a real number into a short real number string
; stripping off all trailing 0's.
; Arguments: 1
;   RealNum~ = Real number to convert to a short string real number
; Returns: ShortReal$ the short string real number value of the real number.
;-------------------------------------------------------------------------------
(defun rtosr (RealNum~ / DimZin# ShortReal$)
 (setq DimZin# (getvar "DIMZIN"))
 (setvar "DIMZIN" 8)
 (setq ShortReal$ (rtos RealNum~ 2 8))
 (setvar "DIMZIN" DimZin#)
 ShortReal$
);defun rtosr
;-------------------------------------------------------------------------------
(princ);End of GetExcel.lsp

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Các đoạn code này PP thấy trong trang http://web2.airmail.net/terrycad , ngoài ra còn có nhiều CODE khác nữa. Hope this help.

;-------------------------------------------------------------------------------
; Program Name: GetExcel.lsp [GetExcel R4]
; Created By:   Terry Miller (Email: terrycadd@yahoo.com)
;               (URL: [url="http://web2.airmail.net/terrycad)"]http://web2.airmail.net/terrycad)[/url]
; Date Created: 9-20-03
; Function:     Several functions to get and put values into Excel cells.
;-------------------------------------------------------------------------------
; Revision History
; Rev  By     Date    Description
;-------------------------------------------------------------------------------
; 1    TM   9-20-03   Initial version
; 2    TM   8-20-07   Rewrote GetExcel.lsp and added several new sub-functions
;                     including ColumnRow, Alpha2Number and Number2Alpha written
;                     by Gilles Chanteau from Marseille, France.
; 3    TM   12-1-07   Added several sub-functions written by Gilles Chanteau
;                     including Cell-p, Row+n, and Column+n. Also added his
;                     revision of the PutCell function.
; 4    GC   9-20-08   Revised the GetExcel argument MaxRange$ to accept a nil
;                     and get the current region from cell A1.
;-------------------------------------------------------------------------------
; Overview of Main functions
;-------------------------------------------------------------------------------
; GetExcel - Stores the values from an Excel spreadsheet into *ExcelData@ list
;   Syntax:  (GetExcel ExcelFile$ SheetName$ MaxRange$)
;   Example: (GetExcel "C:\\Folder\\Filename.xls" "Sheet1" "L30")
; GetCell - Returns the cell value from the *ExcelData@ list
;   Syntax:  (GetCell Cell$)
;   Example: (GetCell "H15")
; Function example of usage:
; (defun c:Get-Example ()
;   (GetExcel "C:\\Folder\\Filename.xls" "Sheet1" "L30");<-- Edit Filename.xls
;   (GetCell "H21");Or you can just use the global *ExcelData@ list
; );defun
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
;   Syntax:  (OpenExcel ExcelFile$ SheetName$ Visible)
;   Example: (OpenExcel "C:\\Folder\\Filename.xls" "Sheet1" nil)
; PutCell - Put values into Excel cells
;   Syntax:  (PutCell StartCell$ Data$) or (PutCell StartCell$ DataList@)
;   Example: (PutCell "A1" (list "GP093" 58.5 17 "Base" "3'-6 1/4\""))
; CloseExcel - Closes Excel session
;   Syntax:  (CloseExcel ExcelFile$)
;   Example: (CloseExcel "C:\\Folder\\Filename.xls")
; Function example of usage:
; (defun c:Put-Example ()
;   (OpenExcel "C:\\Folder\\Filename.xls" "Sheet1" nil);<-- Edit Filename.xls
;   (PutCell "A1" (list "GP093" 58.5 17 "Base" "3'-6 1/4\""));Repeat as required
;   (CloseExcel "C:\\Folder\\Filename.xls");<-- Edit Filename.xls
;   (princ)
; );defun
;-------------------------------------------------------------------------------
; Note: Review the conditions of each argument in the function headings
;-------------------------------------------------------------------------------
; GetExcel - Stores the values from an Excel spreadsheet into *ExcelData@ list
; Arguments: 3
;   ExcelFile$ = Path and filename
;   SheetName$ = Sheet name or nil for not specified
;   MaxRange$ = Maximum cell ID range to include or nil to get the current region from cell A1
; Syntax examples:
; (GetExcel "C:\\Temp\\Temp.xls" "Sheet1" "E19") = Open C:\Temp\Temp.xls on Sheet1 and read up to cell E19
; (GetExcel "C:\\Temp\\Temp.xls" nil "XYZ123") = Open C:\Temp\Temp.xls on current sheet and read up to cell XYZ123
;-------------------------------------------------------------------------------
(defun GetExcel (ExcelFile$ SheetName$ MaxRange$ / Column# ColumnRow@ Data@ ExcelRange^
 ExcelValue ExcelValue ExcelVariant^ MaxColumn# MaxRow# Range$ Row# Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (not (findfile ExcelFile$))
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (progn
     (alert "Excel file not specified.")
     (exit)
   );progn
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq ExcelFile$ (findfile ExcelFile$))
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
 (if SheetName$
   (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
     (if (= (vlax-get-property Worksheet "Name") SheetName$)
       (vlax-invoke-method Worksheet "Activate")
     );if
   );vlax-for
 );if
 (if MaxRange$
   (progn
     (setq ColumnRow@ (ColumnRow MaxRange$))
     (setq MaxColumn# (nth 0 ColumnRow@))
     (setq MaxRow# (nth 1 ColumnRow@))
   );progn
   (progn
     (setq CurRegion (vlax-get-property (vlax-get-property
       (vlax-get-property *ExcelApp% "ActiveSheet") "Range" "A1") "CurrentRegion")
     );setq
     (setq MaxRow# (vlax-get-property (vlax-get-property CurRegion "Rows") "Count"))
     (setq MaxColumn# (vlax-get-property (vlax-get-property CurRegion "Columns") "Count"))
   );progn
 );if
 (setq *ExcelData@ nil)
 (setq Row# 1)
 (repeat MaxRow#
   (setq Data@ nil)
   (setq Column# 1)
   (repeat MaxColumn#
     (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
     (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
     (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
     (setq ExcelValue (vlax-variant-value ExcelVariant^))
     (setq ExcelValue
       (cond
         ((= (type ExcelValue) 'INT) (itoa ExcelValue))
         ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
         ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
         ((/= (type ExcelValue) 'STR) "")
       );cond
     );setq
     (setq Data@ (append Data@ (list ExcelValue)))
     (setq Column# (1+ Column#))
   );repeat
   (setq *ExcelData@ (append *ExcelData@ (list Data@)))
   (setq Row# (1+ Row#))
 );repeat
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil)
 *ExcelData@
);defun GetExcel
;-------------------------------------------------------------------------------
; GetCell - Returns the cell value from the *ExcelData@ list
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (GetCell "E19") = value of cell E19
;-------------------------------------------------------------------------------
(defun GetCell (Cell$ / Column# ColumnRow@ Return Row#)
 (setq ColumnRow@ (ColumnRow Cell$))
 (setq Column# (1- (nth 0 ColumnRow@)))
 (setq Row# (1- (nth 1 ColumnRow@)))
 (setq Return "")
 (if *ExcelData@
   (if (and (>= (length *ExcelData@) Row#)(>= (length (nth 0 *ExcelData@)) Column#))
     (setq Return (nth Column# (nth Row# *ExcelData@)))
   );if
 );if
 Return
);defun GetCell
;-------------------------------------------------------------------------------
; OpenExcel - Opens an Excel spreadsheet
; Arguments: 3
;   ExcelFile$ = Excel filename or nil for new spreadsheet
;   SheetName$ = Sheet name or nil for not specified
;   Visible = t for visible or nil for hidden
; Syntax examples:
; (OpenExcel "C:\\Temp\\Temp.xls" "Sheet2" t) = Opens C:\Temp\Temp.xls on Sheet2 as visible session
; (OpenExcel "C:\\Temp\\Temp.xls" nil nil) = Opens C:\Temp\Temp.xls on current sheet as hidden session
; (OpenExcel nil "Parts List" nil) =  Opens a new spreadsheet and creates a Part List sheet as hidden session
;-------------------------------------------------------------------------------
(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
 (if (= (type ExcelFile$) 'STR)
   (if (findfile ExcelFile$)
     (setq *ExcelFile$ ExcelFile$)
     (progn
       (alert (strcat "Excel file " ExcelFile$ " not found."))
       (exit)
     );progn
   );if
   (setq *ExcelFile$ "")
 );if
 (gc)
 (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
   (progn
     (alert "Close all Excel spreadsheets to continue!")
     (vlax-release-object *ExcelApp%)(gc)
   );progn
 );if
 (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
 (if ExcelFile$
   (if (findfile ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
     (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
   );if
   (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
 );if
 (if Visible
   (vla-put-visible *ExcelApp% :vlax-true)
 );if
 (if (= (type SheetName$) 'STR)
   (progn
     (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
       (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
     );vlax-for
     (if (member SheetName$ Sheets@)
       (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
         (if (= (vlax-get-property Worksheet "Name") SheetName$)
           (vlax-invoke-method Worksheet "Activate")
         );if
       );vlax-for
       (vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
     );if
   );progn
 );if
 (princ)
);defun OpenExcel
;-------------------------------------------------------------------------------
; PutCell - Put values into Excel cells
; Arguments: 2
;   StartCell$ = Starting Cell ID
;   Data@ = Value or list of values
; Syntax examples:
; (PutCell "A1" "PART NUMBER") = Puts PART NUMBER in cell A1
; (PutCell "B3" '("Dim" 7.5 "9.75")) = Starting with cell B3 put Dim, 7.5, and 9.75 across
;-------------------------------------------------------------------------------
(defun PutCell (StartCell$ Data@ / Cell$ Column# ExcelRange Row#)
 (if (= (type Data@) 'STR)
   (setq Data@ (list Data@))
 )
 (setq ExcelRange (vlax-get-property *ExcelApp% "Cells"))
 (if (Cell-p StartCell$)
   (setq Column# (car (ColumnRow StartCell$))
         Row# (cadr (ColumnRow StartCell$))
   );setq
   (if (vl-catch-all-error-p
         (setq Cell$ (vl-catch-all-apply 'vlax-get-property
           (list (vlax-get-property *ExcelApp% "ActiveSheet") "Range" StartCell$))
         );setq
       );vl-catch-all-error-p
       (alert (strcat "The cell ID \"" StartCell$ "\" is invalid."))
       (setq Column# (vlax-get-property Cell$ "Column")
             Row# (vlax-get-property Cell$ "Row")
       );setq
   );if
 );if
 (if (and Column# Row#)
   (foreach Item Data@
     (vlax-put-property ExcelRange "Item" Row# Column# (vl-princ-to-string Item))
     (setq Column# (1+ Column#))
   );foreach
 );if
 (princ)
);defun PutCell
;-------------------------------------------------------------------------------
; CloseExcel - Closes Excel spreadsheet
; Arguments: 1
;   ExcelFile$ = Excel saveas filename or nil to close without saving
; Syntax examples:
; (CloseExcel "C:\\Temp\\Temp.xls") = Saveas C:\Temp\Temp.xls and close
; (CloseExcel nil) = Close without saving
;-------------------------------------------------------------------------------
(defun CloseExcel (ExcelFile$ / Saveas)
 (if ExcelFile$
   (if (= (strcase ExcelFile$) (strcase *ExcelFile$))
     (if (findfile ExcelFile$)
       (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") "Save")
       (setq Saveas t)
     );if
     (if (findfile ExcelFile$)
       (progn
         (vl-file-delete (findfile ExcelFile$))
         (setq Saveas t)
       );progn
       (setq Saveas t)
     );if
   );if
 );if
 (if Saveas
   (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook")
     "SaveAs" ExcelFile$ -4143 "" "" :vlax-false :vlax-false nil
   );vlax-invoke-method
 );if
 (vlax-invoke-method (vlax-get-property *ExcelApp% "ActiveWorkbook") 'Close :vlax-False)
 (vlax-invoke-method *ExcelApp% 'Quit)
 (vlax-release-object *ExcelApp%)(gc)
 (setq *ExcelApp% nil *ExcelFile$ nil)
 (princ)
);defun CloseExcel
;-------------------------------------------------------------------------------
; ColumnRow - Returns a list of the Column and Row number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = Cell ID
; Syntax example: (ColumnRow "ABC987") = '(731 987)
;-------------------------------------------------------------------------------
(defun ColumnRow (Cell$ / Column$ Char$ Row#)
 (setq Column$ "")
 (while (< 64 (ascii (setq Char$ (strcase (substr Cell$ 1 1)))) 91)
   (setq Column$ (strcat Column$ Char$)
         Cell$ (substr Cell$ 2)
   );setq
 );while
 (if (and (/= Column$ "") (numberp (setq Row# (read Cell$))))
   (list (Alpha2Number Column$) Row#)
   '(1 1);default to "A1" if there's a problem
 );if
);defun ColumnRow
;-------------------------------------------------------------------------------
; Alpha2Number - Converts Alpha string into Number
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Str$ = String to convert
; Syntax example: (Alpha2Number "ABC") = 731
;-------------------------------------------------------------------------------
(defun Alpha2Number (Str$ / Num#)
 (if (= 0 (setq Num# (strlen Str$)))
   0
   (+ (* (- (ascii (strcase (substr Str$ 1 1))) 64) (expt 26 (1- Num#)))
      (Alpha2Number (substr Str$ 2))
   );+
 );if
);defun Alpha2Number
;-------------------------------------------------------------------------------
; Number2Alpha - Converts Number into Alpha string
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Num# = Number to convert
; Syntax example: (Number2Alpha 731) = "ABC"
;-------------------------------------------------------------------------------
(defun Number2Alpha (Num# / Val#)
 (if (< Num# 27)
   (chr (+ 64 Num#))
   (if (= 0 (setq Val# (rem Num# 26)))
     (strcat (Number2Alpha (1- (/ Num# 26))) "Z")
     (strcat (Number2Alpha (/ Num# 26)) (chr (+ 64 Val#)))
   );if
 );if
);defun Number2Alpha
;-------------------------------------------------------------------------------
; Cell-p - Evaluates if the argument Cell$ is a valid cell ID
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 1
;   Cell$ = String of the cell ID to evaluate
; Syntax examples: (Cell-p "B12") = t, (Cell-p "BT") = nil
;-------------------------------------------------------------------------------
(defun Cell-p (Cell$)
 (and (= (type Cell$) 'STR)
   (or (= (strcase Cell$) "A1")
     (not (equal (ColumnRow Cell$) '(1 1)))
   );or
 );and
);defun Cell-p
;-------------------------------------------------------------------------------
; Row+n - Returns the cell ID located a number of rows from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of rows from cell
; Syntax examples: (Row+n "B12" 3) = "B15", (Row+n "B12" -3) = "B9"
;-------------------------------------------------------------------------------
(defun Row+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (car Cell$)) (itoa (max 1 (+ (cadr Cell$) Num#))))
);defun Row+n
;-------------------------------------------------------------------------------
; Column+n - Returns the cell ID located a number of columns from cell
; Function By: Gilles Chanteau from Marseille, France
; Arguments: 2
;   Cell$ = Starting cell ID
;   Num# = Number of columns from cell
; Syntax examples: (Column+n "B12" 3) = "E12", (Column+n "B12" -1) = "A12"
;-------------------------------------------------------------------------------
(defun Column+n (Cell$ Num#)
 (setq Cell$ (ColumnRow Cell$))
 (strcat (Number2Alpha (max 1 (+ (car Cell$) Num#))) (itoa (cadr Cell$)))
);defun Column+n
;-------------------------------------------------------------------------------
; rtosr - Used to change a real number into a short real number string
; stripping off all trailing 0's.
; Arguments: 1
;   RealNum~ = Real number to convert to a short string real number
; Returns: ShortReal$ the short string real number value of the real number.
;-------------------------------------------------------------------------------
(defun rtosr (RealNum~ / DimZin# ShortReal$)
 (setq DimZin# (getvar "DIMZIN"))
 (setvar "DIMZIN" 8)
 (setq ShortReal$ (rtos RealNum~ 2 8))
 (setvar "DIMZIN" DimZin#)
 ShortReal$
);defun rtosr
;-------------------------------------------------------------------------------
(princ);End of GetExcel.lsp

Giống như cái mà bạn tuananh đã nêu. Trong code người ta hướng dẫn rất kỹ, bạn cứ đọc sẽ hiểu cách dùng. Để hiểu tất cả các dòng code trong đó, cần phải có kiến thức tương đối sâu và rộng về lisp. Ở góc độ ứng dụng, không nhất thiết phải hiểu hết, bạn chỉ cần biết cách dùng (cung cấp đủ và đúng các arguments theo yêu cầu) là có thể phát huy hiệu quả.

Bạn có thể tham khảo thêm về quan điểm đó ở topic này:

http://www.cadviet.com/forum/index.php?sho...t=0&start=0

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Xin nhờ bác SSG giúp em lisp đưa dữ liệu từ file excel sang Acad

 

File excel có 2 sheet tương ứng với 2 bảng trong file acad

 

http://www.cadviet.com/upfiles/Acad.dwg

 

http://www.cadviet.com/upfiles/acad_excel.xls

 

Cám ơn bác nhiều lắm.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Xin nhờ bác SSG giúp em lisp đưa dữ liệu từ file excel sang Acad

 

File excel có 2 sheet tương ứng với 2 bảng trong file acad

 

http://www.cadviet.com/upfiles/Acad.dwg

 

http://www.cadviet.com/upfiles/acad_excel.xls

 

Cám ơn bác nhiều lắm.

Có lẽ bạn chưa hiểu hết ý. Hai nội dung cơ bản mà topic này đề cập là:

 

1. Trình lisp đọc data từ file *.xls, tính toán, xử lý chúng theo những yêu cầu cụ thể, xuất kết quả sang AutoCAD. Kết quả ở đây không đơn thuần là các dòng chữ và số như trong bảng Excel mà có thể biến thành các đối tượng AutoCAD (line, circle, pline, spline... hoặc tổ hợp chúng thành những components cụ thể tuỳ theo mục đích của chương trình)

2. Vận dụng các công cụ tính toán của Excel, trình lisp đọc kết quả, có thể xử lý thêm và xuất sang AutoCAD như trên.

 

Yêu cầu như của bạn chỉ đơn giản là "bê nguyên xi" cái bảng Excel vào Cad, chẳng cần đến chương trình gì cả. Vấn đề này đã được bàn luận rất nhiều trên diễn đàn. Ở đây ssg xin gợi ý vài cái:

 

a- Menu - Insert - OLE Object - Create from file - Chọn file *.xls - Open - OK -> toàn bộ bảng Excel sẽ chuyển y chang sang Cad. Bạn select nó, bấm vào các nút grips ở góc và co dãn kích thước theo ý muốn

 

b- Quét chọn một vùng cần quan tâm trong bảng Excel đang mở, copy. Sang AutoCAD paste vào

 

c- Như trên, nhưng thay vì paste, bạn vào Menu - Edit - Chọn Paste Special... - chọn "%Product Entities" với Cad đời cũ hoặc AutoCad Entities với Cad đời mới. Với Cad đời mới, bảng Excel đã thành đối tượng Table của Acad, bạn có thể gán các công thức tính toán ngay trong nó.

 

d- v.v... (bạn tìm thêm trên diễn đàn)

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Xin nhờ bác SSG giúp em lisp đưa dữ liệu từ file excel sang Acad

 

File excel có 2 sheet tương ứng với 2 bảng trong file acad

 

http://www.cadviet.com/upfiles/Acad.dwg

 

http://www.cadviet.com/upfiles/acad_excel.xls

 

Cám ơn bác nhiều lắm.

Sao bạn không dùng chức năng table của Cad. Nó đáp ứng đủ điều kiện mà bạn vừa nêu, thập chí nó còn link kết quả cho cả 2 tức là sửa cad thì excel tự cập nhật và sửa excel thì cad tự cập nhật

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×