根据模板生成word-添加图片

文章描述了一个Java工具类`FreeMarkWordUtils`,该类用于将包含base64编码图片的Word文档转换为XML,并使用FreeMarker模板引擎处理数据。在导出Word文件时,工具类会读取模板,处理数据地图,然后将生成的文档输出到HTTP响应,供用户下载。过程中涉及了文件编码、流操作和HTTP头设置。
摘要由CSDN通过智能技术生成

word中需要图片的地方插入图片,然后另存为xml,会生成一段base64编码,将文件中的编码替换成${变量}(接上一篇:word生成xml并改名为ftl

 util工具类改写:

public class FreeMarkWordUtils {

    private static final Logger logger = LoggerFactory.getLogger(WordUtils.class);

    private static final Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
/**
 * 导出Word文件
 */
public static void exportToWord(String template, String docPath, Map<String, Object> dataMap, File dir, HttpServletResponse response) {
    // ** 设置编码 **//*
    configuration.setDefaultEncoding("UTF-8");
    // 加载模板文件
    Template t;
    try {
        response.setCharacterEncoding("utf-8");
        //加载文档模板FTL文件所存在的位置
        configuration.setDirectoryForTemplateLoading(dir);
        t = configuration.getTemplate(template);
    } catch (IOException e) {
        logger.error(e.getMessage(), e);
        throw new BaseException("io读写模板失败!");
    }
    ServletOutputStream out = null;
    response.setContentType("application/msword");
    // 指定输出word文件的路径
    // 调用工具类WordUtils的createDoc方法生成Word文档
    InputStreamSource file;
    InputStream fin = null;
    try {
        response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
        // 文件名称
        docPath = URLEncoder.encode(docPath, String.valueOf(StandardCharsets.UTF_8));
        //设置浏览器以下载的方式处理该文件-下载文件名称乱码处理
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + docPath + ";" + "filename*=utf-8''" + docPath);
        file = createDoc(dataMap, t);
        fin = file.getInputStream();
        out = response.getOutputStream();
        // 缓冲区
        byte[] buffer = new byte[1024];
        int bytesToRead;
        // 通过循环将读入的Word文件的内容输出到浏览器中
        while ((bytesToRead = fin.read(buffer)) != -1) {
            out.write(buffer, 0, bytesToRead);
        }
    } catch (TemplateException | IOException e) {
        logger.error(e.getMessage(), e);
        throw new BaseException("文件读取失败!");
    } finally {
        try {
            if (fin != null) {
                fin.close();
            }
            if (out != null) {
                out.close();
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
}

/**
 * 创建word文件
 *
 * @param dataMap  dataMap
 * @param template template
 * @return InputStreamSource
 */
public static InputStreamSource createDoc(Map<String, Object> dataMap, Template template) throws TemplateException, IOException {
    //生成随机的合同名称
    StringWriter out1 = new StringWriter();
    Writer out = new BufferedWriter(out1, 10240);
    //将数据输出到模板
    template.process(dataMap, out);
    out.close();
    out1.close();
    return new ByteArrayResource(out1.toString().getBytes(StandardCharsets.UTF_8));
}
}

//具体实现调用-导出word
public void exportSubFaultApplyFile(HttpServletResponse response, String applyId) {
    //获取导出详情
    Map<String, String> insertTextMap = this.baseMapper.querySubFaultApplyExportDetail(applyId);
    //生成的word名称
    String fileName = DateUtils.getDate() + StringConstants.SUB_FAULT_REPORT_DOC;
    if (null != insertTextMap) {
        //todo 获取审批历史记录
        //获取故障附件详情
        List<SubFaultFileVo> faultFileList = BeanCopyUtils.copyList(fileService.list(new LambdaQueryWrapper<SubFaultFile>().eq(SubFaultFile::getApplyId, applyId)), SubFaultFileVo.class);
        //获取图片并转为doc存储模式
        Map<String, String> pictureMap = getPictureFiles(faultFileList);
        //处理word文档内数据
        Map<String, Object> data = dealData(insertTextMap, pictureMap);
        //ftl模板创建word文档
        FreeMarkWordUtils.exportToWord(StringConstants.SUB_FAULT_REPORT_TEMPLATE_FTL, fileName, data, getTemplateDir(), response);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值