public String getContent(String code) {
    Template tpl = loadByCode(code);
    if (tpl == null) {
      logger.warn("没有找到编码为'" + code + "'的模板!");
      return null;
    }
    // 纯文本类型
    if (tpl.isPureText()) return tpl.getContentEx();
    // 附件的扩展名
    String extension = StringUtils.getFilenameExtension(tpl.getPath());
    if (tpl.getTemplateType().getCode().equals("word-docx") && extension.equals("docx"))
      return DocxUtils.loadText(tpl.getInputStream());

    if (tpl.getTemplateType().getCode().equals("xls") && extension.equals("xls"))
      return XlsUtils.loadText(tpl.getInputStream());

    if (tpl.getTemplateType().getCode().equals("xlsx") && extension.equals("xlsx"))
      return XlsxUtils.loadText(tpl.getInputStream());

    if (tpl.getTemplateType().getCode().equals("html") && extension.equals("html"))
      return TemplateUtils.loadText(tpl.getInputStream());

    logger.warn("文件后缀名:" + extension + ",未转换为字符串类型");
    return null;
  }
  public InputStream getInputStream(String code) {
    Template tpl = loadByCode(code);
    if (tpl == null) {
      logger.warn("没有找到编码为'" + code + "'的模板!");
      return null;
    }

    return tpl.getInputStream();
  }
  public void formatTo(String code, Map<String, Object> args, OutputStream out) {
    Template tpl = loadByCode(code);
    if (tpl == null) logger.warn("没有找到编码为'" + code + "'的模板!");
    if (tpl.isFormatted()) logger.warn("code=" + code + ",模板不可格式化。");

    // 纯文本类型
    if (tpl.isPureText()) {
      String source = this.getContent(code);
      String r = TemplateUtils.format(source, args);
      try {
        out.write(r.getBytes());
        out.flush();
      } catch (IOException e) {
        logger.warn("formatTo 写入数据到流错误:" + e.getMessage());
      } finally {
        try {
          out.close();
        } catch (IOException ex) {
        }
      }
    } else {
      InputStream is = tpl.getInputStream();

      // 附件的扩展名
      String extension = StringUtils.getFilenameExtension(tpl.getPath());

      if ("word-docx".equals(tpl.getTemplateType().getCode()) && "docx".equals(extension)) {
        XWPFDocument docx = DocxUtils.format(is, args);
        try {
          docx.write(out);
          out.flush();
        } catch (IOException e) {
          logger.warn("formatTo 写入数据到流错误:" + e.getMessage());
        } finally {
          try {
            is.close();
            out.close();
          } catch (IOException ex) {
          }
        }

      } else if ("xls".equals(tpl.getTemplateType().getCode()) && "xls".equals(extension)) {
        HSSFWorkbook xls = XlsUtils.format(is, args);
        try {
          xls.write(out);
          out.flush();
        } catch (IOException e) {
          e.printStackTrace();
          logger.warn("formatTo 写入数据到流错误:" + e.getMessage());
        } finally {
          try {
            is.close();
            out.close();
          } catch (IOException ex) {
          }
        }

      } else if ("xlsx".equals(tpl.getTemplateType().getCode())
          && "xlsx".equals(extension)) { // Excel2007+

        XSSFWorkbook xlsx = XlsxUtils.format(is, args);
        try {
          xlsx.write(out);
          out.flush();
        } catch (IOException e) {
          e.printStackTrace();
          logger.warn("formatTo 写入数据到流错误:" + e.getMessage());
        } finally {
          try {
            is.close();
            out.close();
          } catch (IOException ex) {
          }
        }

      } else if ("html".equals(tpl.getTemplateType().getCode())
          && "html".equals(extension)) { // html
        String source = FreeMarkerUtils.format(TemplateUtils.loadText(is), args);
        try {
          out.write(source.getBytes());
          out.flush();
        } catch (IOException e) {
          e.printStackTrace();
          logger.warn("formatTo 写入数据到流错误:" + e.getMessage());
        } finally {
          try {
            is.close();
            out.close();
          } catch (IOException ex) {
          }
        }
      } else {
        logger.warn("文件后缀名:" + extension + ",不能formatTo");
        try {
          is.close();
          out.close();
        } catch (IOException ex) {
        }
      }
    }
  }