十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一、问题来源
专注于为中小企业提供网站制作、做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业永新免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了成百上千企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。1.1问题现象
动态多字段导出内存溢出
1.2问题分析
从问题的现象中找不到问题出现根源,需要通过捕获异常来分析问题具体出在那
通过不同参数导出测试,发现30个以内的列名导出没有问题,超过其上限在datatable给控键(原来用aspose控件)赋值中就抛出了异常。当初以为是控件问题,就尝试用NOPI控件,但是问题依然存在。由此可见内存溢出很大原因是来自要到导出的列名太多(73个字段),读取datatable的值时导致了内存溢出,需要用另一种方式来替换通过读取datatable赋值的方式来实现给导出控件赋值。
二、解决方法
找到了导致问题出现的大可能,接下来就是如何去解决。如果每次都是全部导出,这个问题好解决,直接通过foreach逐行读取对象集合给控件赋值就ok了,问题是需要按照客户选定的列名动态导出,找出需要导出的字段与其对象属性的对应关系是解决问题的关键所在。当时尝试用了通过xml配置文件找到它们对应关系,但并未能实现,原因是动态控制难实现。有时候思路错了,思考的方向错了,问题会越陷越深,出现无头绪的状态。在这个时候我们应该跳出来,重新去审视这个问题,用另一种方法去解决。通过重新审视问题,发现要建立关系,表头必须是要存放在二维的表中,只要建立一张基础关系数据表,用来对象给导出控件赋值遍历识别是否是用户选中的列名。这基础数据表要求数据全即涵盖全部的导出字段,且每个字段需有一个对应的固定的标记空间用来标记用户是否选中这个字段。动态表头存放在datatable中,没有处理的表头数据与基础关系表的表头一致,再通过转过来列名进行筛选,保证数据的一致性。在此之前需要给这73个列名固定的顺序(按照客户需求的排序)。从而得出解决方案,如下图
附件:http://down.51cto.com/data/2365315另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。