java实现将数据导出为word功能(文字,表格,图片的循环导出)

这篇具有很好参考价值的文章主要介绍了java实现将数据导出为word功能(文字,表格,图片的循环导出)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.配置文件的准备

1.导出功能实现所需要的pom文件

<!--   导出到word(循环图片)     -->
        <!-- word导出  方式:easypoi-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.4.0</version>
        </dependency>
        <!--注意:word中要使用循环等标签必须单独导入以下依赖-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.4</version>
        </dependency>

这里需要注意的点!!!!!!!!!!!!!!!!!

easypoi的版本必须在4.3.0以上,否则在导出图片的时候,只会导出图片的内存地址,却不能显示出图片。

2.在配置目录下添加一个配置类

package com.state.grid.substation.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;

public class WordUtil {
    public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
        Assert.notNull(templatePath,"模板路径不能为空");
        Assert.notNull(temDir,"临时文件路径不能为空");
        Assert.notNull(fileName,"导出文件名不能为空");
        Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");
        if (!temDir.endsWith("/")){
            temDir = temDir + File.separator;
        }
        File dir = new File(temDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {

            String userAgent = request.getHeader("user-agent").toLowerCase();
            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            }
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            String tmpPath = temDir + fileName;
            FileOutputStream fos = new FileOutputStream(tmpPath);
            doc.write(fos);
            // 设置强制下载不打开
            response.setContentType("application/force-download");
            // 设置文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
            OutputStream out = response.getOutputStream();
            doc.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            delFileWord(temDir,fileName);//这一步看具体需求,要不要删
        }

    }

    /**
     * 删除零时生成的文件
     */
    public static void delFileWord(String filePath, String fileName) {
        File file = new File(filePath + fileName);
        File file1 = new File(filePath);
        file.delete();
        file1.delete();
    }

}

3.准备一个导出模板(固定位置填充固定数据,表格和图片的循环导出)

java实现将数据导出为word功能(文字,表格,图片的循环导出)

 解释一下模板中所填充的东西:

1.像这种:用两个花括号括起来的变量名,到时候会将变量名所指代的数据填充进去

java实现将数据导出为word功能(文字,表格,图片的循环导出)

 2.像这种:需要将批量数据循环导出的表格以及图片

java实现将数据导出为word功能(文字,表格,图片的循环导出)

 2.功能的实现(写一个Controller)

调用service和mapper没写,具体以实际需求为准

1.先理一些这个功能实现的逻辑:

去数据库查表获取想要的信息----用一个集合将这些信息都装起来----将这些信息都插入到模板的指定位置当中去

2.功能的实现(带注释)

这个肯定不能直接拿来运行,注意看我写的注释,理解代码逻辑,我写的很清楚,每一行代码干了什么我都有写。

