关于Easyexcel读取EXCEL合并单元格信息

2023-05-16

关于Easyexcel读取EXCEL合并单元格信息

1.excel模版

@Configuration
public class TestModel {
	/**
	 *  开发部
	 */
	@ExcelProperty(value = "开发部",index = 0)
	private String kaifabu;
	
	/**
	 * A2
	 */
	@ExcelProperty(value = "A2",index = 1)
	private String a2qiyoutian;
	
	/**
	 * 区块
	 */
	@ExcelProperty(value = "区块",index =2)
	private String qukuai;
	
	/**
	 * 项目部
	 */
	@ExcelProperty(value = "项目部",index =3)
	private String xiangmubu;
	
	/**
	 * 开发部
	 */
	@ExcelProperty(value = "开发部1部", index =4)
	private String kaifabu1;

	public String getKaifabu() {
		return kaifabu;
	}

	public void setKaifabu(String kaifabu) {
		this.kaifabu = kaifabu;
	}

	public String geta2qiyoutian() {
		return a2qiyoutian;
	}

	public void seta2qiyoutian(String a2qiyoutian) {
		this.a2qiyoutian = a2qiyoutian;
	}

	public String getQukuai() {
		return qukuai;
	}

	public void setQukuai(String qukuai) {
		this.qukuai = qukuai;
	}

	public String getXiangmubu() {
		return xiangmubu;
	}

	public void setXiangmubu(String xiangmubu) {
		this.xiangmubu = xiangmubu;
	}

	public String getKaifabu1() {
		return kaifabu1;
	}

	public void setKaifabu1(String kaifabu1) {
		this.kaifabu1 = kaifabu1;
	}

	@Override
	public String toString() {
		return "TestModel [kaifabu=" + kaifabu + ", a2qiyoutian=" + a2qiyoutian + ", qukuai=" + qukuai + ", xiangmubu="
				+ xiangmubu + ", kaifabu1=" + kaifabu1 + "]";
	}
}

2.Service层(处理单元格)


@Service
public class TryService extends AnalysisEventListener<Map<Integer,String>>{
// class readModel extends AnalysisEventListener<Map<Integer, String>>{
	
	private static final Logger log = LoggerFactory.getLogger(TryService.class);

		// 所有要插入的数据
		 public static List<TestModel> datas = new ArrayList<>();
			// 缓存上一级跨行的数据
			Map<Integer, String>preContent;
			@Override
			public void invoke(Map<Integer, String> o, AnalysisContext analysisContext) {
				// TODO Auto-generated method stub
				TestModel testModel = new TestModel();
				String kaifabu = o.get(0);
				String a2qiyoutian = o.get(1);
				String qukuai = o.get(2);
				String xiangmubu = o.get(3);
				String kaifabu1 = o.get(4);
				
				// 如果数据是空的话,从缓存对象中取值
				if(StringUtils.isEmpty(kaifabu)){
				kaifabu = preContent.get(0);
				}
				if(StringUtils.isEmpty(a2qiyoutian)) {
				a2qiyoutian = preContent.get(1);
				}
				if(StringUtils.isEmpty(qukuai)) {
				qukuai = preContent.get(2);
				}
				if(StringUtils.isEmpty(xiangmubu)) {
				xiangmubu = preContent.get(3);
				}
				if(StringUtils.isEmpty(kaifabu1)) {
				kaifabu1 = preContent.get(4);
				}
        // 为单元格赋值
				testModel.setKaifabu(kaifabu);
				testModel.seta2qiyoutian(a2qiyoutian);
				testModel.setQukuai(qukuai);
				testModel.setXiangmubu(xiangmubu);
				testModel.setKaifabu1(kaifabu1);
				
				// 将数据放入list
				datas.add(testModel);
				// 复用跨行数据的实现
				String uniquKey = o.get(0);
				if(!StringUtils.isEmpty(uniquKey) || preContent == null) {
					preContent = o;
				}
			}

			@Override
			public void doAfterAllAnalysed(AnalysisContext context) {
				// TODO Auto-generated method stub
				log.info("读取数据完成");
			}
}

	

这里面主要还是基于传统EasyExcel读取信息的原理,在对单元格方面做出了处理,并且excel表格数据都主要存储在datas里面

		// 将数据放入list
			datas.add(testModel);

原理是将合并元格数据放入Map中进行存储,然后对单元格里面的内容进行判断,如果该区间的单元格为空,则将缓存中的值赋给其单元格。

	String uniquKey = o.get(0);
				if(!StringUtils.isEmpty(uniquKey) || preContent == null) {
					preContent = o;
				}

如果A列的值为空,那么说明这是跨行列,如果取的值不是空,那说明这是第一次读取跨行列数据,如果preContent为空,说明这是第一次读取sheet表格的数据

