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

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 14:57:16

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

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

x
C# 或 c++  不用安装操作 EXCEL的方法:c++ 对excel 的操作 非常不理想 要安装excel 而且读写速度也慢
$ h' C- a/ M9 G' G6 Qnet 有很多 免费的开源库 比如 Npoi库  (Npoi库 支持c#、vb.net 等语言)9 M; l& T" u* }8 s8 n0 ^
这里我用c# 生成 com 组件 让 c++ 调
5 |/ v9 F  A8 d' A6 ?( G: Z
2 {9 M8 J# O$ S3 q+ X% x8 z" A首先要学会 c++ 调 c# com组件的方法   (和com注册的方法)% ]1 i: V8 m% z) o5 s$ q: [
C++调用C#的COM组件(DLL)
9 `. r( [2 G2 U2 W- ~" V5 \
: B4 L" t+ A/ u下面我举个简单的小例子.我用的是Microsoft Visual Studio 2012,操作系统是Win 7.
0 Y0 Z1 m, ]5 f1 W首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和.# m5 {* g  E; E4 z+ {4 M

' x: x2 u- n% c4 x1 d5 T' ~% z# j& x# [+ s4 P$ r
1.新建一个C#项目 ,类型就选 类库 .取名 MEI_AddCom
8 n- P* R( T+ X$ G! [; Y2 m+ q: H2 V3 J9 y
2.在项目中添加一个接口,取名MEI_COM.C++调用com组件中所有的功能只能通过接口来调用,不能直接调用类或函数' E! h- k! k0 G& \$ }
0 @' l& [; {/ A; h! W9 E1 X
具体代码:
  M# n0 e; w2 {5 n: I2 R* z4 N+ C- V. C8 c
using System.Runtime.InteropServices; //记得加这个命名空间, m8 l% a9 L: ?* X* u

3 W1 K* [( I; O: s. n' h  Ynamespace MEI_AddCom5 h! v( [1 i* i5 w& t7 [& c
& ~* L( y. E$ l( w, _, S$ j
{( |+ C! @6 T6 I  g* |% e
- m; K6 x8 l" y3 c' W# @
    [Guid("DA07B88D-29F0-41cf-B3D3-611010E6F3FF")] // guid的产生可以通过vs自带的工具.点菜单栏上的Tools ->Create GUID,然后选第4个选项.Registry Format.
: h( c0 `: Z! |) D0 B# P6 s
" T- B$ h; f, d$ t2 W          //点按钮New GUID,再点Copy.这样你就可以把产生的guid复制下来,然后粘贴到这个地方来.当然那个大括号得去掉.后面需要用到guid的地方也用这方式产生/ j1 m/ d; W' Z4 |1 Z

. o) Y7 S; q- h- t. u( W  H' y    [ComVisible(true)]  Q7 Z0 s$ U. S

5 n; Q. O* t1 y2 _! v* _9 x/ R    public interface MEI_COM        //记得用修饰符public
( J( o, {, `8 ]3 Y9 D7 _/ x3 {, y! V4 j& J- Y1 m, Q3 n# Z% }
    {9 @; ]8 O2 Z1 W, ]9 U" l) P
" V0 Z7 M4 p( m1 W+ @  F
        [DispId(1)]       //如果还要添加其他函数就继续来个[DispId(2)],[DispId(3)]加在函数前面
( d5 p7 f2 I" v- j+ }( w  I/ @/ B7 m' |3 y
        int Plus(int one, int two);
* q" R3 A  h) A. H  h: i- F# w
+ N! U6 K; d; F' a' |    }1 ?# R. X7 a: ~' y" A+ r( I8 J4 t

/ s9 P! S3 A  W( J3 l- N}
" Z; |5 w4 b, i* z; E% q+ N+ S( g, K) m0 p1 l/ |9 {
9 _( z$ Q# P. y8 x) m/ S
+ S# y0 W8 _; M$ S
3.添加一个类MEI_COM_T,继承接口MEI_COM,具体代码
: n5 o, j7 ?9 q# ]# n2 Y9 E1 O
6 I* b) y: ~6 W: Musing System.Runtime.InteropServices;* I+ f" ~0 y% y
: X0 F0 m) U* y' w
namespace MEI_AddCom, ]$ ~# {- E: l$ c

% U2 j: M* X( ?7 _8 X{. t) b. z- H  D1 X9 d

: _9 _# j* _! J9 L3 |    [Guid("04F4DC83-8883-4a03-BDBC-92D8630ECC1F")]
' q" \9 I5 F. |9 ~0 G
% H  Z0 y4 p. s$ ^7 M: _    [ClassInterface(ClassInterfaceType.None)]
9 X) ]# P& p# \5 V, p, {- z: d/ ?4 z% b
    public class MEI_COM_T : MEI_COM
: H. }2 `  e7 X% m; }/ t3 v) j6 J& X! Q5 N
    {5 B7 V" Z& Y% g3 g" F" n8 l
( F! l; W! z* ?3 i8 C* |* A
        public int Plus(int a, int b): ?- Q% B( {2 D
) |1 ~$ j: `; I$ T/ A( m  A. g
        {6 `' O; T/ T, B# S
6 _. k& ]3 M; X$ b. H
            return a + b ;
0 q* s2 X$ }' L4 o; p; A5 y7 H
/ @4 f9 [* E' W6 s: G/ [1 R+ f        }
; A, c5 g; n' u" u+ m0 N  i; ]0 J
) z/ f' C1 }$ b( M    }
: L0 w& U9 e* R/ l3 d2 K8 G* [
1 H1 R0 E8 Z, p' U5 ^1 a4 ~0 r}
; \9 |# ^* D( j6 d$ m& @' q+ U! v" ]9 A2 u2 W
( T+ p8 Y: O! r+ A, _: x
  D- m: x% @1 h% I
4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)].% Q2 q) C0 U5 S. I- v8 E1 j) b

( F& M8 h2 G* m3 U" {右击项目名打开属性窗口,在生成里,选中 为COM 互操作注册' m! {8 b2 R9 t* u

# k4 I+ r" q5 c& c+ j' ~! D9 Y0 n  g  X2 o
8 B7 J. U. g8 H' W5. 生成->生成解决方案
8 l* o1 |5 h1 q1 Y8 }9 |   注意 这个时候 生成 非常缓慢 6 I8 S4 `% H7 [, C5 K9 a0 u
   直到 出现 成功 1 个,失败 0 个,为止才 操作一下面内容
; p) l3 R' J0 Q3 I6 ~) H& |7 ?" \' M$ S. ]& n3 n( b5 ?2 ^
# g" X) o; S, W. ~/ k) j. ?. n
---------------------------
0 P. {. j8 t4 ^6 s" n
9 P: L/ v* `/ m% n/ A1.调用前要先把com组件注册才行.
2 W* V' V& U6 V; ~9 h7 w/ E; C4 x, I- C  @" N8 M
使用C#创建并注册COM组件  C#不能直接创建COM组件,因为其生成的DLL属于程序集,但可通过“使程序集COM可见”选项来支持COM。
( m+ t, Z/ C- c6 n& C$ ]5 K以下说明如何通过C# 注册、注销COM组件。
% t! j& k0 U& i+ W- z/ u
  z( U: q! p: O( T4 n/ Q为了能让生成的DLL能够进行COM注册,需要进行强名称签名+ U9 a1 F9 j) k% ?, ?4 L
打开COMLib项目属性,选择签名,勾选为程序集签名,通过下拉列表选择新建,弹出创建强名称密钥窗口,输入名称,不勾选使用密码保护密钥文件。
' ~* Q0 e2 k9 h6 S) x. E创建完成后COMLib项目中将出现后缀为.snk的签名文件。( o$ b& |2 J) v
最后,编译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文件。- v$ d# r; `) Y" G$ a
卸载COM组件:  
4 R8 G$ k( Q1 _5 V& _与注册过程基本相同,只需将命令改为“RegAsm  /u  D:\ COMLib.dll  /tlb: COMLib.tlb  /codebase”。0 u" {$ @& E% P0 T& P: [

1 Y1 j% M" w0 i# K) D# {7 l0 j$ K# `9 k2 ^8 W: b# a
2.注册完了就可以在代码中用了,先新建一个C++程序, 类型选 Win32 Console控制台应用程序$ `- `+ I. l$ t( t4 Z
% D  s5 ~8 l- w7 j! u# N3 t
名字取MEI_UseCsharpCom,点完成
, v( o0 \$ K) \7 c4 {0 x. D6 b+ k* F; M5 F! u
把MEI_AddCom.tlb文件拷贝到项目的任何目录下.我就放在D:\MEI_UseCsharpCom\MEI_UseCsharpCom.
  e9 [: o" V( N! W! g) c2 ]! N& U' [$ E3 K
我们会看到一个MEI_UseCsharpCom.cpp文件,双击打开把默认生成的代码全部删掉.敲入下面代码:
- K$ K( z6 _+ f: _: f% O2 Y7 {9 {7 M. S! M/ Q

3 t+ b0 n2 x5 \#include "stdafx.h"
; C& u7 a" g; X9 I2 S#include <windows.h>
5 R/ ]8 E* Z# G1 y#include <string.h>
  b, B) k; _8 H3 x3 J
5 r0 D; Q. W1 p/ ^, L#import "MEI_AddCom.tlb" named_guids raw_interfaces_only4 }! `2 `, ^. K! z: v

* s% F. m" Y4 `4 f/ g1 [8 schar* WcharToChar(const wchar_t* wp)  //wchar_t转char*
# @: K# b" X- r8 d% f  i( m; U9 k{  6 ?; V' C; E4 _5 i3 f' ~* A
    char *m_char;
7 Y  E7 \: x/ G7 h    int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);  ! I5 A6 {+ N% m! k9 R1 A
    m_char=new char[len+1];  
. a0 c+ K% f; i/ O, o8 y( Z    WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);  2 E4 }: [, A+ U! k' ]
    m_char[len]='\0';  
0 x: ^, C/ ?7 E    return m_char;  / i9 Y# Z0 ^( o8 C( b) ?
}  
, S4 Y& [' }2 p# |  F( M8 Swchar_t* CharToWchar(const char* c)   //char*转wchar_t0 N. c( z- `+ @& e) W) X( z, G
{  
1 E( m! F6 _% u$ W- F& Q1 T   wchar_t *m_wchar;6 e8 y: R1 B; K( u0 D8 \) W" L
    int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);  + x! D* m, i" D; K; p  [" M4 Q
    m_wchar=new wchar_t[len+1];  
2 U% W* w0 ?- D# E9 g5 o    MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);  . L$ _; r2 U6 G2 T# w$ _
    m_wchar[len]='\0';  . I  r  \9 L' j4 p
    return m_wchar;  6 a% L7 s  J( ~* S& k: V: J; T6 \% {
}  
% M% H7 o  H* D5 y: G& |. g2 p6 z+ f
void _tmain(int argc, _TCHAR* argv[])( @" H) l4 m. }6 S& X9 Q$ e

$ {0 F/ E/ Q- o6 o+ z{
* ^8 K* X2 M  M" Q& @( Z* n. Y
* ]% r' t: \$ g) X    CoInitialize(NULL);; W* B' R- M2 ^# i2 q( B. A

6 Z% R! L2 A0 R9 o  ^        MEI_AddCom::MEI_COMPtr ptr;   //类似明志一个指向接口的指针' B2 _# O  v  [: s" Y0 `

6 E7 l  m6 `# C/ l( @2 C        ptr.CreateInstance(MEI_AddCom::CLSID_MEI_COM_T);   //实例化一个类 CLSID_ 类名3 h0 ]/ [# P9 h: I4 k  q8 L
) @. w  m6 f% x' z/ p
   //这个地方有一点点奇怪我也还没弄懂.在C#中的函数是int Plus(int,int).但类型在这里都转成long了.另外就是我们不能直接$ }4 ]' a1 v2 h
' M8 [& ]5 q5 c5 z7 ]- ]  y+ Q
   //来个long a = ptr->Plus(1,2);这样得不到a = 3,反正会出错.
! P9 J: v2 ~$ L   //这里函数Plus的参数变成三个了long Plus(long,long,long *).其中最后一个指针得两数相加的结果( @8 S7 k$ E$ P2 k

# P1 b, x: p9 x# z% w   long a = 1;
$ D7 q. ^+ B9 N( N# |8 U) B4 s" M; O8 c7 z: O4 e
   long * lPtr = &a;
) O; q# X4 U  x6 t8 A* b
9 [2 B# ~3 ]( G$ y    ptr->Plus(1,2,lPtr);
" W, t% y; J" h8 o! f1 D! [% d. N9 }; R+ u. ?
    char msg[132]="";
& O) V- _& |$ R5 i. B& D    sprintf(msg, "%d",lPtr[0]);3 d5 s3 @6 {# B; T
0 e. I; }  |! T7 \& U" U' M6 e
        LPCWSTR str=CharToWchar(msg);
) t  V8 R3 Q% r+ d' Z1 _; g
1 J) s' X# ?) ^/ Q; k0 q    MessageBox(NULL,str,_T("123"),MB_ICONWARNING);
  y  x1 I0 d7 S/ L' e$ U  K# H, `4 U% A1 n. [: h
" e; s: h0 ^' S- b! g
}
; R6 H% a- h- ?$ l
' f2 E7 p; M% c; O8 ]此时就可以正确运行了.得到结果3# m$ k; C2 V3 m# u2 r" B# d4 h
; o3 }; O1 K) _0 ?! H
如果没有正常运行,则必须把dll文件拷贝到有MEI_UseCsharpCom.exe这个文件的目录下.8 ?( Q4 U$ `4 y( Q

6 T# ?& w/ u/ i- L6 j! o
/ s% b" J: R! ~- o% }--------------------------------------------------------------* ~, Z- f$ d; b/ }7 g/ [5 N
C# Npoi库 操作excel 的代码网上很多. {: W$ p0 s. _" b

* O! W+ S: v  j# t- j9 p* h0 O2 J// ----------------------------------------------------------------------
- x6 F" b6 T9 a: a6 K4 f0 c  ~1 v6 }! o// 使用Npoi创建一个简单的xls文件,写内容1 K) M) c% H3 O+ s1 }
: b2 h" W% W, W/ z5 k
using System;- q* R0 Y& Y' J# U
using System.Collections.Generic;& g$ B1 ]. y# H- e
using System.Linq;7 C! f! v  S% J8 X8 G" w
using System.Text;3 K0 \. j3 r2 T
using NPOI.SS.UserModel;% j* H, _1 _2 S: w. n  U1 {. p
using NPOI.XSSF.UserModel;
( I5 P8 {1 E8 C0 ~0 t4 ?5 kusing NPOI.HSSF.UserModel;
; x4 u, K. H* g; n4 Qusing System.IO;: b* V. q+ S1 l' a/ y! y
using System.Data;
5 v; ?& c- U5 H( [5 W  M- h5 F2 Q7 ~5 B5 Z7 f. P& c5 K4 B& r
//using System.Windows.Forms; ( x" A2 x1 S$ z

. a: D: ~: k% X! m% Ynamespace CC: t( r7 g3 g# B! z5 Z! V2 }
{
- P8 K2 c7 ?8 T4 u/ F6 D
, D& `6 R( V/ M2 F4 n4 v# {    class Program: s4 t) [4 O9 `# I7 ?
    {3 f- Y! d1 P  G9 A1 x: o
# v: k0 Y" ]- d; ?5 q2 [" ^9 W
3 Z& f* X( d8 @! x$ S
        static void Main(string[] args)
: |2 T) @3 {: S# I7 i6 [5 J        {7 t& P/ R# y) c# @% ^; d* v/ z9 o
            //创建工作薄
: j& S0 y3 w$ a0 L  l. Z4 g1 J            HSSFWorkbook wk = new HSSFWorkbook();- S; g& K- c+ w' W1 X3 L
            //创建一个名称为mySheet的表
1 Q) n4 Q. p; e' J4 `1 E/ j; ~/ G            ISheet tb = wk.CreateSheet("mySheet");
7 X1 Q- P( i$ }! a3 S6 a2 [2 d            //创建一行,此行为第二行
+ h; d. V+ \1 R9 y* S0 i; H7 T            IRow row = tb.CreateRow(1);  U, W; \' w7 c( K' I( d
            for (int i = 0; i < 20; i++)  I# C5 {5 P( @- P- c3 t: l# t0 E
            {/ J, O% _$ D7 k5 ]$ T& O
                ICell cell = row.CreateCell(i);  //在第二行中创建单元格
3 [* ^' L) I4 G+ t! m                cell.SetCellValue(i);//循环往第二行的单元格中添加数据
+ \9 p& r* z5 R: P: q" u  C  N            }
' e6 ~4 ?1 D( Z, s            using (FileStream fs = File.OpenWrite(@"c:/myxls.xls")) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!9 W, Y7 q" S" ^* Z5 @
            {' T; G4 w! |% A8 v5 P- P( g% n
                wk.Write(fs);   //向打开的这个xls文件中写入mySheet表并保存。
5 h# z6 y0 M7 w/ ?9 L. ^# z4 h                // MessageBox.Show("提示:创建成功!");8 C1 _0 n7 \4 s6 G+ l7 C( P6 W
            }3 u, M  r7 `3 {* Y# R

# d( s) r  v! K8 l: i3 C        }
' @' n$ Z# e& G6 ^/ u) E
0 C4 T, s% y* z
/ B8 D0 S  S& u1 d3 M    }. K' J3 x' I0 }7 t  x

& ~+ b& S1 x: J- {3 b
" D; \' M9 ~* w. a* a# ^. _  V  O& j1 e+ Z
}
1 ^0 Q9 I7 t7 Y- J0 g+ r9 r, g0 y# Z; P/ x( w- Q: q" ?- _+ O
// ----------------------------------------------------------------------  ^2 |, b$ X8 @8 r$ C: m3 R
// 使用Npoi读一个简单的xls文件
' i* R) V7 _# [
# Q1 S5 k' W/ S  m" M6 P8 _: iusing System;: _4 K; `3 p. Z8 T5 q$ M& n
using System.Collections.Generic;* Q+ k+ g" N) e
using System.Linq;
( y8 g) b- s1 f2 ^6 x0 nusing System.Text;
) N  U$ Y* u% musing NPOI.SS.UserModel;- C( u9 L9 w$ z5 [
using NPOI.XSSF.UserModel;, P$ ~3 t# o8 _6 h& t5 v8 W
using NPOI.HSSF.UserModel;+ X+ k( t- }2 l
using System.IO;
* n) {5 F1 O5 M9 b  F- Busing System.Data;- j7 m9 p: ?' y+ X# {

' W5 E2 g( ]) X5 a5 `+ k- z2 _. Dnamespace CC2 I; _! W# O8 @. r: Q( n+ w* R5 v
{
! g8 I" O! p8 u+ r% _! u- _+ ?2 m3 k. v7 c1 ~) ]
    class Program
  J- X9 T3 l  o    {
5 j8 ~/ a% y4 Q- M* V& N' G6 P4 }' ]) b! X0 K

8 Y# [. V/ D; X+ E  e8 K2 Q: M        static void Main(string[] args)4 v5 i0 w$ o! e$ e1 m& X
        {& h7 _! @0 S* m7 ^  n  u3 h+ E
            StringBuilder sbr = new StringBuilder();
! a( X* z2 ^% X, n4 n8 o            using (FileStream fs = File.OpenRead(@"c:/myxls.xls"))   //打开myxls.xls文件: H4 s5 P; m) r
            {
7 j7 A9 k/ |' b, B                HSSFWorkbook wk = new HSSFWorkbook(fs);   //把xls文件中的数据写入wk中
9 x/ Y' k5 x5 Q& X  N                for (int i = 0; i < wk.NumberOfSheets; i++)  //NumberOfSheets是myxls.xls中总共的表数
6 h% c; \- y0 f. e" w* U                {: e6 }8 O! P/ k( N& o
                    ISheet sheet = wk.GetSheetAt(i);   //读取当前表数据
/ Y+ P# L; W) b# S0 ?+ a                    for (int j = 0; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数4 _6 d* O# d% {5 ^: g
                    {3 _, B# C5 C; F1 }1 ^4 |8 Q
                        IRow row = sheet.GetRow(j);  //读取当前行数据$ N  o5 N* N7 Q" Q
                        if (row != null)+ t' o* K  Z0 v8 T0 a6 Z
                        {0 s8 V# w: v6 [
                            sbr.Append("-------------------------------------\r\n"); //读取行与行之间的提示界限
# V: F3 t5 c4 M8 t' Q, E- Y                            for (int k = 0; k <= row.LastCellNum; k++)  //LastCellNum 是当前行的总列数
1 ~" F1 q; n0 j                            {
# I" Q- _; Q- ~- {5 H7 m5 \                                ICell cell = row.GetCell(k);  //当前表格* e- |2 I& z& C1 l5 R
                                if (cell != null)
7 K! V' m5 k# u7 r% m" j- o0 }& w                                {+ u: Z* W! |$ w
                                    sbr.Append(cell.ToString());   //获取表格中的数据并转换为字符串类型
# l( h: ^% U# x4 L( G3 p                                }& j% r* D: e% r3 U. v5 H  e6 u  d
                            }
) u0 F! W) u1 X) x2 C, d6 @2 ?                        }
! U. w& S  K* k3 h/ ]4 C                    }
$ b+ I9 ]3 t7 H                }
* O- r( O' c0 ^8 S: `! C5 Q% f6 b            }
' }) h7 F" c! z            sbr.ToString();
2 t% M4 _* A+ k% k  Q1 N/ \            using (StreamWriter wr = new StreamWriter(new FileStream(@"c:/myText.txt", FileMode.Append)))  //把读取xls文件的数据写入myText.txt文件中
( D7 W! x; o# i9 F2 K/ u6 ?            {
+ m1 z3 K" I3 l6 s) U& ?" A                wr.Write(sbr.ToString());7 s: b& q7 x9 T3 S( h3 R8 W
                wr.Flush();, Q: u( o1 Q* u2 M( e" p( d, K
            }7 ^+ ?- A/ Q0 f7 O" y& R+ m, ?6 ~

: A3 H9 n1 i5 C! @& y0 ^! A* X1 e
; z( ~9 [8 W! s5 I- j: X0 z        }) z$ @8 k. t! C) i; A) [3 U: X

: q; y  {( i* t
  d, A! o; s8 k! T) `    }) Y1 f8 i( f8 t" _1 p" W- k& _
2 u$ ^' _5 y4 x7 Y
$ r0 w. ~9 `/ O8 u& P! ]
: G9 K" @6 u. I7 z2 w; P
}
, _) k; b2 b9 o2 D0 a  P, N8 m  G4 L
. c" y! ~0 q6 g5 T- n: b* z' R3 C2 H( C, {- j
然后 自己封装 给 c++用& C0 R! P! F" f* z
9 R4 u" Q' ]( s4 l. y

2 D) q# ]# U! d7 u$ Z8 b/ C
7 k! E0 @$ o: ?) h  r
: b, B4 V' D8 |, a/ e; u+ H# W+ Q  |. T/ ^5 h/ c7 n: d, z9 }

/ {$ q! z  s6 y8 u! r" h" y7 W1 T4 {$ T' j
9 S; X+ n9 h# |  G0 ?9 |) W
: c9 C4 O2 K* Q- Z2 O) m: b* A2 A

6 h% ]/ o; C) N
, D/ f; A# X+ V& G; w1 w
& {. h" f( k8 q
' K- z; H2 P) J. S9 I

" ?5 N1 F/ H( ]+ ?3 v, o1 V
+ M- X. o! ?( q$ N+ h4 B
7 C7 [- l6 [  V9 g9 j
5 M$ S% R, D4 V7 z5 u& ~

5 e2 o- a4 m0 f9 b+ V3 A- N. b* [: u
+ v. Q5 I4 K  g5 F  a* K
5 P$ G8 e; G3 }' \; T6 h8 }
8 n$ y( L6 Z$ E% M' j8 L9 ^
9 m% t' I4 `* p; W/ H
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了