springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏

Posted bug菌¹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏相关的知识,希望对你有一定的参考价值。

👨‍🎓 作者:bug菌

🎉简介:在CSDN、掘金等社区优质创作者,全网合计6w粉+,对一切技术都感兴趣,重心偏java方向,目前运营公众号[猿圈奇妙屋],欢迎小伙伴们的加入,一起秃头。

🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。

🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。

【开发云】年年都是折扣价,不用四处薅羊毛

         嗨,家人们,我是bug菌呀,我又来啦。今天我们来聊点什么咧,OK,接着为大家更《springboot零基础入门教学》系列文章吧。希望能帮助更多的初学者们快速入门!

       小伙伴们在批阅文章的过程中如果觉得文章对您有一丝丝帮助,还请别吝啬您手里的赞呀,大胆的把文章 点亮👍吧,您的点赞三连(收藏⭐️+关注👨‍🎓+留言📃)就是对bug菌我创作道路上最好的鼓励与支持😘。时光不弃🏃🏻‍♀️,创作不停💕,加油☘️

一、前言🔥

        前几期呢,我们主要是讲了如何集成easypoi实现excel的导入导出、word导出功能等,对吧。不知道你们都掌握的如何,如果还对以下任意一篇有疑问,还请大家多多提问,哈哈哈,虽然不是什么大佬,但是我会尽全力相授,一起学习,查缺补漏,方能成长的快。

  • springboot集成EasyPoi(环境准备篇)
  • 如何实现Excel文件的导入?
  • 如何实现Excel文件的导出?
  • 如何实现单word文档模板分页导出?
  • 如何实现word文件模板导出单页?
  • 如何实现word文件带图片导出?
  • 如何实现excel文件带图片导出?
  • 如何实现excel文件多sheet导入?
  • 如何实现excel文件多sheet导出?
  • 如何实现excel模板导出成pdf文件?

        其实日常除了以上这些文档操作以外,还有一种场景就是导出以pdf格式的文档,不知道你们在平时开发中是否有遇到过?就是将excel模板直接以pdf文档格式导出,虽然完全可以手动转pdf,但是就是要求开发能实现以excel模板导成pdf。

        其实实现过程上还是挺简单的,毕竟我已经教过大家如何通过easypoi实现excel导出,我们只需要在excel导出的基础上,再把流重新写入到pdf格式文档上就可以了。基本思路就是这样。

        但是别担心,我今天就是来带着大家从零敲一遍,希望大家能提前备好课,届时如果真遇到了这个需求,那你肯定是全场最靓的仔。

        接下来我就开始啦,同学们可得竖起耳朵好好听讲哦~我会带着大家一步一步实现它,至于怎么实现,接着往下看。

二、环境配置🔥

        实现excel模板导出这部分我们还是得依赖于easypoi来做。所以你们只需要在你们的pom.xml依赖中加上如下easypoi的starter依赖包即可,添加过的同学就可以不用再重复导入了。

<!--easypoi依赖,excel导入导出-->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.3.0</version>
</dependency>

        另外,我们还需要引用一个包,专门用于excel转pdf工具。所以我们也要导入一下。但是这个包目前人家是要收费的,远程maven镜像是拉取不到本地的,借此我们需要本地导一下这个包就行。

        如下是我提供一种导入方式,就是指定引用本地jar而不自动去maven源拉取。具体细节就不详说啦,你们按照如下格式即可。

<!--excel转pdf-->
<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls.free</artifactId>
    <version>2.2.0</version>
    <scope>system</scope>
    <systemPath>$project.basedir/libs/spire.xls.free-2.2.0.jar</systemPath>
</dependency>

        直接引入本地目录jar就可以,具体请看下方截图:

        至于jar包下载,你们就自己下吧哈,原来我是添加了云盘地址,但是显示不出被屏蔽了,所以这个大家需要就自己下载一下吧,给大家提供一个下载地址下载链接

三、实战演示🔥

1️⃣定义excel模板

       由于要进行excel模板的读取,所以我们肯定是要定义好excel模板,然后将模板进行数据渲染即可,所以我们还是老样子,通过fe进行赋值内部循环。

具体请看截图:

2️⃣Controller添加excel导入方法

        我们先来定义一个pdf导出方法,目的是提供一个口子,好方便自己通过浏览器访问进行测试。

/**
 * 导出pdf文件
 */
@GetMapping("/export-for-pdf")
@ApiOperation(value = "导出pdf文件", notes = "导出pdf文件")
public void exportPdfUsers(HttpServletResponse response) 
    userService.exportPdfUsers(response);

3️⃣定义导入pdf接口

/**
 * 导出pdf文件
 */
void exportPdfUsers(HttpServletResponse response);

4️⃣实现导入方法(核心)

       如下这个导入实现类就很关键了,我们还是直接使用easypoi提供的ExcelExportUtil工具类的importExcel()方法,然后通过它返回的Workbook,来进一步进行流的写入,最后通过刚导入的spire.xls.free写入pdf导出至指定目录下保存。大致的思路就是这样,具体请看如下的实现代码,如果你有更好的实现方式,请记得que我哦。

具体实现代码如下:

/**
 * 导出pdf文件
 */
