PLM之家PLMHome-工业软件践行者

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

[复制链接]

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

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

15757753770 楼主

2016-12-11 14:57:16

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

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

x
C# 或 c++  不用安装操作 EXCEL的方法:c++ 对excel 的操作 非常不理想 要安装excel 而且读写速度也慢2 j( I2 r, Z$ p- O
net 有很多 免费的开源库 比如 Npoi库  (Npoi库 支持c#、vb.net 等语言)
" d: j( U* }$ `% a  S* T这里我用c# 生成 com 组件 让 c++ 调
# }2 K- S- I/ a5 a& T9 E2 x: t% S, n% a8 u2 T1 _8 i( S8 r
首先要学会 c++ 调 c# com组件的方法   (和com注册的方法)5 v5 T+ w0 j. W# P8 U
C++调用C#的COM组件(DLL)" _/ b$ F' B6 V+ @6 P  V$ Y
4 }/ I" S" E2 T
下面我举个简单的小例子.我用的是Microsoft Visual Studio 2012,操作系统是Win 7.% u9 l9 l8 T2 y. C% n! _
首先创建一个C# com组件.实现的功能很简单,就是返回两数相加的和.! X/ L5 Y' B+ f4 u
: M3 }0 l- }! r$ B' j; L, C
) W0 h" j% X1 Q
1.新建一个C#项目 ,类型就选 类库 .取名 MEI_AddCom
4 Z0 Z) B) N4 ]2 C4 l6 |4 J6 N5 N
! R* l" L% g+ w8 G) G2.在项目中添加一个接口,取名MEI_COM.C++调用com组件中所有的功能只能通过接口来调用,不能直接调用类或函数
% E1 M& p' \' R3 }. G, }
  `4 s+ f3 a8 e9 ~- ?' Q具体代码:8 Q0 {" C) Z3 k
$ z+ m' {3 b& c8 O, a6 f9 S
using System.Runtime.InteropServices; //记得加这个命名空间
0 G4 q7 [" h! ]
6 C% z! P3 ^& E' ~9 g3 T4 _5 fnamespace MEI_AddCom
% u6 H8 f4 P8 V9 }* L
0 \4 x' e% t$ z! y, d{8 n% d+ H7 ^, h7 g- F
2 F% z2 `% r# b
    [Guid("DA07B88D-29F0-41cf-B3D3-611010E6F3FF")] // guid的产生可以通过vs自带的工具.点菜单栏上的Tools ->Create GUID,然后选第4个选项.Registry Format.
& c) @# f. G. B) R4 m  `6 Q  w9 t$ `! q1 A. z; ~( }
          //点按钮New GUID,再点Copy.这样你就可以把产生的guid复制下来,然后粘贴到这个地方来.当然那个大括号得去掉.后面需要用到guid的地方也用这方式产生
' T- g2 O# ?8 m. s4 ]# k. y1 \; |7 R9 z' }8 S* x' g& I
    [ComVisible(true)]
6 T6 q2 N. C/ Q: Q3 S. s( _4 B& h" l2 i, O8 J. v0 ~
    public interface MEI_COM        //记得用修饰符public
# ~( E6 x3 O3 D; L. G/ n
1 g- X0 H3 c6 ?- f5 p; ^" R9 c  r5 y$ U    {
: s/ `9 c1 A& b. S- n1 l% u
( T9 O' A" e3 ~, m" F        [DispId(1)]       //如果还要添加其他函数就继续来个[DispId(2)],[DispId(3)]加在函数前面
- R7 N; v( ~% p2 ^% F# A4 h* V6 o% @* Y, n5 v- \
        int Plus(int one, int two);
/ L9 B: @1 h  }  U/ t& H: c7 Z* U
    }
  t; B, @) U& P! `
& {0 e) j# O( x" C8 A}
& ]& ?1 U3 p, F. P. ^; _) v* ]$ _8 W% n9 F- n' a
9 \; e1 w3 ~" }+ X' c& K3 U

6 z, K$ J( t  L. |  f$ n3.添加一个类MEI_COM_T,继承接口MEI_COM,具体代码6 @/ e% A& M5 s4 M
! }* j0 F) H. L4 v0 a
using System.Runtime.InteropServices;8 _# T4 b( m7 z$ a% o) G( x