3.Rest层

这里代码比较糙(可能存在不必要的代码),主要是用于测试方法是否合理正确。

@RequestMapping("uploadProjectDepartmentExcel")
	public JSONObject uploadProjectDepartmentExcel(@RequestParam(value = "file") MultipartFile file) {
		JSONObject returnData = new JSONObject();
		JSONObject response = new JSONObject();
		returnData.put("cmd", "uploadProjectDepartmentExcel");
		returnData.put("type", "response");
		returnData.put("response", response);
		
		try {
			// 检验前端数据
			if(file == null || file.isEmpty()) {
				throw new MyException("未找到 file字段");
			}
			// 暂存临时文件
			String path = FilePath.CACHE_PATH + "/uploadFile" + System.currentTimeMillis() + "/";
			String originalFilename = file.getOriginalFilename();
			log.info("缓存文件:"+originalFilename );
			File filepath = new File(path);
			
			// 创建文件夹
			if(!filepath.exists()) {
				filepath.mkdirs();
			}
			// 文件路径
			File uploadFile = new File(path + originalFilename);
			file.transferTo(uploadFile);
			/*************************** 1、读取数据 ***************************/
			// 表单
			int sheetNo = 0;
			// 行数(从该行开始读取)
			int headRownumber = 0;
			EasyExcel.read(uploadFile,new ProjectManagementExcelService()).sheet(sheetNo).headRowNumber(headRownumber).doRead();
			List<ProjectManagementExcelModel> message = ProjectManagementExcelService.datas;
			response.put("res", true);
			response.put("message", message);
		}catch (MyException e) {
			// TODO: handle exception
			log.error("uploadProjectDepartmentExcel",e.getReason());
			response.put("res", false);
			response.put("exception", e.getReason());
		}catch (Exception e) {
			// TODO: handle exception
			log.error("uploadProjectDepartmentExcel",e.getMessage());
			response.put("res", false);
			response.put("exception", e.getMessage());
		}
		return returnData;
	}

