数学建模社区-数学中国

标题: c++builder如何和excel交换数据? [打印本页]

作者: 韩冰    时间: 2005-1-26 01:22
标题: c++builder如何和excel交换数据?
<>c++builder如何和excel交换数据?</P>
; {5 k9 A- C/ Z9 t) g<>  </P>8 H" f- j. n  C2 X
<>这是从网上下载的: </P>
8 I% R) h/ A9 @: a<>Microsoft Excel作为一个功能强大的电子表格处理软件,已经得到了广泛的应用。在数 </P>5 Y6 A. \# z9 O/ z3 K# T
<>  </P>$ p3 `  j6 k$ E! @/ B
<>据库应用软件开发过程中,如果能实现数据库与Excel文件的数据交换,那么一方面能增 </P>
( K8 Z/ [8 M  _, b( c( B  r9 ^<>  </P>
5 v( L/ X  t: v<>加数据库数据的来源,另一方面也能方便用户对数据库数据的进一步处理。 </P>+ O# y  e( `/ U" N& Z! G
<>  C++ Builder是一个可视化快速应用程序开发工具,它提供的OLE Automation机制 </P>
6 q. K' V; L6 M9 G<>  </P>
- G/ s) s, S) j7 ^1 }<>使得开发人员在应用程序中就能调用Excel,实现数据交换。 </P>
  A8 f  e* d" x, l$ P% w. {9 i<>  在C++ Builder中调用Excel,首先要为Excel建立一个OLE对象,然后通过设定该 </P>
  j$ t$ ?) h) `3 q; s* A; C<>  </P>
2 X: K1 ]( X4 t. {# ]6 u<>对象的属性和调用该对象的方法来操纵Excel。C++ Builder通过CreateOleObject()来 </P>
7 }7 ]; [2 A; i% f6 R# E<>  </P>1 _( {8 ~. h( I; n5 ]5 k
<>建立OLE对象;用OlePropertySet(propname,value)来设置OLE对象的属性;用 </P>
& ?. y  c2 p4 b" a* I$ s<>OlePropertyGet(propname)获得OLE对象的属性;通过OleFunction(oleFuncName, </P>- H+ d- t+ C; n
<>[val,...])和OleProcedure(oleProcName,[val,...])来调用OLE对象的方法。 </P>
& \# x$ a) N4 f5 Q' z( d% K5 H' m<>  C++ Builder中使用OLE自动化操纵Excel,必须掌握Excel的自动化对象及VBA关于 </P>1 f7 J& p# d& Z2 q4 |! r% z' l; `3 f
<>  </P>+ m- i: D3 V' E; f
<>Excel的对象方法和属性,这些都在Microsoft Office(完全安装)的VBAXL8.HLP帮助文件 </P>. g+ K) m) V0 R
<>  </P>
; E& N% M+ ~, x& T<>中可以找到,在此就不再赘述。下面以将数据库中的数据转到Excel工作薄中为例,说明 </P>2 k! l& U3 ~' v8 m5 V
<>  </P>: z' _& ~2 [6 h0 o% D
<>C++ Builder操纵Excel的具体方法。 </P>
- B+ Y3 c" E4 o+ G' i5 Z) r; Z<>  首先新建一个表单Form1,保存单元文件Unit1.cpp,保存工程文件Project1.bpr。 </P>
8 ?1 T' q$ a2 F2 D0 Z<>  </P>
' c, c! F8 x" q6 @+ P3 H2 g<>然后在表单中加入数据访问控件TTable,将Name属性设为Table1,DatabaseName属性设 </P>
- x; y, E9 L  d$ b" J$ G<>  </P>
5 _0 Q- Z1 Q8 Z<>为BCDEMOS,TableName属性设为Country.db。在表单中加入一个按钮控件TButton,将其 </P>
# n: s) D, o9 Q5 v& F# F) q<P>  </P>
* N/ D1 G* S- h; ?$ @% W<P>Name属性设为Button1,Caption属性设为 “转换为Excel文件”。双击Button1,在 </P>
1 I- f! Z7 k1 w) b<P>Button1Click()函数中加入如下代码: </P>
2 t$ q' |/ w  l% \3 i<P>   Variant ex,newxls; </P>
+ o, n5 ?2 q2 s" C0 `" K  \<P>   int i,j=1; </P># `( P! _: ?' p, C6 `
<P>try </P>7 N( |; M) c: h8 y4 B4 G& `" o
<P>{ </P>: _3 p6 P$ m( [8 L, {: }& y# P. l
<P>ex=CreateOleObject(″Excel.Application″); //启动Excel </P>
8 K; g9 }2 V6 H<P>} </P>7 m8 `8 K2 k' W  d  u9 G
<P>catch(...) </P>' ^3 j* u& p  n6 K. o
<P>{ </P>
3 X8 l8 ], h+ I<P>ShowMessage(″无法启动Excel″); </P>4 i, a3 U. J! s
<P>} </P>
, A5 T/ l$ C2 X3 r6 d6 [+ W<P>   ex.OlePropertySet(″Visible″,(Variant)true); //使Excel启动后可见 </P>
, Z3 J, R  U/ Y' ]+ z/ ]% I% P<P>newxls=(ex.OleFunction(″Workbooks″)).OleFunction(″Add″);//新建一个工作薄 </P>
  A: r5 N; A) F7 E( z6 }) Z" w2 f! d<P>  </P>
