java生成docx文档, docx文档动态饼图

news2024/11/20 12:22:30

背景: 最近接了个需求, 要求生成日报,  大概如下图所示:

其中'*'表示变量, 看到要动态生成doc给我难受坏了,为什么会有这种需求?

然后看到里面还要动态生成饼图, oh, no.........没有办法, 硬着头皮上吧.

于是就搜了下java生成docx的方式, 看到的, 比较靠谱的一种通过freemaker生成, 替换其中的动态数据即可.

这种的好处就是提供一个模板, 替换完里面的数据之后格式不会乱, 于是愉快的决定就用这个了, 过程如下

1.让产品给一个最终的日报文档, 然后另存为xml文件, 没错, 就是xml文件, 放着备用

2.项目中加入freemaker依赖及相关配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.5.0</version>
</dependency>
spring:
  freemarker:
    cache: false  #关闭模板缓存,方便测试
    settings:
      template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    suffix: .ftl               #指定Freemarker模板文件的后缀名
    enabled: true
    expose-spring-macro-helpers: true

3.开始搞利用模板生成docx的代码

3.1 在resources文件夹下新建 templates 文件夹, 将第1步docx转存的xml文件复制到该目录下,并更改文件后缀为 .ftl (文件后缀和配置里保持一致即可)

        之后对这个模板文件的代码进行格式化一下(方便找需要替换的地方), 找到需要替换的地方之后,使用${变量}进行替换就行了, 这里都是freemaker的基础操作, 就是docx的结构有点麻烦, 不过xml文件仔细看看很容易就发现规律了. 大部分都是这种, 样式后面跟着文字, 如果遇到表格什么的可能稍微不一样.

3.2 写一下服务类


public interface TemplateService {
    /**
     * 创建模板文件
     * @param outputPath 输出路径
     * @param templateFile 模板文件名
     * @param param 参数
     * @return 是否创建成功
     */
    boolean createTemplateFile(String outputPath,String fileName, String templateFile, Map<String, Object> param);

}

@Slf4j
@Service
public class TemplateServiceImpl implements TemplateService {

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;


    @Override
    public boolean createTemplateFile(String outputPath, String fileName, String templateFile, Map<String, Object> param) {
        Configuration cfg = freeMarkerConfigurer.getConfiguration();
        Writer out = null;

        File file = new File(outputPath);
        if (!file.exists()) {
            file.mkdirs();
        }
        file = new File(outputPath + fileName);
        try {
            cfg.setDefaultEncoding(StandardCharsets.UTF_8.name());
            Template template = cfg.getTemplate(templateFile);
            out = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);

            //将数据放在map里,然后就会自动渲染模版
            template.process(param, out);
            return true;
        } catch (Exception e) {
            log.error("TemplateServiceImpl#createTemplateFile生成文件失败............." + e);
        } finally {
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    log.error("TemplateServiceImpl#createTemplateFile流关闭失败..........." + e);
                }
            }
        }
        return false;
    }


}

3.3 写个测试的controller调用试一试

    @GetMapping("/createdoc")
    public String createdoc() throws Exception {
        //1.文档里要动态替换的数据
        Map<String, Object> param = new HashMap<>();
        String company = "测试工作室";
        param.put("company", company);//公司
        param.put("time", "2023-12-10 11:00 - 2023-12-11 11:00");//日报时间
        param.put("order", 4500);//订单数
        param.put("amount", 304614.23);//金额
        

        //2.根据模板生成docx文档
        //用来输出生成的文档目录
        String outputPath = "D:/data/hotspot/docx/";
        String dayStr = DateTimeUtil.getDayStr(convertToDateTime(new Date()));
        String fileName = company + "电商日报【" + dayStr + "】.docx";
        templateService.createTemplateFile(outputPath, fileName, "模板.ftl", param);
        
        //3.到这里,文档就已经生成了, 去目录下看生成的文档是否符合要求就行了
        //我这里后面又把文件上传到oss上面去了, 然后将数据更新到数据库了
        String fileAbsolutePath = outputPath + fileName;
        //3.1 todo 上传到oss, 并将url更新到数据库

        //3.2 删除本地机器的文件
        File file = new File(fileAbsolutePath);
        boolean delete = file.delete();

        return "success";
    }