试过文本地址和文本流两种方法来导入excel,后来发现通过地址来导入excel是行的通的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Easyexcel读取EXCEL合并单元格信息 的相关文章

  • 从键盘输入一个字符串,分别统计其中的字母,数字和其他字符的个数

    printf 34 请输入一个字符串 n 34 char a 100 int num1 61 0 num2 61 0 num3 61 0 gets a for int i 61 0 a i 61 39 0 39 i 43 43 if a i
  • 域名解析各项记录对应的值

    1 DNS域名解析中添加的各项解析记录 A记录 xff1a 将域名指向一个IPv4地址 xff08 例如 xff1a 100 100 100 100 xff09 xff0c 需要增加A记录 CNAME记录 xff1a 如果将域名指向一个域名
  • 数据结构———队列的顺序实现

    define MaxSize 100 define ElemType int typedef struct ElemType data MaxSize int front rear SeqQueue void InitQueue SeqQu
  • 直接插入排序

    include lt stdio h gt include lt math h gt include lt string h gt include lt stdlib h gt int main void InsertSort int a
  • C++枚举类型enum使用方法(附带可用代码+通俗易懂)

    1 说明 枚举用来表示某类事情的结果 xff1b 例1 xff1a 下棋比赛的三种结果 xff0c 赢 xff0c 和 xff0c 输 xff1b 这里是描述比赛的结果 例2 xff1a 一周7天中的俩种结果 xff0c 工作日和非工作日
  • 关于python+opencv无法打开摄像的问题

    一开始我认为是软件的兼容问题 xff0c 苦苦思考 xff08 按照流程自己去第三方库里乱下一波是绝对不会出现这种无法打开摄像头的奇葩问题 xff09 xff0c 最终参考网上的教程 xff0c 尝试用系统的相机打开 xff0c 看 xff
  • 蓝桥杯每日一题(28)七段码(python)

    Topic 试题 D 七段码 本题总分 xff1a 10 分 问题描述 小蓝要用七段码数码管来表示一种特殊的文字 上图给出了七段码数码管的一个图示 数码管中一共有 7 段可以发光的二极管 xff0c 分别标记为 a b c d e f g
  • 数据结构之顺序表(C语言)

    目录 1 线性表 1 1 线性表的概念 xff1a 1 2 线性表数据的存储方式 xff1a 注意 xff1a 2 顺序表 2 1 概念 2 2 顺序表的存储结构 3 顺序表的各种操作函数实现 3 1 顺序表初始化 3 2 顺序表判满函数
  • Posix与System V共享内存区

    Posix与System V共享内存区 一 Posix共享内存区1 概述2 shm open和shm unlink函数3 ftruncate和fstat函数4 给一个共享的计数器持续加1 例子5 向一个服务器发送消息例子 二 System
  • ARM裸机开发——Linux环境搭建和LED灯闪烁实验

    写在前面 本文为学校开展的嵌入式系统设计课程 xff0c 本文主要是记录课程中的相关作业与学习记录 xff0c 本课程采用了S3C2440A嵌入式系统开发板 xff0c 由于主要以学校开展课程为主 xff0c 本文内容可能有一定的课程资料辅
  • Linux文件系统常用命令

    文件系统常见目录 boot 包含系统内核 xff0c 系统启动时加载到内存 etc 含系统配置文件 var 含系统中变化信息 xff08 如日志 xff09 的目录 dev 可直接对物理设备存取的特殊文件 bin
  • PTA_Python3_企业根据利润提成发放奖金问题

    企业根据利润提成发放奖金问题 利润低于或等于10万元时 xff0c 奖金可提10 xff1b 利润高于10万元 xff0c 低于20万元时 xff0c 低于10万元的部分按10 提成 xff0c 高于10万元的部分 xff0c 可提成7 5
  • 【4大运营商光猫默认初始超级密码】

    4大运营商光猫默认初始超级密码 xff1a 1 电信超级密码 telecomadmin nE7jA 5m 2 移动超级密码 CMCCAdmin aDm8H MdA 3 联通超级密码 CUAdmin CUAdmin 4 广电超级密码 admi
  • 写delete时遇到的问题

    在写delete的时候会跳出错误 ConsoleApplication1 exe Win32 已加载 C Windows SysWOW64 ntdll dll 无法查找或打开 PDB 文件 ConsoleApplication1 exe W
  • 宏定义可以自增自减吗?(带题讲解,并总结C语言数据类型可自加自减的)

    不可以 通过实验我们可以得出double型数据可以自加 xff0c 且每次变化为1 在宏定义下自加出现了错误 xff0c 如下 xff1a 总结int char double float 都可进行自加自减运算
  • Linux下将当前目录下的某个文件复制到指定文件夹

    cp filename home directory 即cp 文件名 目标文件夹的绝对路径 批量复制 cp filename1 filename2 filename3 home directory 即cp 文件1名 文件2名 文件3名 目标
  • centos的命令行个性化配置

    centos的命令行个性化配置 cd root 进入配置文件 vim bashrc 在末行输入 PS1 61 34 debian chroot 43 debian chroot e 32 1m u e 0m 64 h e 34 1m w e
  • 数据库作业:数据查询 连接查询

    若一个查询同时涉及两个以上的表 xff0c 称之为连接查询 连接查询是数据库中最主要的查询 xff0c 包括等值连接查询 xff0c 自然连接查询 xff0c 自身连接查询等 一 等值和非等值连接查询 1 1连接查询的WHERE子句中用来连
  • Ubuntu20.04安装arm-linux-gcc

    我安装的版本是arm linux gcc 4 6 4 xff0c 并且是64位的 在windows系统中把arm linux gcc 4 6 4 arm x86 64 tar bz2压缩包放在跟Ubuntu虚拟机的共享目录下在Ubuntu2
  • OSI七层模型总结

    OSI Open System Inter Connection 开放系统互联模型 定义了不同计算机互联的标准 xff0c 设计和描述了计算机网络通信的框架 OSI有7层和5层两种模型 xff0c 7层模型从上往下分别是 xff1a 应用层