8 g9 E* h# {: D; }" N  n<P>Table1-〉Active=true;   </P>
! i7 h& R+ |% Q+ f( |<P>  //打开数据库 </P>
$ Y5 d7 G; D# a% ?6 ]! }<P>Table1-〉First(); </P>; Y* ]; ?3 o: [: N
<P>for(i=0;i〈Table1-〉FieldCount;i++) </P>( ?' r4 i7 ~" I, x6 U/ @, h
<P>  //将字段名写到工作薄的第一行 </P>
/ L6 R" e4 C) a8 M3 w5 X: F, k, k<P>{ </P>8 Q6 W4 U( |+ d$ Y# w$ H0 O8 H1 A& Q
<P>(ex.OleFunction(″Cells″)).OlePropertySet(″Item″,(Variant)1,(Variant)(i+ </P>4 C5 V" Y6 Y) j' c. ^
<P>  </P>$ Z% j- {) M/ Z
<P>1),(Variant)Table1-〉Fields-〉FieldName); </P>
4 p; y! L4 {& \9 L( E<P>} </P>
- T8 N% C! y9 f; p* S<P>while(!Table1-〉Eof) </P>& t3 S2 b# S9 Z! y- }5 R; V
<P>  //将数据库中的记录依次写到工作薄中 </P>& b1 H3 |# r) U4 V% l0 z& V* d
<P>{ </P>
  i; O. a2 J# D+ h<P>j=j+1; </P>
: p! o& @, K1 R- Z7 _<P>for(i=0;i〈Table1-〉FieldCount;i++) </P>  W# s* m' h) Q* v7 d3 a8 z
<P>{ </P>( ~. r  S; ]) b/ j( U) j+ f
<P>  (ex.OleFunction(″Cells″)).OlePropertySet(″Item″,(Variant)j,(Variant) </P>
/ ]; f& y) @( E$ e" {1 S  n<P>(i+1), </P>; S) ~' ~/ a: M1 R3 J
<P>  (Variant)Table1-〉Fields-〉AsString); </P>
5 t1 F8 T- |8 {2 d+ y" U<P>} </P>2 V& q$ ]# w8 H' r
<P>Table1-〉Next(); </P>5 g& e( p. i# T: a! f- D5 t0 C
<P>} </P>: E' o6 R' M: f( A; G
<P>newxls.OleFunction(″SaveAs″,(Variant)filename); </P>9 d/ D: W/ i: {2 D, l( F- R# ~; W
<P>  //保存工作薄,filename是工作薄的全文件名 </P>& V# r5 x5 [! a4 ^( W
<P>ex.OleFunction(″Quit″); </P>6 f4 l7 \/ j- w
<P>  //退出Excel,释放OLE对象 </P>
8 F5 G- j9 Q  Y7 ?# n$ P<P>  注意,要使用OLE自动化对象,在编译之前还必须在Unit1.cpp文件前面加上# </P>
6 Q5 J1 g" e  x0 l; w2 I<P>include ″ComObj.hpp″。 </P>
2 X- b: r" Z3 Z<P>  运行程序就可以实现将数据库中的数据转换到Excel工作薄中。同样的道理,使用 </P>
! S2 A7 F$ P( B<P>OlePropertyGet()函数,也可以将Excel工作薄中的数据读到数据库中去。 </P>4 ]$ W7 \6 D% B3 j5 m: ]
<P>  以上代码在Windows 98操作系统、C++ Builder 3.0下调试运行通过。 </P>
作者: liunengwu    时间: 2010-4-8 14:07
体力 已经不充沛啦!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5