首页 > 代码库 > 动态多字段导出解决方案
动态多字段导出解决方案
一、问题来源
1.1问题现象
动态多字段导出内存溢出
1.2问题分析
从问题的现象中找不到问题出现根源,需要通过捕获异常来分析问题具体出在那
通过不同参数导出测试,发现30个以内的列名导出没有问题,超过其上限在datatable给控键(原来用aspose控件)赋值中就抛出了异常。当初以为是控件问题,就尝试用NOPI控件,但是问题依然存在。由此可见内存溢出很大原因是来自要到导出的列名太多(73个字段),读取datatable的值时导致了内存溢出,需要用另一种方式来替换通过读取datatable赋值的方式来实现给导出控件赋值。
二、解决方法
找到了导致问题出现的最大可能,接下来就是如何去解决。如果每次都是全部导出,这个问题好解决,直接通过foreach逐行读取对象集合给控件赋值就ok了,问题是需要按照客户选定的列名动态导出,找出需要导出的字段与其对象属性的对应关系是解决问题的关键所在。当时尝试用了通过xml配置文件找到它们对应关系,但并未能实现,原因是动态控制难实现。有时候思路错了,思考的方向错了,问题会越陷越深,出现无头绪的状态。在这个时候我们应该跳出来,重新去审视这个问题,用另一种方法去解决。通过重新审视问题,发现要建立关系,表头必须是要存放在二维的表中,只要建立一张基础关系数据表,用来对象给导出控件赋值遍历识别是否是用户选中的列名。这基础数据表要求数据全即涵盖全部的导出字段,且每个字段需有一个对应的固定的标记空间用来标记用户是否选中这个字段。动态表头存放在datatable中,没有处理的表头数据与基础关系表的表头一致,再通过转过来列名进行筛选,保证数据的一致性。在此之前需要给这73个列名固定的顺序(按照客户需求的排序)。从而得出解决方案,如下图
动态多字段导出解决方案