PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

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

[原创] 关于NX11.0二次开发支持Excel的操作之鸡肋和坑

[复制链接]

2021-8-10 20:54:50 4731 1

admin 发表于 2017-9-12 17:11:19 |阅读模式

admin 楼主

2017-9-12 17:11:19

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

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

x
相比较Catia 的CAA 开发对xml,excel相关的API函数,NX在这方面确实做的很不地道。要实现和excel的交互需要使用各种流行的方法去处理,个人常用的就是OLE的方式,当然如果你使用C# 或者 JAva 可能更好些,封装一些常用的功能去用。5 h4 ?: x$ Z5 V; t
NX11的帮助文档,明确的写了如下话语:1 `8 V' R( ], p  R" P
9 f* d' Y$ @* o) {1 G
What is it?
; }" F4 q2 r- ^! m
Use the new NX Open methods to further interact with spreadsheets. You can control cell data and manage and control typical spreadsheet operations. The methods also provide capabilities for spreadsheets for NX Open similar to the current Knowledge Fusion spreadsheet functions.
The following new classes are provided:
  • SpreadsheetManager - Contains the spreadsheet interaction APIs that are similar to the Knowledge Fusion spreadsheet functions.
  • SpreadsheeTCellData - Contains data types and data for the cell.
  • Spreadsheet - This is a class for the spreadsheet object.

    2 `% a( U7 U* F1 U& c
6 Y' `, f/ p# Y  R& k
Why should I use it?! [' o+ w1 C0 N+ r
You can use these new methods to modify and manage spreadsheets in NX Open programs.

% r5 M5 r! @' W2 Q# v9 r, r, p, [) {6 k4 C% {0 D
怀着无比兴奋的心情,想象一下以后再不用OLE的方式去做了,我要实现的功能很简单,树列表的内容导出!先把结果贴出来,再细说:
8 x/ o; v) T: H5 D1 I6 E9 b(1)开发的功能是获取所有PMI的信息,界面如下:* c% T3 D* x: d2 P7 R( h
111.png
7 T& H8 H2 b) c, K(2)导出结果如下:
- v, ?9 N! e" `6 S 222.png / y  V: w3 U0 Q1 s+ I$ w) A
( S3 L1 y8 d! V" Q! m6 a
现在我开始看这方面的类,一共四个,发现excel 分成了内部和外部,内部呢 实际上就是你从NX里面的工具打开的,外部就是我们自己用的那种。显然对于我来说只能是外部了,打开函数没问题,直接打开,导出只能通过appendrow的方法,这个很显然每次都是追加的方式。
0 |' r3 S& K9 I# e1 X9 d问题是我如何覆盖以前的内容,外部方式的方法很少,实现不了,我觉得这是一个坑,官方是不是留到下一个版本再放出?
& u9 s1 P+ H4 N2 |% x5 l无法清除或者写入指定的range的结果就是使用appendRow不停的追加,很难看。另外也有些不稳定的报错,比如找不到sheet索引,无法读取excel,实际上是单进程的,如果已经打开了这个文件,就会报错,这个比较坑。0 H7 r2 F% {2 m" X  b- P
个人认为读取问题不大,要写入真靠不住!!
5 H& n. _3 f) j. k1 |9 u- [% ` 3333.png % x, V: _, N/ B& _
我把代码贴出来,仅供参考!: i3 `3 L, j- M4 s$ x- h
) {+ ~3 i7 r3 V3 Z" J
void  MBD_PMIInformation::exportInforToSpreadSheet()8 M$ c) p% Q: `$ v* [5 G, v: Z
{6 n9 @% r% s8 m( U& a3 _
        NXString excelTemplateName = theSession->GetEnvironmentVariableValue("UGII_USER_DIR") + "\\data\\MBD_PMIInformation.xlsx";2 Z( G; ^6 {( q/ d5 O8 i' C
        7 L$ n& N. Z3 j+ ^
        //open the excel as write mode, @4 T2 ?8 r5 W
        NXOpen::SpreadsheetExternal *spreadSheet = theSession->SpreadsheetManager()->OpenFile(excelTemplateName,SpreadsheetManager::OpenModeWrite);5 j4 E: C; T$ C
        if (spreadSheet==NULL)) {8 ?5 x- o2 I4 \# {, y9 a
        {
' a3 P# \: X+ M! o' \, |                MBD_PMIInformation::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeError,"打开模板失败,可能模板文件已经打开:" + excelTemplateName);5 U. I" w( h! k. V
                return;( R4 C9 p+ l5 V- a
        }
0 \; P# s$ {# J5 N' i- F: G6 W0 B! @' w) p
        // write data
9 R6 M$ g5 U% A/ T" E8 O        int workIndex = spreadSheet->GetWorksheetIndex("MBDInformation");
) s$ N# g: |, N2 ?( x        
2 L- t4 h: h" l, L7 J* `, q        std::vector< NXOpen::SpreadsheetCellData * > CellDatas;
( @! X0 s0 K# g1 G7 U( f) \        int numCol,numRow; - I* a( |2 g& i, }3 ]) H- `# s
        vector<Node*> allNodes;        ! d% g& l" J; m
        //inser title# ~4 ~! N+ U$ N* g8 ]. I
        numCol= tree_controlInfor->NumberOfColumns();
5 R; I* X" B% R) u7 J3 N        
# w7 R# C6 H6 R1 Q! x6 ?- M        for (int i = 0; i < numCol; i++)
5 l; }: u8 n5 w6 U* Y        {# m7 @( s0 d+ F# f( v" H: t: N4 t
                NXOpen::SpreadsheetCellData *CellData = theSession->SpreadsheetManager()->CreateCellData();
7 R' o6 t2 @1 U/ y0 y( N                CellData->SetType(SpreadsheetCellData::TypesString);/ s5 K2 R# P0 U& B; G4 L5 W
                CellData->SetStringValue(tree_controlInfor->GetColumnTitle(i).GetLocaleText());
- Q& _0 }# g. Z2 U0 o! s                CellDatas.push_back(CellData);
4 _+ X$ I/ B  T/ K9 e                7 S! _) K3 _' _% r  b
        }+ u4 g. g: H. m$ E' n8 {
        # y6 L% v+ R- I8 H3 y
        5 z. N  i9 F! T/ G- \
        spreadSheet->AppendRow(workIndex,CellDatas );
