PLM之家PLMHome-工业软件与AI结合践行者

[原创] C# 或 c++ 不用安装操作 EXCEL的方法

[复制链接]

2017-3-6 19:21:55 3392 1

15757753770 发表于 2016-12-11 14:57:16 |阅读模式

15757753770 楼主

2016-12-11 14:57:16

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

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

x
C# 或 c++  不用安装操作 EXCEL的方法:c++ 对excel 的操作 非常不理想 要安装excel 而且读写速度也慢
- D+ t$ j$ o- H; R+ Unet 有很多 免费的开源库 比如 Npoi库  (Npoi库 支持c#、vb.net 等语言)
$ c0 ?. n- q7 |  ~+ v, j这里我用c# 生成 com 组件 让 c++ 调 ( R) |. q# Q  M/ Q! Y: R
! |& J2 D# ?# C
首先要学会 c++ 调 c# com组件的方法   (和com注册的方法)+ ~: r0 C+ s8 [1 B2 U
C++调用C#的COM组件(DLL)0 _& M! J4 r/ ]! s5 d; V+ O

! i3 r) y4 I: C- `, `" l下面我举个简单的小例子.我用的是Microsoft Visual Studio 2012,操作系统是Win 7.7 O3 R, p, |$ r5 f/ h
首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和.
" ]4 U( d7 ^5 {
  {$ M# t* K7 {  z' U# m0 H0 U. @3 ^, W) b
1.新建一个C#项目 ,类型就选 类库 .取名 MEI_AddCom
) s6 i1 ^& D" s* }% W
3 E2 _. {+ v3 K5 w; R$ m$ X% o* D2.在项目中添加一个接口,取名MEI_COM.C++调用com组件中所有的功能只能通过接口来调用,不能直接调用类或函数/ R; R7 p# ~$ z1 P! `( x
: e" ^8 N& U6 e* Z, g
具体代码:
9 o7 R: h0 L2 s) v
8 z& Z  k- c3 [8 l0 u; zusing System.Runtime.InteropServices; //记得加这个命名空间
, H2 g) G- s' P5 x
7 _$ |# j6 O; h! g& }  ?namespace MEI_AddCom
& d- E+ D( [3 l3 k6 a$ i+ ^- A; F
& ^3 c% F3 P9 f9 t; x- [, ~' G{
( y% i4 l7 S% G9 y) Q$ A8 A$ D1 ?, |0 Q2 F5 K  Z( D$ I
    [Guid("DA07B88D-29F0-41cf-B3D3-611010E6F3FF")] // guid的产生可以通过vs自带的工具.点菜单栏上的Tools ->Create GUID,然后选第4个选项.Registry Format.
$ {' V8 {) q" x1 R
3 |# P- `* M) d! R( H5 }% O3 N' P          //点按钮New GUID,再点Copy.这样你就可以把产生的guid复制下来,然后粘贴到这个地方来.当然那个大括号得去掉.后面需要用到guid的地方也用这方式产生
3 a1 [0 r7 C0 ]2 a7 E
# ]" D- S+ f2 y: Z    [ComVisible(true)]
3 @: Z/ d! ]8 V2 _/ p$ w
1 p! ^+ c! b% D1 X/ G    public interface MEI_COM        //记得用修饰符public1 D( n; b2 F- H  ]* A. _  w

+ f, ?2 F8 d0 N    {# E$ E, {$ t- }. A3 h
. {7 Q) t  Z4 n4 y$ o* w
        [DispId(1)]       //如果还要添加其他函数就继续来个[DispId(2)],[DispId(3)]加在函数前面
5 I; M. b0 a" a$ {" a
8 p! B7 J9 A8 F* Y        int Plus(int one, int two);4 C. k6 \5 E& h% w
* g5 g& [' O9 r. h7 {/ j8 e" I4 P3 i( }
    }+ A# X6 O+ o# ^- ?

. i) q. L. G+ q. D' d4 e8 L( S6 m: D}
4 G+ S& A" O9 v% D* o+ v2 z$ e+ b. K0 R! Y! j1 ^( z

$ ?6 e/ P1 m5 W% p0 k$ c& E1 T! Z# r" y( l
3.添加一个类MEI_COM_T,继承接口MEI_COM,具体代码  B; G! p3 {) b5 v' e
1 t9 Y/ I7 F& o+ G9 \5 J
using System.Runtime.InteropServices;
- S/ R/ }, Z9 w0 ]1 R# ?* h! x* U1 x( L8 W. b, z
namespace MEI_AddCom! X1 K" V; K$ d; d
; H; Q6 f) I$ X: h2 f
{, A. {2 P6 Z: K: m* ]: P3 d- T

6 \6 e) E7 N1 v/ b; n    [Guid("04F4DC83-8883-4a03-BDBC-92D8630ECC1F")]: e: Z, n' C# i0 h
1 u' w- E6 J% x. p6 v4 r8 n" i% L
    [ClassInterface(ClassInterfaceType.None)]( ~/ |5 E4 |" ^8 J. M3 V

1 a8 \; B! ~# v    public class MEI_COM_T : MEI_COM
6 c" u% `3 O  U- y' H
- D3 G- j: Y" W# H$ A    {
' y; Y' O& G3 ]3 W+ z% _" r. V
& b7 |- t& }9 |/ p# V$ b& L0 z8 [        public int Plus(int a, int b)
! C8 ?) L  M2 S6 x
0 Z1 T6 {: G7 P9 `        {7 i5 Y9 n( A0 n% u, I( f! s- R* i
: R+ Z. I+ x5 k( R/ ?) {- [5 l
            return a + b ;. [9 x$ ~' x; j4 V- @) }

# z7 @9 _% x; P# m% V% Y3 ?1 I        }; b8 Z3 [4 f8 z. Q8 o+ b+ J* d
0 [3 q) D5 |0 s$ u/ H
    }. b/ [' w, [: @1 V5 h

5 c, U. Q' W! P}7 M0 A0 Q& N  Z& v

3 V' s3 h# |. G8 w$ o/ o; N; i' J8 a

1 |# `3 H( X! E6 ?4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)].4 q" ^6 o5 q- P* _, w8 W  H; j8 g

