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.mzph.cn/news/747985.shtml

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

相关文章

基于openCV实现的单目相机行人和减速带检测

概述 在计算机视觉项目中&#xff0c;相机标定是一项至关重要的任务&#xff0c;因为它可以校正相机内部参数&#xff0c;消除因镜头畸变等因素导致的图像失真&#xff0c;从而提高后续图像处理和分析的精度。在这个项目中&#xff0c;相机标定的核心功能集成在名为calibratio…

还原wps纯粹的编辑功能

1.关闭稻壳模板&#xff1a; 1.1. 启动wps(注意不要乱击稻壳模板&#xff0c;点了就找不到右键菜单了) 1.2. 在稻壳模板选项卡右击&#xff1a;选不再默认展示 2.关闭托盘中wps云盘图标&#xff1a;右击云盘图标/同步与设置&#xff1a; 2.1.关闭云文档同步 2.2.窗口选桌面应用…

Vue2+ElementUI表单、Form组件的封装

Vue2ElementUI表单、Form组件的封装 &#xff1a;引言 在 Vue2 项目中&#xff0c;ElementUI 的 el-form 组件是常用的表单组件。它提供了丰富的功能和样式&#xff0c;可以满足各种需求。但是&#xff0c;在实际开发中&#xff0c;我们经常会遇到一些重复性的需求&#xff0c…

16.WEB渗透测试--Kali Linux(四)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;15.WEB渗透测试--Kali Linux&#xff08;三&#xff09;-CSDN博客 1.crunch简介与使用 C…

分布式CAP理论

CAP理论&#xff1a;一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容错性&#xff08;Partition tolerance&#xff09;。是Eric Brewer在2000年提出的&#xff0c;用于描述分布式系统基本性质的定理。这三个性质在分布式系统…

FPGA静态时序分析与约束(一)、理解亚稳态

系列文章目录 FPGA静态时序分析与约束&#xff08;二&#xff09;、时序分析 FPGA静态时序分析与约束&#xff08;三&#xff09;、读懂vivado时序报告 文章目录 系列文章目录前言一、概述一、何为亚稳态&#xff1f;二、图解亚稳态三、什么时候亚稳态会导致系统失效&#xff…

k8s部署hadoop

&#xff08;作者&#xff1a;陈玓玏&#xff09; 配置和模板参考helm仓库&#xff1a;https://artifacthub.io/packages/helm/apache-hadoop-helm/hadoop 先通过以下命令生成yaml文件&#xff1a; helm template hadoop pfisterer-hadoop/hadoop > hadoop.yaml用kube…

Unity PS5开发 天坑篇 之 申请开发者与硬件部署01

腾了好几天终于把PS5开发机调试部署成功, 希望能帮到国内的开发者, 主机游戏PlayStation/Nintendo Switch都是比较闭塞的&#xff0c;开发者账号是必须的。 开发环境有两个部分&#xff0c;一是DEV Kit 开发机, TEST Kit测试机两部分组成&#xff0c;二是Unity的支持库(安装后…

最新开源解密版TwoNav网址导航系统源码

源码简介 2024最新开源解密版TwoNav网址导航系统源码去授权破解版 内置二十多套主题模板。 已去授权&#xff0c;最新开源解密版。TwoNav 是一款开源的书签&#xff08;导航&#xff09;管理程序&#xff0c;使用PHP SQLite 3开发&#xff0c;界面简洁&#xff0c;安装简单&…

FFmepg--音频编码流程--pcm编码为aac

文章目录 基本概念流程apicode(核心部分) 基本概念 从本地⽂件读取PCM数据进⾏AAC格式编码&#xff0c;然后将编码后的AAC数据存储到本地⽂件。 PCM样本格式&#xff1a;未经压缩的⾳频采样数据裸流 参数&#xff1a; Sample Rate : 采样频率Sample Size : 量化位数Number o…

Matlab进阶绘图第45期—蝴蝶气泡图

蝴蝶气泡图是一种特殊的柱泡图/气泡柱状图。 蝴蝶图一般由左右两个水平柱状图组合而成&#xff0c;其形如蝴蝶展翅&#xff0c;可以很直观地展示两种数据直接的差异。 而蝴蝶气泡图则是在两个水平柱状图每根柱子外侧额外添加大小不同的气泡&#xff0c;用于表示另外一个数据变…

使用IDEA2023创建传统的JavaWeb项目并运行与调试

日期:2024-0312 作者:dusuanyun 文档环境说明: OS:Deepin 20.9(Linux) JDK: OpenJDK21 Tomcat:10.1.19 IDEA: 2023.3.4 (Ultimate Edition) 本文档默认已经安装JDK及环境变量的配置。 关键词…

单片机设计-超声波视力保护仪的设计与实现

项目介绍 技术&#xff1a;C语言、单片机等 本设计利用超声波技术检测眼睛与书本的距离&#xff0c;调整看书位置&#xff0c;通过光敏检测判断环境光线强度是否适合阅读&#xff0c;并通过定时器设定阅读时长&#xff0c;以此解决人们由于看书姿势的错误&#xff0c;阅读环境…

R语言数据挖掘-关联规则挖掘(1)

一、分析目的和数据集描述 要分析的数据是美国一区域的保险费支出的历史数据。保险费用数据表的每列分别为年龄、性别、体重指数、孩子数量、是否吸烟、所在区域、保险收费。 本文的主要目的是分析在年龄、性别、体重指数、孩子数量、是否吸烟、所在区域中这些因素中&#xf…

webpack5零基础入门-8清空前次打包文件与处理图标字体资源

1.配置output中的clean属性为true output: {/**文件输出路径 绝对路径*///__dirname 表示当前文件的文件夹目录path: path.resolve(__dirname, dist),//所有文件的输出目录/**文件名 */filename: static/js/dist.js,//入口文件输出文件名clean: true,//在打包前将path整个目录内…

SSM SpringBoot vue智能手机参数分析平台

SSM SpringBoot vue智能手机参数分析平台 系统功能 首页 图片轮播 新闻资讯 手机信息 手机百科 登录注册 个人中心 后台管理 登录注册 个人中心 手机百科管理 用户管理 手机对比管理 配置管理 新闻资讯管理 手机信息管理 对比信息管理 我的收藏管理 开发环境和技术 开发语言…

安卓国产百度网盘与国外云盘软件onedrive对比

我更愿意使用国外软件公司的产品&#xff0c;而不是使用国内百度等制作的流氓软件。使用这些国产软件让我不放心&#xff0c;他们占用我的设备大量空间&#xff0c;在我的设备上推送运行各种无用的垃圾功能。瞒着我&#xff0c;做一些我不知道的事情。 百度网盘安装包大小&…

爬虫 某物流

目标地址 url "https://api.jdl.com/aging/feeInquiryNewByJDL" 加密参数 ciphertext和data 搜关键字ciphertext跟着栈走 很明显的DES加密 window globalconst e require(jsencrypt); // const e require(JSEncrypt) // e r(775).JSEncrypt // const t requi…

《ARM汇编与逆向工程》读书心得与实战体验

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 一、引言 &#x1f4dd; 二、…

信雅纳网络测试的二次开发集成:XOA(Xena Open-Source Automation)开源自动化测试

目录 XOA是什么 XOA CLI XOA Python API ​XOA Python Test Suite/测试套件 XOA Converter Source Code XOA是什么 XOA&#xff08;Xena Open-Source Automation&#xff09;是一个开源的测试自动化框架&#xff0c;追求“高效、易用、灵活”的跨操作系统的开发框架。能…