| 
 | 	
		
 
请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!
您需要 登录 才可以下载或查看,没有账号?注册 
 
 
 
x
 
C# 或 c++  不用安装操作 EXCEL的方法:c++ 对excel 的操作 非常不理想 要安装excel 而且读写速度也慢& x. _. w) J) j$ k& z1 B 
net 有很多 免费的开源库 比如 Npoi库  (Npoi库 支持c#、vb.net 等语言)- l) N& I) A9 @( C6 e  P4 S7 v 
这里我用c# 生成 com 组件 让 c++ 调 8 w; c* `1 r- o% ?5 d$ ?0 G 
 
# Z1 j; a' T9 Q; X. K- s  {; `首先要学会 c++ 调 c# com组件的方法   (和com注册的方法) 
2 ]2 t. @' N: i3 U% l8 m# GC++调用C#的COM组件(DLL)' q: x# b9 X1 u9 E4 T3 W! e' p 
$ }( v$ u  g  W 
下面我举个简单的小例子.我用的是Microsoft Visual Studio 2012,操作系统是Win 7. 
. L3 E' ~/ b! c- Y. g, ?首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和. 
" g/ _$ u' t4 V/ N( u& K  ~% W 
+ q+ [$ T& b" E! c 
# i: Q* p% B; S" B% O4 f" o1.新建一个C#项目 ,类型就选 类库 .取名 MEI_AddCom& B' B2 t. W& s. D5 q( d7 @ 
 
2 f: M$ K2 o, [! W- t  E2.在项目中添加一个接口,取名MEI_COM.C++调用com组件中所有的功能只能通过接口来调用,不能直接调用类或函数3 p8 B( A, K+ M 
9 z6 @  q3 Q5 v: o; Y8 B# q. R+ l 
具体代码:* P( ~, X4 F! p$ D 
 
# u2 n# g9 k5 _+ @using System.Runtime.InteropServices; //记得加这个命名空间 
$ U. R3 H0 {9 C# C: R# \$ u; \* W* P* J1 \+ V  B; G4 F 
namespace MEI_AddCom 
3 b4 L. F9 D/ E! L; j' ?1 O7 m9 c2 w6 t( s 
{' y  Y* v, s2 f# W* R# ~9 g 
2 d9 U( X' Z' k% D6 K% \# U 
    [Guid("DA07B88D-29F0-41cf-B3D3-611010E6F3FF")] // guid的产生可以通过vs自带的工具.点菜单栏上的Tools ->Create GUID,然后选第4个选项.Registry Format. 
3 W7 C" r1 {9 f3 E1 w+ @. V2 n( T4 W8 t, y: D: j 
          //点按钮New GUID,再点Copy.这样你就可以把产生的guid复制下来,然后粘贴到这个地方来.当然那个大括号得去掉.后面需要用到guid的地方也用这方式产生 
+ S) V0 s  R* L" j9 T  _! _, u9 B% a* m6 w, s" C" a 
    [ComVisible(true)]* I+ k3 m8 Z# E& A) a! I* z( F0 z# Q 
' i( ]( j: }+ l  h& o2 Z 
    public interface MEI_COM        //记得用修饰符public 
4 X& v3 W: L+ y( L 
( T* g- p; l% V: t/ J    { 
2 T1 j/ W. u. g+ V$ f3 R' o) V( |! d) N& C2 n4 v( N* u( K3 M 
        [DispId(1)]       //如果还要添加其他函数就继续来个[DispId(2)],[DispId(3)]加在函数前面 
/ t0 ^1 }" t( d; s+ u 
6 B6 Y6 \6 e% ]8 y        int Plus(int one, int two); 
) b* }- @2 ]8 M& R% X* o, G' I4 ]/ p. S 
' q0 F( _- y9 w! V    } 
9 G: a+ _8 z- j& g" y 
  g5 A2 a. l6 F4 [  l}. `: k" }/ F5 \; g/ e 
" x# t5 n3 ]" w 
 
- o4 {9 ]/ E7 i! W1 q# ^+ L1 P1 e) z7 A! V2 I  B/ o 
3.添加一个类MEI_COM_T,继承接口MEI_COM,具体代码 
2 _$ `' u9 {& H, O. \! g# H' S5 d, G& Q 
using System.Runtime.InteropServices; 
) j+ |$ T3 R) H- Y) T0 X; O. n! ^4 [/ W2 e 
namespace MEI_AddCom 
) b# l1 c  x3 `1 C0 S 
8 t9 p/ I2 f3 w{ 
6 x. a9 q) A5 o1 l 
: C% u. C3 Q/ P# z& x    [Guid("04F4DC83-8883-4a03-BDBC-92D8630ECC1F")] 
2 O1 Q+ {! X3 j5 s9 ~# f# n/ y- P' S8 I; w 
    [ClassInterface(ClassInterfaceType.None)] 
5 z6 v% w7 A5 o/ j$ O& v- t; x( q6 R* x, c4 t4 r3 W 
    public class MEI_COM_T : MEI_COM 
) I- K. a. f. x7 t- J& q, y: F% Q. e* W: ~7 O4 ^1 j5 t 
    { 
+ R* q4 U. ^- m9 B9 @- M' a% i+ ?) J; C8 U: d+ N! n8 X) G 
        public int Plus(int a, int b)! B# W% R8 c) f% L 
7 Z1 l3 b7 q  P' A 
        {; O/ T7 v6 u/ q: O$ ~9 I 
* G% I% S- j( g1 F& S! V$ p 
            return a + b ;* G- R( t) L# Q7 {, }, m 
 
0 H+ W" J$ D7 d) `* R" Q; E        }% h4 Q7 B& k+ a. |9 Z3 \ 
+ S+ k. j- L7 N$ w* c0 S! z- W7 P( o 
    }, r3 P( R& c: s# p 
2 r0 k3 L+ X- K5 P& A 
}# O# |8 E' f' a7 I6 @" ] 
  B# ~1 L. s8 l3 j2 ] 
" w; U9 }9 V9 P5 Y' H 
 
9 k1 M$ b+ x. \7 t6 Z* t3 X/ G6 B4 i4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)]. 
, x, b7 T* A, ]7 L7 B& W5 }$ U% f9 E/ h 
: i9 I* w' T5 B+ c9 b. k" C8 Y右击项目名打开属性窗口,在生成里,选中 为COM 互操作注册$ e) ]5 |# d( \/ e  X/ g) B, u% l 
 
  C; d8 k2 X: r+ C3 U 
6 c7 d3 _& a, l% a5. 生成->生成解决方案 
2 r( `9 x7 l  {2 {) d   注意 这个时候 生成 非常缓慢 # m. Q# z( G" Y4 x3 v* i6 T 
   直到 出现 成功 1 个,失败 0 个,为止才 操作一下面内容( L9 y0 x- v6 D5 \) [8 Z/ I+ d 
% b6 H7 [. |/ _8 j 
 
: ^  @( ]1 B# w/ u  y2 V---------------------------* R3 ?; Z9 h: x7 J6 O 
 
" ]; ?, D! E( q( B& h; `1.调用前要先把com组件注册才行.. N0 A" j; \- U 
 
( s$ h6 ^1 I- s5 }. L2 T8 T, f6 D使用C#创建并注册COM组件  C#不能直接创建COM组件,因为其生成的DLL属于程序集,但可通过“使程序集COM可见”选项来支持COM。. R$ P; x6 \% ?  ?, H. \* X1 u 
以下说明如何通过C# 注册、注销COM组件。  
$ @; j1 i( u' D& t: q 
; g; {- o' b* s6 t: A* A; k- F为了能让生成的DLL能够进行COM注册,需要进行强名称签名 
+ t# b# j( Q8 _% [; E+ z/ d打开COMLib项目属性,选择签名,勾选为程序集签名,通过下拉列表选择新建,弹出创建强名称密钥窗口,输入名称,不勾选使用密码保护密钥文件。9 @% U3 q( m% @- v/ o( x. n 
创建完成后COMLib项目中将出现后缀为.snk的签名文件。 
! @3 n2 J. @. b5 }3 Q最后,编译COMLib项目,生成COMLib.dll文件,完成COM组件的制作。  注册COM组件:  如将COMLib.dll放置D盘根目录下,以管理员身份运行CMD,提示符切换至C:\Windows\Microsoft.NET\Framework\v2.0.50727,输入“RegAsm  D:\ COMLib.dll  /tlb: COMLib.tlb  /codebase”,回车后得到如下图所示结果,表明注册成功。同时D盘根目录还会生成COMLib.tlb文件。 
, {6 q( r0 @4 f卸载COM组件:  4 O  {7 B  ?  S, i  }: ] 
与注册过程基本相同,只需将命令改为“RegAsm  /u  D:\ COMLib.dll  /tlb: COMLib.tlb  /codebase”。 
9 J- u- ]/ ~; d 
6 Q/ d5 b2 o1 b" N. a/ x1 n5 Z 
1 W4 u  g0 S5 A2 H4 S2.注册完了就可以在代码中用了,先新建一个C++程序, 类型选 Win32 Console控制台应用程序+ _3 c* v" k2 V% j3 B 
& B: c3 `6 R( c1 x( ]; ` 
名字取MEI_UseCsharpCom,点完成 
6 q! e' h; ~& ?; ^. s$ Y+ H- Q  p2 b1 ~; C9 t+ Y5 B 
把MEI_AddCom.tlb文件拷贝到项目的任何目录下.我就放在D:\MEI_UseCsharpCom\MEI_UseCsharpCom. 
! I& {9 }+ X5 j/ }# h7 v 
+ G6 _, S: Z$ s  V2 {+ F我们会看到一个MEI_UseCsharpCom.cpp文件,双击打开把默认生成的代码全部删掉.敲入下面代码:6 x. {/ v. g, G3 l1 d8 O 
1 G* j* [, k& x 
 
& H& R# g9 r6 E5 I! f#include "stdafx.h" 
( f' F( a6 }# [8 Y" t#include <windows.h>" D7 d+ h9 ~2 c" h: l9 { 
#include <string.h>5 e8 ^: C: g' _4 U: r# t# g* m  p 
% h- O# C1 o4 Y- D4 P8 b 
#import "MEI_AddCom.tlb" named_guids raw_interfaces_only" ?$ Z/ H4 w, q3 r: ?6 K5 G, m, _ 
 
! `; ^! l+ ]# {1 X  |2 P3 E/ o# cchar* WcharToChar(const wchar_t* wp)  //wchar_t转char* 
8 g) o4 a: e# P4 Z: I( d1 _{   
' h  _- _$ i5 @% u$ W5 s$ W/ B    char *m_char;4 e# y7 v  h1 m' U% L; | 
    int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);  : |1 M7 G% _  e) \" A: o: s 
    m_char=new char[len+1];  7 O% \) r; B- N3 l 
    WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);   
- V! ~$ i, A* Z) d    m_char[len]='\0';  . ^2 i: j8 Z! q0 t: }& h  g 
    return m_char;  , C; @0 p/ m' O+ j. e 
}   
; V( W, h; Q! ]: Zwchar_t* CharToWchar(const char* c)   //char*转wchar_t; j4 S8 t2 l8 e% H7 O2 e 
{   
2 \3 j  h# q2 x( {, ^   wchar_t *m_wchar;9 E, I3 P. I" b 
    int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);  ! F# I4 K$ w$ D$ L$ l9 i 
    m_wchar=new wchar_t[len+1];  9 e, e0 g* D! n% s7 ^4 X 
    MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);   
  q* a% C/ C8 y: M. q    m_wchar[len]='\0';  $ b( M$ p  j# |/ x: Y. H9 ?% _ 
    return m_wchar;  : V  s7 a; S& ] 
}  ; i" e6 h# b9 O5 `2 {! ~, \+ P/ `- } 
- c9 H; U. U  ^/ a1 ^$ r 
void _tmain(int argc, _TCHAR* argv[])# Y+ k" E; o2 v0 K% a# l& S 
 
6 j! l' b0 v; [: E{ 
: ^) S2 j: |9 D  X+ s# r 
4 m1 G( R% P- c4 u+ a8 b; N    CoInitialize(NULL); 
9 D( U9 C) V5 A: j/ |( {( `9 c 
1 Y; i7 r$ m4 D1 F0 W: c$ [        MEI_AddCom::MEI_COMPtr ptr;   //类似明志一个指向接口的指针7 F; Z( X' u( N( [. ?1 }* x6 ^ 
4 _% I: T8 z1 M; j8 X- N" e2 k 
        ptr.CreateInstance(MEI_AddCom::CLSID_MEI_COM_T);   //实例化一个类 CLSID_ 类名 
; [0 H, W0 H0 M1 }, j% B$ c 
) N% M# ?; A' s  N   //这个地方有一点点奇怪我也还没弄懂.在C#中的函数是int Plus(int,int).但类型在这里都转成long了.另外就是我们不能直接) X- }8 j1 f  E7 N 
! ]; q5 y! ?6 A# |' N 
   //来个long a = ptr->Plus(1,2);这样得不到a = 3,反正会出错.8 b( M( G8 P( s. o# g; \0 W 
   //这里函数Plus的参数变成三个了long Plus(long,long,long *).其中最后一个指针得两数相加的结果" b' q- T4 E; ]+ Z 
- K( g/ x6 @4 {  F. U 
   long a = 1;1 Q; l1 Q+ ~" v4 ?( N6 |7 _0 x 
 
. k, x; @: V  y/ \4 W! t   long * lPtr = &a;0 M9 {, }/ d9 _& I 
 
" C7 i, l4 C) _1 E/ p8 I% Z) q+ f    ptr->Plus(1,2,lPtr);3 y6 L( n# Y; Z# Y3 ^/ K3 v 
9 v/ A7 m% x/ x( L 
    char msg[132]="";+ h  M$ _- p3 D 
    sprintf(msg, "%d",lPtr[0]); 
$ L2 }) _- {. b/ t$ v  d; F4 W1 R6 G 
        LPCWSTR str=CharToWchar(msg);  L' q: c  B5 z2 K 
0 f- \7 I* }. B! @ 
    MessageBox(NULL,str,_T("123"),MB_ICONWARNING); 
6 J" Y6 u" S2 h7 B1 s9 d 
: `, Y4 `+ I+ f- p: Y$ g  L 
' u8 b* Z+ ^; N8 o2 j+ r} 
/ h; \: v. c. {* H1 t3 I$ y  ]; s! B% P3 u 
此时就可以正确运行了.得到结果3. D6 R/ l) _1 W. i8 g 
 
/ `3 x# S' @: i7 r# W! F' |如果没有正常运行,则必须把dll文件拷贝到有MEI_UseCsharpCom.exe这个文件的目录下. 
% n* }, v! m: r% m4 a; Q- ~  @- J, o7 ^) g% w0 [ 
. z" k6 H# I: I 
--------------------------------------------------------------* y! ]' U, a5 z. @- ~% z" `% P: O 
C# Npoi库 操作excel 的代码网上很多% |" q3 h* g; `& I/ @  X 
1 m% K5 b4 c7 E' d: G 
// ---------------------------------------------------------------------- 
1 k6 _1 W' F: K/ t3 d3 z// 使用Npoi创建一个简单的xls文件,写内容, A  u2 @8 _) y9 g3 H2 P 
3 ?6 a+ L* U* ^* R5 S3 Z 
using System; 
6 \  r! S: s0 J, T$ [7 E: Yusing System.Collections.Generic; 
3 I' b7 O4 \7 Q# e9 t# Ousing System.Linq;7 `6 P9 b7 i. |$ H 
using System.Text;! q4 S; |+ ~6 h- A$ \ 
using NPOI.SS.UserModel;; y2 o! C# @- _& {: j 
using NPOI.XSSF.UserModel; 
" c+ |) Z- d6 dusing NPOI.HSSF.UserModel; 
/ v' a, C% H  S# ]/ P0 v  h. ?  [% Zusing System.IO;5 V/ C! w8 N: B+ j& o 
using System.Data; 
6 M; {& D. R4 ~) Z0 U4 d2 t% X- c4 f5 v  c 
//using System.Windows.Forms; ; Z' n8 L/ R3 C* L1 d 
/ w7 ]7 K& v( a* m, B# h 
namespace CC0 a) s0 ~' f- N$ N' }9 F5 L 
{0 a+ a& {, B5 E8 [. p 
. F5 M+ @% J5 K) k* l" e 
    class Program 
  q- W) T6 y& k- S9 w    { 
) D; v' h/ _. O 
$ b- E  _; F" K8 a& Z2 R+ o 
7 C0 H) w& \$ _! s8 e$ t. E5 ~        static void Main(string[] args) 
( L' R" v  X9 u& y+ n$ v* [7 C        {% ~* G+ b9 T" J. B( s0 ? 
            //创建工作薄 
7 o! j! |6 y( d, _            HSSFWorkbook wk = new HSSFWorkbook(); 
/ c- M& E) R$ B( Y( @            //创建一个名称为mySheet的表. t6 a5 S8 J* h- H( G9 ~4 ~ 
            ISheet tb = wk.CreateSheet("mySheet"); 
/ N& t% K0 z9 u' z            //创建一行,此行为第二行) O/ b) ?+ _5 M4 q. c 
            IRow row = tb.CreateRow(1);/ {! B1 f! N1 R# C6 s- {) J( d 
            for (int i = 0; i < 20; i++): U" ~4 k5 j0 X% n 
            {/ T! L+ A2 F  s 
                ICell cell = row.CreateCell(i);  //在第二行中创建单元格. l8 }% n: d% I1 t+ h! a( y 
                cell.SetCellValue(i);//循环往第二行的单元格中添加数据/ ~6 B6 x5 V2 u 
            }% m& }9 P4 Z9 R5 m0 D 
            using (FileStream fs = File.OpenWrite(@"c:/myxls.xls")) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!% |! C' X, W+ e, V0 Z; T1 B, H. z; d 
            { 
5 j6 N8 N5 f& i, ^1 h2 Z  e                wk.Write(fs);   //向打开的这个xls文件中写入mySheet表并保存。% j! \( @. x1 G' e 
                // MessageBox.Show("提示:创建成功!");- w' a% j) z% l. [& h! M. E% K4 l 
            } 
  Q7 u0 j: z& j" {! U: \ 
5 U$ j' j, l) j  |  ]7 @+ _        } 
5 t& h: t: K  |. Y) t% E/ D4 ]! X+ c9 l. A* l3 L2 l1 {: B4 r 
 
$ v& t3 |5 Y: r0 V7 |    } 
+ ]% z) `# J/ }0 S& o, k8 j% E 
/ P& }9 D/ C0 e1 b; z% q/ _- U- ]8 w: b1 Q. ] 
! Z4 i/ F$ u( P: l" V( Q 
} 
; X# \% h. G& s$ m' y& V1 | 
& h; h: P- z& O// ----------------------------------------------------------------------' o' J8 _' @+ o! B5 z 
// 使用Npoi读一个简单的xls文件! a0 _$ L  f# s( M 
' H3 `$ m3 L: Y' S 
using System;; U; z/ l: Z8 a" J2 y 
using System.Collections.Generic; 
) C! o" U$ B" qusing System.Linq; 
8 Q& V/ t5 z( C5 u6 k) f9 Q: Ousing System.Text;, i" }# d& t& q2 t% L/ C0 N  t 
using NPOI.SS.UserModel;/ [* F2 n5 s8 b) Z1 F 
using NPOI.XSSF.UserModel;$ l7 [7 b& y" `- L6 j 
using NPOI.HSSF.UserModel; 
4 M$ p) I% K& V, V/ A- kusing System.IO; 
* b$ |% }# b" Wusing System.Data; 
- x+ }' B* L; `5 `" k' ~9 E. v8 G6 c8 f 
namespace CC 
/ r/ ?* I3 \- d  K. [3 {{ 
* ^$ d8 Y& y7 S! S4 Z, f& Y. h/ [0 {3 `; U" i7 \ 
    class Program9 |9 _2 x1 j4 R+ _/ S 
    {! s. m; X- l- r5 K( u4 Q0 k' }9 }& R 
 
# {* h( G, A! C8 C& ~8 n 
0 B' g" B9 E* u" j7 t# L0 |6 [        static void Main(string[] args) 
! v; y6 ^9 }% {' a/ L) _# o        { 
( H2 }3 \) |8 ]            StringBuilder sbr = new StringBuilder();% O& P' Y% n2 C 
            using (FileStream fs = File.OpenRead(@"c:/myxls.xls"))   //打开myxls.xls文件 
0 L4 D  A% O2 B6 `" T& J            {' {+ }# @4 Y- i5 ^3 E 
                HSSFWorkbook wk = new HSSFWorkbook(fs);   //把xls文件中的数据写入wk中 
' M/ M/ T& Z1 q' K2 R                for (int i = 0; i < wk.NumberOfSheets; i++)  //NumberOfSheets是myxls.xls中总共的表数' V, H; g( ]% d% I. Q! x 
                { 
7 ~0 [% h# D; A+ b& ?                    ISheet sheet = wk.GetSheetAt(i);   //读取当前表数据 
8 G, {& \- b' a5 V                    for (int j = 0; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数/ H. |0 b1 q/ E+ j 
                    {4 @2 r  o4 ~6 N2 Y 
                        IRow row = sheet.GetRow(j);  //读取当前行数据! f! D( d; {; r- K- }0 k4 F 
                        if (row != null) 
3 W# o( x/ [2 X" _                        {) K9 Z9 s9 r! v1 A& I' o+ H+ n 
                            sbr.Append("-------------------------------------\r\n"); //读取行与行之间的提示界限 
2 Z6 i) T+ \& H% F+ f& }0 a9 W                            for (int k = 0; k <= row.LastCellNum; k++)  //LastCellNum 是当前行的总列数 
: E# n% K2 i8 c* p5 R6 Z                            {2 X/ G( v5 _( X 
                                ICell cell = row.GetCell(k);  //当前表格 
( O, k) v9 H9 Y2 O1 s                                if (cell != null) 
  X+ h- ^. @( {$ T$ S/ q0 X                                { 
8 P! {( ]5 Q1 C: ]2 ?- l, F4 j: s                                    sbr.Append(cell.ToString());   //获取表格中的数据并转换为字符串类型 
& J  a, C5 l. E+ X) @0 t; I. E                                }/ \4 T; K9 [& Z  f 
                            }2 ^  B5 \+ H4 m, @* W( J 
                        }/ a2 g- S* J2 T/ ^( t; x 
                    }" g5 [* S. s* K- z; X8 H 
                } 
% [) I$ `0 J$ d% B            }9 Q2 v; z7 }7 r3 H0 l 
            sbr.ToString(); 
* F1 T; R# r5 }3 |. V            using (StreamWriter wr = new StreamWriter(new FileStream(@"c:/myText.txt", FileMode.Append)))  //把读取xls文件的数据写入myText.txt文件中, |$ h7 Q* u# N2 I+ E" Y 
            {7 e: Q$ J$ l. w! u 
                wr.Write(sbr.ToString());4 w1 N- I& B1 z2 F2 T  J& s) q 
                wr.Flush();, v+ _& h& X7 H% r 
            }, [5 F. O, e. O4 j2 E 
 
: e& [" C- J7 V' P" c1 F$ e& }( U- S+ d, A' J5 s# _8 ~* u 
        }( c# [3 Y5 ^" N+ w6 X 
 
# O1 ]% t$ k$ K; _8 v3 [; t; n 
! k; h; k3 d* W/ X5 r& g  A. V    } 
, E" f0 h+ w6 J& b9 {0 J& k) T8 e 
+ |2 m( H% w5 u8 I% V8 c9 `. \ 
5 K* J8 u( U9 e, _/ }. {. i/ p2 S 
} 
: y$ z0 y/ x* g2 t/ B 
0 L% x" @, p. E4 _0 k 
5 ?' |2 x3 U$ W+ `0 F, ^# V然后 自己封装 给 c++用 
- C9 J$ l0 Y3 |+ F( s1 c4 d 
* X& {. i: g. {0 i" Q/ ~ 
3 S2 Q3 Z4 Y1 N! E8 Y5 J* `# u0 h5 n" X: p+ X; k" S. U& r 
5 g, \% _% C1 p) z" o' d) o 
7 \, n3 j4 s  S9 \$ R' Q4 H) b 
 
0 w" q+ y% k8 S( ?( ?+ l! \, z. R3 \4 X9 M6 Z- y* J 
) I0 z0 H- u9 E) ^1 Y" E 
7 }7 e* ]# H' Z( R: d& k 
 
6 |' e8 H; Z5 ^7 [8 E 
4 w; Z+ Z; T! U9 r3 I6 W$ l# S( p+ s% T; Z 
1 ?7 s: z) Z$ N  \% B4 a/ \ 
 
% n5 E; X' {4 i5 {+ L, v: z6 G; k  Z  J 
( Q: I1 u/ e. R) V" n# f! _+ D 
 
0 B' @8 c7 h8 P) y8 j7 t+ K9 V# f, u! `  d! x/ p% } 
 
2 C! e! M3 P* Y 
! A2 L6 I! Z) q0 e7 ` 
2 g) i1 i% k9 p 
8 l" `- x% L& ]- x; L1 J4 I. G& Y! { 
 |   
 
 
 
 |