" s9 u% ^1 S, p5 A右击项目名打开属性窗口,在生成里,选中 为COM 互操作注册
" ]: E1 n+ Q- u3 \" c
9 P" `/ D5 ^* ?8 J
" e7 v; {. S. ^, m5. 生成->生成解决方案
- [# B  r5 g: @4 L1 ^   注意 这个时候 生成 非常缓慢 ! M" n* W% T& _' X; z* @' E
   直到 出现 成功 1 个,失败 0 个,为止才 操作一下面内容
2 k$ S$ t' K8 O1 ]: X2 w- F2 a2 u+ W$ W2 @

/ v- b5 P7 k8 M& v  o% {( W---------------------------
- D7 b  s5 @/ o, s4 e& @! B8 r# t, {2 L. j3 R8 X! j
1.调用前要先把com组件注册才行.
/ T+ N; k  q1 a7 d$ l4 b" n+ e5 E1 ~
使用C#创建并注册COM组件  C#不能直接创建COM组件,因为其生成的DLL属于程序集,但可通过“使程序集COM可见”选项来支持COM。
9 W, L" A# d( ~9 U! H( S' K以下说明如何通过C# 注册、注销COM组件。
* d6 ]( L  E  N2 P/ E% C$ w5 t* X6 a- I" c% T7 L
为了能让生成的DLL能够进行COM注册,需要进行强名称签名
9 P+ s# C" g$ x' M) {. |6 K打开COMLib项目属性,选择签名,勾选为程序集签名,通过下拉列表选择新建,弹出创建强名称密钥窗口,输入名称,不勾选使用密码保护密钥文件。
& P6 t  Z3 ^2 u& c" R创建完成后COMLib项目中将出现后缀为.snk的签名文件。
: B& F% P( I2 \! ?# \4 x; X最后,编译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文件。
2 _6 I* `: |6 o- ?. n! [卸载COM组件:  
1 e. q7 `3 {. e$ U1 r, V& |: r2 R与注册过程基本相同,只需将命令改为“RegAsm  /u  D:\ COMLib.dll  /tlb: COMLib.tlb  /codebase”。
$ Y/ C" |3 B( v0 F
: U! I7 q6 K! W" m) C  }0 K; u6 d7 F$ W; D
2.注册完了就可以在代码中用了,先新建一个C++程序, 类型选 Win32 Console控制台应用程序
* y4 Z0 G# \" K: j$ j0 I8 R
! i- a9 f  K" ~9 [: r( s: R名字取MEI_UseCsharpCom,点完成
! r& w6 l; Q6 M' S$ g7 O. a: y$ H) }) B6 N* w3 G
把MEI_AddCom.tlb文件拷贝到项目的任何目录下.我就放在D:\MEI_UseCsharpCom\MEI_UseCsharpCom.
( d& \- B9 L# h' u& x5 ^; U1 x, A$ b! I9 T2 ?! W$ G9 Q9 l
我们会看到一个MEI_UseCsharpCom.cpp文件,双击打开把默认生成的代码全部删掉.敲入下面代码:" M# r# k% @( ?$ \; d

$ |& y3 M; |5 v, C# Y; Q- Y8 }6 t6 P/ _/ S! E+ \# e2 s; q) w" U
#include "stdafx.h"5 ]# P+ \& c4 }
#include <windows.h># n, }# Z: N0 g5 S
#include <string.h>+ I+ f$ o; [- r+ K8 j

4 j, u" Y4 A2 |$ D#import "MEI_AddCom.tlb" named_guids raw_interfaces_only& y& q) s# E) M# e" o1 Q" B3 D8 ^: k( l

+ s* I5 o# {) ]3 J2 V! k4 u, Vchar* WcharToChar(const wchar_t* wp)  //wchar_t转char*
6 ?4 v4 K- l3 x" `' \' o! ?7 N{  7 d. D( P' e4 g$ }
    char *m_char;; |2 N2 S  n# z' ^
    int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);  8 E0 }1 X9 B. ~3 o1 B$ n
    m_char=new char[len+1];  
) D% f- [4 b8 M2 F    WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);  4 [+ q9 P9 ^! w0 v* p( W
    m_char[len]='\0';  
) ~5 _  Y. s% O6 }! V! W$ E    return m_char;  2 |* I1 u0 I7 N7 o9 O
}  % q- o  ]7 O) m5 A0 w6 \
wchar_t* CharToWchar(const char* c)   //char*转wchar_t
4 j# h& o5 O5 m/ [2 h{  
; L4 E. U$ R6 a& o   wchar_t *m_wchar;% W+ }; ?4 o1 b, _- Z
    int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);  " e4 [  E0 o& {  x" d
    m_wchar=new wchar_t[len+1];  