4.文字是没问题了, 那么图片怎么解决呢? 还要动态生成, 还要写到docx里面去. 

   于是开始发功, 百度大法....... 找到了jfreechart这个框架, 话不多说, 开始干活.

4.1 依赖

        <!--用于jfreechart生成图片  -->
        <dependency>
            <groupId>org.jfree</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.5.0</version>
        </dependency>
        <!--非必要 -这个里面少一些内置包 版本比较高,需要单独引入-->
        <dependency>
            <groupId>com.guicedee.services</groupId>
            <artifactId>jfreechart</artifactId>
            <version>1.1.1.5-jre15</version>
        </dependency>

4.2 jfree工具类


import org.apache.commons.lang3.StringUtils;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.block.BlockBorder;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.ui.HorizontalAlignment;
import org.jfree.chart.ui.RectangleInsets;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;

import java.awt.*;
import java.io.File;
import java.io.IOException;
import java.math.RoundingMode;
import java.rmi.server.ExportException;
import java.text.NumberFormat;
import java.util.Iterator;
import java.util.Map;

/**
 * 创建图集图表
 */
public class JfreeUtil {

    private static final Font FONT = new Font("宋体", Font.PLAIN, 12);
    private static StandardChartTheme defaultTheme(){
        //创建主题样式
        StandardChartTheme theme=new StandardChartTheme("CN");
        //设置标题字体
        theme.setExtraLargeFont(new Font("隶书",Font.BOLD,20));
        //设置图例的字体
        theme.setRegularFont(new Font("宋书",Font.PLAIN,15));
        //设置轴向的字体
        theme.setLargeFont(new Font("宋书",Font.PLAIN,15));
        return theme;
    }

    public static String createPieChart(String title, Map<String, Double> datas, int width, int height) throws IOException {
        //根据jfree生成一个本地饼状图
        DefaultPieDataset pds = new DefaultPieDataset();
        datas.forEach(pds::setValue);
        //应用主题样式
        ChartFactory.setChartTheme(defaultTheme());
        //图标标题、数据集合、是否显示图例标识、是否显示tooltips、是否支持超链接
        JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, false);
        chart.getTitle().setFont(FONT);
        chart.getLegend().setItemFont(FONT);
        //设置抗锯齿
        chart.setTextAntiAlias(false);

        PiePlot plot = (PiePlot) chart.getPlot();
        plot.setStartAngle(90);
        plot.setNoDataMessage("暂无数据");
        plot.setNoDataMessagePaint(Color.blue); // 设置无数据时的信息显示颜色

        //忽略无值的分类
        plot.setIgnoreNullValues(true);
        plot.setIgnoreZeroValues(true);
        plot.setBackgroundAlpha(0f);
        //设置标签阴影颜色
        plot.setShadowPaint(new Color(255, 255, 255));

        //设置标签是否显示在饼块内部,默认时在外部
//        plot.setSimpleLabels(true);