/**
     * 巡视报告的导出(循环图片版)
     * @param substationId
     * @param calendarId
     * @param request
     * @param response
     * @return
     */
    //请求路径是/taskResultToWord,请求方式是get请求
    @RequestMapping(value = "/taskResultToWord", method = RequestMethod.GET)
    //返回Result类型,传进来变电站id,日历id
    public Result taskResultToWord(String substationId, String calendarId, HttpServletRequest request, HttpServletResponse response) throws Exception {  // 分页查询
        int code = 0;
        String msg = "";
//        定义List集合list,泛型是TaskResultEquipment
        List<TaskResultEquipment> list = new ArrayList<>();
//        List<TaskProgress> uplist = new ArrayList<>();
        //定义Map集合resmap
//        Map<String, Object> resmap = new HashMap<>();
        try {
            //token验证
            Des3Util des = new Des3Util();
            String token = request.getHeader("token");
            String jsonUser = des.parseDES(token);
            JSONObject jsonData = JSONObject.fromObject(jsonUser);
            String userId = (String) jsonData.get("u");
            String roleId = (String) jsonData.get("r");

            boolean access = this.roleService.getAccess(roleId, "task/taskList");
            if(access){
                //定义Map集合map
                Map<String, Object> map = new HashMap<>();
                //将输入的设备id添加到map集合里面
//                map.put("substationId", substationId);
                //将输入的日历id添加到calendarId里面
                map.put("calendarId", calendarId);
                //返回表v_task_result_equipment中的数据条数
                int count = this.taskService.taskResultEquipmentCount(map);

                //将查询到的基本信息赋给taskProgress
                TaskProgress taskProgress = this.taskService.taskResultInfo(map);
                //添加字段startRow(开始行)的值为0
                map.put("startRow", 0);
                //添加字段endRow(结束行)的值为count,count的值就是表v_task_result_equipment中的数据条数
                map.put("endRow", count);
                //分页查询表v_task_result_equipment中的数据,起始行是0,结束行是count,就是一页查询所有数据,
                list = this.taskService.taskResultEquipmentList(map);
                System.out.println(list);

                //路径
                String path1 = ResourceUtils.getURL("classpath:").getPath();
                String path2 = path1.substring(1);
                String terminalType = System.getProperty("os.name");
                String path = "";
                if (Objects.equals(terminalType, "Linux")){
                    path = path1.replace("ROOT/WEB-INF/classes/", "").replace("ROOT\\WEB-INF\\classes\\", "");
                }else {
                    path = path2.replace("ROOT/WEB-INF/classes/", "").replace("ROOT\\WEB-INF\\classes\\", "");
                }
                System.out.println("path!!!!!!" + path);
                //PATH是文件导出路径resource/excel/
                String PATH = path + config.getExportUrl();
                //ImagePath是图片导入路径resource/cameraImage/
                String ImagePath = path + config.getCameraImageUrl();

                //导出表头信息
                //定义一个Map集合params
                Map<String, Object> params = new HashMap<>();
                //模板文件的路径templatePath
                String templatePath = "E:/template/patrolWord.docx"; //模板路径

                //简单渲染文本
                params.put("substationName", taskProgress.getSubstationName());
                params.put("voltageLevel", taskProgress.getVoltageLevel());
                params.put("viewStartTime",taskProgress.getViewStartTime());
                params.put("patrolType",taskProgress.getPatrolType());
                params.put("taskName",taskProgress.getTaskName());
                params.put("className",taskProgress.getClassName());
                params.put("totalNumber",taskProgress.getTotalNumber());
                params.put("execresult1",taskProgress.getExecresult1());
                params.put("execresult2",taskProgress.getExecresult2());
                params.put("execresult0",taskProgress.getExecresult0());
                params.put("execresult3",taskProgress.getExecresult3());
                params.put("execStartTime",taskProgress.getExecStartTime());
                params.put("execEndTime",taskProgress.getExecEndTime());

               

                //声明了一个名为alarms的变量,它是一个List类型,其中每个元素都是一个Map<String, Object>类型的键值对集合。
                List<Map<String, Object>> alarms = new ArrayList<>();
                //声明了一个名为alarm的变量,它是一个Map类型的键值对集合。具体来说,这个Map对象中每个键都是一个String类型,每个值都是一个Object类型。
                Map<String, Object> alarm;


                //会遍历list集合中的每个元素,并将每个元素赋值给循环变量taskResultEquipment。
                // 在每次循环迭代中,可以使用taskResultEquipment变量来访问集合中当前元素的属性和方法。
                //数据来源是摄像头
                String source = "摄像头";
                //序号从1开始
                int order = 1;
                for (TaskResultEquipment taskResultEquipment : list){
                    //img_path得到表中一行数据的图片路径
                    String img_path = taskResultEquipment.getPicture();
                    //ImagePath是图片导入路径resource/cameraImage/,realImagePath是图片真正的路径
                    String realImagePath = ImagePath + img_path;
                    //将图片路径打印出来
                    System.out.println(realImagePath);

//                    File imagefile = new File(realImagePath);
//                    if (imagefile.exists()){
//                        taskResultEquipment.setImageData(realImagePath);
//                    }else {
//                        String errorFile = ImagePath +  config.getErrorCameraImageUrl();
//                        taskResultEquipment.setImageData(errorFile);
//                    }

                    //创建了一个名为alarm的新的HashMap对象
                    alarm = new HashMap<>();
                    //将循环中获取到的信息添加到集合里面
                    //变电站
//                    alarm.put("name", taskResultEquipment.getTaskName());
                    //设备名称
                    alarm.put("order",order);
                    alarm.put("equipmentInterval", taskResultEquipment.getEquipmentInterval());
                    alarm.put("equipmentName", taskResultEquipment.getEquipmentName());
                    alarm.put("equipmentPart",taskResultEquipment.getEquipmentPart());
                    alarm.put("pointName", taskResultEquipment.getPointName());
                    alarm.put("importance", taskResultEquipment.getImportance());
                    alarm.put("result", taskResultEquipment.getResult());
                    alarm.put("realAlarmLevel", taskResultEquipment.getRealAlarmLevel());
                    alarm.put("confirmUser", taskResultEquipment.getConfirmUser());
                    alarm.put("execStartTime", taskResultEquipment.getExecStartTime());
                    alarm.put("source",source);
                    //表格内循环添加图片(easypoi 4.3以后才支持,不然只能打印出ImageEntity的内存地址)

                    //创建了一个名为simage的新的ImageEntity对象,并将其赋值给simage变量。
                    // 具体来说,ImageEntity是一个Java类,用于表示一个图像实体,其中包含了图像的各种属性和数据。
                    ImageEntity simage = new ImageEntity();
                    simage.setHeight(50);
                    simage.setWidth(50);
                    //将图片的本地路径导入进去
                    simage.setUrl(realImagePath);
                    //将simage对象的类型设置为URL类型。
                    //该图像实体表示的是一个通过URL链接获取的远程图像,而不是一个本地存储的图像。
                    simage.setType(ImageEntity.URL);
//                    ByteArrayOutputStream out = new ByteArrayOutputStream();
//                    simage.setData(out.toByteArray()); //字节流读取
                    //将图片添加进去
                    alarm.put("img", simage);
                    //alarms是一个里面元素都是map的list集合
                    alarms.add(alarm);
                    order = order + 1;
                }

                //Map集合params,将jobs(元素为map的list集合添加进去)
                params.put("alarms", alarms);
                //定义了一个表示模板文件夹路径的字符串变量temDir,用于存储模板文件所在的文件夹的路径。
                // 在这个例子中,temDir指向E:/template/file/word/路径。表示文件路径分隔符,可以是\或者/,具体取决于操作系统
                String temDir="E:/template/" + File.separator + "file/word/"; ;//生成临时文件存放地址
                //生成文件名
                Long time = new Date().getTime();
                // 生成的word格式
                String formatSuffix = ".docx";
                // 拼接后的文件名
                String fileName = time + formatSuffix;//文件名  带后缀
                //导出word
                WordUtil.exportWord(templatePath, temDir, fileName, params, request, response);
//                WordUtil.exportWord(templatePath, PATH, fileName, params, request, response);
                code = 1;
            }else{
                msg = "token无效";
            }
        }catch (Exception e){
            msg = "操作失败";
        }
        return Result.success(code, msg,null);
    }

