springboot+poi-tl根据模板导出word(含动态表格和图片),并将导出的文档压缩zip导出

springboot+poi-tl根据模板导出word(含动态表格和图片)

官网:http://deepoove.com/poi-tl/
参考网站:https://blog.csdn.net/M625387195/article/details/124855854

  • pom导入的maven依赖
<dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version>
</dependency>
  • 准备模板
    在这里插入图片描述
    文本标签用{{ }},动态表格的字段标签用[]。

  • 代码实现
    3.1 控制器

    package io.renren.modules.sys.controller;
    import io.renren.common.utils.R;
    import io.renren.modules.sys.service.POIService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;/*** @Author: Administrator* @Date: 2024/3/14* @Description:*/
    @RestController
    @RequestMapping("/anli")
    public class AnliController {@Autowiredprivate POIService poiService;@GetMapping("/daochu/{renwuId}")public R daochu(@PathVariable("renwuId") Long renwuId) {String zipUrl = poiService.anlidaochu(renwuId);return new R().put("zipUrl", zipUrl);}
    }
    

    3.2 实现类

    package io.renren.modules.sys.service;/*** @Author: Administrator* @Date: 2024/3/4* @Description:*/
    public interface POIService {/*** 案例导出* @param renwuId*/String anlidaochu(Long renwuId);
    }
    
    package io.renren.modules.sys.service.impl;import io.renren.common.utils.word.WordUtils;
    import io.renren.modules.sys.dto.RenwuTemplateDTO;
    import io.renren.modules.sys.service.POIService;
    import io.renren.modules.sys.service.SysRenwuService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Service;import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.UUID;
    import java.util.concurrent.CompletableFuture;
    import java.util.zip.ZipOutputStream;/*** @Author: Administrator* @Date: 2024/3/4* @Description:*/
    @Service
    public class POIServiceImpl implements POIService {@Autowiredprivate SysRenwuService renwuService;@Value("${upload.url}")private String UPLOAD_URL;@Value("${upload.path}")private String UPLOAD_SUFFIX_URL;public String getUPLOAD_URL() {return UPLOAD_URL + getUploadSuffixURL();}public String getUploadSuffixURL() {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");String dateString = sdf.format(new Date());return UPLOAD_SUFFIX_URL + dateString + "/";}/*** 案例导出* @param renwuId*/@Overridepublic String anlidaochu(Long renwuId) {// 将要生成文档的数据查询出来RenwuTemplateDTO renwuTemplateDTO = renwuService.daochuByRenwuId(renwuId);String url = null;if (renwuTemplateDTO != null) {try {List<String> urlList = WordUtils.piliangDaochu(renwuTemplateDTO);if (urlList != null && urlList.size() > 0) {String name = renwuTemplateDTO.getRenwuName()+"_"+ UUID.randomUUID() +".zip";url =  this.getUploadSuffixURL() + name;FileOutputStream fos = new FileOutputStream(this.getUPLOAD_URL() + name);ZipOutputStream zos = new ZipOutputStream(fos);for (String file : urlList) {WordUtils.addToZipFile(file, zos);}zos.close();fos.close();// 使用异步线程删除文件deleteFilesAsync(urlList);}} catch (Exception e) {throw new RuntimeException(e);}}return url;}@Asyncpublic CompletableFuture<Void> deleteFilesAsync(List<String> urlList) {for (String file : urlList) {File fileToDelete = new File(file);if (fileToDelete.exists()) {if (fileToDelete.delete()) {System.out.println("Deleted file: " + file);} else {System.out.println("Failed to delete file: " + file);}}}return CompletableFuture.completedFuture(null);}
    }
    

    3.3 配置文件

    upload:url: H:/GoTionBackends/2023/resourcespath: /u/cms/www/outPath: H:/GoTionBackends/2023/resources/docprefix: http://xxx.xxx.xxx:8087
    

    3.4 工具类

    package io.renren.common.utils.word;import com.alibaba.fastjson.JSON;
    import com.deepoove.poi.XWPFTemplate;
    import com.deepoove.poi.config.Configure;
    import com.deepoove.poi.data.*;
    import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
    import com.deepoove.poi.policy.PictureRenderPolicy;
    import io.renren.common.utils.word.dto.WordQingdanDetailsDTO;
    import io.renren.modules.sys.dto.RenwuTemplateDTO;
    import io.renren.modules.sys.entity.SysQingdanExtEntity;
    import org.apache.commons.lang.StringUtils;import java.io.*;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.UUID;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipOutputStream;/*** @Author: Administrator* @Date: 2024/3/1* @Description:*/
    public class WordUtils {public static List<String> piliangDaochu(RenwuTemplateDTO renwuTemplate) throws IOException {List<String> urlList = new ArrayList<>();if (renwuTemplate.getQingdanDTOList() != null && renwuTemplate.getQingdanDTOList().size() > 0) {for (int i = 0; i < renwuTemplate.getQingdanDTOList().size(); i++) {renwuTemplate.setQingdanDTO(renwuTemplate.getQingdanDTOList().get(i));String daochuUrl = daochumoban(renwuTemplate);urlList.add(daochuUrl);}} else {String daochuUrl =daochumoban(renwuTemplate);urlList.add(daochuUrl);}return urlList;}public static String daochumoban(RenwuTemplateDTO renwuTemplate) throws IOException {// 为表格的显示绑定行循环LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();// 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析Configure configure = Configure.builder().bind("bz", policy).build();// 图片标签集合List<String> pictureTag = new ArrayList<>();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");HashMap<String, Object> dataMap = new HashMap<String, Object>() {{//添加文本put("xiangmuName", renwuTemplate.getXiangmuName());put("xiangmuzhouqi", renwuTemplate.getXiangmuzhouqi());put("renwuName", renwuTemplate.getRenwuName());put("renwuzhouqi", sdf.format(renwuTemplate.getStartTime()) + " 至 " + sdf.format(renwuTemplate.getEndTime()));put("description", renwuTemplate.getDescription());String xiangmuLink = "";if (renwuTemplate.getRenwuResourceUrlList() != null && renwuTemplate.getRenwuResourceUrlList().size() > 0) {for (int i = 0; i < renwuTemplate.getRenwuResourceUrlList().size(); i++) {if (i != renwuTemplate.getRenwuResourceUrlList().size()-1) {xiangmuLink += PeizhiConfig.getUploadPrefix() + renwuTemplate.getRenwuResourceUrlList().get(i) + "\n";} else {xiangmuLink += PeizhiConfig.getUploadPrefix() + renwuTemplate.getRenwuResourceUrlList().get(i);}}}put("xiangmulink", xiangmuLink );put("biaoqianName", renwuTemplate.getQingdanDTO() != null ? renwuTemplate.getQingdanDTO().getBiaoqianName() : "");String diliurk = PeizhiConfig.getUploadUrl() + renwuTemplate.getQingdanDTO().getResourceUrl();PictureRenderData pictureRenderData = Pictures.ofStream(Files.newInputStream(Paths.get(diliurk)), PictureType.PNG).size(200, 150).create();put("dililink", pictureRenderData);put("resourceDescription", renwuTemplate.getQingdanDTO() != null ? renwuTemplate.getQingdanDTO().getDescription() : "");put("startYear", renwuTemplate.getQingdanDTO() != null ? renwuTemplate.getQingdanDTO().getStartYear() : "");put("endYear", renwuTemplate.getQingdanDTO() != null ? renwuTemplate.getQingdanDTO().getEndYear(): "");put("area", renwuTemplate.getQingdanDTO() != null ? renwuTemplate.getQingdanDTO().getArea() : "");// 其他业务获取到数据源String testTable = null;if (renwuTemplate.getQingdanDTO() != null && renwuTemplate.getQingdanDTO().getQingdanExtList() != null &&  renwuTemplate.getQingdanDTO().getQingdanExtList().size() > 0) {String str = "";for (int i = 0; i < renwuTemplate.getQingdanDTO().getQingdanExtList().size(); i++) {SysQingdanExtEntity ext = renwuTemplate.getQingdanDTO().getQingdanExtList().get(i);String templateType = null, data = PeizhiConfig.getUploadPrefix() + ext.getResourceUrl();// PictureRenderData pictureRenderData1 = null;if (ext.getTemplateType() == 1) {templateType = "图片";//String dataUrl = PeizhiConfig.getUploadUrl() + ext.getResourceUrl();//pictureRenderData1 = Pictures.ofStream(Files.newInputStream(Paths.get(dataUrl)), PictureType.PNG)//        .size(200, 150).create();} else if (ext.getTemplateType() == 2) {templateType = "附件";} else if (ext.getTemplateType() == 3) {templateType = "音视频";} else if (ext.getTemplateType() == 4) {templateType = "文本";data = ext.getExtText();} else if (ext.getTemplateType() == 5) {templateType = "文档";}String source = StringUtils.isNotBlank(ext.getSource()) ? ext.getSource() : "";data = StringUtils.isNotBlank(data) ? data : "";str += "{\n" +"        \"index\": \"" + (i + 1) + "\",\n" +"        \"templateName\": \"" + ext.getTemplateName() + "\",\n" +"        \"templateType\": \"" + templateType + "\",\n" +"        \"source\": \"" + source + "\",\n" +"        \"data\": \"" + data + "\",\n" +"    },\n";}testTable = "[" + str + "]";}// 内容在表格里循环// JSON使用,需要导入fastjson依赖List<WordQingdanDetailsDTO> forms = JSON.parseArray(testTable, WordQingdanDetailsDTO.class);if (forms != null && forms.size() > 0) {for (int i = 0; i < forms.size(); i++) {put("index" + i, forms.get(i).getIndex());put("templateName" + i, forms.get(i).getTemplateName());put("templateType" + i, forms.get(i).getTemplateType());put("source" + i, forms.get(i).getSource());put("data" + i, forms.get(i).getData());}}put("bz", forms);pictureTag.add("dililink");}};for (String tag : pictureTag ) {//设置图片,不然保存的是一串字符configure.customPolicy(tag, new PictureRenderPolicy());}if (!new File(PeizhiConfig.getUploadOutPath()).exists()) {new File(PeizhiConfig.getUploadOutPath()).mkdirs();}String outPath = PeizhiConfig.getUploadOutPath() + "/"+ UUID.randomUUID() +".docx";// 读取模板、数据并渲染XWPFTemplate template = XWPFTemplate.compile(new FileInputStream(PeizhiConfig.getUploadOutPath() + "/任务数据.docx"), configure).render(dataMap);//  文件是否已存在,则删除File file = new File(outPath);if (file.exists()) {file.delete();}// 生成word保存在指定目录//template.writeToFile(outPath);template.writeAndClose(Files.newOutputStream(Paths.get(outPath)));template.close();return outPath;}public static void addToZipFile(String filePath, ZipOutputStream zos) throws IOException {File file = new File(filePath);FileInputStream fis = new FileInputStream(file);ZipEntry zipEntry = new ZipEntry(file.getName());zos.putNextEntry(zipEntry);byte[] bytes = new byte[1024];int length;while ((length = fis.read(bytes)) >= 0) {zos.write(bytes, 0, length);}zos.closeEntry();fis.close();}public static void createDoc() throws Exception {// 为表格的显示绑定行循环LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();// 将bz设置为行循环绑定的数据源的key,即key是bz的value会在模板中的{{bz}}处进行解析Configure configure = Configure.builder().bind("bz", policy).build();List<String> pictureTag = new ArrayList<>();// 将需要解析的数据放到dataMap中HashMap<String, Object> dataMap = new HashMap<String, Object>() {{//添加文本put("xiangmuName", "项目名称");put("xiangmuzhouqi", "2024-03-01 至 2024-04-02");put("renwuName", "任务名称");put("renwuzhouqi", "2024-03-05 至 2024-03-26");put("description", "项目描述");put("xiangmulink", "http://www.baidu.com");put("biaoqianName", "标签名称");PictureRenderData pictureRenderData = Pictures.ofStream(Files.newInputStream(Paths.get("D:\\template\\picture\\其他\\yiyan-NewYear.png")), PictureType.PNG).size(200, 150).create();put("dililink", pictureRenderData);put("resourceDescription", "资源描述");put("startYear", "1997");put("endYear", "2018");put("area", "100.5");// 其他业务获取到数据源String testTable = null;{testTable = "[\n" +"    {\n" +"        \"index\": \"1\",\n" +"        \"templateName\": \"模板内容1\",\n" +"        \"templateType\": \"模板类型1\",\n" +"        \"source\": \"来源1\",\n" +"        \"data\": \"http://www.baidu.com\"\n" +"    },\n" +"    {\n" +"        \"index\": \"2\",\n" +"        \"templateName\": \"模板内容2\",\n" +"        \"templateType\": \"模板类型2\",\n" +"        \"source\": \"来源2\",\n" +"        \"data\": \"http://www.baidu.com111\"\n" +"    },\n" +"    {\n" +"        \"index\": \"3\",\n" +"        \"templateName\": \"模板内容3\",\n" +"        \"templateType\": \"模板类型3\",\n" +"        \"source\": \"来源3\",\n" +"        \"data\": \"http://www.baidu.com222\"\n" +"    }\n" +"]";}// 内容在表格里循环// JSON使用,需要导入fastjson依赖List<WordQingdanDetailsDTO> forms = JSON.parseArray(testTable, WordQingdanDetailsDTO.class);for (int i = 0; i < forms.size(); i++) {put("index" + i, forms.get(i).getIndex());put("templateName" + i, forms.get(i).getTemplateName());put("templateType" + i, forms.get(i).getTemplateType());put("source" + i, forms.get(i).getSource());put("data" + i, forms.get(i).getData());}put("bz", forms);pictureTag.add("dililink");}};for (String tag : pictureTag ) {//设置图片,不然保存的是一串字符configure.customPolicy(tag, new PictureRenderPolicy());}String outPath = "D:\\生成数据.docx";// 读取模板、数据并渲染XWPFTemplate template = XWPFTemplate.compile(new FileInputStream("D:\\任务数据.docx"), configure).render(dataMap);//  文件是否已存在,则删除File file = new File(outPath);if (file.exists()) {file.delete();}// 生成word保存在指定目录//template.writeToFile(outPath);template.writeAndClose(Files.newOutputStream(Paths.get(outPath)));template.close();}public static void main(String[] args) throws Exception {createDoc();}}
    

    3.5 用到的实体类

  • RenwuTemplateDTO

    package io.renren.modules.sys.dto;import com.fasterxml.jackson.annotation.JsonFormat;
    import io.renren.common.validator.group.AddGroup;
    import io.renren.common.validator.group.UpdateGroup;
    import io.renren.modules.sys.entity.SysRenwuTemplateEntity;
    import io.renren.modules.sys.entity.SysResourceEntity;
    import io.renren.modules.sys.entity.SysXiangmuEntity;
    import lombok.Data;
    import org.springframework.format.annotation.DateTimeFormat;import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.NotNull;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;/*** @Author: Administrator* @Date: 2023/12/8* @Description:*/
    @Data
    public class RenwuTemplateDTO {private Long renwuId;private Long xiangmuId;private String renwuName;@DateTimeFormat(pattern = "yyyy-MM-dd")@JsonFormat(pattern = "yyyy-MM-dd")private Date startTime;@DateTimeFormat(pattern = "yyyy-MM-dd")@JsonFormat(pattern = "yyyy-MM-dd")private Date endTime;private String description;private String xiangmuName;private String xiangmuzhouqi;private List<SysXiangmuEntity> xiangmuList;private List<SysResourceEntity> fileList = new ArrayList<>();private QingdanDTO qingdanDTO;/*** 用于导出*/private List<QingdanDTO> qingdanDTOList;private List<String> renwuResourceUrlList;
    }
    
  • QingdanDTO

    import com.fasterxml.jackson.annotation.JsonFormat;
    import io.renren.common.validator.group.AddGroup;
    import io.renren.common.validator.group.UpdateGroup;
    import io.renren.modules.sys.entity.SysQingdanExtEntity;
    import lombok.Data;
    import org.springframework.format.annotation.DateTimeFormat;import javax.validation.constraints.NotNull;
    import java.util.Date;
    import java.util.List;/*** @Author: Administrator* @Date: 2023/12/11* @Description:*/
    @Data
    public class QingdanDTO {private Long qingdanId;private Long renwuId;private Long userId;private String biaoqianName;@DateTimeFormat(pattern = "yyyy")@JsonFormat(timezone = "GMT+8", pattern = "yyyy")private String startYear;@DateTimeFormat(pattern = "yyyy")@JsonFormat(timezone = "GMT+8", pattern = "yyyy")private String endYear;private String area;private String resourceUrl;/*** 资源描述*/private String description;private String xiangmuName;private String renwuName;/*** 清单详情*/private List<SysQingdanExtEntity> qingdanExtList;/*** 任务周期*/private String renwuzhouqi;/*** 项目周期*/private String xiangmuzhouqi;}
    
  • SysQingdanExtEntity

    import com.baomidou.mybatisplus.annotation.TableField;
    import com.baomidou.mybatisplus.annotation.TableLogic;
    import lombok.Data;import java.io.Serializable;/*** @Author: Administrator* @Date: 2023/12/11* @Description:*/
    @Data
    public class SysQingdanExtEntity implements Serializable {private static final long serialVersionUID = 1L;private Long qingdanExtId;private Long qingdanId;private String templateName;private Long resourceId;private String source;private String extText;private Integer templateType;private String resourceUrl;
    }
    
  • WordQingdanDetailsDTO

    import lombok.Data;/*** @Author: Administrator* @Date: 2024/3/1* @Description:*/
    @Data
    public class WordQingdanDetailsDTO {/*** 下标序号*/private Integer index;/*** 名称*/private String templateName;/*** 类型*/private String templateType;/*** 来源*/private String source;/*** 数据*/private String data;
    }
  1. 工具类ConvertUtils

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.BeanUtils;import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;/*** 转换工具类** @author Mark sunlightcs@gmail.com*/
    public class ConvertUtils {private static Logger logger = LoggerFactory.getLogger(ConvertUtils.class);public static <T> T sourceToTarget(Object source, Class<T> target){if(source == null){return null;}T targetObject = null;try {targetObject = target.newInstance();BeanUtils.copyProperties(source, targetObject);} catch (Exception e) {logger.error("convert error ", e);}return targetObject;}public static <T> List<T> sourceToTarget(Collection<?> sourceList, Class<T> target){if(sourceList == null){return null;}List targetList = new ArrayList<>(sourceList.size());try {for(Object source : sourceList){T targetObject = target.newInstance();BeanUtils.copyProperties(source, targetObject);targetList.add(targetObject);}}catch (Exception e){logger.error("convert error ", e);}return targetList;}
    }
    
  2. 导出效果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/542306.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux远程连接本地数据库(docker)

1. 安装docker 参考上一篇文章 CentOS安装Docker 2. Linux中安装Mysql 2.1 docker拉取mysql镜像 拉取镜像 docker pull mysql查看镜像列表 docker images2.2 运行mysql容器 运行一个名字为mysql的mysql容器&#xff0c;其连接端口号为3306&#xff0c;密码为123456 docker r…

rembg报错onnxruntime_providers_tensorrt.dll

报错&#xff1a; 2024-03-16 04:16:59.4413827 [E:onnxruntime:Default, provider_bridge_ort.cc:1534 onnxruntime::TryGetProviderInfo_TensorRT] D:\a_work\1\s\onnxruntime\core\session\provider_bridge_ort.cc:1209 onnxruntime::ProviderLibrary::Get [ONNXRuntimeErro…

基于springboot的七彩云南文化旅游网站的设计与实现(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装七彩云南文化旅游网站软件来发挥其高效地信息处理的作用&am…

量子遗传算法优化VMD参数,五种适应度函数任意切换,最小包络熵、样本熵、信息熵、排列熵、排列熵/互信息熵...

关于量子遗传算法&#xff0c;在众多文献均有应用。下面简述一下原理。 &#xff08;1&#xff09;量子比特编码 子遗传算法通过引入量子比特来完成基因的存储和表达。量子比特是量子信息中的概念&#xff0c;它与经典比特不同&#xff0c;是因为它可以在同一时刻处于两个状态的…

excel统计分析——曲线回归

参考资料&#xff1a;生物统计学 两个变量之间常呈非直线关系&#xff0c;非直线关系的两个变量需要用曲线回归模型来进行分析。曲线回归&#xff08;curvilinear regression&#xff09;有多种曲线类型。选择曲线类型时&#xff0c;需要根据散点图观察变量间的协同变化区试&am…

基于openresty构建运维工具链实践

本文字数&#xff1a;4591字 预计阅读时间&#xff1a;25 01 导读 如今OpenResty已广泛被各个互联网公司在实际生产环境中应用&#xff0c;在保留Nginx高并发、高稳定等特性基础上&#xff0c;通过嵌入Lua来提升在负载均衡层的开发效率并保证其高性能。本文主要介绍接口鉴权、流…

npm WARN config init.license Use `--init-license` instead.

背景&#xff1a;近期升级本地node版本&#xff08;v14.15.4 --> v18.19.1&#xff09;&#xff0c;npm -v报警 npm WARN config init.license Use --init-license instead. npm WARN config init.author.name Use --init-author-name instead. 分析&#xff1a; npm高版本…

【pynput】监控是否打开百度贴吧网页

文章目录 简介Demo 简介 有网友提过一个要求&#xff0c;用 Python 实现一个 电脑打开某网站就自动关机的功能。 想到的思路有两个&#xff1a; 【windows 平台】, 获取活动的窗口标题&#xff0c;如果标题里包含了某些网站名称, 那就使用关机命令 可以定时拉取标题, 也可以使…

世上最全Python学习思路

孤客python学习思路 python学习从入门到精通前言 预备知识Python简介程序设计思想导入python资源包用户体验模块获得A和B的能力值与场次模块模拟n局比赛模块判断比赛结束条件模拟n次单局比赛模拟n局比赛打印结果模块 安装Python运行方式常用开发工具编码规范模块管理 python学习…

通付盾Web3专题 | SharkTeam:2023年加密货币犯罪分析报告

2023年&#xff0c;Web3行业共经历了940多起大大小小的安全事件&#xff0c;同比2022年增长了超过50%&#xff0c;损失金额达到17.9亿美元。其中&#xff0c;第三季度发生的安全事件最多&#xff08;360起&#xff09;&#xff0c;损失最大&#xff08;7.4亿美元&#xff09;&a…

新品牌推广怎么做?百度百科创建是第一站

创业企业的宣传推广怎么做&#xff1f;对于初创的企业、或者品牌来说&#xff0c;推广方式都有一个循序渐进的过程&#xff0c;但多数领导者都会做出同一选择&#xff0c;第一步就是给自己的企业创建一个百度百科词条。在百度百科建立自己的企业、或产品词条,不仅可以树立相关信…

【论文阅读笔记】Attention Is All You Need

1.论文介绍 Attention Is All You Need 2017年 NIPS transformer 开山之作 回顾一下经典&#xff0c;学不明白了 Paper Code 2. 摘要 显性序列转导模型基于包括编码器和解码器的复杂递归或卷积神经网络。性能最好的模型还通过注意力机制连接编码器和解码器。我们提出了一个新…