        chart.getLegend().setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐 左对齐;
        chart.getLegend().setMargin(0, 0, 0, 0);//参数是:上,左,下,右. 设置饼图的位置
        chart.getLegend().setPadding(0, 0, 20, 0);// 设置饼图下文字的位置
        chart.getLegend().setFrame(new BlockBorder(0, 0, 0, 0));// 设置饼图下文字边框的位置
        // 图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例,小数点后两位
        NumberFormat percentInstance = NumberFormat.getPercentInstance();
        percentInstance.setRoundingMode(RoundingMode.HALF_UP);
        percentInstance.setMaximumFractionDigits(2);
        plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0},{2}", NumberFormat.getNumberInstance(), percentInstance));

        return createFile(chart, width, height);
    }

    public static String createBarChart(String title, Map<String, Object> datas, String type, String units, PlotOrientation orientation, int width, int height) throws IOException {
        //数据集
        DefaultCategoryDataset ds = new DefaultCategoryDataset();
        Iterator<Map.Entry<String, Object>> iterator = datas.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, Object> entry = iterator.next();
            ds.setValue(Double.valueOf(String.valueOf(entry.getValue())), "工单数量", StringUtils.defaultString(entry.getKey(), ""));
        }

        //创建柱状图,柱状图分水平显示和垂直显示两种
        JFreeChart chart = ChartFactory.createBarChart(title, type, units, ds, orientation, false, false, false);

        //设置文本抗锯齿,防止乱码
        chart.setTextAntiAlias(false);
        //得到绘图区
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        plot.setNoDataMessage("no data");
        //设置柱的透明度
        plot.setForegroundAlpha(1.0f);
        plot.setOutlineVisible(false);

        //获取X轴的对象
        CategoryAxis categoryAxis = plot.getDomainAxis();
        //坐标轴标尺值是否显示
        categoryAxis.setTickLabelsVisible(true);
        //坐标轴标尺是否显示
        categoryAxis.setTickMarksVisible(false);
        categoryAxis.setTickLabelFont(FONT);
        categoryAxis.setTickLabelPaint(Color.BLACK);
        categoryAxis.setLabelFont(FONT);// X轴标题
        //categoryAxis.setCategoryLabelPositionOffset(2);//图表横轴与标签的距离(10像素)

        //获取Y轴对象
        ValueAxis valueAxis = plot.getRangeAxis();
        valueAxis.setTickLabelsVisible(true);
        valueAxis.setTickMarksVisible(false);
        valueAxis.setUpperMargin(0.15);//设置最高的一个柱与图片顶端的距离(最高柱的20%)
        valueAxis.setLowerMargin(0d);
        valueAxis.setTickLabelFont(FONT);//Y轴数值
        valueAxis.setLabelPaint(Color.BLACK);//字体颜色
        valueAxis.setLabelFont(FONT);//Y轴标题

        NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
        //设置Y轴刻度为整数
        numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        //设置网格横线颜色
        plot.setRangeGridlinePaint(Color.gray);
        plot.setRangeGridlinesVisible(true);
        //图片背景色
        plot.setBackgroundPaint(Color.white);
        plot.setOutlineVisible(false);

        // 设置原点xy轴相交,柱子从横轴开始,否则会有间隙
        plot.setAxisOffset(new RectangleInsets(0d, 0d, 0d, 0d));
        //设置网格横线大小
        plot.setDomainGridlineStroke(new BasicStroke(0.5F));
        plot.setRangeGridlineStroke(new BasicStroke(0.5F));
        //设置柱状图柱子相关
        CategoryPlot categoryPlot = chart.getCategoryPlot();
        BarRenderer rendererBar = (BarRenderer) categoryPlot.getRenderer();

        //组内柱子间隔为组宽的10%,调整柱子宽度
        rendererBar.setItemMargin(0.6);
        rendererBar.setMaximumBarWidth(0.07);

        rendererBar.setDrawBarOutline(true);
        rendererBar.setSeriesOutlinePaint(0, Color.decode("#4F97D5"));
        //设置柱的颜色#5B9BE6
        rendererBar.setSeriesPaint(0, Color.decode("#4F97D5"));

        //设置柱子上显示值
        rendererBar.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        rendererBar.setDefaultItemLabelFont(FONT);
        rendererBar.setDefaultItemLabelsVisible(true);
        rendererBar.setDefaultItemLabelPaint(Color.BLACK);

        return createFile(chart, width, height);

    }

    public static String createLineChart(String title, Map<String, Object> datas, String type, String unit, PlotOrientation orientation, int width, int hight) throws IOException {
        DefaultCategoryDataset ds = new DefaultCategoryDataset();
        Iterator iterator = datas.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry entry = (Map.Entry) iterator.next();
            ds.setValue(Double.valueOf(String.valueOf(entry.getValue())), "工单数量", entry.getKey().toString());
        }

        //创建折线图,折线图分水平显示和垂直显示两种
        JFreeChart chart = ChartFactory.createLineChart(title, type, unit, ds, orientation, false, true, true);
        //设置文本抗锯齿,防止乱码
        chart.setTextAntiAlias(false);
        //chart.setBorderVisible(true);

        //得到绘图区
        CategoryPlot plot = (CategoryPlot) chart.getPlot();
        //设置横轴标签项字体
        CategoryAxis categoryAxis = plot.getDomainAxis();
        categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
        categoryAxis.setTickMarksVisible(false);
        categoryAxis.setTickLabelsVisible(true);
        categoryAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
        categoryAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));

        ValueAxis valueAxis = plot.getRangeAxis();
        valueAxis.setTickMarksVisible(false);
        valueAxis.setTickLabelsVisible(true);
        valueAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 12));
        valueAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));

        NumberAxis numberAxis = (NumberAxis) plot.getRangeAxis();
        //设置Y轴刻度跨度
        numberAxis.setUpperMargin(0.15);
        numberAxis.setLowerMargin(0);
        numberAxis.setAutoRangeMinimumSize(5);

        // 设置背景透明度
        plot.setBackgroundAlpha(0.1f);
        plot.setForegroundAlpha(1.0f);
        // 设置网格横线颜色
        plot.setRangeGridlinePaint(Color.gray);
        // 设置网格横线大小
        plot.setDomainGridlineStroke(new BasicStroke(0.5F));
        plot.setRangeGridlineStroke(new BasicStroke(0.5F));
        plot.setBackgroundPaint(Color.white);
        plot.setOutlineVisible(false);

        // 设置原点xy轴相交,y轴为0时,点在横坐标上,否则不在横坐标上
        plot.setAxisOffset(new RectangleInsets(0d, 0d, 0d, 0d));

        // 生成折线图上的数字
        //绘图区域(红色矩形框的部分)
        LineAndShapeRenderer renderer = (LineAndShapeRenderer) plot.getRenderer();
        renderer.setDefaultItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        //设置图表上的数字可见
        renderer.setDefaultItemLabelsVisible(true);
        //设置图表上的数字字体
        renderer.setDefaultItemLabelFont(new Font("宋体", Font.PLAIN, 12));

        // 设置线条是否被显示填充颜色
        renderer.setUseFillPaint(true);
        renderer.setSeriesStroke(0, new BasicStroke(4.0f));
        renderer.setSeriesPaint(0, Color.decode("#4472C4"));

        return createFile(chart, width, hight);
    }

    public static String createFile(JFreeChart chart, int width, int hight) throws IOException {
        File templateFile = File.createTempFile("jfreetemp", ".png");
        String filePath = templateFile.getParent() + File.separator + templateFile.getName();
        try {
            if (templateFile.exists()) {
                templateFile.delete();
            }
            ChartUtils.saveChartAsPNG(templateFile, chart, width, hight);
        } catch (IOException e) {
            throw new ExportException("创建图表文件失败!");
        }

        return filePath;
    }


}

