Velocity Template 合并方法采用 StringWriter 但 buff 大小不够

Velocity Template merge method takes in a StringWriter but buff size not enough

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

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

我需要在 velocity 模板中使用这个集合,通过遍历 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 相关的帖子,但没有运气。

谢谢

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

来自 StringWriter javadocs:

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

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