既然说到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