2 R, m. u5 E2 G+ o    MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);  
! M6 [! N& F+ `! O' A, J    m_wchar[len]='\0';  
5 z6 g8 F3 B, |; Y    return m_wchar;  
4 k" n' P3 |" i# V4 r! B: l}  
/ e' q" C4 e3 m  G$ Z: b: I9 p: I, i! K" a! T" E
void _tmain(int argc, _TCHAR* argv[])% U5 E" ]; Q" F
' `3 S2 |  U8 |1 e
{
# W9 }1 a. |* _* {, @9 b: E3 v9 b) c" j8 x  s$ p$ ^( Z6 G8 f4 Z
    CoInitialize(NULL);
  F# O" s6 p$ C. m4 F* J8 }' z7 R* Y8 Q- Y# Q
        MEI_AddCom::MEI_COMPtr ptr;   //类似明志一个指向接口的指针- }1 E6 E( B; l6 x' F4 }

9 t) w# ^( ?5 I        ptr.CreateInstance(MEI_AddCom::CLSID_MEI_COM_T);   //实例化一个类 CLSID_ 类名
" ~( R2 ]  L4 @4 q3 D6 q0 z$ {- k5 m- d9 \
   //这个地方有一点点奇怪我也还没弄懂.在C#中的函数是int Plus(int,int).但类型在这里都转成long了.另外就是我们不能直接7 U) a6 G9 r/ g" i  o/ B3 z& Z/ r
$ ?  V4 S  J- o
   //来个long a = ptr->Plus(1,2);这样得不到a = 3,反正会出错.
3 a# C- G1 i- T" p0 h* Z   //这里函数Plus的参数变成三个了long Plus(long,long,long *).其中最后一个指针得两数相加的结果
, A' X# A; Y$ |$ C1 l) R+ n/ d1 _9 i9 A9 ?( Z
   long a = 1;, W8 s( ^6 d, Z7 j$ `8 Q3 p  }

' e/ u' H) T% ~; a: S   long * lPtr = &a;6 U! t; f) e8 _1 T

2 `, R- b  U! j+ H1 _7 x. M7 j    ptr->Plus(1,2,lPtr);9 i5 @6 ~8 B. S) q3 r
+ r$ s: X" C+ o) b
    char msg[132]="";
  r# x: R/ y( }- q  z6 K/ s1 r5 y    sprintf(msg, "%d",lPtr[0]);. e6 g3 ~% c7 x9 {. t7 H; p# D* m0 ^
" a. k+ l! t  r, y& _
        LPCWSTR str=CharToWchar(msg);
/ z- x, E1 B" u4 F. l! A2 K$ |7 \$ K& ?: Y0 `1 J
    MessageBox(NULL,str,_T("123"),MB_ICONWARNING);
; P  N4 l' B, W2 }  s$ N# D0 @$ \: O; h6 G0 E1 e* j! G

3 \4 p6 ~& i1 ?4 C4 Z- Z, F" ^; f}" Z* h+ R5 @- t) @. m7 W
+ G5 [" \/ _: Y* [# c  c0 \: X
此时就可以正确运行了.得到结果3- P% S8 R( T9 n  `4 c7 \
5 r' T  R. K- R
如果没有正常运行,则必须把dll文件拷贝到有MEI_UseCsharpCom.exe这个文件的目录下.% r- L$ o0 y2 t

/ r6 a7 W, ^: e7 d$ |( M
$ }7 F0 G" A7 q( C' g& |--------------------------------------------------------------
! z/ W$ }* {: s6 H# IC# Npoi库 操作excel 的代码网上很多! P* Q) A. u) V* }3 F3 A

+ w( M) ]4 }/ C4 b// ----------------------------------------------------------------------
1 r9 M* y4 n  q. N$ {6 _// 使用Npoi创建一个简单的xls文件,写内容
$ ^9 o: p! e$ R7 e6 g
& s2 S  [2 s8 B4 s" k1 Fusing System;. H1 l" o: c3 G: T$ H
using System.Collections.Generic;
5 U# I( J; H; _1 Z  @7 N  A8 K% Susing System.Linq;
# C2 U; O) x; j5 L, j9 `3 Kusing System.Text;1 z# \% l  \1 E; A2 }* A; ~/ q
using NPOI.SS.UserModel;
* H7 Q& O, d6 Q9 t  `: n9 [using NPOI.XSSF.UserModel;
( a/ R& O- ?+ p4 nusing NPOI.HSSF.UserModel;4 [, e& S4 N$ T2 O# Z% J( `, a
using System.IO;! H1 h. I% x# f! C9 ], F
using System.Data;
* [1 W$ r7 g. K8 `5 {6 O" Y( {8 G/ w4 S
. c; ]6 H- @$ M; d% c; ?//using System.Windows.Forms;
# d9 Z+ C/ m7 B% g3 Y, {! c2 O
- O* ~2 ?  H+ o' Q8 t9 ~namespace CC2 }$ s8 S" X  _5 ^/ K5 w
{$ p$ f. ?+ S0 X0 A4 y
$ T6 `# |: u6 H7 s- h
    class Program
; ^" r; H! N3 M+ h* ~    {8 u1 r1 @; n/ G5 k

+ \' S4 D$ Y1 ]% `2 S) [+ P* b) T* D2 c0 x0 k4 F' h+ H$ ~  Z; e
        static void Main(string[] args). I" {/ }; l9 ?5 B8 t- u0 W
        {
0 J0 E6 G% H! `            //创建工作薄
. g5 Z; t) m/ n0 z8 d. L            HSSFWorkbook wk = new HSSFWorkbook();& R; l0 D! |4 I- [, J
            //创建一个名称为mySheet的表
% U# q" y. ?' Z+ o: \3 H            ISheet tb = wk.CreateSheet("mySheet");
7 \9 l. r; ?# v* ^& M# z8 J0 C4 J            //创建一行,此行为第二行
5 u( u" H9 ?  k& M8 u/ N            IRow row = tb.CreateRow(1);( F. S& ^- K: H3 m
            for (int i = 0; i < 20; i++)  u& H1 y/ s: O6 J5 Q; n& [) I
            {
7 C% D& Z; k- U7 \                ICell cell = row.CreateCell(i);  //在第二行中创建单元格
2 ~, i4 F/ U: p1 W9 d8 z( O3 p                cell.SetCellValue(i);//循环往第二行的单元格中添加数据
6 \+ ?$ y1 j0 f# Z            }0 [/ G9 O+ ^+ O; w
            using (FileStream fs = File.OpenWrite(@"c:/myxls.xls")) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!
( X$ A7 M% f9 N6 P0 Y1 u) b' U; v            {6 g: X! x& _0 J; d
                wk.Write(fs);   //向打开的这个xls文件中写入mySheet表并保存。
4 i. \( L/ X8 z. I! e                // MessageBox.Show("提示:创建成功!");% Q" m/ T9 E0 T! u7 D
            }
* G$ A( e# m) \, v, `# H; ^& P  U0 x
* l4 x+ ~' _- }( h& l        }
6 w/ r5 V# z, y7 p# }: m' O
. z. `$ ]/ q4 N3 R
4 E; x3 H9 h& [5 u% u: C, }. z! B    }1 X% ~9 H& g' m& Z4 @( A
1 x2 K& c: c7 W5 [1 p# p

2 V; H+ l' }0 a7 l0 C  Y) t4 q# Q5 ?0 i0 w9 c
}0 x  c  }: n) q5 V2 y1 a1 H0 S. q; q3 P& p
4 D# T# g' Z  C& h* _
// ----------------------------------------------------------------------  t$ |: R' n: U
// 使用Npoi读一个简单的xls文件8 d# i7 P; I& M( w  o8 K5 _
! X8 d8 Z: q5 `4 Y5 f, Q) x4 _
using System;1 S& p4 @% Q. n: f0 P) }" g
using System.Collections.Generic;) w1 {6 V! k3 `0 P2 ]9 f, d4 n4 m
using System.Linq;
* ^6 J+ `% |5 O$ _' c9 X. Lusing System.Text;
- ~  ?- u9 P, }4 Uusing NPOI.SS.UserModel;+ L  F! b3 e0 a' }9 y/ E5 F; P
using NPOI.XSSF.UserModel;/ ~% ^" j+ @; J3 n! q* ^# d
using NPOI.HSSF.UserModel;1 {7 I5 `; s. b, k" y$ ]- [" i' Z
using System.IO;
' W7 f2 t: Y+ Eusing System.Data;$ i* b6 n2 s$ G, |& T" }% O
# y" Y" x' G+ c8 X% n, |
namespace CC, H) u& _& ~5 L) D5 B* |  {* y, `
{
& _: w8 k2 j/ N# W) ?1 ]
8 A* h) ~! |) O: P! Y    class Program! D0 i. U% k7 W& G# [: p
    {
* I, Z3 |  Z& M6 l0 @/ l$ a' R, E% z9 g# q1 s( x0 M0 Q' o
4 r- E1 @( [7 i) \( k9 G2 K* i: L
        static void Main(string[] args)% \# t3 X* j. S3 G
        {) h, o" y+ U9 b( W" y) G2 L! k
            StringBuilder sbr = new StringBuilder();
! D4 t9 P" e# A$ u& m2 M' f/ P            using (FileStream fs = File.OpenRead(@"c:/myxls.xls"))   //打开myxls.xls文件, W* }, a& A  @! `
            {" k2 q4 o6 @- i
                HSSFWorkbook wk = new HSSFWorkbook(fs);   //把xls文件中的数据写入wk中
1 R6 \: ]! P& e# J2 j                for (int i = 0; i < wk.NumberOfSheets; i++)  //NumberOfSheets是myxls.xls中总共的表数- f& \, P1 |3 i) S/ t
                {/ Z$ H& _) F. M4 y! u: F
                    ISheet sheet = wk.GetSheetAt(i);   //读取当前表数据* T9 s) Z: b7 f" V( P( S6 C
                    for (int j = 0; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数' p/ B' K3 a+ Y, b& D: q% X
                    {7 m- f+ F% ?) Y" b) w
                        IRow row = sheet.GetRow(j);  //读取当前行数据) `& N* w0 H% q& J) O$ ~6 V
                        if (row != null)/ S  M- x, w. w. Y/ K! W$ K% M* Y7 |! v
                        {
3 i: ]. T0 a" t1 b                            sbr.Append("-------------------------------------\r\n"); //读取行与行之间的提示界限+ j) A! [7 [8 u6 J3 y, y
                            for (int k = 0; k <= row.LastCellNum; k++)  //LastCellNum 是当前行的总列数+ k. o7 P. K5 D, \4 V3 E  K
                            {
; ]( r" Y' H$ X- u: S                                ICell cell = row.GetCell(k);  //当前表格) {" o& k8 W# \, F+ m
                                if (cell != null): \; G! ?% n9 a$ f
                                {% Q% c& k1 s& u& D- Q; R1 a( t% x6 E3 u
                                    sbr.Append(cell.ToString());   //获取表格中的数据并转换为字符串类型
- n  e+ k% v) M1 J5 o% M* @7 ?                                }" T5 D" m: y% K, j+ J. K
                            }# v5 O4 u, W! w' ~" Y6 Q' |
                        }
" M  W9 z$ L+ n: z0 R9 _0 M! L                    }; }7 i) y: |: y5 |( o% V  K
                }6 ]  P0 k1 f) j
            }