@Override
public void exportPdfUsers(HttpServletResponse response) 

    //准备导出数据
    Map<String, Object> mapList = new HashMap<>();
    //准备导出数据
    List<Map<String, Object>> listUsers = new ArrayList<>();

    try 
        //指定excel模板;我这是在项目根目录下创建了一个template文件夹存放excel导出模板文件
        TemplateExportParams params = new TemplateExportParams("./template/导出excel模板.xlsx");

        //从数据库查询到数据
        List<UserEntity> users = this.list();
        //定义一个原子序列
        AtomicInteger atomicInteger = new AtomicInteger(1); 
        users.forEach(user -> 

            Map<String, Object> map = new HashMap<>();
            map.put("id", atomicInteger.getAndIncrement());
            map.put("name", user.getName());
            map.put("age", user.getAge());
            map.put("sex", user.getSex());
            map.put("address", user.getAddress());
            map.put("describes", user.getDescribes());

            //添加到集合中,一个map就是一行
            listUsers.add(map);
        );
        mapList.put("users", listUsers);
        //调用exportExcel()
        Workbook workbook = ExcelExportUtil.exportExcel(params, mapList);

        //定义一个字节输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        //将excel文件写入到新的输出流
        workbook.write(outputStream);

        //将字节数组放置到内存里面
        ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());

        //导入xls包引用Workbook区分poi提供的Workbook
        com.spire.xls.Workbook wb = new com.spire.xls.Workbook();
        wb.loadFromStream(inputStream);
        //设置字段在一页中显示全
        wb.getConverterSetting().setSheetFitToPage(true);

        //指定并指定目录保存文件
        wb.saveToFile("D:/pdf/学生基本信息表.pdf");
     catch (Exception e) 
        e.printStackTrace();
    

注意:

  • 第一点:我是将pdf导出指定了目录为本地D:/pdf/学生基本信息表.pdf下,没有pdf文件夹则会自动创建一个。但如果你们是需求开发的话,你们得根据自己的实际开发环境来获取存放目录,我这里只是演示。其实也可以在页面开个口子,由用户进行手动选址,然后再将用户所选择的目录地址作为入参,这样就可以不用考虑用户保存在何位置了。
  • 第二点:与excel模板导出方法一致,后续这个导出方法可进行封装调用。
  • 第三点,如下是我的演示项目存放excel导出模板的目录结构截图,所以我就直接写定了模板的相对位置。

        接下来,交给我们的就只剩下测试了。

5️⃣浏览器测试

      
我们打开浏览器,在地址栏,输入我们刚才在Controller暴露出来的接口地址,

比如我的:http://localhost:8080/user/export-for-pdf 。而你就按你的接口地址填写然后回车进行访问即可。

具体浏览器访问截图如下:

        输入地址回车之后,查看一下控制台有无报错,我们再检查一下,指定文件夹是否已经存有该xxx.pdf文件。实际结果可以看到xxx.pdf文件已经存在该pdf文件夹下,证明pdf导出方法没有问题,还是很成功嘛,剩下的就是检查pdf文档数据及排版格式是否都按预定设置的一样?

        打开pdf文档,我是没想到,字段在一页展示不全,竟然分页展示,这样就不是很友好啊,那这肯定得想办法解决啊。不要急, bug菌替大家查阅了相关资料才知道有个属性可以设置不分页展示字段列,.setSheetFitToPage()设置为true即可实现字段列在一页中展示全。

如下是未设置了该属性导出的pdf截图:

        我们把它加上这个属性并设置为true,我们重启项目导出再来看下效果。

//设置字段在一页中显示全
wb.getConverterSetting().setSheetFitToPage(true);

        添加完这个属性之后,具体如下效果截图,相比上面的效果,这很明显是所有字段都归于一页展示了,而没有再分页。

... ...

        ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看我的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬的。好啦,咱们下期见~

 四、往期推荐🔥

五、文末🔥

        如果还想要学习更多,小伙伴们可关注bug菌专门为大家创建的专栏《springboot零基础入门教学》,从无到有,从零到一!希望能帮助到更多小伙伴们。

【开发云】年年都是折扣价,不用四处薅羊毛

       我是bug菌,一名想走👣出大山改变命运的程序猿。接下来的路还很长,都等待着我们去突破、去挑战。来吧,小伙伴们,我们一起加油!未来皆可期,fighting!

        最后送大家两句我很喜欢的话,与诸君共勉!


☘️做你想做的人,没有时间限制,只要愿意,什么时候都可以start。

🍀你能从现在开始改变,也可以一成不变,这件事,没有规矩可言,你可以活出最精彩的自己。


​​​

💌如果文章对您有所帮助,就请留下您的吧!(#^.^#);

💝如果喜欢bug菌分享的文章,就请给bug菌点个关注吧!(๑′ᴗ‵๑)づ╭❤~;

💗如果对文章有任何疑问,还请文末留言或者加群吧;

💞鉴于个人经验有限,所有观点及技术研点,如有异议,请直接回复参与讨论(请勿发表攻击言论,谢谢);

💕版权声明:原创不易,转载请附上原文出处链接和本文声明,版权所有,盗版必究!!!谢谢。

以上是关于springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏的主要内容,如果未能解决你的问题,请参考以下文章

springboot系列(三十一):如何实现excel模板导出成pdf文件?这你得会 | 超级详细,建议收藏

Python工具箱系列(三十一)

springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏

springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏

springboot系列(三十):如何实现excel多sheet导出?这你得会|超级详细,建议收藏

Tableau可视化分析实战系列(三十一)-如何对超市销售数据进行可视化分析