Java使用poi-tl动态生成word和pdf

Java使用poi-tl动态生成word和pdf

lixiangrong
2024-01-25 / 26 评论 / 121 阅读 / 正在检测是否收录...

1.导入依赖,注意版本必须匹配

详情参见官网 poi-tl官方文档

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>
<!--导出word-->
<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>1.10.5</version>
</dependency>
<!--xpwf转pdf(根据word导出pdf)-->
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.poi.xwpf.converter.pdf-gae</artifactId>
    <version>2.0.2</version>
</dependency>
<!--SpringEL表达式-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>5.3.18</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.draco1023/poi-tl-ext -->
<!--富文本解析-->
<dependency>
    <groupId>io.github.draco1023</groupId>
    <artifactId>poi-tl-ext</artifactId>
    <version>0.3.22</version>
    <exclusions>
        <exclusion>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
        </exclusion>
        <exclusion>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2.准备文件模板

{{data.id}}
{{data.sno}}
{{data.name}}
{{data.sex}}
{{data.age}}
{{data.createTime}}
图片解析
{{@data.img}}
富文本
{{data.content}}
SpringEL表达式对时间格式化
{{data.createTime == null ? "" : new java.text.SimpleDateFormat('yyyy-MM-dd').format(data.createTime)}}
字符串集合遍历
{{?data.list}}
{{=#this}}
{{/data.list}}
复杂对象集合遍历和取值
{{?data.cityList}}
{{id}}
{{name}}
{{/data.cityList}}

Test
Test

3.生成文件到本地

@Test
public void test()
{
    Student entity = new Student();
    entity.setId("1");
    entity.setSno("1");
    entity.setName("张三");
    entity.setSex("男");
    entity.setAge(25);
    entity.setCreateTime(new Date());
    final ArrayList<String> strings = new ArrayList<>();
    strings.add("str1");
    strings.add("str2");
    strings.add("str3");
    entity.setList(strings);
    // Base64图片
    String base64Str = "这里填写Base64编码的图片字符串,此处限于篇幅省略";
    entity.setImg(Pictures.ofBase64(base64Str, PictureType.JPEG).size(96, 45).create());
    // 网络图片
    // entity.setImg("https://www.lxrao.com/myfile/cat.jpg");
    // 富文本
    entity.setContent("此处粘贴富文本,此处限于篇幅省略");
    List<City> list = new ArrayList<>();
    City city1 = new City();
    city1.setId(1);
    city1.setName("BeiJing"+"\n");
    list.add(city1);
    City city2 = new City();
    city2.setId(1);
    city2.setName("ShangHai");
    list.add(city2);
    entity.setCityList(list);
    try(InputStream inputStream = getClass().getResourceAsStream("/templates/test.docx"))
    {
        Assert.isTrue(Objects.nonNull(inputStream),"模板不存在!");
        HashMap<String,Object> map = new HashMap<>();
        map.put("data",entity);
        // 富文本解析
        HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
        Configure configure = Configure.builder().bind("data.content", htmlRenderPolicy).useSpringEL().build();
        XWPFTemplate template = XWPFTemplate.compile(inputStream,configure).render(map);
        // 1.导出word文件
        template.writeAndClose(new FileOutputStream("C:\\Users\\LiXiangrong\\Desktop\\test.docx"));
        // 2.导出pdf文件
        PdfOptions options = PdfOptions.create();
        FileOutputStream outPDF = new FileOutputStream("C:\\Users\\LiXiangrong\\Desktop\\test.pdf");
        PdfConverter.getInstance().convert(template.getXWPFDocument(), outPDF, options);
        outPDF.close();
    } catch (IOException e)
    {
        System.out.println(e.getMessage());
    }
}

4.下载到web端

package com.example.springbootdemo.utils;

import com.deepoove.poi.XWPFTemplate;
import fr.opensagres.poi.xwpf.converter.pdf.PdfConverter;
import fr.opensagres.poi.xwpf.converter.pdf.PdfOptions;
import org.springframework.util.Assert;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Objects;

public class ExportUtil
{
    private static final String WORD = ".docx";

    private static final String PDF = ".pdf";

    private static final String TYPE = "application/octet-stream";
    
    public static void exportWordOrPDF(HttpServletResponse response,Object o,String tempName,String exportName,String fileType)
    {
        final String fileSuffix = "word".equals(fileType) ? WORD : PDF;
        // 赋值数据对象
        HashMap<String,Object> map = new HashMap<>();
        map.put("data",o);
        // 读取模板文件
        InputStream inputStream = ExportUtil.class.getResourceAsStream("/templates/"+tempName);
        Assert.isTrue(Objects.nonNull(inputStream),"模板文件不存在!");
        XWPFTemplate template = XWPFTemplate.compile(inputStream).render(map);
        // 生成文件
        response.setContentType(TYPE);
        try {
            response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(exportName+fileSuffix, "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        try
        {
            OutputStream outputStream = response.getOutputStream();
            if ("word".equals(fileType))
            {
                template.writeAndClose(outputStream);
            } else
            {
                PdfOptions options = PdfOptions.create();
                PdfConverter.getInstance().convert(template.getXWPFDocument(), outputStream, options);
                outputStream.close();
            }
        } catch (IOException e)
        {
            throw new RuntimeException("导出异常!");
        }
    }
    
}

5.控制层接口

@GetMapping("/exportPDF")
    public void exportPDF(HttpServletResponse response)
    {
        Student entity = new Student();
        entity.setId("1");
        entity.setSno("1");
        entity.setName("张三");
        entity.setSex("男");
        entity.setAge(25);
        ExportUtil.exportWordOrPDF(response,entity,"test.docx","导出pdf测试","pdf");
    }

    @GetMapping("/exportWORD")
    public void exportWORD(HttpServletResponse response)
    {
        Student entity = new Student();
        entity.setId("1");
        entity.setSno("1");
        entity.setName("张三");
        entity.setSex("男");
        entity.setAge(25);
        ExportUtil.exportWordOrPDF(response,entity,"test.docx","导出word测试","word");
    }

6.浏览器地址栏输入url测试

Test

7.前端下载方法

<el-button type="primary" @click="downloadToWord" :loading="downloadLoading">下载</el-button>

下载公共方法写在工具类中

// Blob下载文件
export function downloadFileByBlob (content, filename) {
    let eleLink = document.createElement("a");
    eleLink.download = filename;
    eleLink.style.display = "none";
    let blob = new Blob([content]);
    eleLink.href = URL.createObjectURL(blob);
    document.body.appendChild(eleLink);
    eleLink.click();
    document.body.removeChild(eleLink);
}

下载方法放在methods:{}中

import { downloadFileByBlob } from '@/utils'

// Loading
downloadLoading: false,
downloadToWord() {
  const { id } = this.topicsInfo
  this.downloadLoading = true
  request({
    url: `/api/szyd/JTopicRequestMeeting/export`,
    method: 'get',
    responseType: "blob",
    data: {
       id,
       type: 'word', 
       temp: this.curTemp,
       exportName: 'test'
    }
  }).then(file => {
    this.$message({ message: '文件下载成功', type: 'success' })
    downloadFileByBlob(file, document.title + '.docx')
  }).finally(() => {
    this.downloadLoading = false
  })
},
0

评论 (26)

取消
  1. 头像
    rptabvpcgx
    Windows 10 · Google Chrome

    《黑热病》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/92661.html

    回复
  2. 头像
    gbjtjqvdzn
    Windows 10 · Google Chrome

    龙腾传世手游官网链接的标题:畅爽龙腾,轻松征战:https://501h.com/heji/490.html

    回复
  3. 头像
    demehlajua
    Windows 10 · Google Chrome

    你的文章让我感受到了正能量,非常棒! https://www.yonboz.com/video/30665.html

    回复
  4. 头像
    fngxditskj
    Windows 10 · Google Chrome

    3975盛世复古传奇官网-最新攻略与评测:https://501h.com/jinbi/3614.html

    回复
  5. 头像
    ooapshsned
    Windows 10 · Google Chrome

    《老师!我可以喜欢你吗?》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/7163.html

    回复
  6. 头像
    huxyfehtrr
    Windows 10 · Google Chrome

    你的文章内容非常精彩,让人回味无穷。 http://www.55baobei.com/EOxMo9HOzb.html

    回复
  7. 头像
    hodponmlkx
    Windows 10 · Google Chrome

    你的文章充满了智慧,让人敬佩。 https://www.yonboz.com/video/69057.html

    回复
  8. 头像
    iqwscvvyoh
    Windows 10 · Google Chrome

    《老师!我可以喜欢你吗?》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/7163.html

    回复
  9. 头像
    yorixnowrk
    Windows 10 · Google Chrome

    你的文章让我感受到了快乐,每天都要来看一看。 http://www.55baobei.com/JRvnak0rCl.html

    回复
  10. 头像
    jctlbsieap
    Windows 10 · Google Chrome

    你的才华让人惊叹,请继续保持。 https://www.4006400989.com/qyvideo/73934.html

    回复
  11. 头像
    rctfeqdcii
    Windows 10 · Google Chrome

    看到你的文章,我仿佛感受到了生活中的美好。 https://www.yonboz.com/video/27434.html

    回复
  12. 头像
    kjklylxjjb
    Windows 10 · Google Chrome

    你的文章充满了欢乐,让人忍不住一笑。 http://www.55baobei.com/Ggl4Knfd5P.html

    回复
  13. 头像
    bwazykxilw
    Windows 10 · Google Chrome

    你的文章让我感受到了无尽的欢乐,谢谢分享。 https://www.4006400989.com/qyvideo/55210.html

    回复
  14. 头像
    mduwkymgko
    Windows 10 · Google Chrome

    你的文章充满了智慧,让人敬佩。 https://www.4006400989.com/qyvideo/98578.html

    回复
  15. 头像
    knpomykjll
    Windows 10 · Google Chrome

    你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/ZUCjxqRRfQ.html

    回复
  16. 头像
    xzbxfbnyys
    Windows 10 · Google Chrome

    《全员加速中第三季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/34266.html

    回复
  17. 头像
    mwdjvtyxvo
    Windows 10 · Google Chrome

    《圣诞奇遇结良缘》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/57546.html

    回复
  18. 头像
    uwooutatfe
    Windows 10 · Google Chrome

    《糟糕我假皇子的身份要曝光了》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/13846.html

    回复
  19. 头像
    dbejkywihu
    Windows 10 · Google Chrome

    你的才华让人瞩目,期待你的更多文章。 https://www.yonboz.com/video/51788.html

    回复
  20. 头像
    pzjgnxknxu
    Windows 10 · Google Chrome

    《小飞的梦想》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/72196.html

    回复
  21. 头像
    izobnpazqr
    Windows 10 · Google Chrome

    你的文章让我感受到了无尽的欢乐,谢谢分享。 https://www.yonboz.com/video/66725.html

    回复
  22. 头像
    uocoonypdp
    Windows 10 · Google Chrome

    你的文章总是能给我带来欢乐,谢谢你! http://www.55baobei.com/VKTyIaJ1g3.html

    回复
  23. 头像
    defsedcoqc
    Windows 10 · Google Chrome

    你的文章让我心情愉悦,每天都要来看一看。 http://www.55baobei.com/lO2cP2aC5H.html

    回复
  24. 头像
    kamycoaglo
    Windows 10 · Google Chrome

    《镖行天下之天下镖局》动作片高清在线免费观看:https://www.jgz518.com/xingkong/24408.html

    回复
  25. 头像
    rqeqconmqd
    Windows 10 · Google Chrome

    你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/3S6EJApIbp.html

    回复
  26. 头像
    emmqponylt
    Windows 10 · Google Chrome

    《可可岛的秘密》韩国剧高清在线免费观看:https://www.jgz518.com/xingkong/122709.html

    回复