|
在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过Excel处理,再导入到AutoCAD,
- n8 L' C( ?* x. X- t( h 那绝对会起到事半功倍的效果。随着Automation编程技术的出现,我们可以很方便地实现这一点了,下面是个: O2 p$ m. |2 t' c
ObjectARX的例子,其功能是动态关联Excel,然后读取其数据,并将这些数据打印在文本域中。" ~& C+ @$ Q1 v* b
//动态从Excel读取数据
7 e7 P; U1 k. n int DynamicReadFromExcel()2 p- n4 O% e \! N" j
{
4 {5 K" E: \8 d1 K1 a //常用变量定义
" P! v+ @" L- G( w# @: @ _Application app;
) V( q1 G- t9 b3 x% Y. R' k( w+ D Workbooks books;! z1 L; m& s/ c8 [, m
_Workbook book;
2 Q' H4 ]( Z4 r7 V+ L) Z, i$ H4 z: R Worksheets sheets;
$ o2 y2 d+ m2 a* a5 m+ [ _Worksheet sheet;
?: L: [& c$ W/ G4 ~ Range range;
$ P' W3 j7 m4 ^( Z' p Range iCell;- R& [$ q* w! C
LPDISPATCH lpDisp;- N: y" A# m8 P4 U& T
COleVariant8 S8 m, u7 m/ f. i* A. [( }0 {
covTrue((short)TRUE),
2 q4 h, `2 J j W, I& |% Q! p covFalse((short)FALSE),) K3 [6 b8 A2 v( d+ ]& c( ]
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);' @+ z/ B8 s, m0 H
COleVariant vResult;3 \/ d. i4 x+ u! L* C; x4 ]
//采用MFC方式初始化COM库,程序结束时COM库会自动释放
0 ]6 G. F6 }; b+ g& Q8 | if(!AfxOleInit())
4 B, J: |' y) ~' V& { g {
$ l* h0 T4 x* s* b J/ i MessageBox(NULL,"初始化COM支持库失败!\n无法控制Excel!", \
: w5 r* i% b* X1 n "TrueTable",MB_IConERROR | MB_OK);
3 b! x8 J% W/ } return RTERROR;
1 Q) `8 Q/ b0 l/ j: d' l }
; A" U$ Z0 q+ @6 i# c, k- c7 G //关联已经运行的Excel实例
$ ^0 n. i+ o; N% o, d CLSID clsid;" l$ M% w U7 |
CLSIDFromProgID(L"Excel.Application", &clsid);
6 U# i9 u, C: d8 O5 [ IUnknown *pUnk = NULL;
' }+ |+ D+ @0 h! N/ h* V) U) A IDispatch *pRunDisp = NULL;
: C/ n6 n- O; b# E3 v/ P# M7 F: | for(long i=1;i<=5;i++) //做5次尝试, r3 b4 h' W3 T' K( J% |
{
7 W, a& F" E4 d8 I7 P ?5 R HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);% ~6 V j" ]2 o1 Y: ?
if(SUCCEEDED(hr))5 S& l$ `! Q# a$ \4 l% L" N! P
{: j D R, t& r% K
hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pRunDisp);
0 J) C. s8 [0 s" ^0 q break;
/ M6 N& y1 I" F2 u6 c4 z0 o0 m }1 d5 C0 T7 e! W n7 S7 C A
::Sleep(10);
( [) o% V& I9 i }
i+ v3 Y" V9 N) W if (!pRunDisp)
, i9 X. m$ Y5 X5 P7 N {, c( j* v# I7 W0 ^5 g& {
::MessageBox(NULL, "没有发现Excel!", "TrueTable", MB_ICONHAND);; h9 I( Q; _0 W9 O# o1 `% N* o0 u
return RTERROR;
/ R; z9 n# o4 w) ^( F7 N5 Q }
: N' M0 h6 q1 `+ t/ ` if (pUnk) pUnk->Release();
. }/ x4 J/ n2 E6 k. h //关联Excel8 K4 a1 [8 }& V, M
app.AttachDispatch (pRunDisp);
, v& P$ b# B% t0 D7 G //得到当前活跃sheet
; H, r( w8 W Y0 a r9 q //如果有单元格正处于编辑状态中,此操作不能返回,会一直等待* n0 ?2 v/ m5 [6 g/ \* _
lpDisp=app.GetActiveSheet();
' {8 o4 Q! m. C9 _/ | if(lpDisp==NULL)
1 y1 q4 e) A6 r {: t: i: k" U) V! M6 w
MessageBox(NULL, "没有发现有效的表格!", \
. [7 Y+ K+ R1 Y "TrueTable",MB_IConERROR | MB_OK);+ M3 h G) L" [+ _1 o
app.ReleaseDispatch ();
' k5 F+ ^8 U1 I4 P ?4 m0 E return RTERROR;
3 }! X+ {3 B' @ }
7 l! p) X4 z, L, J0 E9 i; N sheet.AttachDispatch(lpDisp);8 s/ ~, z2 ?# s% `- H
//已经使用的行数:5 D$ M+ m- o Z0 C# M
long row_num;
6 L) P5 S# i, s% k8 [( I range.AttachDispatch(sheet.GetUsedRange());
9 W1 R5 E; Y# K9 ]4 w7 ~ range.AttachDispatch(range.GetRows());" _: v6 V: ^5 _1 U5 G
row_num=range.GetCount();4 U; x" y8 {0 M1 K
//已经使用的列数:
- H( a# Q* b& Q( q6 I, p0 x8 B long col_num;7 h! Y( w2 f) y7 U
range.AttachDispatch(sheet.GetUsedRange());
# N7 K5 \& O8 d }3 ~' X, L4 j range.AttachDispatch(range.GetColumns());
8 T/ i# D" q' q$ H. D col_num=range.GetCount();* k0 f7 M3 x/ a8 Q1 A( x
//已经使用区域的起始行、列:
: w4 O2 J1 m5 |5 B5 c- P' d' \ range.AttachDispatch(sheet.GetUsedRange());
& g1 M3 W' u6 o- F! t, s8 X0 V# b( j long StartRow=range.GetRow(); //起始行/ H% e3 X% ?* M' W1 D
long StartCol=range.GetColumn(); //起始列2 [$ E( T w( |
//读取sheet名
5 `' C( ]2 R, {5 y3 N, S7 L9 u CString SheetName=sheet.GetName();
3 B# u1 }6 L# n6 B9 d //ads_printf("\n%s",SheetName);
( a1 |' b/ Q9 n8 w, w if(col_num<2 && row_num<2) //此sheet为空5 ^0 E! t3 K% s0 | L
{) g& m/ O4 c' U0 P. W6 l# \$ F
MessageBox(NULL,"\n当前表格没有数据!", \7 K8 M& r) A6 _+ G" n, y
"TrueTable",MB_IConERROR | MB_OK);
. A( [/ u3 T$ e; _) E1 m; D( P) E1 j app.ReleaseDispatch ();
) Q6 ^2 L6 r0 J' }9 z% }6 \% b return RTERROR;6 w7 N/ C* x% Z @* C
}6 g; u* B: Y2 b2 \* ]" z) \
else( T" m& u9 z# S* I4 L4 |7 i) J5 e
{
1 ~0 w9 N' e% ] H ads_printf("\n表格%s共%d行,%d列",SheetName,row_num,col_num);" m; K+ V% H& o
}- I ?' K# e( C* h5 e/ u
//得到全部Cells,此时,range是cells的集合) O/ o8 m. P+ k) L! \! d f2 l
range.AttachDispatch(sheet.GetCells());0 p4 ~+ z+ l% D6 d6 T, Q
//读写数据了
) ^ o" X# M5 \* D1 u4 H7 J+ b CString cstr;; c- [. f/ T; e" N. O
ads_printf("\n");; n: ?% Z% r( O; I
for(long i=StartRow;i<STARTROW+ROW_NUM;I++) {
8 ]2 [( Z2 q5 f( F' } for(long j=StartCol;j<STARTCOL+COL_NUM;J++) {
# U# p5 T- l. b* G( q' P //读取单元格文本, E; r. L J1 G7 e
iCell.AttachDispatch(range.GetItem (COleVariant(i),COleVariant(j)).pdispVal );
% n! W+ {$ A* [+ W" K* A- p- G3 A vResult =iCell.GetText();& m' }! J$ H# f% f, u
cstr=vResult.bstrVal;5 y( C! i5 s* `2 U
//写单元格文本* d. N" }/ ]# u. v. s
ads_printf("%s ",(LPTSTR)cstr);+ l- U6 j* M7 t1 T/ G& K
}
% u1 l. Z8 [7 l" i, J6 \3 o# O; ~9 @ ads_printf("\n");* i$ _1 ]8 x. o! w
}
$ D& W+ Y7 a: n( N+ f //释放Dispatch" x5 Z5 a' ^( M4 ^" B) Z) K6 r
iCell.ReleaseDispatch ();7 Y7 P" T$ w- | |7 P$ {
range.ReleaseDispatch ();: S2 L# c! _9 ^/ Q5 A, L; i/ J4 f2 f
sheet.ReleaseDispatch ();
& M: w& J! z Z7 n& B9 P* P* ` sheets.ReleaseDispatch ();
) E: Q! [7 H3 i/ o; v book.ReleaseDispatch ();' b5 z- ]9 _, k2 Q3 Q
books.ReleaseDispatch ();) T+ q6 A! o6 F& T
app.ReleaseDispatch ();
8 f4 ^' k$ Y! ~, @# F/ p' m return RTNORM;
( _: s- ~4 ~7 U$ W g6 r9 L } m) Z" |! D2 I/ V: x2 D, ?
如果要输出到Excel的话,关键函数就是:. `1 F% R7 s! g6 G0 e- y
iCell.SetItem(COleVariant(i),COleVariant(j),COleVariant(cstr)); |
|