3.导出的效果

1.固定信息部分:

java实现将数据导出为word功能(文字,表格,图片的循环导出)

 2.循环表格和循环图片部分 

java实现将数据导出为word功能(文字,表格,图片的循环导出)文章来源地址https://www.toymoban.com/news/detail-434632.html

到了这里,关于java实现将数据导出为word功能(文字,表格,图片的循环导出)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • VUE使用docxtemplater导出word(带图片) 踩坑 表格循环空格 ,canvas.toDataURL图片失真模糊问题

    参考:https://www.codetd.com/article/15219743 安装 关键代码JS部分 导出函数 vue 中引入上述js文件和方法 模板内容 自己准备一个docx文档,然后里面标注好需替换的参数 列表循环-- {#list}{name}{/list} 单个参数–{} 图片–{%imgUrl} 大概就这些,我也是从参考链接里看到的,至此基本能解决

    2024年02月15日
    浏览(33)
  • java实现word导入导出富文本(含图片)-附完整测试用例

    1、解决富文本导入导出依赖兼容问题 2、处理富文本和非富文本内容 3、解决webp格式通过java下载不了问题,如果要用到富文本导出,将来势必是会碰到的bug,这里提前给提出来并解决,测试用例中有给图片测试。 4、在原有方法上优化,比如处理等比缩小图片、将图片本地路

    2024年02月03日
    浏览(41)
  • SpringBoot整合Easyexcel实现将数据导出为Excel表格的功能

    本文主要介绍基于SpringBoot +MyBatis-Plus+Easyexcel+Vue实现缺陷跟踪系统中导出缺陷数据的功能,实现效果如下图: EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能。 本文

    2024年02月14日
    浏览(34)
  • Python 在Word中创建表格并填入数据、图片

    在Word中,表格是一个强大的工具,它可以帮助你更好地组织、呈现和分析信息。本文将介绍如何使用Python在Word中创建表格并填入数据、图片,以及设置表格样式等。 Python Word库: 要使用Python在Word中创建或操作表格,需要先将Spire.Doc for Python这个第三方库安装到项目中.   以

    2024年03月11日
    浏览(30)
  • JAVA之利用easypoi将word模板导出为pdf(可带图片)

    EasyPoi是一款基于POI的Java快速导出/导入Excel工具。它在POI的基础上进行了封装,提供了更加简洁易用的API,使得生成Excel文件更加容易和高效。 使用EasyPoi可以轻松地生成Excel文件,并支持多种格式,如xlsx、xls、csv等。同时,EasyPoi也支持读取Excel文件,可以方便地获取其中的数

    2024年02月08日
    浏览(39)
  • JAVA实现向Word模板中插入Base64图片和数据信息

    在服务端提前准备好Word模板文件,并在用户请求接口时服务端动态获取图片。数据等信息插入到模板当中,然后返回包含数据信息的Word文件流。 在需要插入图片的地方使用:{{@参数名}},文本信息使用:{{参数名}},进行占位,占位格式将会被保留,经过处理后格式不变 将准

    2024年01月19日
    浏览(24)
  • 【Java】百万数据excel导出功能如何实现

    人不走空                                                                          目录         🌈个人主页:人不走空       💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 前言 1.异步处理 1.1 使用job 1.2 使用mq 2.使用easyexcel 3.分页查询 4.多个she

    2024年02月20日
    浏览(28)
  • 封装图片处理工具类,实现图片的裁剪、压缩、图片水印、文字水印、多行文字水印等功能

    目录 一、前言 二、工具类的依赖和简单介绍 1、添加依赖 2、简单的使用 3、加载需要处理的图片 4、添加图片处理规则 4.1 Builder的方式 4.2 使用规则工厂的方式 5、输出处理后的图片 三、使用方式 1、图片裁剪 图片裁剪规则实体类 1.1 按长宽裁剪 1.1.1 示例代码 1.1.2 实现效果

    2024年02月13日
    浏览(31)
  • easypoi 导出word表格

    template.docx 模板内容: {{0}} {{1}} {{2}} {{3}} {{4}} {{5}} 学生姓名 学生年龄 学生生日 语文成绩 数学成绩 template_job.docx 模板内容: 名称 年龄 地址 名称2 {{user.name}} {{user.age}} {{user.address}} {{user.other}} 公司名称 地址 {{$fe:jobs t.name t.address}}

    2024年02月13日
    浏览(79)
  • ChatGPT | 分割Word文字及表格,优化文本分析

    知识库读取Word内容时,由于embedding切片操作,可能会出现表格被分割成多个切片的情况。这种切片方式可能导致“列名栏”和“内容栏”之间的Y轴关系链断裂,从而无法准确地确定每一列的数据对应关系,从而使得无法准确知道每一列的数据汇总。 用下面表格为例子: 级数

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包