返回

问题与思路

最近在工作上碰到了一个技术问题,其实是很容易解决的问题,但是按照正常的思路完成之后,出现了一些不可预测是情况,后面和同事交流才让我恍然大悟,现在记录起来,加深印象。

问题是这样的,项目有一个根据动态数据进行 word 文件模板替换,并生成新文档的需求。平台上面有 Apache POI 文档操作库,于是按照平常开发的思路,按照以下思路开发:

  1. 对动态数据获取
  2. 读取模板文件
  3. 找到需要替换的标识(对动态替换定义变量占位)
  4. 进行替换文档操作,此时返回 POI 文档格式
  5. 添加临时文件写入并生成

就在步骤 5 时,经常出现内存溢出的问题,因为 POI 对文档的操作相对复杂,占用大量内存。

其实在这个问题上,如论怎样调整都需要操作文档,就避免不了有繁琐的编码。按照「好的设计是尽可能少的设计」的设计哲学,即使这样完成任务,但是它并不是良好的设计,对于一般完美主义者这是不被允许的。后面通过一位同事得到了一个全新的方案。具体步骤如下:

  1. 首先将模板文档转换成 XML 格式的文件
  2. 然后查询动态数据
  3. 使用 FreeMarker 模板引擎对 XML 文件进行占位符替换
  4. 最后将文件流输出,输出的文件名后缀修改为 *.doc,即 word 文档格式

我没有想到的是将复杂先转换成简单,然后解决起来就轻松多了。总结下来,能够以点代面,在解决其他复杂的问题时,可以先将其简化,顺序去进行。或许解决问题的方法很多,但是能优雅并简单的把事情处理好,就是自己去好好领悟的。

厦门 - 雨