4.2 对图片进行base64编码的工具类, 因为我们的模板是由docx另存为xml文件, 然后又改的.ftl后缀,

但其本质仍然是xml文件, 那么我们就相当于要往xml文件中写图片,就需要对图片进行编码了.


import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.util.Base64;

public class EncodeUtil {
    public static String readImage(String str_FileName) {
        BufferedInputStream bis = null;
        byte[] bytes = null;
        try {
            try {
                bis = new BufferedInputStream(new FileInputStream(str_FileName));
                bytes = new byte[bis.available()];
                bis.read(bytes);
            } finally {
                bis.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encryptBASE64(bytes);
    }
    public static String readImage(FileInputStream in) {
        BufferedInputStream bis = null;
        byte[] bytes = null;
        try {
            try {
                bis = new BufferedInputStream(in);
                bytes = new byte[bis.available()];
                bis.read(bytes);
            } finally {
                bis.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encryptBASE64(bytes);
    }
    public static String encryptBASE64(byte[] key) {
        Base64.Encoder encoder= Base64.getMimeEncoder();
        return encoder.encodeToString(key);
    }

4.3 重新往测试的controller写下代码

    @GetMapping("/createdoc")
    public String createdoc() throws Exception {
        //1.文档里要动态替换的数据
        Map<String, Object> param = new HashMap<>();
        String company = "测试工作室";
        param.put("company", company);//公司
        param.put("time", "2023-12-10 11:00 - 2023-12-11 11:00");//日报时间
        param.put("order", 4500);//订单数
        param.put("amount", 304614.23);//金额
        //1.1 图片数据
        Map<String, Double> map = new LinkedHashMap<>();
        map.put("美食",53.00);
        map.put("箱包",23.00);
        map.put("运动",13.11);
        map.put("衣服",73.25);
        map.put("其他",40.36);
        map.put("宠物",3.21);
        //使用Jfreechart创建饼图
        String pictureUrl = JfreeUtil.createPieChart("", doubleMap, 600, 500);
        //对图片进行编码,转换为string类型
        FileInputStream inputStream = new FileInputStream(pictureUrl);
        String image = EncodeUtil.readImage(inputStream);
        param.put("image", image);//图片.....将模板里的图片(很长的一串)替换为 ${image}即可

        //2.根据模板生成docx文档
        //用来输出生成的文档目录
        String outputPath = "D:/data/hotspot/docx/";
        String dayStr = DateTimeUtil.getDayStr(convertToDateTime(new Date()));
        String fileName = company + "电商日报【" + dayStr + "】.docx";
        templateService.createTemplateFile(outputPath, fileName, "模板.ftl", param);
        
        //3.到这里,文档就已经生成了, 去目录下看生成的文档是否符合要求就行了
        //我这里后面又把文件上传到oss上面去了, 然后将数据更新到数据库了
        String fileAbsolutePath = outputPath + fileName;
        //3.1 todo 上传到oss, 并将url更新到数据库

        //3.2 删除本地机器的文件
        File file = new File(fileAbsolutePath);
        boolean delete = file.delete();

        return "success";
    }

一般图片是放在如下标签里的.

到此结束, 生成的文档和需求里的差不多, 就是这个饼图有点丑.

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

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

相关文章

【每日一题】1334. 阈值距离内邻居最少的城市-2023.11.14

题目&#xff1a; 1334. 阈值距离内邻居最少的城市 有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边&#xff0c;距离阈值是一个整数 distanceThreshold。 …

[Linux] ssh远程访问及控制

一、ssh介绍 1.1 SSH简介 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用于实现远程登录、远程复制等功能的字符接口。SSH 协议包括用户在登录时输入的用户密码、双方之间的通信。 加密数据传输&#xff0c;SSH 是一种建立在应用层和传输层上…

<MySQL> 查询数据进阶操作 -- 聚合查询

目录 一、聚合查询概述 二、聚合函数查询 2.1 常用函数 2.2 使用函数演示 2.3 聚合函数参数为*或列名的查询区别 2.4 字符串不能参与数学运算 2.5 具有误导性的结果集 三、分组查询 group by 四、分组后条件表达式查询 五、MySQL 中各个关键字的执行顺序 一、聚合查询…

【2013年数据结构真题】

highlight: a11y-dark 41题 王道解析&#xff1a; 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元素Num 。然后重新计数&#xff0c;确认Num是否是主元素。算法可分为以下两步&#xff1a; 选取候选的主元素&#xff1a;依次扫描所给数组中的每个…

【数据结构 | 链表】leetcode 2. 两数相加

个人主页&#xff1a;兜里游客棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里游客棉花糖 原创 收录于专栏【LeetCode】 原题链接&#xff1a;点击直接跳转到该题目 目录 题目描述解题代码 题目描述 给你两个 非空 的链表&#xff0c;表示两个非…

降低城市内涝风险,万宾科技内涝积水监测仪的作用

频繁的内涝会削弱和损坏城市的关键基础设施&#xff0c;包括道路、桥梁和公用设施。城市内涝风险降低可以减少交通中断事件&#xff0c;也可以保护居民安全并降低路面维修等成本&#xff0c;进一步确保城市基本服务继续发挥作用。对城市可持续发展来讲有效减少内涝的风险是重要…

ESP32网络开发实例-将DS18B20传感器读数发送到InfluxDB

将DS18B20传感器读数发送到InfluxDB 文章目录 将DS18B20传感器读数发送到InfluxDB1、InfluxDB、DS18B20介绍2、软件准备3、硬件准备4、代码实现在本文中,我们将介绍如何将 DS18B20传感器读数发送到 InfluxDB 时间序列数据库。 使用 InfluxDB 数据库的一大特点是可以在确定的时…

python 爬虫之requests 库以及相关函数的详细介绍

get 函数 当你使用 requests.get 函数时&#xff0c;你可以按照以下步骤来发起一个 GET 请求&#xff1a; 导入 requests 模块&#xff1a; 在你的 Python 脚本或程序中&#xff0c;首先导入 requests 模块。 import requests指定目标 URL&#xff1a; 设置你要请求的目标 URL…

4路光栅尺磁栅尺编码器解码转换5MHz高速差分信号转Modbus TCP网络模块 YL97-RJ45

特点&#xff1a; ● 光栅尺磁栅尺解码转换成标准Modbus TCP协议 ● 光栅尺5V差分信号直接输入&#xff0c;4倍频计数 ● 模块可以输出5V的电源给光栅尺供电 ● 高速光栅尺磁栅尺计数&#xff0c;频率可达5MHz ● 支持4个光栅尺同时计数&#xff0c;可识别正反转 ● 可网…

啊?印第安碳纤维限量款?复古与性能的结合吗Indian FTR x 100% R Carbon

印第安作为美国的老牌摩托车厂大家都不陌生了&#xff0c;和哈雷有一点比较大的区别是印第安的车还是考虑马力性能的&#xff0c;也是敢于标出自己的马力参数数据&#xff0c;就比如印第安的FTR系列。 以泥地赛道为灵感设计的印第安FTR运动街车发布了最新的限量联名款车型&…

spring cloud alibaba 简介

微服务搭建组件选型 1.服务注册中心 Nacos(spring-cloud-alibaba) 2.服务通信 OpenFeign(spring-cloud) 3.服务熔断、降级、限流 Sentinel(spring-cloud-alibaba) 4.网关 Gateway(spring-cloud) 5.服务配置中心 …

ARM64 linux并发与同步之经典自旋锁

1.3 经典自旋锁 在实际项目中临界区数据有可能会修改一个数据结构或者链表中的数据&#xff0c;在整个过程中要保证原子性&#xff0c;才不会影响数据的有效性&#xff0c;这个过程使用原子变量不合适&#xff0c;需要使用锁机制来完成&#xff0c;自旋锁&#xff08;spinlock&…

深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通

大家好,我是微学AI,今天给大家介绍一下深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通。transformer是一种基于自注意力机制的深度学习模型,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初被设计用来处理序…

香港科技大学广州|机器人与自主系统学域博士招生宣讲会—电子科技大学专场!!!(暨全额奖学金政策)

在机器人和自主系统领域实现全球卓越—机器人与自主系统学域 硬核科研实验室&#xff0c;浓厚创新产学研氛围&#xff01; 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; &#x1f559;时间&#xff1a;…

防爆五参数气象仪的科技力量

WX-FBQ2 随着科技的不断进步&#xff0c;气象监测设备也在不断升级和完善。 防爆五参数气象仪是一种可以同时监测温度、湿度、压力、风速和风向五个基本气象参数的仪器。它采用了气象监测技术&#xff0c;不仅可以实时监测气象数据&#xff0c;还可以对数据进行分析和处理。 …

git使用patch进行补丁操作

文章目录 前言一、format-patch/am生成和应用补丁1、生成2、应用 二、patch文件解读 前言 在软件开发中&#xff0c;代码协作和版本管理是至关重要的。Git 是一个流行的分布式版本控制系统&#xff0c;它提供了各种功能来简化团队合作和代码管理。但是如何给已有项目打补丁&am…

基于单片机的智能考勤机(论文+源码)

1.系统设计 本课题为基于单片机的智能考勤机&#xff0c;其整个系统由STC89C52单片机&#xff0c;RC522 RFID模块&#xff0c;LCD液晶&#xff0c;按键等构成&#xff0c;在功能上&#xff0c;本系统智能考勤机主要应用在校园生活中&#xff0c;用户可以通过按键注销/注销相应的…

Skywalking流程分析_4(插件的加载和不同版本的识别)

插件的结构 之前我们介绍了插件的加载&#xff0c;接下来就是真正开始进行插件的执行了&#xff0c;首先要看下插件的结构是怎么样的&#xff0c;以阿里的druid数据源为例 skywalking-plugin.def: druid-1.xorg.apache.skywalking.apm.plugin.druid.v1.define.DruidPooledCo…

二进制原码、反码、补码、移码

机器数&#xff1a;一个数在计算机中的二进制表示形式&#xff0c;称为这个数的机器数。符号位&#xff1a;机器数是带符号的&#xff0c;在计算机中用最高位作为符号位&#xff0c;0为正数&#xff0c;1为负数。真值&#xff1a;机器数由于含有符号位&#xff0c;所以机器数的…

基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码

基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于群居蜘蛛算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于群居蜘蛛优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…