easyexcel 自定义列的导出

news2025/1/12 9:44:45

公司最近有个需求 就是将day这一列 变为excel表格表头,然后列显示薪水。
在这里插入图片描述
然后再到网上找教程最终终于找到相关的大神写的博客,具体网址忘记了。抱歉。现在写下具体教程。

  1. ExcelHead 代码
import lombok.Data;

/**
 * @author hunterhou
 * @date 2023/2/28 10:14
 */
@Data
public class ExcelHead<T> {

    //内容里的字段名称
    private String fieldName;
    //显示值,一般为中文的
    private String title;
    private T nullValue; //如果为null情况下要显示的值

    public ExcelHead(String fieldName, String title) {
        this.fieldName = fieldName;
        this.title = title;
    }

    public ExcelHead(String fieldName, String title, T nullValue) {
        this.fieldName = fieldName;
        this.title = title;
        this.nullValue = nullValue;
    }
}

ExcelUtils

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.google.common.collect.Lists;
import com.ltu.util.easyexcel.HorizontalCellStyleStrategy;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author hunterhou
 * @date 2023/2/28 9:18
 */
public class ExcelUtils<T> {

//    public static void main(String[] args) {
//        String filePath = "d:\\temp\\a.xlsx";
        List<ExcelHead> headList = new ArrayList();
        headList.add(new ExcelHead<String>("23-05-05", "23-05-05",""));
        headList.add(new ExcelHead<String>("23-05-06", "23-05-06", ""));


        List<Map<String, Object>> dataList = new ArrayList();
        Map<String, Object> one = new HashMap();
        one.put("23-05-05", "285.65");
        one.put("23-05-06", "257.36");
        dataList.add(one);

        Map<String, Object> two = new HashMap();
        two.put("23-05-05", "283.65");
        two.put("23-05-06", "25712.36");
        dataList.add(two);

//        Map<String, Object> there = new HashMap();
//        there.put("name", "不知道年龄");
//        there.put("age", null);
//        dataList.add(there);
        ExcelUtils.write(filePath, headList, dataList);
//
//
//        List<ExcelHead> headList2 = new ArrayList();
//        headList2.add(new ExcelHead<String>("dept", "部门", ""));
//        headList2.add(new ExcelHead<String>("code", "工号", ""));
//        headList2.add(new ExcelHead<String>("name", "姓名", ""));
//        headList2.add(new ExcelHead<String>("23-05-05", "23-05-05",""));
//        headList2.add(new ExcelHead<String>("23-05-06", "23-05-06", ""));
//        headList2.add(new ExcelHead<String>("23-05-07", "23-05-07", ""));
//
//        List<Map<String, Object>> dataList2 = new ArrayList();
//        Map<String, Object> one2 = new HashMap();
//        one2.put("code", "A001");
//        one2.put("23-05-05", "285.65");
//        one2.put("23-05-06", "257.36");
//        one2.put("23-05-07", "25734.36");
//        dataList2.add(one2);
//
//        Map<String, Object> two2 = new HashMap();
//        two2.put("code", "A002");
//        two2.put("23-05-05", "283.65");
//        two2.put("23-05-06", "25712.36");
//        two2.put("23-05-07", "25712e2.36");
//        dataList2.add(two2);
//
//        ExcelUtils.write(filePath, headList2, dataList2);
//
//    }

    /**
     * 写excel
     *
     * @param filePath 保存的路径名
     * @param headList
     * @param dataList
     */
    public static void write(String filePath, List<ExcelHead> headList, List<Map<String, Object>> dataList) {
        ExcelWriterBuilder writerBuilder = EasyExcel.write();
        writerBuilder.file(filePath);
        writerBuilder.excelType(ExcelTypeEnum.XLSX);
        writerBuilder.autoCloseStream(true);

        writerBuilder.head(convertHead(headList)).sheet("sheet1")
                .doWrite(convertData(headList, dataList));
    }

    /**
     * 写excel
     *
     * @param filePath 保存的路径名
     * @param headList 表头
     * @param dataList 数据源
     * @param sheetName  sheet名称
     */
    public static void write(String filePath, List<ExcelHead> headList, List<Map<String, Object>> dataList,String sheetName) {
        ExcelWriterBuilder writerBuilder = EasyExcel.write();
        writerBuilder.file(filePath);
        writerBuilder.excelType(ExcelTypeEnum.XLSX);
        writerBuilder.autoCloseStream(true);

        writerBuilder.head(convertHead(headList)).sheet(sheetName)
                .doWrite(convertData(headList, dataList));
    }


