AX2009使用Microsoft.Dynamics.AX.Fim导出EXCEL

最近老是跟Excel过不去了,刚整完NPOI,在捣鼓AX2012时发现系统的一份财务报表是导出Excel的,而且这份报表导出Excel的方法不是使用Office的COM组件,经过代码研究,这份报表使用的是AX2012新增的一个Microsoft.Dynamics.AX.Fim.dll链接库

在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:	est1.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文件夹中找到Microsoft.Dynamics.AX.Fim.dll这个文件,复制这个文件到AX2009的Client安装目录Bin文件夹中,然后在AX2009中添加这个Dll文件的引用

将在AX2012测试的Job也移植到AX2009上,编译完成

运行,没有产生Excel文件!

是什么原因呢?

跟踪一下

这个Job在运行到if(spreadsheets.CreateSpreadsheet(filename))这句时返回了False

奇怪了,在AX2012里面正常运行,移植过来就运行不了了。。

既然在AX2009里面找不到原因,那就换个思路,将这个Dll放到C#里面试试

也同样写了个小测试程序

编译也正常

运行就出错了,也是CreateSpreadsheet()这个方法出错,不过这回有显示错误内容了

少了DocumentFormat.OpenXML这个程序集,经过一番查询,原来是需要安装OpenXMLSDK

下载了Open XML SDK 2.0 for Microsoft Office这个安装包后,安装完再运行就正常了

原来这个Dll链接库只是个马甲而已,真正起作用的是OpenXMLSDK,这个Dll的作用是将一些OpenXMLSDK操作Exce的l功能简单封装一下,方便在AX中调用而已

经过测试,这个Dll的功能只能满足一般的导出数据,设置一些简单的格式和页面设置,如果要设置合并单元格之类的就做不了

看来这个Dll也只是微软做出来的一个半成品而已,用来代替Npoi好像还不是不行

但是用来做数据导出还是足够的。

另外经过测试,这货最多只支持26列(⊙﹏⊙)b

难怪2012财务报表最多支持25列~~

原文地址:https://www.cnblogs.com/rumenren/p/3502248.html