0

我正在尝试使用 Apache POI 从包含超过 5000 行和超过 10 个工作表的 excel 文件中读取,我获取所有列和行值并将其存储在 ArrayListMultiMap> 中,这个逻辑工作得很好,然后我存储这个VelocityContext 中的对象,如下所示:

       VelocityContext context = new VelocityContext();
        context.put("excelMap", excelMap);

我需要在速度模板中使用此集合,通过遍历 excelMap 来使用值填充 XML 文件,为此:

     VelocityEngine vEngine = new VelocityEngine();
    vEngine.setProperty("resource.loader", "class");
    vEngine.setProperty("class.resource.loader.class",  "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
    Template t = vEngine.getTemplate(vmTemplate);
    **StringWriter sw = new StringWriter(excelMap.size());**
    **t.merge(context,sw)**

但是StringWriter容量一直是1024,并且已经尝试过PrintWriter结合BufferedWriter、StringBuilderWriter,当应用程序到达合并行时挂起,最后显示OutOfMemory异常。

谁能帮帮我,我已经准备好所有与 StringWriter 和 PrintWriter 相关的帖子,但没有运气。

谢谢

4

1 回答 1

0

1024 限制是一个红鲱鱼。因此,您不会出现内存不足错误。如果 Writer 超出初始容量,将分配更多内存。您真正的问题是电子表格和数据,而不是 Velocity。

来自 StringWriter javadocs:

initialSize -在自动扩展之前将适合此缓冲区的 char 值的数量(强调我的)

您应该尝试一次将一个工作表或一个条目转换为 XML,而不是将整个电子表格读入内存。Velocity 可能不是您的最佳选择。

于 2015-04-15T11:19:54.900 回答