    /**
     * 写excel
     *
     * @param filePath 保存的路径名
     * @param headList 表头
     * @param dataList 数据源
     * @param sheetName  sheet名称
     * @param horizontalCellStyleStrategy  单元格样式设置
     */
    public static void write(String filePath, List<ExcelHead> headList, List<Map<String, Object>> dataList, String sheetName, HorizontalCellStyleStrategy horizontalCellStyleStrategy) {
        ExcelWriterBuilder writerBuilder = EasyExcel.write();
        writerBuilder.file(filePath);
        writerBuilder.excelType(ExcelTypeEnum.XLSX);
        writerBuilder.autoCloseStream(true);

        writerBuilder.head(convertHead(headList))
                .sheet(sheetName)
                // 设置单元格样式
                .registerWriteHandler(horizontalCellStyleStrategy)
                .doWrite(convertData(headList, dataList));
    }


    /**
     * 会先删除excel所有sheet,再写入
     */
    public static <T> void writeSheet(String filePath, String sheetName, Class<T> c, List<T> list) {
        EasyExcel.write(filePath, c).sheet(sheetName).doWrite(list);
    }

    public static <T> List<T> read(String fileName, String sheetName, Class c) {

        List<T> list = new ArrayList();
        EasyExcel.read(fileName, c, new ReadListener<T>() {
            @Override
            public void invoke(T o, AnalysisContext analysisContext) {
                list.add(o);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {

            }
        }).sheet(sheetName).doRead();
        return list;
    }


    private static List<List<String>> convertHead(List<ExcelHead> headList) {
        List<List<String>> list = new ArrayList<>();
        for (ExcelHead head : headList) {
            list.add(Lists.newArrayList(head.getTitle()));
        }
        //沒有搞清楚head的参数为List<List<String>>,用List<String>就OK了
        return list;
    }

    /**
     * @param headList
     * @param dataList key为head里的fieldName
     * @return
     */
    private static List<List<Object>> convertData(List<ExcelHead> headList, List<Map<String, Object>> dataList) {
        List<List<Object>> result = new ArrayList();
        //对dataList转为easyExcel的数据格式
        for (Map<String, Object> data : dataList) {
            List<Object> row = new ArrayList();
            for (ExcelHead h : headList) {
                Object o = data.get(h.getFieldName());
                //需要对null的处理,比如age的null,要转为对应设置的值
                row.add(handler(o, h.getNullValue()));
            }
            result.add(row);
        }
        return result;
    }

    /**
     * null值处理
     *
     * @param o
     * @param nullValue
     * @return
     */
    private static Object handler(Object o, Object nullValue) {
        return o != null ? o : nullValue;
    }
}

设置单元格样式

import java.util.List;

import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;

import com.alibaba.excel.write.style.AbstractCellStyleStrategy;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;


@Getter
@Setter
@EqualsAndHashCode
public class HorizontalCellStyleStrategy extends AbstractCellStyleStrategy {

    private WriteCellStyle headWriteCellStyle;
    private List<WriteCellStyle> contentWriteCellStyleList;

    public HorizontalCellStyleStrategy() {
    }

    public HorizontalCellStyleStrategy(WriteCellStyle headWriteCellStyle,
                                       List<WriteCellStyle> contentWriteCellStyleList) {
        this.headWriteCellStyle = headWriteCellStyle;
        this.contentWriteCellStyleList = contentWriteCellStyleList;
    }

    public HorizontalCellStyleStrategy(WriteCellStyle headWriteCellStyle, WriteCellStyle contentWriteCellStyle) {
        this.headWriteCellStyle = headWriteCellStyle;
        if (contentWriteCellStyle != null) {
            this.contentWriteCellStyleList = ListUtils.newArrayList(contentWriteCellStyle);
        }
    }

    @Override
    protected void setHeadCellStyle(CellWriteHandlerContext context) {
        if (stopProcessing(context) || headWriteCellStyle == null) {
            return;
        }
        WriteCellData<?> cellData = context.getFirstCellData();
        WriteCellStyle.merge(headWriteCellStyle, cellData.getOrCreateStyle());
    }

    @Override
    protected void setContentCellStyle(CellWriteHandlerContext context) {
        if (stopProcessing(context) || CollectionUtils.isEmpty(contentWriteCellStyleList)) {
            return;
        }
        WriteCellData<?> cellData = context.getFirstCellData();
        if (context.getRelativeRowIndex() == null || context.getRelativeRowIndex() <= 0) {
            WriteCellStyle.merge(contentWriteCellStyleList.get(0), cellData.getOrCreateStyle());
        } else {
            WriteCellStyle.merge(
                    contentWriteCellStyleList.get(context.getRelativeRowIndex() % contentWriteCellStyleList.size()),
                    cellData.getOrCreateStyle());
        }
    }

