PLM之家精品课程培训

PLM之家精品课程培训

联系电话:18301858168   |   QQ咨询:939801026
NX二次开发培训

NX二次开发培训

UFUN/NXOpen C++和实战案例

适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术。
公众号二维码

关注公众号

点击扫描二维码免费在线高清教程

课程详情
Catia二次开发培训

Catia二次开发培训

市场需求大,掌握核心技术前景广阔

Catia二次开发的市场需求大,人才稀缺。掌握开发技能潜力巨大,随着经验积累将在汽车、航空等领域有所作为。
B站二维码

在线原创B站视频

点击关注工业软件传道士主页

课程详情
Teamcenter培训

Teamcenter培训

全方位培训,从基础应用到高级开发全覆盖

涵盖用户应用基础培训、管理员基础培训、管理员高级培训及二次开发培训等全方位内容,由多年经验讲师打造。
QQ群二维码

加入同行交流

点击扫描二维码加入QQ群

课程详情
×

PLM之家plmhome公众号

课程涵盖: PLM之家所有原创视频

×

关注B站视频

所有高清视频一览无余,全部在线播放学习

×

加入PLM之家QQ群

同行交流,疑问解答,更多互助

PLM之家PLMHome-国产软件践行者

[转载电子书] VS C++操作Excel详细教程

[复制链接]

2014-11-8 08:13:41 6497 0

admin 发表于 2014-11-8 08:13:41 |阅读模式

admin 楼主