' z7 n) s* A$ Q            sbr.ToString();6 {  ]$ I$ L8 I$ g
            using (StreamWriter wr = new StreamWriter(new FileStream(@"c:/myText.txt", FileMode.Append)))  //把读取xls文件的数据写入myText.txt文件中
6 {/ [0 s/ S/ K# N% |; f            {  D7 L; G; N7 _5 P! f; f
                wr.Write(sbr.ToString());
" l% w; k+ n) r  @9 A1 H                wr.Flush();; \/ Y. V$ I: q+ ?& q
            }
( O  A& b7 f; h
- U& A! n) m4 f2 l) e5 i2 f
2 g5 N, O! \& K: w+ t. O        }( z: M# H' M- z

" ]1 X: h( j  {' O( h( |. k: M- d) n8 e+ |3 V+ c+ |7 ^
    }) V4 ~& W# M( u' ^
* m5 }! ?! {6 j+ [. H% J

% z9 i4 z) ~! o  B# n$ T4 w: V& U" m3 r, B. N& H
}. f$ X9 }' d8 H0 n
" f, D( B2 T, R% S7 ^& ]

2 ?  O+ z& l! X$ T+ c& O  t4 N* g然后 自己封装 给 c++用
3 V4 S' K7 \, ?( [$ K( ~$ m( @0 M+ W0 z( l: {. {
/ M4 h# b; _" n- _+ k1 U+ R