随机推荐

  • 23种Python设计模式之工厂方法模式详解

    x1f496 作者 xff1a 大家好 xff0c 我是阿旭 x1f61c x1f389 支持我 xff1a 点赞 x1f44d 收藏 留言 x1f4dd x1f4e3 系列专栏 xff1a 23种设计模式详解 Python x1f341
  • STM32F103C8T6驱动SG90舵机--通过延时

    前言 最近博主在尝试驱动SG90舵机的时候 xff0c 发现网上教程都是通过定时器的方式 xff0c 还要进行各种配置 xff0c 太麻烦了 xff0c 于是自己用延时简单写了一下 xff0c 也能用 舵机的控制 舵机控制就是需要一个20m
  • MyBatis-Plus 分页设置不生效

    分页不生效的原因都是拦截器的问题 添加拦截器有两种情况 在配置类上加拦截器 64 Configuration public class MyBatisPlusConfig 新增分页拦截器 xff0c 并设置数据库类型为mysql 64 Be
  • 【关于使用SpringJUnit4ClassRunner单元测试报错问题】

    关于使用SpringJUnit4ClassRunner单元测试报错问题 今天单元测试如下的代码的时候发现项目老是报错 xff1a package com yhb jsxn service import java text SimpleDat
  • Arch linux使用yay安装软件时有效性检查错误

    错误 xff1a 一个或多个文件没有通过有效性检查 span class token operator 61 61 span span class token operator gt span 正在验证 span class token b
  • 无人驾驶(四)---远程桌面控制工具: NoMachine踩坑记录

    NoMachine for mac是一款免费的远程桌面访问工具 xff0c 这款软件的连接到远程桌面后延迟可以非常低 xff0c NX协议在高延迟低带宽的链路上提供了近乎本地速度的响应能力 xff0c 打破空间和时间的障碍 xff0c 让您
  • ubuntu 20.04安装配置ssh远程服务中出现的一些问题及总结

    0 安装配置过程参考 56条消息 ubuntu20 04开启SSH远程登录 从此开始低调范 的博客 CSDN博客 ubuntu开启ssh远程登录 1 输入sudo apt get install openssh server提示Readin
  • OSPF综合实验配置

    1 R4为ISP 其他只能配置IP地址 xff0c R4与其他所有直连设备间使用公有IP 与R4相连的路由器R3 5 6 7都要做NAT 保证底层私网能ping通公网 xff1b R4直连的路由器有缺省指向R4 xff0c 每台路由器都要有
  • 双向重发布--路由策略实验报告

    题目要求 xff1a 1 两个协议间进行多点双向重发布 2 R7环回没有宣告在OPSF中 xff0c 而是后期重发布进入 xff1b 3 解决环路 xff0c 所有路径选择最优 xff0c 且存在备份 一 配置底层IP地址 R3 int g
  • VLAN实验

    实验拓扑 实验配置 1 将接口划入vlan 2 配置路由器 xff0c 通过池塘下发地址 测试 pc2可以访问pc4 pc5 pc6 pc5不能访问pc6 pc1可以访问2 4 5 6
  • TCP三次握手四次挥手(图解)

    TCP三次握手 TCP连接的建立是一个三次握手的过程 如图所示 xff1a 主机A xff08 通常也称为客户端 xff09 发送一个标识了SYN的数据段 xff0c 表示期望与服务器A建立连接 xff0c 此数据段的序列号 xff08 s
  • kali换源详细步骤

    1 进入sources list文件编辑模式 2 把kali原有的源注释掉 xff0c 把阿里源放进去 deb span class token property https span span class token punctuatio
  • C/C++中的1<<n什么意思?

    1 lt lt 2 1的二进制是00000001 lt lt 意思是将二进制编码向左移动2位并将空位补0 即00000001转化为00000100 61 4 同理 1 gt gt n 为将二进制码向右移动n位
  • Linux 文本文件编码GBK转UTF-8

    Linux服务器中调用Oracle卸数工具sqluldr2 xff0c 数据库编码为GBK 需要卸UTF 8的数据文件出来 xff0c 如果某个字段为中文 xff0c 因为GBK为两个字节 xff0c UTF 8为三个字节 xff0c 同样
  • PHP-RCE绕过的姿势总结

    文章目录 前言一 命令执行空格过滤取反绕过命令分隔符黑名单绕过 xff08 比如flag字符 xff09 拼接编码单双引号的绕过 二 代码执行linux中的直接查看文件内容工具通过命令行写入webshell无数字字母绕过webshell无回
  • 一些文件目录架构知识

    在Linux内所有的数据都是以文件的形式来呈现 xff0c 因此 xff0c 在Linux系统中最重要的地方就在于目录树架构 目录树架构 xff1a 指以根目录 xff08 用斜线 表示 xff09 为主 xff0c 然后向下呈现为分支状的
  • date、cal、bc命令简单的使用

    在Linux系统中的命令是严格区分大小写的 xff0c 换句话说就是 xff0c 在Linux环境中字母大小写是不一样的东西 date 显示日期与时间 用法 xff1a 直接在命令行模式中输入 date 敲回车 xff1a 格式化输出功能
  • 几个常见处理目录的命令

    xff5e cd 切换目录 进入当前使用者 debian11 的家目录 xff1a 或者 xff1a cd 去到目前的上层目录 xff1a cd 去到指定的文件的目录 xff1a cd 绝对路径 回到刚刚那个目录 xff1a cd pwd
  • Win10系统下安装JDK8笔记

    一 下载安装包 1 浏览器搜索Oracle的官网 xff1a https www oracle com xff0c 进入如下页面 xff1a 2 点击头部标题栏上的 Products 产品 xff0c 此时会有二级标题显示出来 xff0c
  • 关于Easyexcel读取EXCEL合并单元格信息

    关于Easyexcel读取EXCEL合并单元格信息 1 excel模版 span class token annotation punctuation 64 Configuration span span class token keywo