: E) I* h' d& g0 C# v) Cnamespace MEI_AddCom
/ r( [* v! c- I$ u' T  f
1 F1 O7 V+ M7 k( R, z0 C) V{8 ~/ ~) F  r" Z7 y

4 y" K# \5 j6 S2 u- K    [Guid("04F4DC83-8883-4a03-BDBC-92D8630ECC1F")]
% Z. ~- I; \% W! s' _/ Y4 R& G% i3 v2 W% u, m" W$ }; t
    [ClassInterface(ClassInterfaceType.None)]( H. \3 ?# \' Q
$ x2 N8 y; w) d7 I
    public class MEI_COM_T : MEI_COM& D' D7 U! w" S3 h, S" |

) C6 u" X& o$ U) o" Y1 p    {" V+ Z8 u- p. g) p! B, G3 K

; {: \* p8 H& a. f  ^1 x5 r3 J        public int Plus(int a, int b)* u: c" e7 @/ E: l/ I
5 V7 a+ B  Y- j- e
        {
5 T# G0 ]# I: x! J8 s5 d' J4 Y
% ]3 L# i0 t) G+ d            return a + b ;
. `$ b2 f# J$ Y7 x9 O7 J
! L; d6 H3 h2 Y6 T4 z4 N        }
. W# U8 K0 E, O2 G9 C& c( [5 ~0 l) k' s3 g: s; V
    }' ?8 }1 E6 ^2 A% b; J( N& k, [9 a% l- \9 m

1 v) u4 Z" B' |/ p- \% g! f% u}0 j- R) ^( B# n( Q9 l" j+ ?+ J

& K8 d: m! g9 U" ]& f! f  H6 c& D' C3 A' |) [

. W) v' C# u  G8 O4.把AssemblyInfo.cs中的[assembly:ComVisible(false)]改成[assembly: ComVisible(true)].' {# G5 ?3 k' A8 `* n6 m. h; h
: N- _& K$ v( f' n  R7 @$ C" w
右击项目名打开属性窗口,在生成里,选中 为COM 互操作注册# }0 }8 y4 R9 \# r3 a- L- t% `3 c
0 M, l; V. E) V& w, p

1 r3 `- v& Y1 D+ h/ k5. 生成->生成解决方案
" w+ I2 w  D* V$ @, W: s   注意 这个时候 生成 非常缓慢
& {9 ~# V6 `% i# y) y0 b& {   直到 出现 成功 1 个,失败 0 个,为止才 操作一下面内容
0 b% X0 N& D! a9 D- B, R* q2 y, e' Y8 k% n1 d- q: ~+ B

& }+ c' s0 v7 s7 d: |---------------------------
: A0 x+ }3 j( D: B5 J4 b
7 l4 I/ g& A# [1 a; v1.调用前要先把com组件注册才行.
% W0 z& G( x" n) C# R8 u/ |0 R" B& V% ?) M" A; Y2 N, _
使用C#创建并注册COM组件  C#不能直接创建COM组件,因为其生成的DLL属于程序集,但可通过“使程序集COM可见”选项来支持COM。- r: W  n) W6 \
以下说明如何通过C# 注册、注销COM组件。
7 h, L  n) t) d! ~  N! p. b0 ^1 k
$ |7 d# m) [) H% A为了能让生成的DLL能够进行COM注册,需要进行强名称签名$ w) J* M" G  S2 f+ }( \% Y/ R
打开COMLib项目属性,选择签名,勾选为程序集签名,通过下拉列表选择新建,弹出创建强名称密钥窗口,输入名称,不勾选使用密码保护密钥文件。
2 \) Y9 E8 ~/ U7 b- B& A! J/ }# ]创建完成后COMLib项目中将出现后缀为.snk的签名文件。
5 u0 {1 h, Z  M最后,编译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文件。" H! R1 d, o' g. F" g" t
卸载COM组件:  / {6 p# T! s' c0 J
与注册过程基本相同,只需将命令改为“RegAsm  /u  D:\ COMLib.dll  /tlb: COMLib.tlb  /codebase”。8 [! V, C: E' x9 `$ ?# V  t
9 Y3 U1 {" Z7 S' z4 M$ {- L7 O5 `
* F  F1 v  f" ]$ E! L
2.注册完了就可以在代码中用了,先新建一个C++程序, 类型选 Win32 Console控制台应用程序
1 `6 l1 Z9 J: J' ^/ y/ r$ d8 g( h0 I
名字取MEI_UseCsharpCom,点完成
6 Z- t7 j* h" C) s  _) M. y3 D. r# p" N
把MEI_AddCom.tlb文件拷贝到项目的任何目录下.我就放在D:\MEI_UseCsharpCom\MEI_UseCsharpCom./ i" N1 C- a6 b) O2 Q
& F% ~0 I9 j2 t
我们会看到一个MEI_UseCsharpCom.cpp文件,双击打开把默认生成的代码全部删掉.敲入下面代码:6 v& j8 B5 |4 @: }: P" o) ]/ @7 a
) g/ d. }6 T. f' I! V6 z- u
) B) O* i* X6 d, T
#include "stdafx.h"
, ?6 o0 h  D" j# Z) s4 v" Q#include <windows.h>
( ?( n! v4 C- @" ]#include <string.h>
7 q7 s" n  I- T3 l: O* c1 o7 T
. X) w, o4 q2 _/ |% j& t#import "MEI_AddCom.tlb" named_guids raw_interfaces_only
4 y% @+ }% a+ r% k- o9 h
: i+ l: }' w# W- N& H3 n1 Pchar* WcharToChar(const wchar_t* wp)  //wchar_t转char*
3 J5 J- h2 Y' N! b{  
  P. T- y7 j$ F5 r5 O6 ]    char *m_char;
$ [" m2 T+ E8 n( }3 G4 |    int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);  
% X/ ]' a% X/ |9 j) [2 \  h/ {% |" ]    m_char=new char[len+1];  
( Z  S4 m! t& \1 H' W    WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);  
2 q# g& |5 U2 X2 Y    m_char[len]='\0';  % V; l7 x2 t) U
    return m_char;  
2 C: Y- n# b, O" h}  * b4 h( U% G/ j  ^7 x( F
wchar_t* CharToWchar(const char* c)   //char*转wchar_t3 a! E5 a* ~" V8 R. q
{  
9 d  i! J& \5 F6 M5 ~  I  o- U- v' M  x1 Z   wchar_t *m_wchar;; l3 }) a) ^# i  @& n  a: t, v2 b
    int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);  - F9 v1 m0 l, u2 ]
    m_wchar=new wchar_t[len+1];  ) M7 a- }  Z+ o# t
    MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);  
" |2 A3 C6 X3 o. P. n# T1 u    m_wchar[len]='\0';  ! u% ~3 x7 g6 M. I7 U
    return m_wchar;  + R# w& D2 h& }2 l2 v' P, J* T$ u
}  0 u# P! w; e( I- g

7 V. ^4 m' `2 ~void _tmain(int argc, _TCHAR* argv[])! `3 z# W, s+ h; B! o
! u! J7 T8 d6 I8 ^( Y
{' \! t& j3 y9 b

9 ?% Y5 H/ p" y2 @    CoInitialize(NULL);
, z, l  b" z" n" `/ H9 p7 |2 C
, X" u' P/ p9 x1 D& k6 l& z        MEI_AddCom::MEI_COMPtr ptr;   //类似明志一个指向接口的指针
9 F. @" O) E2 T5 m
: I8 N% A' i9 w$ }3 |9 {4 L4 h        ptr.CreateInstance(MEI_AddCom::CLSID_MEI_COM_T);   //实例化一个类 CLSID_ 类名: q* K1 a3 y& {9 y3 V: T
' j* t( L3 l1 d  T- a, r4 L% i: c
   //这个地方有一点点奇怪我也还没弄懂.在C#中的函数是int Plus(int,int).但类型在这里都转成long了.另外就是我们不能直接: c9 l1 P2 ^7 |+ w

( C0 \5 P9 J6 P1 b   //来个long a = ptr->Plus(1,2);这样得不到a = 3,反正会出错.
* z; ^. `6 m; `* _$ j   //这里函数Plus的参数变成三个了long Plus(long,long,long *).其中最后一个指针得两数相加的结果3 x9 d0 k( ]2 G; T
( A) k: b  ^% Z% R4 n
   long a = 1;
  J* @9 w/ V2 h- I  I
) u$ X% u* q9 H# N) z   long * lPtr = &a;$ Z; N- S5 w2 o* a9 R& V$ `  c

. K" h. @6 f, j- l, y; r    ptr->Plus(1,2,lPtr);$ v3 |; @! X" C: [0 G0 _5 \4 f8 A: g
/ f9 J9 j9 r% O, ^
    char msg[132]="";" o' k5 D' C1 e/ r8 k6 _7 h
    sprintf(msg, "%d",lPtr[0]);7 A- c; a+ p) L) O) j

1 b' s- _: w  d0 _/ e1 c: u        LPCWSTR str=CharToWchar(msg);
% V3 q& q7 Q6 ^8 @9 S4 I1 x7 L  j! C' }4 o+ U5 g$ ~- M
    MessageBox(NULL,str,_T("123"),MB_ICONWARNING);
: x  Y9 q  S0 \
( K% b9 a0 ~, l. L  _; c6 c% i$ Y
% D2 g; O6 h  n, ?* ]: Y  c}
+ f5 O( |# {( d0 _( E: Q/ u3 x; _+ F
此时就可以正确运行了.得到结果30 Y; r" w4 J5 d9 O* a
+ e; k$ Z9 u7 a% x3 d2 u; |: V" P
如果没有正常运行,则必须把dll文件拷贝到有MEI_UseCsharpCom.exe这个文件的目录下.
6 q7 {) D+ p; t
: c6 X- c, z, p# v( @3 c
4 s2 ]) d) W+ N+ y" c0 h--------------------------------------------------------------
- n0 _, L9 J9 \, CC# Npoi库 操作excel 的代码网上很多7 S% b0 H/ x% p  A1 v, c( T

