【java】生成【word】的后端接口-- java生成Word的第二步

1. 放置模板

在这里插入图片描述

2. 后端代码

	@PostMapping("downloadWord")
    public ResultVO downloadWord(@RequestBody Map map, HttpServletRequest request){
        Map<String, Object> dataMap = getDataMap(map);
        //生成文件
        String path = WordUtils.createWord(dataMap,"研修培训项目实施方案模板1.ftl", "研修培训项目实施方案模板"+System.currentTimeMillis()+".doc");
        String base64 = WordUtils.downLoadBase64( path,request);
        return new ResultVO().addData("base64",base64);
    }

1. 获取数据并封装数据

private Map<String, Object> getDataMap(@RequestBody Map map) {
        //根据统一社会信用代码查询出所有的数据
        String tyshxydm = (String) map.get("tyshxydm");
        Map pxbMap = null;
        
        int page = (int) map.get("page");
        int rows = (int) map.get("rows");
        //查询单位信息
        GyQyxx gyQyxx = gyQyxxService.selectById(tyshxydm);
        //查询培训班信息
        String pxbid = (String) map.get("pxbid");
        GyPxxm gyPxxm = new GyPxxm();
        gyPxxm = gyPxxmService.selectById(pxbid);
        //查询授课教师信息
        List<GyPxxmSkzj> gyPxxmSkzjList = gyPxxmSkzjService.queryList(pxbid, page, rows);
//        List<GyPxxmSkzj> gyPxxmSkzjList =(List) skzjMap.get("list");
        //查询研修内容
        List<GyPxxmYxnr> yxnrList = gyPxxmYxnrService.queryList(pxbid, page, rows);
//        List<GyPxxmYxnr> yxnrList = (List) yxnrMap.get("list");

        //装配数据
        Map<String, Object> dataMap = new HashMap<String, Object>();
//        这是在根据模板中的字段进行值的封装
        dataMap.put("y", gyPxxm.getRkrq().substring(0, 4));
        dataMap.put("m", gyPxxm.getRkrq().substring(4, 6));
        dataMap.put("d", gyPxxm.getRkrq().substring(6, 8));
        dataMap.put("yyxmmc", gyPxxm.getYyxmmc());
        dataMap.put("zymc", gyPxxm.getZymc());
        dataMap.put("yrdwmc", gyQyxx.getYrdwmc());
        dataMap.put("yxbdd", gyPxxm.getYxbdd());
        dataMap.put("xyrs", gyPxxm.getXyrs());
        dataMap.put("xyly", gyPxxm.getXyly());
        dataMap.put("yxmdhzy", gyPxxm.getYxmdhzy());
        dataMap.put("pxtjbzcs", gyPxxm.getPxtjbzcs());
        dataMap.put("yxsxjfys", gyPxxm.getYxsxjfys());
        dataMap.put("pxjgdz", gyPxxm.getPxjgdz());
        dataMap.put("pxjglxr", gyPxxm.getPxjglxr());
        dataMap.put("pxjgbgdh", gyPxxm.getPxjgbgdh());
        dataMap.put("pxjgsj", gyPxxm.getPxjgsj());
        dataMap.put("pxjgcz", gyPxxm.getPxjgcz());
        dataMap.put("pxjgyx", gyPxxm.getPxjgyx());

        List<SkzjWordDTO> gyPxxmSkzjs = new ArrayList();
        List<YxnrWordDTO> gyPxxmYxnrs = new ArrayList<>();

        for (GyPxxmSkzj item : gyPxxmSkzjList) {
            SkzjWordDTO skzjWordDTO = new SkzjWordDTO();
            skzjWordDTO.setSkzjnl(item.getSkzjnl());
            skzjWordDTO.setSkzjxm(item.getSkzjxm());
            skzjWordDTO.setSkzjgzdw(item.getSkzjgzdw());
            skzjWordDTO.setSkzzcjndj(ConstCode.jndjType.get(item.getSkzzcjndj()));
            gyPxxmSkzjs.add(skzjWordDTO);
        }

        dataMap.put("skzj", gyPxxmSkzjs);
        AtomicInteger zks = new AtomicInteger();
        for (GyPxxmYxnr item : yxnrList) {
            YxnrWordDTO yxnrWordDTO = new YxnrWordDTO();
            yxnrWordDTO.setKs(item.getKs());
            yxnrWordDTO.setPxnr(item.getPxnr());
            yxnrWordDTO.setPxxs(item.getPxxs());
            yxnrWordDTO.setSkzjxm(item.getSkzjxm());
            gyPxxmYxnrs.add(yxnrWordDTO);
            int i = Integer.parseInt(item.getKs());
            zks.addAndGet(i);
        }
        dataMap.put("yxnr", gyPxxmYxnrs);
        dataMap.put("zks", zks);
        dataMap.put("jykh", gyPxxm.getJykh());
        return dataMap;
    }

