使用EasyExcel添加Excel数据

2023-11-09

一、导入excel代码
1、pom文件:

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>easyexcel</artifactId>
			<version>1.1.2-beta4</version>
		</dependency>

2、实体类:

@Data
@EqualsAndHashCode(callSuper = true)
public class UploadChildProject extends BaseRowModel{
	//这里index=0是指定顺序
	@ExcelProperty(value = {"序号","项目名称","物业类型","省","市","区"},index = 0)
	private String serialNumber;

	@ExcelProperty(value = {"序号","项目名称","物业类型","省","市","区"},index = 1)
	private String buildingName;

	@ExcelProperty(value = {"序号","项目名称","物业类型","省","市","区"},index = 2)
	private String propertyTypeName;
	private String propertyTypeCode;
	@ExcelProperty(value = {"序号","项目名称","物业类型","省","市","区"},index = 3)
	private String provinceName;
	/**
	 * 省code
	 */
	private String provinceCode;
	@ExcelProperty(value = {"序号","项目名称","物业类型","省","市","区"},index = 4)
	private String cityName;
	/**
	 * 城市code
	 */
	private String cityCode;
	@ExcelProperty(value = {"序号","项目名称","物业类型","省","市","区"},index = 5)
	private String areaName;
	/**
	 * 区code
	 */
	private String areaCode;
	/**
	 * 导入失败行的备注
	 */
	private String remarks;
	/**
	 * 是否已经标注错误原因;true 已标注  false 未标注
	 */
	private boolean flag;
}

3、导入代码:

/**
	 * 导入
	 * @param file
	 * @return
	 */
	@PostMapping("/file/upload")
	public R importChildProjects(@Param( "file" ) MultipartFile file){
		if (null == file ) {
			R.fail("文件为空,请核对后重新导入!");
		}else if(file.isEmpty()){
			R.fail("文件为空,请核对后重新导入!");
		}
		String originalFilename = file.getOriginalFilename();
		if ( !StringUtils.endsWithIgnoreCase(originalFilename, ExcelTypeEnum.XLSX.getValue())) {
			R.fail("请使用模板导入!");
		}
		List<UploadChildProject> uploadChildProjectList = null;
		try {
			//需要指定sheetNo
			uploadChildProjectList = EasyExcelUtils.readByModel(file.getInputStream(), UploadChildProject.class, 4, 1);
			System.out.println("sheet4"+ JSON.toJSONString(uploadChildProjectList));
		} catch (Exception e) {
			log.error( "导入子项目失败:",e );
		}
		return null;
	}	

遇坑:
excel使用wps打开,在隐藏sheet并加上保护工作簿的密码后,导入时会找不到指定的sheetNo;
excel使用office打开,在隐藏sheet并加上保护工作簿的密码后,导入时正常!
都取消保护工作簿的密码后,导入时正常!
总结:wps是免费产品坑多;建议使用office;

二、在已存在的excel中添加数据:

业务需求:需要在已经存在的excel模板中添加数据,并返回给前端;
代码:

@GetMapping("/addExcel2")
	public void downloadFile(HttpServletResponse response) throws IOException {
		OutputStream outputStream = null;
		try {
			response.setContentType("application/x-msdownload");
			String name = "xxxx.xlsx";
			// 设置头消息
			response.setHeader("Content-Disposition", "attachment;filename=" + new String(name.getBytes("utf-8"), "iso-8859-1"));
			outputStream = response.getOutputStream();
			Sheet sheet2 = new Sheet(4,3);
			sheet2.setStartRow( 0 );
			EasyExcelUtils.onlineExcel( getLists(data()),sheet2 ,outputStream,nationalExcelMould);
		}catch (Exception e ){
			log.error( "导入错误:",e );
		}finally {
			if (outputStream != null) {
				outputStream.flush();
				outputStream.close();
			}
		}
	}

工具类:

import com.alibaba.excel.EasyExcelFactory;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.support.ExcelTypeEnum;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/***
 * easyExcel文件操作类
 */
public class EasyExcelUtils {