    protected boolean stopProcessing(CellWriteHandlerContext context) {
        return context.getFirstCellData() == null;
    }

}

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.*;

public class StyleUtils {

    /**
     * 标题样式
     * @return
     */
    public static WriteCellStyle getHeadStyle(){
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景颜色
//        headWriteCellStyle.setFillForegroundColor(IndexedColors.LIGHT_TURQUOISE1.getIndex());
//        headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);

        // 字体
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontName("宋体");//设置字体名字
        headWriteFont.setFontHeightInPoints((short)14);//设置字体大小
        headWriteFont.setBold(true);//字体加粗
        headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;

        // 样式
        headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;

        headWriteCellStyle.setWrapped(true);  //设置自动换行;

        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;
        headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

        return headWriteCellStyle;
    }


    /**
     * 内容样式
     * @return
     */
    public static WriteCellStyle getContentStyle(){
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();

        // 背景绿色
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
//        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);

        // 设置字体
        WriteFont contentWriteFont = new WriteFont();
        contentWriteFont.setFontHeightInPoints((short) 12);//设置字体大小
        contentWriteFont.setFontName("宋体"); //设置字体名字
        contentWriteCellStyle.setWriteFont(contentWriteFont);//在样式用应用设置的字体;

        //设置样式;
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
        contentWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
        contentWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
        contentWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
        contentWriteCellStyle.setTopBorderColor((short) 0); ///设置顶边框颜色;

        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中
        contentWriteCellStyle.setWrapped(true); //设置自动换行;

//        contentWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适

        return contentWriteCellStyle;
    }
}

使用案例

public CodeDataResp exportWorkFeeByDate(UserWorkProcedureEntity req, HttpServletResponse response){
        String   sheetName ="人员工资明细表";
        String startTime = null;
        String endTime = null;

        String now = DateUtil.now();
        String threeDaysAgoStart = DateUtil.format(DateUtil.offsetDay(DateUtil.beginOfDay(new Date()), -3), "yyyy-MM-dd HH:mm:ss");
        // 默认查3天内的
        // 设置开始时间为 3天前的 开始
        startTime = StringUtils.isNotBlank(req.getStartTime())?req.getStartTime():threeDaysAgoStart;
        // 结束时间为 now
        endTime = StringUtils.isNotBlank(req.getEndTime())?req.getEndTime():now;
        QueryWrapper<UserWorkProcedureEntity> wrapper2 = new QueryWrapper<UserWorkProcedureEntity>();
        wrapper2.lambda().ge(UserWorkProcedureEntity :: getCreateTime, startTime);
        // 结束时间为 now
        wrapper2.lambda().le(UserWorkProcedureEntity :: getCreateTime, endTime);
        // 姓名过滤
        if (StringUtils.isNotBlank(req.getKeyWords())){
            wrapper2.lambda().like(UserWorkProcedureEntity :: getUserName,req.getKeyWords());
        }
        // 工号过滤
        if (StringUtils.isNotBlank(req.getKeyWords2())){
            wrapper2.lambda().eq(UserWorkProcedureEntity :: getUserCode,req.getKeyWords2());
        }

        List<SalaryByDateVO> data = userWorkProcedureMapper.exportWorkFeeByDate(wrapper2);

        if(CollectionUtils.isEmpty(data))
            return  CodeDataResp.valueOfFailed("无记录");

        String fileName = DatePattern.PURE_DATETIME_FORMAT.format(new Date())+sheetName+".xlsx";
        String folderStr="export-excel";
        String userDir = System.getProperties().getProperty("user.dir").concat(File.separator).concat("static");
        String uploadPath = userDir.concat(File.separator).concat(folderStr);
        String filePath = uploadPath.concat(File.separator).concat(fileName);
        String  returnPath=folderStr.concat("/").concat(fileName);

        // 定义表头和数据格式
        List<ExcelHead> headList = new ArrayList();
        headList.add(new ExcelHead<String>("dept", "部门", ""));
        headList.add(new ExcelHead<String>("code", "工号", ""));
        headList.add(new ExcelHead<String>("name", "姓名", ""));
        // 设置日期
        Set<Date> set = new TreeSet<>();
        data.forEach(i->{
            set.add(i.getDay());
        });
        set.forEach(i->{
            String date = DateUtil.format(i, "yyyy-MM-dd");
            headList.add(new ExcelHead(date, date+"工资", 0));
        });
        // 定位 列   日期作为主键
        Map<String,List<Map<String,String>>> map = new HashMap<>();
        Map<String,String> deptMap = new HashMap<>();
        Map<String,String> nameMap = new HashMap<>();
        // 定位 行   某个部门的某个人 工号
        data.forEach(i->{
            // 时间格式化
            String date= DateUtil.format(i.getDay(), "yyyy-MM-dd");
            String key = i.getUserCode();
            if (!deptMap.containsKey(key)){
                deptMap.put(key,i.getGroupName());
            }
            if (!nameMap.containsKey(key)){
                nameMap.put(key,i.getUserName());
            }
            Map<String,String> oneMap = new HashMap<>();
            // 保留两位小数
            oneMap.put(date,String.format("%.2f", (double) i.getTotalSalary() / 100));
            if (map.containsKey(key)){
                map.get(key).add(oneMap);
            }else {
                //
                List<Map<String,String>> salaryList = new ArrayList<>();
                salaryList.add(oneMap);
                map.put(key,salaryList);
            }
        });
        List<Map<String, Object>> dataList = new ArrayList();
        List<Map<String, Object>> finalDataList = dataList;
        map.forEach((k, v)->{
            Map<String, Object> one = new HashMap();
            one.put("code",k);
            one.put("name",nameMap.get(k));
            one.put("dept",deptMap.get(k));
            // 把值设置进去
            v.forEach(one::putAll);
            finalDataList.add(one);
        });
        // List 根据 部门 姓名 排序
        dataList = dataList.stream()
                .sorted(Comparator.comparing(m -> {
                    String dept = (String) m.get("dept");
                    String name = (String) m.get("name");
                    return dept == null ? "" : dept + "-" + (name == null ? "" : name);
                }))
                .collect(Collectors.toList());
        // 设置单元格样式
        HorizontalCellStyleStrategy horizontalCellStyleStrategy =
                new HorizontalCellStyleStrategy(StyleUtils.getHeadStyle(), StyleUtils.getContentStyle());
        ExcelUtils.write(filePath, headList, dataList,fileName,horizontalCellStyleStrategy);
        return  CodeDataResp.valueOfSuccess(returnPath);
    }

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

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

相关文章

[分块][STL][树]【Centroids】不一样的解法

前言 一道好题&#xff0c;也就花了我一个下午而已。 本人做法比较清奇&#xff0c;可以当做开阔思路参考&#xff0c;并不太建议实操&#xff08;太难调了&#xff01;&#xff09;。 文章较啰嗦&#xff0c;谅解。 思路 众所周知&#xff0c;我并不太喜推式子&#xff0…

37.RocketMQ之Broker消息存储源码分析

highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…

javassist implements interface 模拟mybatis 生成代理类

动态创建代理对象的工具类 package com.wsd.util;import org.apache.ibatis.javassist.ClassPool; import org.apache.ibatis.javassist.CtClass; import org.apache.ibatis.javassist.CtMethod; import org.apache.ibatis.session.SqlSession;import java.lang.reflect.Const…

[工业互联-14]:机器人操作系统ROS与ROS2是如何提升实时性的?

目录 第1章 简介 第2章 历史 第3章 特点 &#xff08;1&#xff09;点对点设计 &#xff08;2&#xff09;不依赖编程语言 &#xff08;3&#xff09;精简与集成 &#xff08;4&#xff09;便于测试 &#xff08;5&#xff09;开源 &#xff08;6&#xff09;强大的库及…

ESP32连接云服务器【WebSocket】

ESP32连接云服务器【ESP32宝塔面板】 文章目录 ESP32连接云服务器【ESP32宝塔面板】&#x1f468;‍&#x1f3eb;内容1&#xff1a;背景&#x1f468;‍⚖️内容2&#xff1a;服务器配置&#x1f468;‍&#x1f4bb;内容3&#xff1a;ESP32配置 &#x1f468;‍&#x1f3eb;…

3.5.核函数的定义和使用

目录 前言1. 核函数2. 核函数案例总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-核函数 课程大纲可看下面…

使用infura创建以太坊网络

创建账号 https://www.infura.io/zh 进入控制台Dashboard&#xff0c;选择CREATE API KEY 创建成功后&#xff0c;进入API KEY查看&#xff0c;使用PostMan测试 返回result即为当前区块。

Linux安装配置Oracle+plsql安装配置(超详细)

注意&#xff1a;本文有大量的界面截图&#xff0c;如观看效果不佳可前往文字版&#xff1a; 目录 1 安装虚拟机系统 1.1 安装虚拟机 2.配置虚拟机 2.1 设置机器名 2.2 修改域名映射 2.3 固定IP地址 ​ 2.4 关闭防火墙 2.5 更改安全机制 2.6 重启reboot 3 修改配置 3.1 …

2.深度学习:用Python实现深度神经网络(简单易懂)

深度学习是人工智能领域中的一个热门话题&#xff0c;也是目前业界最具前景和发展潜力的领域之一。本文将会介绍如何用Python实现深度神经网络&#xff0c;编写自己的深度学习模型。作为一篇简单易懂的教程&#xff0c;本文将会从以下两个方面进行讲解&#xff1a;1. 基础知识介…

java环境搭建2-idea安装激活

windows环境装Java开发环境与idea安装激活 安装jdk安装idea激活idea新建项目开启Java学习 java环境搭建2-idea安装激活 之前安装了wslLinux子环境的Java开发环境,但是再许多地方没有人使用vscode进行Java开发,因为环境配置很麻烦,还有各种插件. windows环境装Java开发环境与ide…

尚无忧多城市共享自助台球室台球厅预约开灯开门小程序源码

1、定位功能&#xff1a;可定位附近是否有店 2、能通过关键字搜索现有的店铺 3、个性轮播图展示&#xff0c;系统公告消息提醒 4、个性化功能展示&#xff0c;智能排序&#xff0c;距离、价格排序 5、现有店铺清单展示&#xff0c;订房可查看房间单价&#xff0c;根据日期、…

在 FPGA 上通过 2D CNN 进行高效视频理解的 TSM 网络

在这个项目中&#xff0c;将在线和离线 TSM 网络部署到 FPGA&#xff0c;通过 2D CNN 执行视频理解任务。 介绍 在这个项目中&#xff0c;展示了 Temporal-Shift-Module ( https://hanlab.mit.edu/projects/tsm/)在 FPGA 上解决视频理解问题的实用性和性能。 TSM 是一种网络结构…

C++常用库函数 2.字符分类函数

函数名&#xff1a;isalnum 函数原型&#xff1a;int isalnum(int c)&#xff1b; 所需头文件&#xff1a;<cctype> 功能&#xff1a;测试 c 是否字母或数字。 返回值&#xff1a;如果 c 在 A&#xff5e;Z、a&#xff5e;z 或0&#xff5e;9的范围内&#xff0c;则返回…

002-集成Dubbo

目录 集成架构架构分析 Spring boot 集成引入依赖提供API 调用桥梁添加Dubbo服务服务提供者-服务实现服务提供者-添加配置服务消费者-添加配置服务消费者-配置消费端请求任务服务调用 扩展为什么要新增Dubbo协议 集成 架构 架构分析 Dubbo作为一个RPC调用框架作用就是让服务具…

使用Yfinance和Plotly分析金融数据

大家好&#xff0c;今天我们用Python分析金融数据&#xff0c;使用Yfinance和Plotly绘制图表&#xff0c;带你了解在Python中使用Plotly制作图表&#xff0c;利用Plotly强大的图表功能来分析和可视化金融数据。 导语 在本文中&#xff0c;我们将深入研究Plotly&#xff0c;从…

Linux安装配置Oracle+plsql安装配置(详细)

如果觉得本文不够详细&#xff0c;没有效果图&#xff0c;可移步详细版&#xff1a; Linux安装配置Oracleplsql安装配置&#xff08;超详细&#xff09;_超爱慢的博客-CSDN博客 目录 1.安装虚拟机系统 1.安装虚拟机 2.配置虚拟机 1.设置机器名 2.修改域名映射 3.固定IP…

I.MX RT1170之FlexSPI(4):HyperRAM手册分析和参数配置详解

在上一篇文章中我分析了NOR Flash的手册和FlexSPI的相关配置&#xff0c;在这篇文章中&#xff0c;我将以HyperRAM为例&#xff0c;看看八线的HyperRAM在硬件设计和软件配置上有增加什么引脚和参数&#xff0c;然后以ISIS型号为IS66WVH64M8DALL/BLL的HyperRAM为例&#xff0c;看…

402 · 连续子数组求和

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧 九章算法 - 帮助更多程序员找到好工作&#xff0c;硅谷顶尖IT企业…

微信小程序开发与应用——字体样式设置

要求&#xff1a;设置字体样式。 1、打开微信开发者工具&#xff0c;创建一个小程序&#xff0c;如下&#xff1a; 2、设置小程序的项目名称和路径&#xff0c;并选择开发语言为JavaScript&#xff0c;如下&#xff1a; 3、小程序的主体部分由三个文件组成&#xff0c;且都要…

2023.07.08力扣6题

167. 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xff0c;则 1 < …