. u  @3 I4 }$ Y' w$ |7 ~// ----------------------------------------------------------------------' F+ g* o# E- W& w
// 使用Npoi创建一个简单的xls文件,写内容9 ~, y# w# V; T' g
/ x/ Z7 E* M& N( B. ]3 x) J
using System;
; ?2 @5 y$ k! y7 k+ `using System.Collections.Generic;
: _0 \5 B: ^) q7 @using System.Linq;6 n9 x& J, C# v* @0 x2 R7 q! x& h
using System.Text;* }; c0 B/ L( Q: [
using NPOI.SS.UserModel;- W; ?; W+ K: r# L  q! w8 I: ~
using NPOI.XSSF.UserModel;' U7 h! f- `0 e4 H, {9 Z
using NPOI.HSSF.UserModel;! \3 ?( S; h2 X. @! D& O
using System.IO;; G8 g: j4 m+ p: V9 |
using System.Data;
3 Q( ^& o  z9 J
5 z% c& A) N( [. [7 C, ?3 p5 Z0 W2 w//using System.Windows.Forms;
$ W- U3 i0 B! J+ S
" b$ x& B& W( O" T* U# anamespace CC
7 e" h3 V$ H) r) J  R2 E1 w{
% U4 P; _. o$ L
  ?9 m9 t3 [: x; U    class Program
& V( w' S/ o/ s5 F$ B( U' R! }    {7 K  Q0 ^: T6 ]% X2 n2 w& e4 C2 v3 C0 A
5 D) @  s' q) `/ v1 z

5 m5 n) ?- c5 Y5 g        static void Main(string[] args)
4 [# {# O& {* d6 N0 G8 F        {& E! @; T) j+ X: J! q# y2 U
            //创建工作薄
4 Y- H5 r8 H; U% ?            HSSFWorkbook wk = new HSSFWorkbook();" \  _+ T" o, g9 y: u6 N
            //创建一个名称为mySheet的表
, [  i% k. P4 g- Y5 F            ISheet tb = wk.CreateSheet("mySheet");( H4 e' I9 i. Y8 d: B5 J, h) q
            //创建一行,此行为第二行+ K, A! O* Q  u
            IRow row = tb.CreateRow(1);
$ i# I; k8 m9 ~/ }) B            for (int i = 0; i < 20; i++)
/ A; [: j) ]$ B) ]2 m/ L            {0 k# M: W5 @, r0 ~' M
                ICell cell = row.CreateCell(i);  //在第二行中创建单元格
+ ~/ S0 B; n0 ^: W' o: m; j                cell.SetCellValue(i);//循环往第二行的单元格中添加数据  W$ K  u$ ]: H6 L( n. `" f, n
            }4 W4 o& o9 l& \& @
            using (FileStream fs = File.OpenWrite(@"c:/myxls.xls")) //打开一个xls文件,如果没有则自行创建,如果存在myxls.xls文件则在创建是不要打开该文件!
0 M9 {- C& r* d# ?            {
9 t( E. k; H5 Z                wk.Write(fs);   //向打开的这个xls文件中写入mySheet表并保存。
( e, X. H+ S" x. o" j4 t, Z                // MessageBox.Show("提示:创建成功!");
" O3 ^, F& Y$ u0 A            }
/ h( ?. Q0 q+ \6 j
! _4 I& @, N8 J: V  U        }( ^2 }2 M0 ?5 t

' X; W' O, ^  S. ]
) i" k! c0 w% Z  ^" D8 ^& U    }
$ m# [' G7 O4 f2 X5 ?- }! `6 X* q* [; q
1 U/ I; C- o( {

8 i! q4 m- v& {) j}, _6 I, t# Z0 A* P, S# {& J

! C7 @# b0 t5 k. x2 C2 ]( H2 n8 [// ----------------------------------------------------------------------
. |# N* U0 m7 f8 k6 M// 使用Npoi读一个简单的xls文件; ?, P' V0 g" r. G5 o8 \

) n3 e$ I' X2 j, g$ n" husing System;: n! L8 ]" k* r4 y) z
using System.Collections.Generic;7 C0 E- q% f3 t: s( q
using System.Linq;
/ l$ O- D/ D: h! X6 J9 l* o/ Vusing System.Text;
& `% L9 n% ]1 L. X+ Eusing NPOI.SS.UserModel;, k% h9 N- n6 V7 V1 A1 W8 S; M4 t
using NPOI.XSSF.UserModel;
" ~+ G2 |: s, M2 R4 F5 Gusing NPOI.HSSF.UserModel;8 y- b9 s/ Z& H; u$ i6 M8 ?
using System.IO;
) @5 `& K2 `: dusing System.Data;
( u. A5 r" u( `5 D; ~0 Q) [4 v8 f1 N7 W1 V$ k6 \3 R3 F! @
namespace CC
4 k5 H' [' a" g& w: h0 O4 S4 |  I: e& G3 {{! D5 o/ z  g2 l" d. R

- p1 {2 D+ ?: c& y8 G2 o    class Program4 E' d; M! U$ Q% f, T' @1 O- e
    {0 B; }; P+ B/ W7 Q2 \2 B+ s0 L
9 p5 U! o0 r+ Y! G
& B! e( b5 ?# C% U8 H
        static void Main(string[] args)+ |9 n8 K# U& E) V2 x* h
        {  p+ w' }) ~! P" @3 A
            StringBuilder sbr = new StringBuilder();5 }! f+ K/ ]4 X& s9 j
            using (FileStream fs = File.OpenRead(@"c:/myxls.xls"))   //打开myxls.xls文件& l1 E4 K$ u" H0 Z+ J1 `
            {
' V" L- V9 Z$ ~0 m( l                HSSFWorkbook wk = new HSSFWorkbook(fs);   //把xls文件中的数据写入wk中) {9 L# i* w3 A; Q
                for (int i = 0; i < wk.NumberOfSheets; i++)  //NumberOfSheets是myxls.xls中总共的表数
) E5 ^, p" I+ ?: E                {5 d1 Z) u* f9 j# @- R+ F- n
                    ISheet sheet = wk.GetSheetAt(i);   //读取当前表数据- X& E& U% S$ z
                    for (int j = 0; j <= sheet.LastRowNum; j++)  //LastRowNum 是当前表的总行数! v3 d/ F% G* T2 e
                    {/ N5 d1 h* v: a* @/ g1 P3 h
                        IRow row = sheet.GetRow(j);  //读取当前行数据
5 g  W3 i4 K, k3 R7 B                        if (row != null)
+ h1 R+ U; c$ w4 i0 H" T$ o                        {" p* L, K: F( _
                            sbr.Append("-------------------------------------\r\n"); //读取行与行之间的提示界限
2 @1 {' z- j2 b0 P* n                            for (int k = 0; k <= row.LastCellNum; k++)  //LastCellNum 是当前行的总列数, V6 B! `& ^$ F
                            {
( k2 i& h# X' C2 R' V* A* j                                ICell cell = row.GetCell(k);  //当前表格! `9 k! s& ^- c( q6 N
                                if (cell != null)
4 \# T3 C: l6 H8 Z% r7 B  e& r2 K                                {
4 V6 w4 E4 N( x3 h$ `# x5 T                                    sbr.Append(cell.ToString());   //获取表格中的数据并转换为字符串类型/ ?1 l8 }7 z+ @. A3 Z. t% \/ v
                                }6 C( d: L- {/ b# H- u/ _+ k& H
                            }
6 B( C8 {; @: }/ ^# D. l5 ]                        }# `  Q( D8 L& q0 y5 G' K
                    }! s  U; R' q7 Y2 i+ h
                }! t* j5 H9 }3 X' z) E2 v) p8 H( \
            }7 g3 ]+ K6 g$ h( q
            sbr.ToString();
* @7 H6 S* g- @9 w: H9 G* g            using (StreamWriter wr = new StreamWriter(new FileStream(@"c:/myText.txt", FileMode.Append)))  //把读取xls文件的数据写入myText.txt文件中
. U1 J9 {. E) I) T$ M: V7 z: }( w            {! ^' q, |- g, o/ ?
                wr.Write(sbr.ToString());
3 K  G$ `  ^& T( U* A6 K5 f$ {3 p                wr.Flush();0 C8 S$ D" Z9 Y  n
            }
! F: \0 R, n/ `1 V% ]# y
9 K7 I9 t/ p- m' k: L1 g
2 S: d& O: }+ K* m& d        }: m: A( H* M1 a  y
# H" h3 H, P- l, i) Q/ C
8 N; }2 U5 ?: n  t- m( g8 P/ W
    }7 G6 j7 C- ~2 |! K- O

- v5 m, x0 S6 W1 V0 G, O, \# j. {; \  y$ ~) f' p
# ]- f% M( L3 ?0 f' C: d
}
: g! l* \$ r4 i/ L  u. l& m6 W/ B5 W- A6 C( N
0 j4 p( h0 `* x- t
然后 自己封装 给 c++用
8 L" T) y( M8 m9 M* X  \. l
- n, V0 g  Z& k( ]9 F  e2 `4 j& Q) ^$ }1 i6 U
) o. j3 B% C5 A" a" C1 y. R

2 \/ n" |  S' {5 `' ~, s
" X9 p  i# f( W7 O- d8 D8 y: r' B
  H: K4 Y5 Y/ G) F- J6 @) h% l0 u% s
8 `* y' f# n% _4 I, k
1 E6 O: k$ l6 i1 q

; Q. k' B3 O8 R4 Q
) `% l( K  ?& w
2 H, u: Q* C# z  F2 R! j$ x, |5 l0 P" ]5 B! @+ d

0 e: s# p2 @3 r7 [* d# d! z) U# e4 D' ?
: S+ x- t6 }( A& y( _
, s; y& X0 C" ]1 {
& q7 R$ {6 s8 g+ K  v) v

5 c" t# f0 i- T. S( K( c0 D% O$ o9 C
% P- ~" s- g7 c* \/ f7 `4 E
5 i- S3 E. `8 _2 L' X8 r, ^$ p

6 h1 {1 v% ~' y. c: ~. |! O( E' A6 E! [" p  P
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了