|
在实际的工作中,我们经常要对一些表格数据进行处理,如果先把这些表格数据通过Excel处理,再导入到AutoCAD,
6 b' t+ n# z6 h' u2 N 那绝对会起到事半功倍的效果。随着Automation编程技术的出现,我们可以很方便地实现这一点了,下面是个
' U( y+ C8 f3 C7 S. [9 F! E ObjectARX的例子,其功能是动态关联Excel,然后读取其数据,并将这些数据打印在文本域中。/ w2 _; J; J- D5 k D# B' I# m
//动态从Excel读取数据) N' D7 t+ j' w, v1 Q
int DynamicReadFromExcel()
# W+ D% b* t) O/ {+ Q' B6 M% e {/ L2 i9 Y2 C! u; i. u0 L- x( J
//常用变量定义
7 ?$ v' J3 x5 ~" w _Application app;
8 U9 V/ k$ d! L) G2 E3 i3 c# p Workbooks books;' U6 n6 E5 o2 ~
_Workbook book;0 F7 }$ N0 E& n1 J
Worksheets sheets;
9 r" W/ Q( Z: `: }- o) U+ ?+ M _Worksheet sheet;+ W3 q/ j0 X6 r! ]7 \9 S
Range range;" Q' n6 F( s/ _% T0 \# d+ ~
Range iCell;1 D: |, T4 j% @" ^
LPDISPATCH lpDisp;
+ B. K* K7 H( U0 l j5 K COleVariant, b; N0 ~9 i3 `9 y- m' r5 W5 c
covTrue((short)TRUE),& V, Q: D7 X& W$ a" ?
covFalse((short)FALSE),9 B9 V8 [5 l0 P* {) N7 i7 k) B, s7 l3 T
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
1 W6 L% K5 W- A$ i COleVariant vResult;/ |' O& n$ v* M
//采用MFC方式初始化COM库,程序结束时COM库会自动释放( P& n, o, b* d6 ]
if(!AfxOleInit()); [* @$ b& Z# N! i
{" ^6 i' H) p3 {5 N1 b( _
MessageBox(NULL,"初始化COM支持库失败!\n无法控制Excel!", \3 i7 z& S2 G' Y: p3 O7 }1 a
"TrueTable",MB_IConERROR | MB_OK);
4 Z5 Q- e1 B9 S$ e C) G return RTERROR;: F0 E( {; |( i6 ^0 S% k1 ]& Z% V
}3 ^. m: u. e# G" |* z
//关联已经运行的Excel实例8 R: s' V4 p8 |' T" }
CLSID clsid;2 B u! g2 T- T
CLSIDFromProgID(L"Excel.Application", &clsid);. i. n) O9 r" [
IUnknown *pUnk = NULL;" a; ]4 u" f1 `$ b' K' n! z
IDispatch *pRunDisp = NULL;
! q$ p* N7 n3 l) r8 g* h for(long i=1;i<=5;i++) //做5次尝试
- D' w4 E% a0 P! B {
* S- v" Y8 s0 k& M HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
4 P& ?, m& |, U; G i% C8 j9 D; a if(SUCCEEDED(hr))
. J: V# M1 ~) z5 H/ X {
r3 O) x: ?- r; L hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pRunDisp);
' |% \, R: v6 c0 ?! t break;* E' H0 W% R" `9 n# R$ \
}- l' {# N: O1 |
::Sleep(10);
( l( V E+ w' T3 z$ @& U }
5 V9 r: N% i: P, [' K, _; _8 A if (!pRunDisp)
8 h) m& Z f' z2 K: T$ a {
- x _% c: f6 Y7 m( |: X ::MessageBox(NULL, "没有发现Excel!", "TrueTable", MB_ICONHAND);
% R2 O: \' L) e/ u return RTERROR;+ [$ e' Y0 b3 F+ q/ q
}+ S$ ?$ a$ j/ w1 D9 v6 M
if (pUnk) pUnk->Release();1 A4 X+ i7 c' _8 a4 ?; e
//关联Excel* N$ s2 @8 b/ Y- z1 S- x
app.AttachDispatch (pRunDisp);
; M( j0 y2 p+ v3 U //得到当前活跃sheet' U0 A; d+ c" O0 C' R$ ~# D, d+ ]
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待& y' b3 r) _' e- A! @* w5 \! N4 V# ~% `
lpDisp=app.GetActiveSheet();9 D# G1 G! l1 X) I
if(lpDisp==NULL)9 U- ?6 S6 I% P* U& y& Y# g2 q, R
{
# _1 M! | K) X: b' W8 b. {. q MessageBox(NULL, "没有发现有效的表格!", \
( ]6 r( H5 o0 w: |# w9 n7 F "TrueTable",MB_IConERROR | MB_OK);
' v3 [+ `! _; R4 w: }; F7 @ app.ReleaseDispatch ();# X! r5 j9 B9 g& d
return RTERROR;2 A' W# a5 p' j5 y- O4 o% x
}+ C! J. L5 b2 u: W+ A. p8 f
sheet.AttachDispatch(lpDisp);
% f$ @1 n5 K- P4 O( n1 ~ //已经使用的行数:
- X2 B) h4 T; B* A4 U2 j; W( z long row_num;7 l. O/ q! ?1 y% j2 n) a& g2 z
range.AttachDispatch(sheet.GetUsedRange());2 B' R8 H1 D3 d, ^. X2 P
range.AttachDispatch(range.GetRows());' w1 c( Y% N! p. e0 W
row_num=range.GetCount();
/ j1 s A( l! V$ P7 }: e' x //已经使用的列数:% q3 z* c1 n4 |6 s# C# O
long col_num;
: e3 j* s5 o5 s+ n% o( S range.AttachDispatch(sheet.GetUsedRange());" c% p- Z/ b/ x& ` r3 h& ?
range.AttachDispatch(range.GetColumns());
2 G2 i$ V; ^$ S+ C- s. u; x col_num=range.GetCount();
1 c- P# V2 G* l1 h/ Q3 S6 r //已经使用区域的起始行、列:
( G9 Y$ `8 M" M- L range.AttachDispatch(sheet.GetUsedRange());
4 u) M: ^& J9 U. _ long StartRow=range.GetRow(); //起始行
; f7 R: }! y0 f- c% Y, i0 q1 {# s1 \ long StartCol=range.GetColumn(); //起始列
$ H! ]& C x' h: y' B+ A //读取sheet名
) V% l. l# x# k( L+ ]2 C7 [ CString SheetName=sheet.GetName();0 b' ?; M O9 s( } R9 g0 }+ r
//ads_printf("\n%s",SheetName);
: |! y! e4 R- D, o, K if(col_num<2 && row_num<2) //此sheet为空' _& ~) S3 o& { T o
{) [) r3 B( ^9 j0 Q! K1 l
MessageBox(NULL,"\n当前表格没有数据!", \( d+ h! |) v2 i+ Y F* E
"TrueTable",MB_IConERROR | MB_OK);& a& Y! L0 x$ g
app.ReleaseDispatch ();5 D- Z# U5 c: D8 E7 }% q
return RTERROR;
+ ^; a% X4 h0 G! K }; z6 v; ]1 v7 }
else; \- F# U9 |- A8 |' ~( I
{
0 q4 ]; m" O# I/ U; Y! _ ads_printf("\n表格%s共%d行,%d列",SheetName,row_num,col_num);' J6 J. G! ]' }9 Q' W% y$ J
}& S$ a4 ^* d- Z. z
//得到全部Cells,此时,range是cells的集合
, y7 Z" f1 s9 d* R range.AttachDispatch(sheet.GetCells());
& R/ n+ r. U: ^ V( h3 `5 C& l //读写数据了7 }! D% J+ P o# `( g+ x9 ^, r" f
CString cstr;/ X& V; q* o5 R7 q, [+ J
ads_printf("\n");
n2 p: T, V! X6 Q for(long i=StartRow;i<STARTROW+ROW_NUM;I++) {
. f: x5 F& E* S; ^) i, ? for(long j=StartCol;j<STARTCOL+COL_NUM;J++) {# M1 l( b3 g1 o8 T- \! y
//读取单元格文本" b- ^$ k- N6 C5 L. n! r: L) V
iCell.AttachDispatch(range.GetItem (COleVariant(i),COleVariant(j)).pdispVal );
+ u. @8 ^ y* M. y) L2 q- e vResult =iCell.GetText();
* h6 X! w" c" W; O9 F" _. f5 z/ i( ] cstr=vResult.bstrVal;
7 O/ Y! p) F# I) ], T //写单元格文本( ~8 l& a1 \$ m8 z% x
ads_printf("%s ",(LPTSTR)cstr);
5 Q/ A7 l1 N: q4 u7 P8 T }# `! V. ?% W9 e, g8 q
ads_printf("\n");3 h; `& C7 P7 i) I! c- R! U2 o! i q
}* p9 }& k; q- o7 {. x
//释放Dispatch8 W+ }1 F. Z4 L, J; [' X1 c
iCell.ReleaseDispatch ();/ i' V6 D1 o8 D, V. L
range.ReleaseDispatch ();
% d+ s1 |8 Q, X; E: l+ o; j sheet.ReleaseDispatch ();- u& W6 X% o6 y- Y6 h9 u
sheets.ReleaseDispatch ();
( j. O1 x' U8 v/ E. X3 n. W+ L! C book.ReleaseDispatch ();
1 N3 C# }; x+ t7 T( h books.ReleaseDispatch ();+ b- A8 `" ]% E! D1 E# H* {; @
app.ReleaseDispatch ();
1 D8 M# z# v* [ return RTNORM;
+ L4 }& y1 \2 C, S5 ~) T' w }
! ^% R) d% v# Z% b 如果要输出到Excel的话,关键函数就是: t6 H ^! z5 B- X& \
iCell.SetItem(COleVariant(i),COleVariant(j),COleVariant(cstr)); |
|