读书人

excel的大数据量用POI写下

发布时间: 2012-09-10 22:20:13 作者: rapoo

excel的大数据量用POI写入
excel的大数据量用POI写入 香菜个人博客
有50万的数据需要分析处理。
处理完毕后写入excel中,excel里需要用一个sheet放所有数据(excel用的是2007以后的版本,行数限制从老版的6万多突破到了100多万)
直接写入跑了一会就OUTOFMEMORY了


多番寻找终于找到poi 3.6,这个版本已经支持了使用XSSF(支持07及以后的excel版本)来写入,并且提供了一个DEMO叫BigGridDemo(网上比较多,知名的DEMO)。这玩意使用XML方式先生成数据,然后再和一个xlsx的模版进行合并生成最终的xlsx。这种做法由于生成XML后还进行了压缩,基本上还是比较节省内存资源的。反正我50万数据是跑过了..百万级的数据问题应该也不大..

但BigGridDemo.java(http://libjakarta-poi-java.sourcearchive.com/documentation/3.6plus-pdfsg/BigGridDemo_8java-source.html有源码,google也有一把)
这个例子很方便,仿造它改一下generate方法就好了..
但有个致命的bug,就是没有对String的value进行XMLencode..一旦你的数据里出现了XML的标准字符(一共五个),你的数据格式就会乱掉...

贴一下需要修正的代码(把所有的value都先XMLEncoder一下)



附上XMLEncoder的实现(模仿htmlEncoder写的)
public class XMLEncoder {    private static final String[] xmlCode = new String[256];    static {        // Special characters        xmlCode['\''] = "'";        xmlCode['\"'] = """; // double quote        xmlCode['&'] = "&"; // ampersand        xmlCode['<'] = "<"; // lower than        xmlCode['>'] = ">"; // greater than    }    /**     * <p>     * Encode the given text into xml.     * </p>     *      * @param string the text to encode     * @return the encoded string     */    public static String encode(String string) {        if (string == null) return "";        int n = string.length();        char character;        String xmlchar;        StringBuffer buffer = new StringBuffer();        // loop over all the characters of the String.        for (int i = 0; i < n; i++) {            character = string.charAt(i);            // the xmlcode of these characters are added to a StringBuffer one by one            try {                xmlchar = xmlCode[character];                if (xmlchar == null) {                    buffer.append(character);                } else {                    buffer.append(xmlCode[character]);                }            } catch (ArrayIndexOutOfBoundsException aioobe) {                buffer.append(character);            }        }        return buffer.toString();    }    public static void main(String[] args) {        String test = "\'\"4&<2>1";        System.out.println(encode(test));    }}
1 楼 laximay 2011-04-12 我在使用的过程中遇到如果是中文就会报非法字符的错误,请问这个问题如何解决

读书人网 >软件架构设计

热点推荐