2014-11-8 08:13:41

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文主要研究通过OLE/COM实现对Excel表格的操作。
, `7 o9 G- ?$ Y" F0 f" |& K" M- B  
0 T- g  H- L; R! Q) ^: N! C$ J本文源码的应用环境说明:8 J  o, D' ?) f' r' d; I2 s0 q
Windows XP SP3
; O6 h% g8 C: e' i% ]Microsoft Visual Studio 2010' ?) g1 A0 U2 G  w1 k
Microsoft Office Excel 20073 D7 n: ]3 u* W' E
  
8 ^1 N- l0 x. A! X1、添加OLE/COM支持。
* y& y; ]1 X: ?5 N, C首先,应用程序必须添加对OLE/COM的支持,才能导入OLE/COM组件。  Z) q: C' ?1 ^, G
本文使用的是MFC对话框程序,在创建工程的向导中选中Automation选项即可为程序自动添加相应的头文件和OLE库初始化代码。$ @$ I, O2 A: `1 J3 h
通过查看源代码,可以知道在stdafx.h的头文件中,添加了OLE/COM很多类所需添加的头文件。4 b- `& S' p$ J+ |8 E2 ?' `* p
#include <afxdisp.h>        // MFC 自动化类
3 Q7 K9 K1 Z8 I. `* }1 G( X同时,在应用程序类的InitInstance函数中,添加了OLE/COM的初始化代码,如下所示:
" [! k) H* B+ c: u$ f6 z// 初始化 OLE 库1 e2 ]' m# _( }4 g3 f3 r. j
if (!AfxOleInit())
; M+ R2 C" H5 a9 j7 K) c  ~6 Z( X{
8 p0 h8 p* j9 ]* V" bAfxMessageBox(IDP_OLE_INIT_FAILED);
1 x' J& Y- R7 X/ G9 J, J5 kreturn FALSE;
. Y( W4 P9 L3 |" U}" ~7 i7 z2 ^! o$ p' h+ P  H. O1 q$ Z
  + a6 E# M! b& d8 U/ N
2、导入并封装Excel中的接口( Q' }8 O! N5 Q9 J6 H
Excel作为OLE/COM库插件,定义好了各类交互的接口,这些接口是跨语言的接口。VC可以通过导入这些接口,并通过接口来对Excel的操作。; h& x; s3 j6 a8 w' p- P5 e; n
由于本文只关心对Excel表格中的数据的读取,主要关注几个_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range等几个接口。Excel的各类接口的属性、方法可以通过MSDN的Office Development进行查询。2 m  @, p: w2 T5 U+ y% m
VS2010导入OLE/COM组件的接口的步骤为:Project->Class Wizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择
& z" B! _- ]4 n要导入的Excel类型库中的接口。3 L- w! E0 j' c% L' y/ T0 f# G
在完成接口导入后,VS2010将自动为导入的接口创建相应的实现类,用于对接口属性和方法的实现。由于标准的C++没有属性访问器,只能添加一个两个存取函数来实现对属性的访问,通过在属性名称前加上get_和put_前缀分别实现对属性的读写操作。即,由VC自动完成C++类对接口的封装。
8 i6 L" x' Y& F" e! n- P% G: ~  
1 F" T% @; T* s2 A4 q- d本文所导入的接口对应的类和头文件的说明如下所示:
8 {$ R6 b6 P+ ]) s/ k6 o( u  : H+ O* J0 _! g  {
Excel接口
4 X: S9 a; U/ S# N. W3 x0 g- R导入类
& @, m0 V" t9 d/ g7 Q; _头文件
" k3 W! A# O( ~3 J3 ?说明" G% W7 x9 T. O1 Q. g4 s
_Application$ u+ r& Q8 F! ]0 N' I
CApplicaton4 R1 g6 d" P( {% k# W
Application.h
" P; l! t" `- Q3 v0 U& UExcel应用程序。
7 _( s  Q5 D' B8 t4 J' {+ QWorkbooks$ t! ^4 V- d& W1 Z9 V, k
CWorkbooks/ `: X" W# [) R! \0 O
Workbooks.h8 |$ a( J, f9 u0 K; t# g
工作簿的容器,里面包括了Excel应用程序打开的所有工作簿。
4 s; _7 s4 D3 I8 |4 O_Workbook7 Q5 J- X& U9 ^( y0 v
CWorkbook
+ G& ~. O9 w0 r" [* q2 ~6 W, XWorkbook.h# h& q: V: R6 J2 @, Y
单个工作簿。
! [: ^+ e+ p9 ~, cWorksheets
( [3 u0 V8 l: ?4 WCWorksheets
+ O" z3 Q$ x! ]: [Worksheets.h
' f6 q& d2 K: h# G3 K' Q+ j& S+ R/ S单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet。3 E- }, H$ S1 }0 J  l# E' x- m$ C
_Worksheet4 T/ \! ^- x9 g9 y$ T. M
CWorksheet
/ V' q3 p7 M. U6 _# l7 UWorksheet.h$ f. C- |% J2 H" A& m& K
单个Sheet表格。9 L, x" ~; X  c' m6 |2 `
Range
. q: o& }/ J: V* s3 g1 zCRange
" M; L& K9 V1 o! R% P5 {% b8 |Range.h
, M7 l% z1 k" y  A$ e  K5 y( U, V" O一定数量的单元格,可对单元格进行单个或多个单元格进行操作。
2 A0 g0 C+ q+ ^. [7 ?  + i. j% o4 U  H
3、导入Excel的整个类型库
" x8 E5 j; {% c5 I接口对应类只是对接口的属性和方法进行了封装,而Excel中的数据类型,如枚举类型却并为并不能使用,因此,为了更方便的操作Excel,还需要导入Excel的数据类型。
7 {$ w+ V% O+ E  N通过查看导入接口对应的头文件可以发现,在所有导入接口的头文件中,都会有这么行:- |; w: H0 ~8 r* |
#import "D:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" no_namespace. Y3 o' P/ I% i0 `# {* J
这行代码的作用是导入Excel整个类型库到工程中。1 _! h4 U* ~1 h- }6 w
由VS2010自动产生的导入代码存在以下几个问题:
3 P+ r! }4 k0 \# V(1)如果导入了多个接口,每个头文件都会把类型库导入一次,如果引用多个头文件,会导致类型库重复导入。
1 X! P" d3 t' {+ D9 ^' H" i(2)Excel类型库中有些类型会跟MFC类库的某些类型冲突。/ }2 ?0 N/ ~6 n, C2 }
(3)Excel类型库的某些类型跟其他Office和VB的某些库相关,如果不导入相关库,将导致这些类型无法使用。。
8 z, b! K9 o, g& y/ w# a. _以上三点问题的解决方法如下:
( Y; W) O( e8 h; m" Y(1)仅在_Application接口对应头文件中导入Excel类型库。
% ~- \4 ?$ u8 X5 N5 z& i4 B& I(2)对冲突的类型进行重命名。7 m* v( s  O" n0 o4 `% O
(3)在导入Excel类型库之前,先导入Office和VB的相关库。
8 }; J0 q0 [( Y  w1 J2 f% Q更改后的导入类型库的代码如下:( C* [- {6 k4 q; ]
  
0 J9 g3 F4 a7 U1 r) Y1 Q$ J% n* a/*导入Office的类型库*/
7 S3 L$ |5 M1 t: G9 s2 o' N#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE12\\MSO.DLL" \$ \* e1 _6 g' u3 O
rename("RGB", "MSORGB") \4 t3 l( B2 ^, j. }" o+ j' j/ Y
rename("DocumentProperties", "MSODocumentProperties")
; |+ Y' @0 w3 h& ]2 f" Z/ n- S! Kusing namespace Office;9 s( ?3 c: v$ q/ v& P
  7 ?! B7 J/ `2 H  ?1 U
/*导入VB的类型库*/. [, l& n) q. |- ~0 X
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"
1 e5 m- M1 U8 X' ~* o$ F- Y1 V$ \using namespace VBIDE;" Y/ v6 y( E: G0 x
  7 U/ [" \" z0 Q0 O" M0 g
/*导入Excel的类型库*/- V2 I9 A! d3 L0 n" O. {
#import "D:\\Program Files\\Microsoft Office\\Office12\\EXCEL.EXE" \7 n3 |% y+ H: @& r2 {, M
rename("DialogBox", "ExcelDialogBox") \8 A$ Q/ e; n+ u. {- P8 m
rename("RGB", "ExcelRGB") \
8 T4 T* w5 R% x+ hrename("CopyFile", "ExcelCopyFile") \
0 s  T3 G4 j, r  i/ |# lrename("ReplaceText", "ExcelReplaceText") \
( @- c, S/ M2 s' _* `% G$ Dno_auto_exclude
6 I7 r! e0 O5 S, p- V" YUsing namespace Excel;4 H2 c2 p" @7 f. D0 u
  
6 x7 D% ?0 L8 a编译程序后,会在DebUG或Release目录下生成三个文件mso.tlh、vbe6ext.tlh和excel.tlh。通过打开文件可知,该三个文件的命名空间分别是Office、VBIDE和Excel。导入了Excel的整个类型库后,就可以使用Excel中的所有类型了。  x" r3 Z( r- u
  % e! h$ M( d, W) E! E1 `, v
4、操作Excel步骤. V8 J# o7 M( w$ A
操作Excel的主要步骤如下:
- t  K- `! M/ _& E! Y* U5 Q% a/ x(1)创建一个Excel应用程序。
+ a( o5 B+ }# ?9 L8 Y  J% r(2)得到Workbook的容器。! ]$ @# G0 P1 p% o  A# {+ b
(3)打开一个Workbook或者创建一个Workbook。" d# C4 a7 j$ u- X" a, o& p
(4)得到Workbook中的Worksheet的容器。
) x$ Y( D& K, Z" `& V& M(5)打开一个Worksheet或者创建一个WorkSheet。
5 `3 W# e9 R. Z" H$ }(6)通过Range对WorkSheet中的单元格进行读写操作。
6 W- B+ s* r4 s+ Q8 l/ n1 b. ], ]8 b(7)保存Excel。  A( S; `7 X3 p8 d0 C5 z
(8)释放资源。
- R0 ]) k2 m  [( m2 v$ _- o% t  
+ J: Q" F- W7 c9 v; u; G) }5 P5、批量处理Excel表格
/ e7 M, q' m& U! Z0 S- r6 FVC通过OLE/COM操作Excel,是通过进程间的组件技术。因此,每次读写Excel中的单元格时,都要进行进程间的切换。当数据量大,如果一个单元格一个单元格的读取,主要的时间都花费在进程切换中。因此读取多个单元格,将可有效的提高程序的运行效率。0 R% q5 ~( L# F: x1 L- _
对多个单元格的读写操作可以通过CRange中以下两个成员函数来完成。2 M- E' N9 q) F3 W9 F3 y5 ~
VARIANT get_Value2();0 M: O/ o5 C" e+ Y  L) K
void put_Value2(VARIANT& newValue);
5 t1 D2 T* [/ q5 S) N% `8 l- S其中,输入参数newValue只要输入一个二维数组,即可实现向Excel中一次写入多个单元格的值。
. B1 q! q1 t6 p7 c5 H, a其中,VARIANT中实现二维数据的方法可参考+ b. v' b8 o6 }& V
http://www.cnblogs.com/xianyunhe/archive/2011/09/13/2174703.html" V5 d5 Z$ u' C# e+ p  t$ [2 i$ D
当然,在对CRange类进行操作之前,要设置CRange类对应的单元格。
* t9 r, C$ p% C. O4 i  8 [" s. e; g6 L  U6 H
6、Excel表格的保存- O  ~/ e/ |! A
(1)如果要保存打开的工作簿,使用CWorkbook类的Save函数就可以保存工作簿,原文件将被覆盖。
# J6 s; L3 H( B) s; F+ }/ b! Z/ A(2)如果是新创建的工作簿,或者是要另存为,可使用CWorkbook类的SaveAs函数。, g# q  W# G4 T, Y; [) k' ?
SaveAs的参数比较多。其中,第1个参数是设置要保存文件的路径;第2个参数是设置文件的格式,可在MSDN中查看枚举类型XlFileFormat来了解Excel的文件格式。经过测试,在本文所用的测试环境中,Excel2003的文件格式是xlExcel8,Excel2007的文件格式是xlExcel4。
0 [/ q; j3 c: O% f' Q. }0 E  3 g/ ~' c) P+ k! q$ L
7、获取当前Excel的版本# O% R- U* L. h! K
可以通过CApplication的get_Version函数来获得Excel的版本,其中,Excel2007的主版本号是12,Excel2003的主版本号是11。/ C* p& X- g8 O0 U; [# y
  ! a  m0 t3 P/ H1 |, i( t
8、示例源代码! h$ K0 `2 _1 k3 `
主要代码如下:  W% i& \/ R  B
  + b$ z: H6 k: C9 p4 e# i; Z
% a/ ]4 [0 k" k. B$ u5 {1 }
+ N. v. g( o7 }- P5 h
    m_LisTCtrl.SetExtendedStyle(LVS_REPORT | LVS_EX_FULLROWSELECT);2 }; w9 x7 K( e% ?7 d6 p
* W5 M6 c, c. T8 h& h
    CApplication ExcelApp;
  R2 R3 h$ O: x, r) b    CWorkbooks books;
  |9 I% F" E4 L8 \0 q. q$ g    CWorkbook book;
; A- ~1 f2 r7 X9 c1 z+ A    CWorksheets sheets;
% c2 R' Q1 y; G; a1 ]; p    CWorksheet sheet;
. G7 K( p5 B# R& j5 E1 ~9 H  p    CRange range;$ N& `  |% C  c" [- i5 J
    LPDISPATCH lpDisp = NULL;& U! [  n) s' E6 a) }

3 O$ R0 N/ V# ]9 n2 n# F    //创建Excel 服务器(启动Excel)& L0 T: f- t& J( s& c5 {
    if(!ExcelApp.CreateDispatch(_T("Excel.Application"),NULL))
( G% ]& Z5 w) A2 m4 }$ v    {' h, k' M" u/ x2 [$ p- |
        AfxMessageBox(_T("启动Excel服务器失败!"));
' G: ^' ?' B# D4 Q        return -1;
+ u' s$ @( `# t4 ]" B, B# i    }
7 h7 U9 ^, P2 R9 ^) V1 b! ^0 U. O" q- V* c, n% y! @
    /*判断当前Excel的版本*/+ F- f( ^. @3 C7 X3 G- j( F
    CString strExcelVersion = ExcelApp.get_Version();
8 Y, E. h7 w- s- l' P* Q- o    int iStart = 0;
  \3 q+ s; N& ?2 U1 i# V    strExcelVersion = strExcelVersion.Tokenize(_T("."), iStart);
3 i7 j) O9 E2 I    if (_T("11") == strExcelVersion)
+ L8 T8 [5 B/ a: r2 b    {
4 N# L# ]7 e' a3 ]7 R        AfxMessageBox(_T("当前Excel的版本是2003。"));
" [- d! Y# H; ]( ]    }
- t  Y1 g0 U/ Z$ D! L7 x! |. E4 K    else if (_T("12") == strExcelVersion)/ N! Y- c  k! g: a, N! R
    {
, B) D9 j% c& x; z1 h9 j' q" O+ Z        AfxMessageBox(_T("当前Excel的版本是2007。"));6 H" Y; z% v# O( p7 w# R
    }
. Q- I$ p( s6 X& A, S4 |. a: ~    else- c8 k4 B- Q, j6 J+ B
    {
1 a. |: F6 _+ c+ i* m5 B        AfxMessageBox(_T("当前Excel的版本是其他版本。"));  I+ z% R" \+ E1 W) {! L! h+ w3 f
    }- k7 _' k9 J' t0 U2 g

5 k$ Y( {, A/ i1 l( W    ExcelApp.put_Visible(TRUE);- B8 W( d+ @: `4 ~) \" v7 ]
    ExcelApp.put_UserControl(FALSE);( j. R* _% d+ H; r6 s6 v) H/ t
% ]( c9 G9 v6 j$ v- V! A
    /*得到工作簿容器*/
9 y. ?+ k- N5 o- ?    books.AttachDispatch(ExcelApp.get_Workbooks());# D  t* o. M; [. J! p

! x3 ~5 O( }: P! ^6 R: t+ P    /*打开一个工作簿,如不存在,则新增一个工作簿*/
) v( z' f' I0 D3 a+ ]    CString strBookPath = _T("C:\\tmp.xls");8 y0 |, p+ L7 ?& f) b' S$ l
    try+ ^# y& t! V/ b+ ^; I. O% t9 ?; M
    {
/ u& o4 g! v+ N6 s4 V) G        /*打开一个工作簿*/
. E( w% a3 S2 O  Y        lpDisp = books.Open(strBookPath,
" `: o0 \- i: ^9 t% k            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,) N9 H3 ]* D6 z( B1 \3 V6 K1 o: ]
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, / s6 A2 C8 V0 o  V/ I$ l6 F& _
            vtMissing, vtMissing, vtMissing, vtMissing);
/ n4 I" L% b0 g& _        book.AttachDispatch(lpDisp);2 l2 A4 J7 {$ C4 v
    }1 C1 ~' H* d2 C
    catch(...)6 s8 g" y8 S5 \8 k/ c" s# ~
    {
% k1 i7 ]$ ~/ l+ R; V8 y2 Z        /*增加一个新的工作簿*/* j% W9 F$ e* }0 N' Y$ C
        lpDisp = books.Add(vtMissing);" X) N0 O& y1 g+ G/ y5 @
        book.AttachDispatch(lpDisp);
+ {7 R% ?) j( K* A    }
- q8 r1 h3 g# N5 O2 g1 t     
8 [7 j) H: m/ T
2 S. v6 ~/ J+ Q% a3 u7 W    /*得到工作簿中的Sheet的容器*/
* u+ x5 ]' h8 J+ X    sheets.AttachDispatch(book.get_Sheets());- `4 n0 I6 u3 s, l

7 L8 i# @7 G" r    /*打开一个Sheet,如不存在,就新增一个Sheet*/
* H- [$ a4 l9 h3 r, X" s+ D4 v    CString strSheetName = _T("NewSheet");# B- f; G2 I3 d2 m8 D
    try  \9 \8 t. P  G7 U  g( }, o( D
    {) }6 p) J& @$ A. K, b
        /*打开一个已有的Sheet*/
0 [0 c+ N: i5 F: d) N+ P        lpDisp = sheets.get_Item(_variant_t(strSheetName));' S& y8 c7 J0 l# P2 Q/ c
        sheet.AttachDispatch(lpDisp);
2 a% [* l# L, Y( [; Z6 a! `  u    }
1 k; q) f% ?+ P( y' Z0 F# n) K3 C- f    catch(...)8 W2 _  k/ z" m" O
    {
4 N9 x: I5 `6 ~7 R8 J! ?- f7 R+ s# h" X        /*创建一个新的Sheet*/
! @9 {  q: F; ]+ n! T# e1 q4 X        lpDisp = sheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);2 A! r7 P4 [* @3 a
        sheet.AttachDispatch(lpDisp);
1 t% n* |( \$ h        sheet.put_Name(strSheetName);
2 D0 ^2 E. ^& {7 J$ f& k  a6 B    }/ m/ X3 V0 P% o/ K- r5 {

" `8 s0 {8 ]- H' U' t    system("pause");
7 @3 e+ n* S8 y& o5 _  s. Q; a
; t' V! s4 ~9 K, E9 f    /*向Sheet中写入多个单元格,规模为10*10 */: P) i- l0 m+ l" q' l( D
    lpDisp = sheet.get_Range(_variant_t("A1"), _variant_t("J10"));
' p. O, N# G+ g* v1 U4 q    range.AttachDispatch(lpDisp);8 ~# U! `" M8 p6 ]* Y- ^# y

1 {. m: D' M7 s  i- `$ p4 @    VARTYPE vt = VT_I4; /*数组元素的类型,long*/! h. F+ v9 l/ O) z
    SAFEARRAYBOUND sabWrite[2]; /*用于定义数组的维数和下标的起始值*/
/ L( y- {- ]  G/ k5 a    sabWrite[0].cElements = 10;: X  _2 l' D; T6 B. M" L: I& ~' u
    sabWrite[0].lLbound = 0;
  ?; ]! M& F+ O9 p# M2 d. L3 e    sabWrite[1].cElements = 10;' \+ E/ Z, ~" n0 f* V
    sabWrite[1].lLbound = 0;
/ Y4 J8 m- t2 s" o/ U3 v% {2 _+ h
# n0 ~( g; z4 F0 ]6 V/ P    COleSafeArray olesaWrite;7 i8 U: |+ ]- X- x
    olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);: w# H+ v$ F! O9 }
0 t' `" ?5 V1 n: h; o: M
    /*通过指向数组的指针来对二维数组的元素进行间接赋值*/
- s3 B! c+ X6 {  Z1 t9 t6 X    long (*pArray)[2] = NULL;& b& K9 z0 F2 R! c6 @8 u
    olesaWrite.AccessData((void **)&pArray);# `, h! f# T4 x; J9 h
    memset(pArray, 0, sabWrite[0].cElements * sabWrite[1].cElements * sizeof(long));: k$ E) O5 I9 h. b- _

6 ?6 @4 `2 c8 _% v! w+ v& P! X    /*释放指向数组的指针*/
3 B! n' R$ U- Z' H    olesaWrite.UnaccessData();
& T) u5 `; {) f. {" @5 d  b" u    pArray = NULL;
. \& k6 \1 J) m- q7 m9 k7 x3 m& Z  i$ ]+ t6 w$ Q
    /*对二维数组的元素进行逐个赋值*/
) p" }# F; g+ X2 R9 P! e    long index[2] = {0, 0};
: D5 C* B, N# a; B$ j    long lFirstLBound = 0;( Y# T/ B/ |9 w5 I* Z& z/ k
    long lFirstUBound = 0;
2 B+ B2 u. _) _- D$ V    long lSecondLBound = 0;
! R* D) [0 x! X    long lSecondUBound = 0;: ]5 M* i$ ?: I3 k0 W
    olesaWrite.GetLBound(1, &lFirstLBound);; @! c/ W$ X& F) B: j
    olesaWrite.GetUBound(1, &lFirstUBound);. X+ P% S  D! z8 @4 {
    olesaWrite.GetLBound(2, &lSecondLBound);  |: ?" Y, l0 |  w6 \& W/ o8 l
    olesaWrite.GetUBound(2, &lSecondUBound);" L8 c6 S4 D& Q* `$ f0 T" ^. f
    for (long i = lFirstLBound; i <= lFirstUBound; i++)
2 d) b3 l/ d% x6 t& ]/ o    {8 D* _& Y7 L" g. M2 z! _
        index[0] = i;
0 \/ c* G$ H' G4 \% {        for (long j = lSecondLBound; j <= lSecondUBound; j++)7 ?: z* U9 b" R# e( o: F
        {; O1 I9 p5 T1 K: u% e
            index[1] = j;' q# u, o7 N5 ~* s' Y
            long lElement = i * sabWrite[1].cElements + j;
* r* S; N5 R! m. o& {            olesaWrite.PutElement(index, &lElement);
# L0 [0 J) h3 M# m" _7 E. h        }6 h/ z& g& }2 i( e4 L$ I1 h
    }2 X, _8 }# T" u! m! a

+ W1 E$ o& e) C  h( @    /*把ColesaWritefeArray变量转换为VARIANT,并写入到Excel表格中*/- b7 M3 `; p% L2 k( N3 Z5 e
    VARIANT varWrite = (VARIANT)olesaWrite;
6 ?& ]: k* r% u- C1 h9 R    range.put_Value2(varWrite);
4 r7 p$ x$ J. a$ L: i2 C/ Y  t* L! ^7 \4 [1 w3 U
    system("pause");
: S; @4 F: O7 }  z7 j
- z: e9 P, V& E2 l$ o, _    /*根据文件的后缀名选择保存文件的格式*/
7 ^4 j4 b* Y* p1 c2 L     CString strSaveAsName = _T("C:\\new.xlsx");9 K2 j! V( T: |8 h) q
    CString strSuffix = strSaveAsName.Mid(strSaveAsName.ReverseFind(_T('.')));; i7 g- u; B; s) ]4 h# H+ n
    XlFileFormat NewFileFormat = xlOpeNXMLWorkbook;" M* r2 _& `7 i" P. d! y7 y  Y, v
    if (0 == strSuffix.CompareNoCase(_T(".xls")))
/ N7 [, P5 A( ^6 T: U4 S+ z    {/ f; j; p, c+ d
        NewFileFormat = xlExcel8;1 U! `7 L& z* w
    }
4 \2 M2 D( a& L- t- r    book.SaveAs(_variant_t(strSaveAsName), _variant_t((long)NewFileFormat), vtMissing, vtMissing, vtMissing, ( q  d( B( G8 t5 ?6 X% R
        vtMissing, 0, vtMissing, vtMissing, vtMissing,
' P) @9 B1 r0 t, o6 l        vtMissing, vtMissing);7 `, r3 H- |: Y0 o7 H

  @3 c6 s) o& U& X- V% }7 s    system("pause");: G0 _/ E8 \3 B$ ^$ e/ H# C

# m- x$ {4 M1 q6 B9 O    /*读取Excel表中的多个单元格的值,在listctrl中显示*/% J+ ]+ [4 ~) V* j' D
    VARIANT varRead = range.get_Value2();" O$ l! z+ o& t1 h1 f9 a
    COleSafeArray olesaRead(varRead);4 _. _- ~: n& k) u

& V+ O; F! q* R( {# d, C/ y    VARIANT varItem;4 s8 C: Y; H/ K' k! U9 g1 q
    CString strItem;) m0 ?1 J7 Z+ ^& _) D; ?
    lFirstLBound = 0;1 }. ^% V+ z2 Z1 a3 z0 n7 [
    lFirstUBound = 0;
7 f7 P0 p/ U# x    lSecondLBound = 0;+ ^# ?# F& z4 [) S' L
    lSecondUBound = 0;6 w# _4 h* F/ E" ]: g
    olesaRead.GetLBound(1, &lFirstLBound);; w; Y' y+ r8 l& F3 ^8 d" u9 F
    olesaRead.GetUBound(1, &lFirstUBound);5 h; v8 K$ \) n' I& {* L, K( W( Y
    olesaRead.GetLBound(2, &lSecondLBound);  c) U& N" W. j3 a2 q" l
    olesaRead.GetUBound(2, &lSecondUBound);