    public static void onlineExcel(List<List<String>> data,Sheet sheet,OutputStream out,String url){
        try {
        	//直接读取线上的excel
            InputStream inputStream =  new URL( url ).openStream();
            ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(inputStream,out,ExcelTypeEnum.XLSX,true);
            writer.write0(data, sheet);
            writer.finish();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void writeWithoutHead() throws IOException{
        InputStream inputStream =  Thread.currentThread().getContextClassLoader().getResourceAsStream(""+"area.xlsx" );
        OutputStream out = new FileOutputStream("area2.xlsx");
        ExcelWriter writer = EasyExcelFactory.getWriterWithTemp(inputStream,out,ExcelTypeEnum.XLSX,true);
        //写第一个sheet, sheet1  数据全是List<String> 无模型映射关系
        Sheet sheet1 = new Sheet(4, 3);
        sheet1.setStartRow(0);
        List<List<String>> data = new ArrayList<>();
        List<String> test1 = new ArrayList<>();
        test1.add("123");
        test1.add("1234");
        test1.add("住宅");
        test1.add("福建省");
        test1.add("厦门市");
        test1.add("海沧区");
        data.add(test1);
        writer.write0(data, sheet1);
        writer.finish();
    }
    /**
     * 导出文件
     */
    public static void writeByModel(List<? extends BaseRowModel> data, Sheet sheet,OutputStream outputStream){
        ExcelWriter excelWriter = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX, true);
        excelWriter.write(data,sheet);
        excelWriter.finish();
    }

    /**
     * 读取文件
     * @param inputStream 需解析文件的流
     * @param clazz 继承excel文件解析基础类BaseRowModel 的子类
     * @param sheetNo 工作表编号
     * @param headLineMun 行号,从第几行开始解析
     * @return
     */
    public static List readByModel(InputStream inputStream,Class<? extends BaseRowModel> clazz,int sheetNo, int headLineMun){
        ExcelTypeEnum excelTypeEnum = ExcelTypeEnum.valueOf(inputStream);
        // 解析每行结果在listener中处理
        EasyExcelListener<?> listener = new EasyExcelListener<>();
        ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
        //默认只有一列表头
        excelReader.read(new Sheet(sheetNo,headLineMun,clazz));
        return  listener.getDataList();
    }

    /**
     * 多sheet导出文件
     */
    public static void writeMultiSheetByModel(List<? extends BaseRowModel> data, List<Sheet> sheets,OutputStream outputStream){
        ExcelWriter excelWriter = new ExcelWriter(outputStream, ExcelTypeEnum.XLSX, true);
        sheets.forEach(sheet -> {
            excelWriter.write(data,sheet);
        });
        excelWriter.finish();
    }

    /**
     * 多sheet读取文件
     * @return
     */
    public static EasyExcelListener readMultiSheetByModel(InputStream inputStream,Class<? extends BaseRowModel> clazz,ExcelTypeEnum excelTypeEnum, int headLineMun){
        // 解析每行结果在listener中处理
        EasyExcelListener<?> listener = new EasyExcelListener<>();
        ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
        List<Sheet> sheets = excelReader.getSheets();
        sheets.forEach(sheet -> {
            sheet.setHeadLineMun(headLineMun);
            sheet.setClazz(clazz);
            excelReader.read(sheet);
        });
        return  listener;
    }

    /**
     * 获取ExcelReader
     * @return
     */
    public static ExcelReader getExcelReader(InputStream inputStream, ExcelTypeEnum excelTypeEnum,EasyExcelListener listener){
        // 解析每行结果在listener中处理
        ExcelReader excelReader = new ExcelReader(inputStream, excelTypeEnum, null, listener);
        return excelReader;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用EasyExcel添加Excel数据 的相关文章

随机推荐

  • 关于SOC、态势感知,5种常见的关联分析模型

    引言 在很多安全分析类产品建设的过程中都会涉及到关联分析 比如日志分析 soc 态势感知 风控等产品 关联分析可以认为是这类产品中最核心的能力之一 这个东西从名字上看就知道 千人千面 每个人的想法和理解都不一样 很多甲方都会提关联分析 但你
  • vue 路由切换动画(滑入,滑出效果)

    最近做的一个小项目 需要做路由切换 页面滑入滑出的效果 总结下实现的思路和方法 router view 用 transition 标签包裹 router view 组件 动态添加动画名 data 里定义transitionName变量
  • 四种访问修饰符

    Java中修饰符分为两种 访问修饰符和非访问修饰符 修饰符中 有一些修饰符可以既可以修饰类 也可以修饰方法 但是有一些修饰符只能修饰符方法 今天这篇文章先介绍一下四种访问修饰符 1 private修饰符 private表示私有的 既然是私有
  • C++ 大话设计之《简单工厂模式》(优缺点,设计原理,常用场景)

    简单工厂是一种创建型模式 优点 简单工厂模式能够提高生产效率和生产力 缺点 简单工厂模式将所有产品的创建逻辑集中在一个工厂类中 一旦这个工厂类出现问题 整个系统都会受到影响 如果要添加新的产品类 需要修改工厂类的代码 违反了开闭原则 对扩展
  • 史上最全的2023年最新版Android面试题集锦(含答案解析)

    前言 又到了一年的金三银四黄金求职季 虽说今年以来 经济回暖 但行业岗位缺口紧缩的趋势恢复还需一段时间 尤其对于Android开发而言 想要跳槽到一个高薪岗位更是难上加难 因此 想要杀出重围 必然要有万全的准备 除了一份美观的简历 还必须刷
  • 这梦想笑开了花---Day15

    题记 散尽这满腔的爱和忧伤 任这一往无前的气势澎湃 我在这 要走下去 转正快要一个月了 来这博客也有半个月了 算是在这个行业入了门 每天的忙碌略感疲惫 但这白天公司里编写后台的代码 晚上回家自己钻研着前端的开发 倒也乐此不疲的享受着 有朋友
  • C++STL之list容器

    一 list特性 list为带哨兵位双向循环链表 支持任意位置的插入和删除 与 array vector deque 相比 list的移除元素效率更高 最大缺陷是不支持 重载 不支持随机访问 只能通过迭代器进行线性开销的迭代 二 list的
  • 创建窗口

    工作涉及到了opengl的boom的demo 看到了learn opengl中有 所以 从头学起 顺便记录下 链接https learnopengl cn readthedocs io zh latest 01 20Getting 20st
  • GAN,IGBT, MOSFET

    作者 集微网 校对 团团 集微网 爱集微APP 各大主流应用商店均可下载 集微网消息 功率半导体是电子电力装置电能转换与电路控制的核心器件 根据Yole数据 中国已经成为全球最大的功率半导体消费市场 预计至2021年 全球功率器件市场规模将
  • Substance designer 瓦片贴图制作

    瓦片贴图制作 因为最终在unity应用 所以采用BaseColor Metallic Roughness Normal Height贴图的工作流程 对于瓦片的细节上 可以分为 基色 上下两种 污渍 水渍 苔藓 裂痕 如果你研究Substan
  • 使用ffmpeg获取一帧摄像头数据

    最近在研究FFmpeg 比较惊讶的是网上一大堆资料都是在说如何从已有的视频中截取一帧图像 却很少说到如何直接从摄像头中捕获一帧图像 其实我一直有个疑问 就是在Linux下 大家是用什么库来采集摄像头的 opencv 还是自己写v4l2的代码
  • HDOJ1052

    先用最快马比 不行再用最慢马比 都不行 就送最慢马给忘得最快马 include
  • git提交本地仓库至远端

    文章目录 1 创建完项目结构 没有分支 2 在github上新建远程仓库 3 按照上图中红色框中的命令 就可以提交本地 4 提交过程中可能会遇到全局配置文件config 中没有配置用户和邮箱地址的情况 5 git pull push每次都需
  • CSS布局—— float布局和flex布局

    用什么CSS布局 当需要兼容IE9时 使用float布局 当需要兼容IE9且不需要兼容最新浏览器时 使用flex布局 当不需要兼容IE9 需要兼容最新浏览器时 使用grid布局 float布局 父元素 添加clearfix类 清楚浮动bug
  • c++生成uuid

    不引用uuid h生成uuid方式 转自How can I generate UUID in c without using boost library Stack Overflow include
  • vue 时间插件_基于 Vue+Gantt 构建甘特图组件

    昨天给大家推荐了一款H5甘特图插件dhtmlxGantt 今天给大家分享如何在Vue项目中实现甘特图插件 基于dhtmlx gantt插件来实现在vue js项目中创建甘特图 安装依赖 首先需要安装 dhtmlx gantt 模块 npm
  • 对于任何一颗二叉树,若其终端节点数为n0,度为2的结点数为n2,则n0=n2+1

    对于任何一颗二叉树 若其终端节点数为n0 度为2的结点数为n2 则n0 n2 1 设度为0的结点数为n0 度为1的结点数为n1 度为2的结点数为n2 边数为T 第一种方案 由一个节点开始构建二叉树 观察图片 初始状态为n0 1 n1 0 n
  • python数据持久存储:pickle模块的基本使用

    经常遇到在Python程序运行中得到了一些字符串 列表 字典等数据 想要长久的保存下来 方便以后使用 而不是简单的放入内存中关机断电就丢失数据 这个时候Pickle模块就派上用场了 它可以将对象转换为一种可以传输或存储的格式 python的
  • Android入门(一)AndroidStudio下的APP目录结构介绍

    Project Name 工程项目名称 Application Name 当前应用发布以后的名字 例如QQ图标下面的名字是 QQ 就是Application Name Android Studio工程目录 1 gradle和 idea 这两
  • 使用EasyExcel添加Excel数据

    一 导入excel代码 1 pom文件