java下载word

需要引入word模板的依赖,pom增加如下jar报包依赖

XML 复制代码
    <!--word模板-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.9.1</version>
        </dependency>

但测试的时候发现,word模板填充时报错

com.deepoove.poi.exception.ResolverException: Compile template failed

at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:116)

at cn.org.bjca.ywq.his.ca.controller.OrderInfoController.renderTemplate(OrderInfoController.java:307)

at cn.org.bjca.ywq.his.ca.controller.OrderInfoController.downloadCaReport(OrderInfoController.java:286)

at cn.org.bjca.ywq.his.ca.controller.OrderInfoController$$FastClassBySpringCGLIB$$5f1b3564.invoke(<generated>)

at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)

at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)

at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)

at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)

Caused by: java.io.IOException: ZIP entry size is too large or invalid

at org.apache.poi.openxml4j.util.ZipArchiveFakeEntry.<init>(ZipArchiveFakeEntry.java:43)

at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:53)

at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:106)

at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:307)

at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:47)

at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:142)

搜了各种资料,原来maven打包时把resource下的word模板压缩了,导致读取模板文件时失败了。

完整的word模板和下载程序如下:

java 复制代码
  @RequestMapping(value = "/downloadDocx", method = RequestMethod.GET)
    public void downloadDocx(HttpServletResponse response) {

        //根据业务查询数据,并组装模板中要替换的params,这里也可以使用guava工具类直接将java dto转换成map
        Map<String, Object> params = new HashMap<>();
try {

            //模板放在项目的 resource目录下的templates目录,模板里需要替换的变量使用EL表达式标识,比如 {{userName}}   在params中有个key为userName的
            ClassPathResource resource = new ClassPathResource("templates\\test.docx");
            XWPFTemplate template = renderTemplate(resource.getStream(), params);

            response.setContentType("application/octet-stream;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("test", StandardCharsets.UTF_8.name()) + ".docx");
            try (OutputStream out = response.getOutputStream()) {
                template.writeAndClose(out);
            } catch (IOException e) {
                logger.error("io异常", e);
            }

        } catch (Exception e) {
            logger.error("下载docx异常", e);
        }

}


/**
     * 模板替换
     * @param templateInputStream
     * @param dataMap
     * @return
     */
private XWPFTemplate renderTemplate(InputStream templateInputStream, Map<String, Object> dataMap) {
        ConfigureBuilder configureBuilder = Configure.builder()
                .useSpringEL()  // 启用Spring EL表达式 模板中使用 {{}} {{userName}}
                .bind("dataTable", new HackLoopTableRenderPolicy());  // 设置循环策略
        Configure config = configureBuilder.build();
        return XWPFTemplate.compile(templateInputStream, config).render(dataMap);

    }

参考:java.io.IOException: ZIP entry size is too large or invalid-CSDN博客

相关推荐
lqz199313 小时前
根据html导出excel和word
html·word·excel
缺点内向16 小时前
C# 中 Word 文档目录的插入与删除指南
开发语言·c#·word·.net
诸神缄默不语1 天前
如何用Python处理文件:Word导出PDF & 如何用Python从Word中提取数据:以处理简历为例
python·pdf·word
初九之潜龙勿用2 天前
C# 操作Word模拟解析HTML标记输出带格式的文本
开发语言·c#·word·office
裤裤兔2 天前
利用VBA批处理word 文档,使用宏对docx文件内容进行批量替换
c#·word·.net··vba·office·宏操作
gc_22992 天前
学习C#调用FreeSpire.Doc包将Word转换为html
c#·html·word·freespire.doc
gc_22993 天前
学习C#调用Microsoft.Office.Interop.Word将Word转换为html
c#·html·word·interop.word
梵克之泪4 天前
根据表格内容和模板文件批量创建word文件,一次性生成多个word文档和批量生成创建PDF文件
pdf·word
栗子~~4 天前
java-根据word模板灵活生成word文档-demo
java·开发语言·word
B博士5 天前
Word中Endnote引用参考文献时正文引用处字体如何标蓝色呢?
word·endnote·引用显示蓝色