2. 生成word文档

public static String createWord(Map dataMap, String templateName, String fileName) {
        String filePath = null;
        //创建配置实例 
        Configuration configuration = new Configuration(new Version("2.3.28"));
        //设置编码
        configuration.setDefaultEncoding("UTF-8");
        //ftl模板文件
        configuration.setClassForTemplateLoading(WordUtils.class,"/template");
        try {
            String path ="E:/files/";  //本地开发环境
            //获取模板
            Template template = configuration.getTemplate(templateName);
            String fname = fileName;
            File outFile = new File(path+fname);
            filePath = path+fname;
            System.out.println(filePath);
            if (!outFile.getParentFile().exists()){
                outFile.getParentFile().mkdirs();
            }
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), StandardCharsets.UTF_8));
            template.process(dataMap, out);
            out.flush();
            out.close();
        }catch (Exception e){
            log.error("导出word文档出错", e);
            throw e;
        }finally {
            return filePath;
        }
    }

3. 将word文档转换为base64

public static String downLoadBase64(String filePath,HttpServletRequest request) {
        System.out.println("filePath------------------" + filePath);
        String base64 = null;

        try {
            //开始时间
            long old = System.currentTimeMillis();
            //获取文件
            File file = new File(filePath);
            if (!file.exists()) {
                return null;
            }
            //获取文件流
            FileInputStream in = new FileInputStream(file);
            //转base64
            byte[] bytes = new byte[(int)file.length()];
            in.read(bytes);
            base64 = Base64.getEncoder().encodeToString(bytes);
            in.close();

            //结束时间
            long now = System.currentTimeMillis();
            System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒");

            file.delete();
        } catch (Exception e) {
            log.info("word文件下载异常");
            e.printStackTrace();
        }
        return base64;
    }
导出带有图片的Word表格涉及到前端与后端的协作。下面是一个简单的实现步骤: 1. 前端使用JavaScript创建一个包含表格和图片的HTML页面。表格可以使用HTML的table标签来构建,而图片则可以使用img标签来引用。为了将图片嵌入到表格中,可以将图片转换为Base64编码。 2. 在前端页面中使用JavaScript的Canvas API将图片渲染到Canvas元素上。首先,将图片加载到一个img元素中,然后将img元素绘制到Canvas上。最后,使用Canvas的toDataURL方法将Canvas内容转换为Base64编码的图片数据。 3. 前端可以使用第三方库,如jsPDF或html-docx-js,将HTML内容导出为Word文档。这些库提供了将HTML转换为Word文档的功能,支持表格和图片的导出。在导出Word文档时,可以将Base64编码的图片数据添加到Word文档中,以使图片嵌入到文档中。 4. 后端使用Java开发一个接口,接收前端发送的HTML内容和图片数据。后端可以使用Apache POI库操作Word文档,将接收到的HTML内容转换为Word表格,并将图片数据添加到Word文档中。通过将图片数据以二进制形式插入到Word文档的方式,图片可以在Word文档中正确显示。 5. 前端发送HTTP请求将HTML内容和图片数据发送到后端接口。可以使用AJAX或Fetch进行发送。 6. 后端接收到请求后,根据接收到的HTML内容和图片数据,使用Apache POI创建Word文档并将内容写入文档。 7. 后端生成Word文档返回给前端。 通过以上步骤,前端JS和后端Java可以实现导出带有图片的Word表格。前端负责生成HTML内容和处理图片,并将数据发送到后端。而后端负责将HTML内容转换为Word文档,并将图片数据添加到文档中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值