`
aeoluswind
  • 浏览: 15814 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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一下)

        public void createCell(int columnIndex, String value, int styleIndex) throws IOException {
            String ref = new CellReference(_rownum, columnIndex).formatAsString();
            _out.write("<c r=\"" + ref + "\" t=\"inlineStr\"");
            if (styleIndex != -1) _out.write(" s=\"" + styleIndex + "\"");
            _out.write(">");
            _out.write("<is><t>" + XMLEncoder.encode(value)+ "</t></is>");
            _out.write("</c>");
        }


附上XMLEncoder的实现(模仿htmlEncoder写的)

public class XMLEncoder {

    private static final String[] xmlCode = new String[256];

    static {
        // Special characters
        xmlCode['\''] = "&apos;";
        xmlCode['\"'] = "&quot;"; // double quote
        xmlCode['&'] = "&amp;"; // ampersand
        xmlCode['<'] = "&lt;"; // lower than
        xmlCode['>'] = "&gt;"; // 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  
我在使用的过程中遇到如果是中文就会报非法字符的错误,请问这个问题如何解决

相关推荐

    java poi 导入大数据量Excel数据 防止内存溢出处理.zip

    然而,当处理大数据量的Excel文件时,POI可能会导致内存溢出(Out of Memory, OOM),因为默认情况下它会将整个工作簿加载到内存中。为了防止这种问题,我们需要采用优化策略来高效地处理大量数据。 1. **分块读取*...

    使用Poi读取大数据量excel的方法

    本篇文章将详细讲解如何利用Apache POI库在Android环境中高效地处理大数据量的Excel文件,无论是2003的.xls格式还是2007及以后的.xlsx格式。 首先,我们需要在项目中引入Apache POI库。如果是Maven项目,可以在pom....

    Java读取大数据量Excel的方法(POI)

    接下来,我们将详细讲解如何使用Apache POI读取大数据量的Excel文件: 1. **创建Workbook对象**:这是处理Excel文件的基础,它代表整个Excel工作簿。你可以通过`XSSFWorkbook`类的构造函数,传入文件的输入流来创建...

    使用POI将数据写入到EXCEL

    此外,如果数据量较大,为了性能考虑,可以使用SXSSFWorkbook,它提供了一种内存优化的模式,可以避免一次性加载所有数据到内存中。 通过阅读提供的示例代码"14、POI将数据写入到EXCEL并保存到本地-示例",你可以更...

    使用POI导出大数据量到EXCEL

    "使用POI导出大数据量到EXCEL"这个主题涉及到如何高效地利用POI处理大量数据并将其导出到Excel文件中。以下是对这个主题的详细讲解。 1. **Apache POI简介** Apache POI 是一个开源项目,它提供了Java API来创建、...

    poi 自己写的excel sax方式导入大量数据

    SAX(Simple API for XML)解析方式与DOM不同,它不会一次性加载整个文件到内存,而是逐行读取,只处理当前需要的数据,这极大地降低了内存使用,特别适合处理大数据量的Excel文件。 以下是一些关于使用Apache POI...

    java poi导出大量数据到Excel

    1. **内存优化**:当数据量非常大时,建议使用Apache POI提供的SXSSF类来降低内存占用。 2. **性能考虑**:在实际应用中,应尽可能减少对Excel文件的读写操作,避免频繁创建和销毁对象。 3. **异常处理**:在处理...

    POI实现大数据量的excel文件解析

    标题中的“POI实现大数据量的excel文件解析”是指使用Apache POI库来处理大量数据的Excel文件。Apache POI是Java平台上的一个开源项目,它提供了读取和写入Microsoft Office格式文件的能力,包括Excel(XLS和XLSX)...

    POI 3.8 Beta5 创建大数据量 Excel文件

    在POI 3.8 Beta5这个版本中,开发者可以利用它来处理大数据量的Excel文件,这在数据处理、报告生成或数据分析场景中非常有用。 Apache POI库提供了HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet ...

    POI导出Excel万级数据分页实现 解决内存溢出问题

    1. **数据分页**:首先,根据需要导出的数据量,设定合理的分页大小。例如,每页处理1000条数据,然后使用SQL查询分页获取数据。 2. **创建SXSSFWorkbook对象**:使用SXSSFWorkbook代替XSSFWorkbook,因为它允许...

    java excel大数据量导出demo,可支持模板导出

    在Java开发中,处理Excel大数据量的导出是一项常见的任务,尤其在数据分析、报表生成等领域。这个"java excel大数据量导出demo"提供了一个高效、灵活的解决方案,它支持模板导出,分页查询,以及处理大数据量的能力...

    poi读写excel+poi总结

    以下是一个简单的Java示例,演示如何使用POI写入Excel: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import java.io.FileOutputStream; public class ...

    poi excel poi excel poi excel

    通过上述介绍,我们可以看到 Apache POI 提供了非常强大的功能来处理 Excel 文件,无论是读取还是写入都非常方便。掌握 POI 的基本用法对于开发人员来说是非常有用的技能,特别是在需要处理大量数据时更是如此。希望...

    Java使用POI导出大数据量Excel的方法

    在Java开发中,导出大数据量的Excel文件可能会面临内存溢出的问题,特别是在使用Apache POI库时。这是因为默认情况下,POI会将整个Excel工作簿存储在内存中,当数据量过大时,内存消耗非常显著,可能导致系统崩溃。...

    实现大数据量的excel文件解析POI

    本篇将深入探讨如何利用Apache POI来实现大数据量的Excel文件解析。 首先,Apache POI提供了两种主要的API用于处理Excel文件:HSSF(Horizontally Stored Sheet Format)用于处理.xls文件(老版本的Excel),而XSSF...

    POI实现的基于动态模板的EXCEL数据导出

    5. 如果数据量大,可能需要分批写入,以避免一次性加载过多数据导致内存溢出。 在实际应用中,为了提高性能,可能还需要考虑异步处理、多线程等技术,以实现更高效的批量数据导出。此外,优化内存管理和设置适当的...

    POI导入excel大数据处理,支持excel2003,2007

    2. **高效读写**:POI允许开发者以流式方式处理Excel数据,减少了内存占用,适合处理大数据量的Excel文件。 3. **灵活性**:可以创建、修改、读取单元格、行、列等元素,以及样式、公式、图表等复杂功能。 4. **易于...

    POI向excel中插入图片

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,包括Excel。在本文中,我们将深入探讨如何使用POI库向Excel工作簿中插入图片。这将涵盖相关的API,步骤以及一些实用技巧。 首先,我们需要...

    poi大量数据读取gc内存溢出解决方案

    poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...

    Java解析大数据量Excel,可解析1048576行excel

    在处理大数据量的Excel文件时,Java是一种常用的语言,因为它提供了强大的库,如Apache POI,使得解析大型Excel文件成为可能。Apache POI是Java的一个开源项目,专门用于读写Microsoft Office格式的文件,包括Excel...

Global site tag (gtag.js) - Google Analytics