' x$ z2 B) R  c$ S7 d" r: y        CellDatas.clear();5 T( G4 R4 v6 y6 g0 j. f/ V
        
6 B" H  U5 p3 k0 e4 _        : l* x7 Z$ k. m# J9 j3 W; F5 D
        //insert value
8 c1 |8 g8 {; U5 U7 Y6 R        getAllNodes(tree_controlInfor,allNodes);
2 X7 E8 M' Y2 d( q        if (allNodes.empty()): o3 Z* H- E& ]( h1 p5 D8 {! _- a* v
        {$ N9 Z8 V8 `( I9 ~2 A4 X& e1 e2 I
                return;
# T1 w6 @( r" K5 a+ O6 A2 c# u; w/ z        }. i% {8 l8 @) I- }" h, }+ g
        numRow = allNodes.size();  x; _5 X0 {. |& z* R
        for (int ii = 0; ii < numRow; ii++)
* V( z  P0 O9 \1 O7 a9 D1 P        {( @/ U' F8 ?* y9 C4 {8 E
                        for (int jj = 0; jj < numCol; jj++). D- c/ K  k. T" |6 A
                        {
4 N" ^1 F! Q* y/ }# n, v8 s3 h                                NXOpen::SpreadsheetCellData *CellData = theSession->SpreadsheetManager()->CreateCellData();& i, Q$ o+ ]. c+ D: C3 u' k
                                CellData->SetType(SpreadsheetCellData::TypesString);
/ q/ P9 J) f- ~                                CellData->SetStringValue(allNodes.at(ii)->GetColumnDisplayText(jj).GetLocaleText());* ?1 o5 a+ o7 C# Q& B- [; p, |! `, Z
                                CellDatas.push_back(CellData);
; {$ b: N9 u9 R; {$ D) A                                
# a1 [- K7 }3 g& [. L% y( l' L                                3 L3 W0 t4 p6 q2 w
                        }, i7 h) f% ]) e& s9 h% }, U& p
                  
5 v9 Y' o+ I4 _6 v# K3 z) h                        spreadSheet->AppendRow(workIndex,CellDatas );+ K# Y# I$ C+ @
                        CellDatas.clear();
) y/ L; T; x6 m% b4 c) p2 ]3 g4 g        }. _' {5 w; `; Q4 S  Y* Y

: d2 o. F, b: K' R& Z4 H        //from begining 2 @/ `% L; Q+ {8 i
( A2 V9 L  z( u; G
        CellDatas.clear();
3 r3 K3 R$ y% ~. o4 n) Y7 b; ?        - m5 t9 ]: X3 E. w8 J; M0 }+ J/ ~
        / ~# |8 \* Z7 V3 k
        //spreadSheet->ReadRange(workIndex,0,0,numRow,numCol,CellDatas);
+ \8 {9 D. p  B# s1 V- Y. N. r4 f        //for (int i = 0; i < CellDatas.size(); i++)# P0 _: r. W  }! T% s
        //{
" z% Y9 X7 d1 ~) j        //        lw->Open();
# L* }5 x4 k  N; k* M: |        //        if (CellDatas.at(i)->Type() == SpreadsheetCellData::TypesString )- y  X' Z1 U' J# O# O* X
        //        {
- t& B! G% u' W& K2 L; R        //                lw->WriteLine(CellDatas.at(i)->StringValue().GetLocaleText());
1 f& s/ C2 H+ D% v. x9 e        //        }
! ~) A+ V* R. n6 R% c+ `" C        //        
$ K4 w, H& M) l, t4 H' a        //}
% ~, F" U6 F5 N$ _$ s# `9 g( G& N$ g& m8 J2 [' i
$ e9 Q: P/ n. _4 w
        spreadSheet->CloseFile(true);
2 p5 m( ~" V# i+ U; f0 y% X' U2 |5 i2 d' m' _& W* D/ V
        MBD_PMIInformation::theUI->NXMessageBox()->Show("Block Styler", NXOpen::NXMessageBox::DialogTypeInformation,"成功导出数据到:" + excelTemplateName);# g- e; d5 r. t* E! {
        
  R: i1 j' x# S  y, A}
0 A6 ?/ @8 i# W; z$ q
9 f! i5 N, [* w) z, I2 E
+ m, B  u5 z' y9 @/ ?: |) Z! p( w" R. \6 s' V. V$ R

- D2 G, w. k5 ?  q* @& Y. ]
$ g) \: J: a2 r; V; y/ Y' h5 `7 t" d/ a8 C, X7 X  Y' r" K7 _
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

全部回复1

qiufengwu 发表于 2021-8-10 20:54:50

qiufengwu 沙发

2021-8-10 20:54:50

目前正在制作,调用EXCEL中的数据。
上海点团信息科技有限公司,承接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二次开发专题模块培训报名开始啦

    我知道了