SpringBoot 使用easypoi.excel实现导入解析数据,并结合数据字典实现对数据的校验

在日常开发工作中避免不了的功能需求:导入Excel文件,然而导入文件流操作、对数据的校验有是件麻烦事,自从接触了easypoi后,觉得封装的很好,很简洁。

使用的主要依赖如下:

<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.5.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.5.0</version>
</dependency>
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.5.0</version>
</dependency>

controller不贴了,这里贴一下serviceImpl

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;@Autowired
private DictHandler dictHandler;
@Autowired
private Bd3OrderHandlerNew bd3OrderHandlerNew;// Bd3OrderDetailExcelNew 是导入的承载实体类
private List<Bd3OrderDetailExcelNew> checkNewExcel(MultipartFile excel, IExcelVerifyHandler verifyHandler) {ImportParams importParams = new ImportParams();importParams.setNeedVerify(true);// 这里是对表格字段一些不为空、正则的判断importParams.setVerifyHandler(verifyHandler);// 这里是数据字典的校验importParams.setDictHandler(dictHandler);// 这里是表格的表头  根据自己需求进行更改String[] importFields = {"序号", "用户终端序列号", "终端用户类型", "使用区域", "使用人姓名", "使用人证件号", "使用人联系电话", "服务频度", "通讯等级","自建编组数量", "区域与全球是否互通", "系统回执", "频度接收系统调控", "北二与北三是否互通", "是否应急搜救用户", "搜救中心ID", "检测报告编号", "北斗卡号"};importParams.setImportFields(importFields);ExcelImportResult<Bd3OrderDetailExcelNew> excelResult;InputStream in = null;try {in = excel.getInputStream();excelResult = ExcelImportUtil.importExcelMore(in, Bd3OrderDetailExcelNew.class, importParams);} catch (Exception e) {e.printStackTrace();throw new RdssException(MessageExceptionEnum.CUSTOM_CODE.getCode(), "表格内容错误,请重新上传正确格式的入网注册详表!");} finally {ThreadLocal<List<Bd3OrderDetailExcelNew>> threadLocal = bd3OrderHandlerNew.getThreadLocal();if (threadLocal != null) {threadLocal.remove();}IOUtils.closeQuietly(in);}List<Bd3OrderDetailExcelNew> failList = excelResult.getFailList();if (ObjectUtil.isNotEmpty(failList)) {throw new RdssException(MessageExceptionEnum.EXCEL_CODE.getCode(),MessageExceptionEnum.EXCEL_CODE.getMessage(), failList);}List<Bd3OrderDetailExcelNew> resultList = excelResult.getList().stream().filter(bd3OrderDetailExcelNew -> bd3OrderDetailExcelNew.getApplyIndex() != null).collect(Collectors.toList());if (resultList.isEmpty()) {throw new RdssException(ResponseCodeEnum.FAIL.getCode(), "导入Excel内容为空");}return resultList;}

对表格数据的校验

其中的IExcelVerifyHandler是对表格字段的校验,需要自己去实现,例如我的实现类为Bd3OrderHandler

import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
import com.rdss.bus.model.entity.ApplyOrderBd3DetailInfo;
import com.rdss.bus.model.entity.Terminal;
import com.rdss.bus.model.excel.Bd3OrderDetailExcelNew;
import com.rdss.bus.service.*;
import com.rdss.common.util.StringUtils1;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;
import java.util.StringJoiner;@Slf4j
@Service
public class Bd3OrderHandlerNew implements IExcelVerifyHandler<Bd3OrderDetailExcelNew> {private ThreadLocal<List<Bd3OrderDetailExcel>> threadLocal = ThreadLocal.withInitial(LinkedList::new);@Autowiredprivate TermianlBdcardService termianlBdcardService;@Autowiredprivate BdcardService bdcardService;@Autowiredprivate SysUserService sysUserService;@Autowiredprivate BdcardService tBusBdcardService;@Autowiredprivate TermianlService termianlService;@Autowiredprivate ApplyOrderBd3DetailInfoService aoBd3DetailInfoService;@Overridepublic ExcelVerifyHandlerResult verifyHandler(Bd3OrderDetailExcelNewdetailExcel) {StringJoiner joiner = new StringJoiner(",");if(isAllFieldNull(detailExcel)){return new ExcelVerifyHandlerResult(true);}List<Bd3OrderDetailExcelNew> detailExcelList = threadLocal.get();if (detailExcelList == null) {detailExcelList = new LinkedList<>();}if(detailExcel.getApplyIndex() == null){joiner.add("[序号]不能为空");}if (StringUtils1.isEmpty(detailExcel.getTerminalSerialNumber())) {joiner.add("[用户终端序列号]不能为空");}if(!detailExcel.getTerminalSerialNumber().matches("^[0-9]{14}([0-9]{2})?$")){joiner.add("[终端序列号]格式错误");}if(detailExcel.getCardType() == null){joiner.add("[北斗卡类型]不能为空");}if(StringUtils1.isEmpty(detailExcel.getUsageArea())){joiner.add("[使用区域]不能为空");}if(StringUtils1.isEmpty(detailExcel.getUserName())){joiner.add("[使用人姓名]不能为空");}// 添加本行数据对象到ThreadLocal中detailExcelList.add(detailExcel);threadLocal.set(detailExcelList);if (joiner.length() != 0) {return new ExcelVerifyHandlerResult(false, joiner.toString());}//查询数据库是否存在机构编号if( detailExcel.getApplyIndex() != detailExcelList.size()){joiner.add("[序号]错误");}String terminalSerialNumber = detailExcel.getTerminalSerialNumber();if(termianlService.getByNum(terminalSerialNumber)!=null) {Terminal terminal = termianlService.getByNum(terminalSerialNumber);if (termianlBdcardService.terminalnumber(terminal.getId()) > 0) {joiner.add("[终端号]已和北斗卡绑定");}}List<ApplyOrderBd3DetailInfo> terminal00= aoBd3DetailInfoService.getListByTerminal(terminalSerialNumber);if(terminal00.size()!=0){joiner.add("[终端序列号]重复提交申请,请确认");}if (joiner.length() != 0) {return new ExcelVerifyHandlerResult(false, joiner.toString());}return new ExcelVerifyHandlerResult(true);}/*** 是否是空表?**/public boolean isAllFieldNull(Bd3OrderDetailExcel detailExcel) {try {for (Field f : detailExcel.getClass().getDeclaredFields()) {f.setAccessible(true);if(f.getName().equals("rowNum") || f.getName().equals("errorMsg")){continue;}if (f.get(detailExcel) != null && org.apache.commons.lang3.StringUtils.isNotBlank(f.get(detailExcel).toString())) {return false;}}} catch (Exception e) {log.error("程序异常,错误信息为{}", e);}return true;}public ThreadLocal<List<Bd3OrderDetailExcelNew>> getThreadLocal() {return threadLocal;}public void removeThreadLocal () { threadLocal.remove(); }

数据字典的处理

针对导入表格单元格存在下拉框选项,获取对应的数值时,需要数据字典解决:

import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.rdss.bus.model.entity.DictionaryData;
import com.rdss.bus.service.DictionaryDataService;
import com.rdss.common.entity.Dictionary;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;@Slf4j
@Service
public class DictHandler implements IExcelDictHandler, InitializingBean {@Autowiredprivate DictionaryDataService dictionaryDataService;private HashOperations<String, Object, Object> dictHash;@Autowiredpublic void setDictHash(RedisTemplate<String, Object> redisTemplate) {this.dictHash = redisTemplate.opsForHash();}@Overridepublic String toName(String dict, Object obj, String name, Object value) {if (value==null) {return null;}Map<Object, Object> map = dictHash.entries(dict);Set<Map.Entry<Object, Object>> entrySet = map.entrySet();String key = "";for(Map.Entry<Object, Object> entry : entrySet){if(entry.getValue().equals(value)){key = String.valueOf(entry.getKey());}}return key;}@Overridepublic String toValue(String dict, Object obj, String name, Object value) {if (value==null) {return null;}Object dictType = dictHash.get(dict, value);return String.valueOf(dictType);}@Overridepublic void afterPropertiesSet() {List<DictionaryData> dictionaryDataList = dictionaryDataService.list(new QueryWrapper<DictionaryData>().lambda().eq(DictionaryData::getStatus, 1));List<Dictionary> dictList = dictionaryDataService.getDictionaryList();dictList.stream().forEach(str->{Map<String,Object> tagMap=new HashMap<>(8);dictionaryDataList.stream().filter(dict -> {Integer id = str.getId();Integer dictId = str.getId();return (dictId!=null && id.equals(dictId));}).forEach(dict->tagMap.put(dict.getTag(),dict.getKey()+""));dictHash.putAll(str.getType(),tagMap);});}
}

其中数据字典 是分类操作,比如字典标题是汽车颜色,对应子字典子集有红色、白色、黑色等
这是字典标题
这是字典子集信息
父字典:

import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.rdss.common.vo.DictionaryData2;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Transient;import java.io.Serializable;
import java.sql.Timestamp;
import java.util.List;@Data
@Accessors(chain = true)
@TableName("t_sys_dictionary")
public class Dictionary implements Serializable {private static final long serialVersionUID = 1L;/*** ID*/@TableId(value = "id", type = IdType.AUTO)private Integer id;/*** 字典名称*/@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)private String name;/*** 字典值*/@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)private String type;/*** 更新时间*/@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Timestamp updateTime;/***状态:0 正常 ,1 停用*/private Integer status;/*** 备注*/@TableField(insertStrategy = FieldStrategy.IGNORED,updateStrategy = FieldStrategy.IGNORED,whereStrategy = FieldStrategy.IGNORED)private String remark;@Transient@TableField(exist = false)private List<DictionaryData2> datas;
}

子字典:

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.time.LocalDateTime;@Data
@TableName("t_sys_dictionary_data")
public class DictionaryData{/*** ID*/@TableIdprivate Integer id;/*** 字典主表id*/private Integer dictId;/*** 字典标签*/private String tag;/*** 字典标签-英文*/private String tagEn;/*** 字典键值*/private Integer key;/*** 状态:1-正常,2-停用*/private Integer status;/*** 更新时间*/private LocalDateTime updateTime;/*** 备注*/private String remark;}

涉及导入表格的实体类

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.handler.inter.IExcelDataModel;
import cn.afterturn.easypoi.handler.inter.IExcelModel;
import lombok.Data;/*** @author ztz* @date 2023/9/4 13:16*/
@Data
public class Bd3OrderDetailExcelNew implements IExcelDataModel, IExcelModel {/*** 行号*/private Integer rowNum;/*** 错误消息*/private String errorMsg;/*** 申请序号*///@NotNull(message = "不能为空")@Excel(name = "序号")private Integer applyIndex;/*** 终端序列号*///@NotBlank(message = "不能为空")@Excel(name = "用户终端序列号")private String terminalSerialNumber;/*** 北斗卡类型/终端用户类型(1:民用智能卡、2:民用指挥卡)1.日常通信卡,2.数据监测卡,3.应急指挥卡,4.其他类型卡*///@NotNull(message = "不能为空")@Excel(name = "终端用户类型",dict = "terminal_user_type")private Integer cardType;/*** 使用区域*///@NotBlank(message = "不能为空")@Excel(name = "使用区域")private String usageArea;/*** 使用人姓名*///@NotBlank(message = "不能为空")@Excel(name = "使用人姓名")private String userName;/*** 使用人证件号*///@NotBlank(message = "不能为空")@Excel(name = "使用人证件号")private String userIdNumber;/*** 使用人联系电话*///@NotBlank(message = "不能为空")@Excel(name = "使用人联系电话")private String userMobile;/*** 使用频度/服务频度*///@NotNull(message = "不能为空")@Excel(name = "服务频度",dict = "bdcard_frequency")private Integer frequency;@Excel(name = "通讯等级",dict = "bdcard_level")private Integer cardLevel;/**.* 自建编组数量*///@NotNull(message = "不能为空")@Excel(name = "自建编组数量",dict = "group_number")private Integer groupNumber;/*** 区域与全球是否互通  开通1  不开通0*/@Excel(name = "区域与全球是否互通",dict = "local_global_Inter_flow")private Integer localGlobalInterflow;/*** 系统回执*/@Excel(name = "系统回执",dict = "sys_receipt")private Integer sysReceipt;/***  频度接收系统调控 0否1是*/@Excel(name = "频度接收系统调控",dict = "frequency_rec_sys")private Integer frequencyRecSys;/*** 北二与北三是否互通*/@Excel(name = "北二与北三是否互通",dict = "bd2_bd3_lInter_flow")private Integer bd2Bd3Interflow;/*** 是否应急搜救用户 0否1是*/@Excel(name = "是否应急搜救用户",dict = "emergency_search_rescue_user")private Integer emergencySearchUser;/*** 搜救中心ID*///@NotBlank(message = "不能为空")@Excel(name = "搜救中心ID")private String searchCenterId;//    /**
//     * 通播号
//     */
//    @Excel(name = "通播号")
//    private String broadcastNum;
///*** 新申请到的北斗卡号*/@Excel(name = "北斗卡号")private String cardNum;@Excel(name = "检测报告编号")private String testNumber;//    @Override
//    public Integer getRowNum() {
//        return null;
//    }
//@Overridepublic void setRowNum(Integer rowNum) {this.rowNum = rowNum+1;}
}

一些其他工具类 可以参考 可有可无代码

异常:

import lombok.Data;@Data
public class RdssException extends RuntimeException{private Integer code;private String errorMessage;private transient  Object data;public RdssException() {}public RdssException(String message) {super(message);this.errorMessage=message;}public RdssException(Integer code,String message) {super(message);this.code=code;this.errorMessage=message;}public RdssException(Integer code,String message,Object data) {super(message);this.code=code;this.errorMessage=message;this.data=data;}public RdssException(MessageExceptionEnum exception) {super(exception.getMessage());this.code = exception.getCode();this.errorMessage = exception.getMessage();}
}

枚举:

package com.rdss.common.exception;/*** 消息服务异常集合**/
public enum MessageExceptionEnum  {QUEUE_CANT_EMPTY(600, "消息队列不能为空"),MESSAGE_ID_CANT_EMPTY(601, "消息id不能为空"),MESSAGE_BODY_CANT_EMPTY(602, "消息body不能为空"),CANT_FIND_MESSAGE(603, "查找不到消息"),MESSAGE_NUMBER_WRONG(604, "消息数量错误"),MESSAGE_QUEUE_ERROR(605, "消息队列服务器处理异常"),MESSAGE_TYPE_ERROR(606, "消息接收到的格式错误,非TEXT类型"),CUSTOM_CODE(4, "发生异常"),EXCEL_CODE(5, "excel数据不正确"),INVALIDTOKEN(500,"令牌失效"),SERVER_NOTCOMPLETE(501,"服务未启动"),USERNAME_PWD_ERROR(400, "用户名或密码错误");MessageExceptionEnum(int code, String message) {this.code = code;this.message = message;}private Integer code;private String message;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

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

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

相关文章

Spring -- 使用XML开发MyBatis

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 文章目录 MyBatis XML配置文件开发配置连接字符串和MyBatis写Mapper层代码添加mapper接口添加UserInfoXmLMapper.xml 操作数据库INSERTDELETE & UPDATE MyBatis XML配置文件开发 实际上,除…

谷粒商城实战笔记-64-商品服务-API-品牌管理-OSS前后联调测试上传

文章目录 1&#xff0c;拷贝文件到前端工程2&#xff0c;局部修改3&#xff0c;在品牌编辑界面使用上传组件4&#xff0c;OSS配置允许跨域5&#xff0c;测试multiUpload.vue完整代码singleUpload.vue完整代码policy.js代码 在Web应用开发中&#xff0c;文件上传是一项非常常见的…

MongoDB - 聚合阶段 $group 的使用

文章目录 1. 构造测试数据1. 示例 12. 示例23. 示例34. 示例45. 示例5 2. 构造测试数据1. 示例12. 示例23. 示例3 在 MongoDB 中&#xff0c;$group 是聚合管道中的一个阶段&#xff0c;用于根据指定的条件对文档进行分组。 {$group: {_id: <expression>, // 分组的依据…

Dubbo 黑白名单机制详解

在微服务架构中&#xff0c;服务间的安全和流量控制是非常重要的。在众多 Java 微服务框架中&#xff0c;Apache Dubbo 作为一款高性能的 RPC 框架&#xff0c;提供了丰富的功能来管理服务调用。在 Dubbo 中&#xff0c;黑白名单机制是保障服务安全性和可控性的一个重要手段。本…

Vue el-input 中 readonly和disabled的区别详解

在 Vue.js 的 Element UI 组件库中&#xff0c;el-input 是一个常用的输入框组件。readonly 和 disabled 是两个常见的属性&#xff0c;用于控制输入框的交互行为&#xff0c;但它们之间存在显著的差异。下面将详细解释这两个属性的区别。 readonly 定义&#xff1a;readonly…

USB描述符实例和介绍

具体的描述符每个字节的含义可参考USB2.0协议 一个标注的描述符集合 /*********************************/ 设备描述符[18]{0x12, //固定 bLength字段。设备描述符的长度为18(0x12)字节0x01, //固定 bDescriptorType字段。设备描述符的编号为0x010x10,0x01, //bcdUSB字…

uniapp中@click或者@tap多层嵌套的问题解决方法

我们在开发页面的过程中。例如要设计一个九宫格的相册&#xff0c;并且加上删除上传图片和点击图片后预览图片大图的功能例如下图的演示功能。 点击图片后显示大图预览图片&#xff0c;点击x号后要删除掉当前的图片&#xff0c;那么我们设计的时候如果我们代码写成如下的格式 …

【C语言】栈的实现(数据结构)

前言&#xff1a; 还是举一个生活中的例子&#xff0c;大家都玩过积木&#xff0c;当我们把积木叠起来的时候&#xff0c;如果要拿到最底部的积木&#xff0c;我们必须从顶端一个一个打出&#xff0c;最后才能拿到底部的积木&#xff0c;也就是后进先出&#xff08;先进后出&a…

硬件厂家行业进销存系统开发之门票预约,源码解析css样式

采用技术未来之窗web行业应用弹窗对话框artDialog 未来之窗web行业应用弹窗对话框artDialog: 网页弹窗&#xff0c;独立使用单文件版本&#xff0c;可指定位置&#xff0c;左上&#xff0c;左下&#xff0c;中间&#xff0c;右侧&#xff0c;下册&#xff0c;左侧&#xff0c;…

微信小程序结合后端php发送模版消息

前端&#xff1a; <view class"container"><button bindtap"requestSubscribeMessage">订阅消息</button> </view> // index.js Page({data: {tmplIds: [UTgCUfsjHVESf5FjOzls0I9i_FVS1N620G2VQCg1LZ0] // 使用你的模板ID},requ…

vue+canvas音频可视化

1.代码 <template><div class"subGuide"><canvas id"canvas"></canvas><br><audio id"audio" src"./audio.mp3" controls></audio></div> </template><script> export…

48、PHP 实现冒泡排序法

题目&#xff1a; PHP 实现冒泡排序法 描述&#xff1a; /** 第1趟&#xff1a;3, 6, …2, 6, 3, …2, 6, 3, 4, …2, 6, 3, 4, 10, …1, 6, 3, 4, 10, 2, …1, 6, 3, 4, 10, 2, 9, …1, 6, 3, 4, 10, 2, 9, 8, …1, 6, 3, 4, 10, 2, 9, 8, 5, …1, 6, 3, 4, 10, 2, 9, 8, 5…

音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版

Guitar Pro 8.2 for Mac 中文破解版是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xff0c;重现喜爱的歌曲或陪伴自己。 Guitar Pro for Mac 是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xf…

做一个能和你互动玩耍的智能机器人之一

2024年被很多人称为AI元年&#xff0c;其实AI元年的叫法由来以久&#xff0c;近年来每一次AI技术的进步&#xff0c;都有很多圈内人大呼AI元年&#xff0c;但不仅一直风声不大&#xff0c;雨点也偏小&#xff0c;都是小范围交流。 得益于软硬件的进步&#xff0c;AI今年开始侵…

深度学习系列70:模型部署torchserve

1. 流程说明 ts文件夹下&#xff0c; 从launcher.py进入&#xff0c;执行jar文件。 入口为model_server.py的start()函数。内容包含&#xff1a; 读取args&#xff0c;创建pid文件 找到java&#xff0c;启动model-server.jar程序&#xff0c;同时读取log-config文件&#xff…

数据库表结构创建

一、原型图 二、分析 1、天气&#xff0c;值字段只有实测值&#xff0c;可用一个字段表示&#xff08;单位、来源同上&#xff09; 2、气温有默认值与实测值两个选项&#xff0c;一个字段无法表示默认值与实测值&#xff08;单位&#xff0c;来源同上&#xff09; 3、因为有…

【Kettle实现神通(数据库)MPP增量、全量数据ETL,同步任务Linux运行(通用)】

1、背景介绍 具体Kettle操作步骤不做过多介绍&#xff0c;主要技术方案说明&#xff0c;Kettle8.2版本放在底部链接提取&#xff0c;本次采用Kettle实现源端&#xff1a;神通数据通用库、目标端&#xff1a;神通MPP增量数据同步&#xff0c;并在服务器端运行Job。 2、windows…

【AIGC】构建自己的谷歌搜索引擎服务并使用

一、谷歌 谷歌的搜索引擎需要自己创建服务才能启用检索api。&#xff08;需自行翻墙和创建自己的谷歌账号&#xff09; 1.1 API服务创建 1&#xff09;登陆https://console.cloud.google.com/: 2&#xff09; 选择新建项目&#xff0c;取号项目名即可&#xff08;比如:Olin…

在 Windows 搭建 flink 运行环境并模拟流数据处理

一、引入 在大数据场景中,开发者追求高效与灵活,Linux 系统以其稳定性成为众多组件的首选,但在资源有限的情况下,在本机搭建一个 Linux 虚拟机集群却显得过于笨重,启动、运行占资源,需要配置网络,无法和windows共享资源,尤其是对只有 8GB 内存的 Windows 系统用户来说…

钙成像数据建模为行为事件

摘要 我在触摸屏盒中记录了小鼠在进行行为学习任务时的钙映像数据。 我想找到一种方法来整合神经数据&#xff08;100 个个体细胞随时间的活动&#xff08;约 30,000 x 约 30 毫秒时间段&#xff09;&#xff09;和行为数据&#xff08;动物在行为任务期间做出的时间戳动作和决…