- S8 p) d/ Q7 y    memset(index, 0, 2 * sizeof(long));* r) l  s/ T: ?6 D& R7 e2 B* `
    m_ListCtrl.InsertColumn(0, _T(""), 0, 100);
+ V( u( X0 F6 |2 C& t$ q1 P    for (long j = lSecondLBound; j<= lSecondUBound; j++)
- f9 {9 D+ n* N  `2 s  i% X0 u* [    {1 S" n( f; n. z4 u7 H6 O/ A; C
        CString strColName = _T("");/ q- `+ |4 W3 t' m
        strColName.Format(_T("%d"), j);4 g; w7 E4 x1 s3 ~
        m_ListCtrl.InsertColumn(j, strColName, 0, 100);
$ x% L. E- m; P  ?  Q+ I, C/ Z    }
/ E# F8 y: \8 R/ m3 A5 [. Y8 P    for (long i = lFirstLBound; i <= lFirstUBound; i++)8 M+ o7 D8 D. D; Z. @- [
    {
0 P1 d' q5 S  Q' ~5 R8 B0 f        CString strRowName = _T("");
4 y5 T: c/ O) [* u$ S% \4 E        strRowName.Format(_T("%d"), i);
/ g! _& W4 S5 b2 ?' K8 u: ]        m_ListCtrl.InsertItem(i-1, strRowName);5 I0 z3 @' k) M) o* p3 S
+ H" S7 N! d7 h) k! N+ m1 Y+ o
        index[0] = i;
  S$ C$ a. L5 n8 y5 {6 E' E0 S        for (long j = lSecondLBound; j <= lSecondUBound; j++)
2 `. v# r# h" t1 L3 g' I/ N        {. N* z. E/ I4 @' a: B$ ^2 }
            index[1] = j;* o+ d. J& U. U# T: U
            olesaRead.GetElement(index, &varItem);
1 M# E  p0 R0 _! `& e" P0 D" t$ G
. [% t* M2 v4 H2 {$ s& {            switch (varItem.vt)
* L+ y4 X0 `2 G! ~( L$ z4 Y0 p4 _            {
/ ?7 z& ~% v8 D# G            case VT_R8:% u8 {1 K$ M6 [+ t5 A/ q1 n3 Y
                {: c1 i! T4 P/ [/ z
                    strItem.Format(_T("%d"), (int)varItem.dblVal);
! p- V% y9 ^7 ]+ N' V! u6 L                }* i& U7 F7 t$ R' o) _* b

6 @. r. b) T) i$ Q' j4 ]5 J$ @7 `            case VT_BSTR:
6 m& a. E; g& H1 J6 x                {1 u9 [$ ~) V2 S, U( Z
                    strItem = varItem.bstrVal;) n) a* w, o8 ^! }5 {
                }9 M6 X& U6 `1 `4 x1 L3 W( T
7 E- f! I5 b8 \
            case VT_I4:
* ~: e9 M4 Z8 C. h                {
: o/ ?% P$ @/ u. @+ C, L# {                    strItem.Format(_T("%ld"), (int)varItem.lVal);
* w1 w! F3 f% U8 k/ {& u0 ?- O                }$ Q5 j2 G9 E6 A1 _& l

% h5 L1 J- H- M) y/ m, b5 [            default:
+ i+ E* N' [2 t7 \! t& ^! `                {
0 k1 [: P! P$ z' z. Z  d4 S, `3 d% t- e
                }
1 c7 {$ W8 P1 X$ p1 J4 b            }
/ \0 O7 H' B6 o3 c% E$ N) M% P! m, k$ j- }
            m_ListCtrl.SetItemText(i-1, j, strItem);% Q; A0 w# \0 H9 i
        }* G8 g( ?+ e0 l0 u- c$ x
    }
2 t5 m) G* A+ z" r4 ]
. k  K- b# e7 b0 Q+ n
6 k7 q% p8 M" q! k" I$ A  K/ v) g6 z3 K* z8 V/ p
    /*释放资源*/- X: B0 V1 K0 ^, H1 ]; [6 Z
    sheet.ReleaseDispatch();
% A. b. E4 [6 }    sheets.ReleaseDispatch();5 ?* J( A+ O& \
    book.ReleaseDispatch();! Y2 f* R9 m' w5 l3 q, a, w6 [
    books.ReleaseDispatch();
) k. M1 ^5 l8 f5 x+ Y9 m2 S: L7 z6 a    ExcelApp.Quit();# J! I& S8 ?. D* O' i1 s; ~
    ExcelApp.ReleaseDispatch();
6 j2 Y, s- P# l- R5 |. |4 p1 i8 o$ \; r+ w3 s/ A6 \* ~' A& l
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

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

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了