9 J; G/ B. n+ P) [4 d2 g: S3 l  G+ ]/ p1 [' l2 ^0 i( M, @

. r: @' ^2 n( s; \- y- p( s% e% m5 o' g4 L/ T* U1 V6 y
/ Q+ m1 m! L. C) B" g, M. |
/ Z& m  e' k! L2 c

) [5 i4 @# P. b% b7 m! d/ K. B( b
6 x5 Q0 ^# r7 n) A  E) f7 [! T1 E5 L" F( K4 K: s2 K
' f; U. K" `' U4 `$ {( P+ ~# g& V

/ c9 R4 r' ]0 A

2 `" Z3 a' B+ m$ U& N" V
1 ?  f. C! \: m( l

- a" q8 `; Q6 L! i" W! i- ?& F; s7 A
+ C6 {; H7 Q! u) }$ S3 ]- V* }
  z1 J: }# P! N. K
- y& \# y% R: y! _' B1 ?

( }& {9 ?' o  f7 N3 y2 x9 F- [1 U! J$ z% O7 ?/ y

. Q2 I4 }) C+ o7 C4 G4 z3 I: ]
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

全部回复1

f1405602 发表于 2017-3-6 19:21:55

f1405602 沙发

2017-3-6 19:21:55

梅大师,就是叼!
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了