最近老是跟Excel过不去了,刚整完NPOI,在捣鼓AX2012时发现系统的一份财务报表是导出Excel的,而且这份报表导出Excel的方法不是使用Office的COM组件,经过代码研究,这份报表使用的是AX2012新增的一个链接库
在AX2012中自己写了个Job,测试一下用这个Dll导出Excel试试
static void spreadsheets(Args _args){ FileName filename; Microsoft.Dynamics.AX.Fim.Spreadsheets.Spreadsheet spreadsheets; Microsoft.Dynamics.AX.Fim.Spreadsheets.ColumnProperties columnProperties; Microsoft.Dynamics.AX.Fim.Spreadsheets.CellProperties cellProperties; ; filename=@"D:\test1.xlsx"; new FileIOPermission(filename, "rw").assert(); spreadsheets = new Microsoft.Dynamics.AX.Fim.Spreadsheets.Spreadsheet(); columnProperties= new Microsoft.Dynamics.AX.Fim.Spreadsheets.ColumnProperties(); cellProperties = new Microsoft.Dynamics.AX.Fim.Spreadsheets.CellProperties(); if(spreadsheets.CreateSpreadsheet(filename)) { columnProperties.set_Width(10); spreadsheets.InstantiateColumn(columnProperties); cellProperties.set_FontSize(Microsoft.Dynamics.AX.Fim.Spreadsheets.CellFontSize::Size9); cellProperties.set_Bold(true); cellProperties.set_BorderBottom(Microsoft.Dynamics.AX.Fim.Spreadsheets.CellBottomBorderFormat::Thin); spreadsheets.AddStringCellToWorkbook("A",cellProperties); spreadsheets.AddStringCellToWorkbook("B",cellProperties); spreadsheets.AddStringCellToWorkbook("C",cellProperties); spreadsheets.AddStringCellToWorkbook("D",cellProperties); spreadsheets.MoveToNextRowInWorkbook(); spreadsheets.AddStringCellToWorkbook("A1",cellProperties); spreadsheets.AddStringCellToWorkbook("B1",cellProperties); spreadsheets.AddStringCellToWorkbook("C1",cellProperties); spreadsheets.AddStringCellToWorkbook("D1",cellProperties); spreadsheets.WriteFile(); spreadsheets.OpenExcelSpreadsheet(); spreadsheets.Dispose(); info("Done!"); }}
正常导出。
既然是通过Dll来导出Excel,那就是试将这个Dll移植到AX2009上试试,在AX2012的Client安装目录Bin文件夹中找到这个文件,复制这个文件到AX2009的Client安装目录Bin文件夹中,然后在AX2009中添加这个Dll文件的引用
将在AX2012测试的Job也移植到AX2009上,编译完成
运行,没有产生Excel文件!
是什么原因呢?
跟踪一下
这个Job在运行到if(spreadsheets.CreateSpreadsheet(filename))这句时返回了False
奇怪了,在AX2012里面正常运行,移植过来就运行不了了。。
既然在AX2009里面找不到原因,那就换个思路,将这个Dll放到C#里面试试
也同样写了个小测试程序
编译也正常
运行就出错了,也是CreateSpreadsheet()这个方法出错,不过这回有显示错误内容了
少了DocumentFormat.OpenXML这个程序集,经过一番查询,原来是需要安装OpenXMLSDK
下载了这个安装包后,安装完再运行就正常了
原来这个Dll链接库只是个马甲而已,真正起作用的是OpenXMLSDK,这个Dll的作用是将一些OpenXMLSDK操作Exce的l功能简单封装一下,方便在AX中调用而已
经过测试,这个Dll的功能只能满足一般的导出数据,设置一些简单的格式和页面设置,如果要设置合并单元格之类的就做不了
看来这个Dll也只是微软做出来的一个半成品而已,用来代替Npoi好像还不是不行
但是用来做数据导出还是足够的。
另外经过测试,这货最多只支持26列(⊙﹏⊙)b
难怪2012财务报表最多支持25列~~