AX2009使用NPOI导出EXCEL2007

既然说到NPOI可以导出2007版本的EXCEL,那就随便也介绍一下如何导出

其实2007版本的EXCEL也并不神秘,将xlsx扩展名修改成zip,然后再打开就很清楚了,简单来说就是一堆的xml文件通过zip压缩,修改扩展名为xlsx就是2007版本的excel了

所以要生成2007版本的excel,就需要添加操作xml和zip的类

将下载得到的DLL文件共5个,还有1个XML文件复制到AX的客户端安装目录BIN下,DLL文件全部添加引用

 

添加完成就可以开始使用了

整个调用方法跟2003版本几乎一致,就是初始化workbook时使用的2007版本的class(红色部分)

 1 static void NPOI_ExportExcel2007(Args _args)
 2 {
 3     System.IO.FileStream                file;
 4     NPOI.XSSF.UserModel.XSSFWorkbook    workBook= new NPOI.XSSF.UserModel.XSSFWorkbook();
 5     NPOI.SS.UserModel.ISheet            sheet=workBook.CreateSheet("NPOISheet");
 6     NPOI.SS.UserModel.IRow              row;
 7     NPOI.SS.UserModel.ICell             cell;
 8 
 9     InventTable                         inventTable;
10     SysDictTable                        dictTable = new SysDictTable(inventTable.TableId);
11     SysDictField                        dictField;
12     FieldId                             fieldId;
13     int                                 i,j,k,t;
14     str                                 fieldValue;
15     Types                               a;
16     ;
17     t=timenow();
18     while select inventTable
19     {
20         row=sheet.CreateRow(i);
21         for(j=1;j<dictTable.fieldCnt();j++)
22         {
23             cell=row.CreateCell(j-1);
24             fieldId=dictTable.fieldCnt2Id(j);
25             a=typeof(inventTable.(fieldId));
26             dictField=dictTable.fieldObject(fieldId);
27             if(a!=types::BLOB && a!=types::Class && a!=types::Container && a!=types::void && a!=types::Record)
28             {
29                 for(k=1;k<=dictField.arraySize();k++)
30                     fieldValue=queryvalue(inventTable.(fieldId2Ext(fieldId,k)));
31 
32             }
33             cell.SetCellValue(fieldValue);
34         }
35         i++;
36     }
37 
38     file =new System.IO.FileStream("D:\\test.xlsx", System.IO.FileMode::Create,System.IO.FileAccess::ReadWrite);
39     workBook.Write(file);
40     file.Close();
41     info("export2007 use time:"+int2str(timenow()-t)+"s");
42 }

 最终导出时间比2003版本多1秒,但文件大小是2003版本的1/4

 

posted @ 2013-06-24 11:13  止在入门  阅读(1308)  评论(0编辑  收藏  举报