导出Excel,很多项目都会有这样的需求,目前也有很多比较成熟的jar可以直接使用,我们使用的是poi。

        先来说说具体是怎么实现的,从数据库一次性的查询所有的数据,然后使用poi生成Workbook对象,Workbook对象生成Worksheet对象,遍历查询数据,往Worksheet写入行,最后通过ServletOutStream导出。

        以上所有的操作都是在内存中完成的,很显然,当数据量增大时肯定出现内存溢出的问题,相信很多开发人员都遇到过同样的情况。那么我们如何去解决这个问题,有人肯定想到了先生成一定格式的XML文件,然后转成Excel,因为XML文件是纯文本文件,相对于直接生成Excel文件,文件大小上肯定是小了一点,但是这个也不是最终的解决办法,因为我们无法知道客户的数据量到底会有多大。

        我们可以换一种思路,假如从数据库中分页查询数据,然后分批的写入到保存在服务器端的文件中,最后通过跳转到该文件路径的方式实现文件的下载,是否能解决内存溢出的问题呢?答案是肯定的,我们也是使用XML转Excel的思路,因为操作XML文件,只需要写入正常的字符串就可以了,比起操作Excel文件来要简单的多。但是我们还需要使用一种方法就是每次修改文件的时候不能把整个文件加载到内存中进行操作,而是使用文件指针指向需要写入的位置,然后把需要增加的数据写进去就可以。Java的RandomAccessFile类能满足上面的要求,下面是一个小例子:

      

RandomAccessFile randomAccessFile = new RandomAccessFile("文件的绝对路径", "rw");//新建一个RandomAccessFile对象,模式是读写。
randomAccessFile.seek(randomAccessFile.length());//设置当前写入的指针位置(这里设置为文件尾,如果不设置默认是文件头)
randomAccessFile.write("新数据".getBytes("utf-8"));//在文件尾写入新的数据
randomAccessFile.close();//使用完后进行关闭