EsayExcle的简单使用

2023-11-01

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>easyexcel</artifactId>
  <version>1.1.2-beta5</version>
</dependency>复制代码
public class OrderExcelBO extends BaseRowModel {
 
    @ExcelProperty(value = {"订单ID"}, index = 0)
    private String id;
 
    /**
     * 订单描述
     */
    @ExcelProperty(value = {"订单描述"}, index = 2)
    private String description;
 
    /**
     * 订单对应产品id
     */
    @ExcelProperty(value = {"产品ID"}, index = 2)
    private Integer productId;
 
    /**
     * 支付方式描述,如:apple pay
     */
    @ExcelProperty(value = {"支付方式"}, index = 3)
    private String payMethod;
 
    /**
     * create_time
     */
    @ExcelProperty(value = {"时间"}, index = 4)
    private String createTime;
 
    /**
     * update_time
     */
    private String updateTime;
 
    /**
     * 产生订单的用户
     */
    @ExcelProperty(value = {"用户ID"}, index = 5)
    private Integer userId;
 
    /**
     * 支付状态:0 未支付、1支付成功支付完成、-1支付失败
     */
    @ExcelProperty(value = {"支付状态"}, index = 6)
    private String status;
 
    /**
     * 订单来源描述,如:ios 安卓
     */
    @ExcelProperty(value = {"手机型号"}, index = 7)
    private String platform;
 
    /**
     * 订单流水
     */
    @ExcelProperty(value = {"订单流水号"}, index = 8)
    private String flowNum;
 
    /**
     * 订单金额
     */
    @ExcelProperty(value = {"金额"}, index = 9)
    private BigDecimal price;
 
    // @ExcelProperty(value = {"收据字段"}, index = 10)
    private String receipt;
 
    @ExcelProperty(value = {"APP来源"}, index = 10)
    private String sources;
}

在这里插入图片描述
在这里插入图片描述

public class ExcelListener extends AnalysisEventListener {
 
   /**
    * 自定义用于暂时存储data。
    * 可以通过实例获取该值
    */
   private List<Object> datas = new ArrayList<>();
 
   /**
    * 通过 AnalysisContext 对象还可以获取当前 sheet,当前行等数据
    */
   @Override
   public void invoke(Object object, AnalysisContext context) {
      //数据存储到list,供批量处理,或后续自己业务逻辑处理。
      datas.add(object);
      //根据业务自行 do something
      doSomething();
        /*
        如数据过大,可以进行定量分批处理
        if(datas.size()<=100){
            datas.add(object);
        }else {
            doSomething();
            datas = new ArrayList<Object>();
        }
         */
   }
 
   /**
    * 根据业务自行实现该方法
    */
   private void doSomething() {
   }
 
   @Override
   public void doAfterAllAnalysed(AnalysisContext context) {
        /*
            datas.clear();
            解析结束销毁不用的资源
         */
   }
 
   public List<Object> getDatas() {
      return datas;
   }
 
   public void setDatas(List<Object> datas) {
      this.datas = datas;
   }
}
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.BaseRowModel;
import com.alibaba.excel.metadata.Font;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.TableStyle;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.mochu.exception.ExcelException;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.springframework.web.multipart.MultipartFile;
 
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
 
public class ExcelUtil {
    /**
     * 读取 Excel(多个 sheet)
     *
     * @param excel 文件
     * @param rowModel 实体类映射,继承 BaseRowModel 类
     * @return Excel 数据 list
     */
    public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel) {
        ExcelListener excelListener = new ExcelListener();
        ExcelReader reader = getReader(excel, excelListener);
 
        if (reader == null) {
            return null;
        }
 
        for (Sheet sheet : reader.getSheets()) {
            if (rowModel != null) {
                sheet.setClazz(rowModel.getClass());
            }
            reader.read(sheet);
        }
 
        return excelListener.getDatas();
    }
 
    /**
     * 读取某个 sheet 的 Excel
     *
     * @param excel 文件
     * @param rowModel 实体类映射,继承 BaseRowModel 类
     * @param sheetNo sheet 的序号 从1开始
     * @return Excel 数据 list
     */
    public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo) {
        return readExcel(excel, rowModel, sheetNo, 1);
    }
 
    /**
     * 读取某个 sheet 的 Excel
     *
     * @param excel 文件
     * @param rowModel 实体类映射,继承 BaseRowModel 类
     * @param sheetNo sheet 的序号 从1开始
     * @param headLineNum 表头行数,默认为1
     * @return Excel 数据 list
     */
    public static List<Object> readExcel(MultipartFile excel, BaseRowModel rowModel, int sheetNo, int headLineNum) {
        ExcelListener excelListener = new ExcelListener();
        ExcelReader reader = getReader(excel, excelListener);
 
        if (reader == null) {
            return null;
        }
 
        reader.read(new Sheet(sheetNo, headLineNum, rowModel.getClass()));
 
        return excelListener.getDatas();
    }
 
    /**
     * 导出 Excel :一个 sheet,带表头
     *
     * @param response HttpServletResponse
     * @param list 数据 list,每个元素为一个 BaseRowModel
     * @param fileName 导出的文件名
     * @param sheetName 导入文件的 sheet 名
     * @param object 映射实体类,Excel 模型
     */
    public static void writeExcel(HttpServletResponse response, List<? extends BaseRowModel> list, String fileName,
                                  String sheetName, BaseRowModel object) {
        ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);
        Sheet sheet = new Sheet(1, 0, object.getClass());
        sheet.setSheetName(sheetName);
 
        TableStyle tableStyle = new TableStyle();
        tableStyle.setTableContentBackGroundColor(IndexedColors.WHITE);
        Font font = new Font();
        font.setFontHeightInPoints((short) 9);
        tableStyle.setTableHeadFont(font);
        tableStyle.setTableContentFont(font);
        sheet.setTableStyle(tableStyle);
 
        writer.write(list, sheet);
        writer.finish();
    }
 
    /**
     * 导出 Excel :多个 sheet,带表头
     *
     * @param response HttpServletResponse
     * @param list 数据 list,每个元素为一个 BaseRowModel
     * @param fileName 导出的文件名
     * @param sheetName 导入文件的 sheet 名
     * @param object 映射实体类,Excel 模型
     */
    public static ExcelWriterFactory writeExcelWithSheets(HttpServletResponse response,
                                                          List<? extends BaseRowModel> list, String fileName,
                                                          String sheetName, BaseRowModel object) {
        ExcelWriterFactory writer = new ExcelWriterFactory(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);
        Sheet sheet = new Sheet(1, 0, object.getClass());
        sheet.setSheetName(sheetName);
        sheet.setTableStyle(getTableStyle());
        writer.write(list, sheet);
 
        return writer;
    }
 
    /**
     * 导出融资还款情况表
     *
     * @param response
     * @param list
     * @param fileName
     * @param sheetName
     * @param object
     */
    public static void writeFinanceRepayment(HttpServletResponse response, List<? extends BaseRowModel> list,
                                             String fileName, String sheetName, BaseRowModel object) {
        ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);
        Sheet sheet = new Sheet(1, 0, object.getClass());
        sheet.setSheetName(sheetName);
        sheet.setTableStyle(getTableStyle());
        writer.write(list, sheet);
 
        for (int i = 1; i <= list.size(); i += 4) {
            writer.merge(i, i + 3, 0, 0);
            writer.merge(i, i + 3, 1, 1);
        }
 
        writer.finish();
    }
 
    /**
     * 导出文件时为Writer生成OutputStream
     */
    private static OutputStream getOutputStream(String fileName, HttpServletResponse response) {
        //创建本地文件
        fileName = fileName + ".xls";
 
        try {
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
            response.addHeader("Content-Disposition", "filename=" + fileName);
 
            return response.getOutputStream();
        } catch (Exception e) {
 
            throw new ExcelException("导出异常!");
        }
    }
 
    /**
     * 返回 ExcelReader
     *
     * @param excel 需要解析的 Excel 文件
     * @param excelListener new ExcelListener()
     */
    private static ExcelReader getReader(MultipartFile excel, ExcelListener excelListener) {
        String filename = excel.getOriginalFilename();
 
        if (filename == null || (!filename.toLowerCase().endsWith(".xls") && !filename.toLowerCase().endsWith(".xlsx"))) {
            throw new ExcelException("文件格式错误!");
        }
        InputStream inputStream;
 
        try {
            inputStream = new BufferedInputStream(excel.getInputStream());
 
            return new ExcelReader(inputStream, null, excelListener, false);
        } catch (IOException e) {
            e.printStackTrace();
        }
 
        return null;
    }
 
    /**
     * 资金收支导出 Excel :一个 sheet,带表头
     *
     * @param response HttpServletResponse
     * @param list 数据 list,每个元素为一个 BaseRowModel
     * @param fileName 导出的文件名
     * @param sheetName 导入文件的 sheet 名
     * @param object 映射实体类,Excel 模型
     */
    public static void exportFundBudgetExcel(HttpServletResponse response, List<? extends BaseRowModel> list,
                                             String fileName, String sheetName, BaseRowModel object) throws IOException {
        ExcelWriter writer = new ExcelWriter(getOutputStream(fileName, response), ExcelTypeEnum.XLSX);
        Sheet sheet = new Sheet(1, 0, object.getClass());
        sheet.setSheetName(sheetName);
        sheet.setTableStyle(getTableStyle());
 
        writer.write(list, sheet);
        writer.merge(2, 3, 0, 0);
        writer.merge(4, 13, 0, 0);
        writer.merge(14, 14, 0, 1);
        writer.finish();
    }
 
    /**
     * 读取Excel表格数据,封装成实体
     *
     * @param inputStream
     * @param clazz
     * @param sheetNo
     * @param headLineMun
     * @return
     */
    public static Object readExcel(InputStream inputStream, Class<? extends BaseRowModel> clazz, Integer sheetNo,
                                   Integer headLineMun) {
        if (null == inputStream) {
 
            throw new NullPointerException("the inputStream is null!");
        }
 
        ExcelListener listener = new ExcelListener();
        ExcelReader reader = new ExcelReader(inputStream, valueOf(inputStream), null, listener);
        reader.read(new Sheet(sheetNo, headLineMun, clazz));
 
        return listener.getDatas();
    }
 
    /**
     * 根据输入流,判断为xls还是xlsx,该方法原本存在于easyexcel 1.1.0 的ExcelTypeEnum中。
     */
    public static ExcelTypeEnum valueOf(InputStream inputStream) {
        try {
            FileMagic fileMagic = FileMagic.valueOf(inputStream);
 
            if (FileMagic.OLE2.equals(fileMagic)) {
                return ExcelTypeEnum.XLS;
            }
 
            if (FileMagic.OOXML.equals(fileMagic)) {
                return ExcelTypeEnum.XLSX;
            }
 
            throw new ExcelException("excelTypeEnum can not null");
 
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
 
    /**
     * 设置全局样式
     *
     * @return
     */
    private static TableStyle getTableStyle() {
        TableStyle tableStyle = new TableStyle();
 
        tableStyle.setTableContentBackGroundColor(IndexedColors.WHITE);
        Font font = new Font();
        font.setBold(true);
        font.setFontHeightInPoints((short) 9);
        tableStyle.setTableHeadFont(font);
        Font fontContent = new Font();
        fontContent.setFontHeightInPoints((short) 9);
        tableStyle.setTableContentFont(fontContent);
 
        return tableStyle;
    }
}
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.IOException;
import java.io.OutputStream;
import java.util.List;
 
public class ExcelWriterFactory extends ExcelWriter {
   private OutputStream outputStream;
   private int sheetNo = 1;
 
   public ExcelWriterFactory(OutputStream outputStream, ExcelTypeEnum typeEnum) {
      super(outputStream, typeEnum);
      this.outputStream = outputStream;
   }
 
   public ExcelWriterFactory write(List<? extends BaseRowModel> list, String sheetName, BaseRowModel object) {
      this.sheetNo++;
      try {
         Sheet sheet = new Sheet(sheetNo, 0, object.getClass());
         sheet.setSheetName(sheetName);
         this.write(list, sheet);
      }
      catch(Exception ex) {
         ex.printStackTrace();
         try {
            outputStream.flush();
         }
         catch(IOException e) {
            e.printStackTrace();
         }
      }
      return this;
   }
 
   @Override
   public void finish() {
      super.finish();
      try {
         outputStream.flush();
      }
      catch(IOException e) {
         e.printStackTrace();
      }
   }
}复制代码
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EsayExcle的简单使用 的相关文章

  • vue自定义穿梭框支持远程滚动加载

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 技术框架公司的选型 老项目 vue2 iview ui 方案的实现思路是共性的 展现UI样式需要你们自定义进行更改 因为iview是全局注入
  • 加密解密相关→EncryptUtils

    import android util Base64 import java io File import java io FileInputStream import java io IOException import java sec
  • 【工具类】发送邮件表格html生成类

    发送邮件的时候 有时候要自己拼html画一个表格 嫌麻烦就写了个工具类 核心类MailTableBuilder import java util MailTableCell author zgd date 2022 8 25 17 43 p
  • 读取文件最后N行

    转自 http www zuidaima com share 1550463669226496 htm 指定行数 可以获取到从这行到文件尾的所有行 分享自大熊 源文件 读取最后10行结果 代码下载地址 http www zuidaima c
  • java实现5种不同的验证码图片,包括中文、算式等,并返回前端

    导入以下依赖
  • TSDB时序数据库-OpenTSDB

    TSDB时序数据库 OpenTSDB 背景 一 概念 二 使用引入 背景 需要及时获取短信发送消息队列的堆积情况 pass将相关信息及时的存入了opentsdb时序数据库中 现需要读取时序数据库将堆积情况以短信形式通知 一 概念 时间序列数
  • zip解压

    1 使用apache的ant解压 org apache tools zip 2 引入pom
  • HBuilder html 乱码解决,java eclipse等应当同理

    1 网上下载了一套html代码 出现乱码 一般就是编码格式问题 2 解决方式 更改编码 3 剪切所有内容 然后右下角修改编码为utf 8 4 再粘贴内容 5 访问页面
  • java实现域名解析

    java实现域名解析 域名解析过程 浏览器检查是否有该域名缓存 检查本机host文件之内是否有该域名对应ip 检查本机DNS缓存 递归或迭代向DNS根域名服务器获取该域名ip地址 1 windows控制台 win r 输入cmd进入控制台
  • Ubuntu 14.04 apt-get update失效解决

    当运行apt get update后出现如下错误时 E Some index files failed to download they have been ignored or old ones used instead 可以将目录下 v
  • window10安装CUDA7.0-8.0-9.0

    因为需求 没办法 window10 x64 家庭版 无所谓 VS 2013 专业版 x64 现在安装CUDA 顺序 CUDA 9 0 176 CUDA 8 0 61 CUDA 7 0 27 CUDA9 0是完整安装 8 0和7 0 不要安装
  • idea使用vim

    idea使用vim 安裝ideaVim插件 在idea中直接搜索插件 ideaVim 并安装 配置vim 在 home 目录下创建 ideavimrc文件 如在 windows 系统中 则在 C Users xxxx 下建 在 ideavi
  • 【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio构建Java、Python项目

    文章目录 一 云IDE 1 云IDE简介 2 云IDE和云虚拟桌面区别 二 Cloud Studio 简介 1 简介 2 AI代码助手 3 企业源代码安全 三 快速开始 1 登录Cloud Studio 2 新建工作空间 3 代码空间 四
  • RedisTemplate lettuce 实现分布式锁

    springboot2 x 以上使用redis时 默认使用了lettuce封装 比起jedis线程安全 import lombok extern slf4j Slf4j import org springframework data red
  • Android 调用系统发短信界面,给指定号码发短信,并带短信内容

    工具类如下ContentUtil java package com zhoucj messagedemo util import android content Context import android content Intent i
  • OpenSSL中文手册之EVP库详解

    1EVP 概览 1 1 EVP 简介 Openssl EVP high level cryptographic functions 1 提供了丰富的密码学中的各种函数 Openssl 中实现了各种对称算法 摘要算法以及签名 验签算法 EVP
  • 序列化工具

    import java io ByteArrayInputStream import java io ByteArrayOutputStream import java io Closeable import java io ObjectI
  • Base64图片编码的使用

    一 base64编码介绍 二 base64图片使用介绍 三 base64图片编码大小与原图文件大小之间的联系 四 代码实现 一 base64编码介绍 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一 Base64编码可用于
  • Java基础之随机生成数字和字母

    原文地址 http blog csdn net yaodong y article details 8115250 字母与数字的ASCII码 目 前计算机中用得最广泛的 字符集及其编码 是由美国国家标准局 ANSI 制定的ASCII码 Am
  • easyExcel实战:(五)写Excel设置excel的样式

    一 主要是设置Excel的字体大小和颜色 目前还不支持单元格内容居中和自动适应宽度 定义Excel正文背景颜色 TableStyle tableStyle new TableStyle tableStyle setTableContentB

随机推荐

  • uni app 录音结束监听_Taro vs uni-app选型对比

    公司新产品要求发布到各家小程序 最近研究对比了社区主流的几家小程序开发框架 独坑不如拉人众坑 分享给各位 欢迎和我一起入坑 背景 最近老板不知怎的很重视各种小程序平台 感觉要靠小程序完成今年大半kpi 产品和运营自然找我们要方案 一方面要快
  • 海思3559A上编译FFmpeg源码操作步骤

    1 从https github com FFmpeg FFmpeg releases 下载你需要的版本 2 因为ffmpeg编译选项较多 为了更方便的了解有哪些选项 可将编译选项写入到一个文本文件configure help txt中 执行
  • 在 Python 中逐行打印字典的项目

    Python 中逐行打印字典的项目 使用 dict items 方法获取字典项目的视图 使用 for 循环遍历视图 使用 print 函数逐行打印字典的项目 my dict id 1 name jiyik age 30 for key va
  • hive 压缩编码

    文章目录 1 hadoop 压缩编码 1 1 MR支持的压缩编码 2 编码 解码器 3 压缩性能的比较 4 压缩配置参数 2 hive压缩编码 2 1 如何查看hive支持的压缩 2 1 hive编码的选择 2 2 配置 1 hadoop
  • 解决问题Caused by: java.net.UnknownHostException

    在Java中 java net UnknownHostException 异常表示无法解析主机名 这意味着你尝试连接的主机名无法解析为 IP 地址 可能的原因有 主机名错误 请确保输入的主机名正确 网络连接问题 请检查网络是否连接正常 DN
  • Maven的安装以及环境的配置

    一 准备工作 1 确定电脑上已经成功安装jdk7 0以上版本 2 win10操作系统 win7操作系统 3 maven安装包 下载地址 http maven apache org download cgi 二 解压Maven安装包 在上述地
  • Django连接数据库出错

    pymysql可能出现的版本不匹配问题 第一个问题 File D virtualenv wx lib site packages django db backends mysql base py line 36 in
  • 最新Tesseract-OCR源码编译1——leptonica编译

    上次写了Tesseract OCR 3 02命令行程序的简单使用 同时官网上给出了3 02版本基于VS2008平台的编译工程 但对于最新源码只是说了在VS2015 3 05 和VS2013 3 04 的编译 还是英文的 且网上关于最新源码的
  • iOS各版本发布时间和特点

    iOS各版本发布时间和特点 iOS9 发布时间2015年6月9日 特性 更新于开发的内容 1 iOS9系统发送的网络请求将统一使用HTTPs 将不再默认使用HTTP等不安全的网络协议 而默认采用TLS 1 2 服务器因此需要更新 以解析相关
  • errno 104:connetction reset by peer的错误分析

    https blog csdn net alibo2008 article details 45694845 errno 104错误表明你在对一个对端socket已经关闭的的连接调用write或send方法 在这种情况下 调用write或s
  • Meta为全天候AR眼镜设计了AI系统的八大指导方针

    众所周知 Meta不仅局限在Quest这类VR头显上 同时还在打造更轻量化的AR眼镜 目标就是让产品更好的融入到人们的日常生活中去 除了硬件上轻量化以外 在功能和交互体验上也至关重要 例如自然交互方式 比如手势输入 以及AI视觉助手等 这其
  • Ros中可视化工具rqt 命令

    rqt工具箱可视为ROS数据的界面调试工具 rosrun rqt 按tab键 可以查看所有的rqt工具 以下介绍为常用的命令 目录 1 rqt tf tree 2 rqt graph 3 rqt plot 4 rqt topic 1 rqt
  • vue-cli 方式创建 uni-app 项目(支持快捷键)

    文章目录 1 前言 2 创建 uni app 3 删除多余依赖 4 支持快捷键 5 安装 uni ui 及 sass 6 配置 easycom 7 运行 1 前言 由于习惯了 VSCode 的使用 本着快速交付 不需要转换开发思维 不需要更
  • 跟ChatGPT同源插件,专为测试人的开放,快来看看吧

    3 月 23 日 OpenAI 又投出了一枚重磅炸弹 为 ChatGPT 推出插件系统 此举意味着 ChatGPT 将迎来 APP Store 时刻 也就是围绕它的能力 形成一个开发者生态 打造出基于 AI 的 操作系统 插件系统将为 Ch
  • [知识图谱实战篇] 八.HTML+D3绘制时间轴线及显示实体

    前面作者讲解了很多知识图谱原理知识 包括知识图谱相关技术 Neo4j绘制关系图谱等 但仍缺少一个系统全面的实例 为了加深自己对知识图谱构建的认识 为后续创建贵州旅游知识图谱打下基础 作者深入学习了张宏伦老师的网易云课程 星球系列电影 并结合
  • Linux系统版本信息查看

    一 查看Linux内核版本命令 方法1 cat proc version root localhost cat proc version Linux version 3 10 0 957 el7 x86 64 mockbuild kbuil
  • 型号不同的计算机内存条可以通用么,笔记本内存条和台式机通用吗

    电脑分为笔记本和台式机 这两者里面都有一个很重要的部件就是内存条 虽然作用都是相同的 但两者却是不一样的 那么笔记本内存条和台式机通用吗 答案是不可以 下面小编会给大家详细介绍不能通用的原因 以及笔记本内存条怎么装 看型号等等问题 笔记本内
  • 【Chisel入门——数据类型与操作符号】

    文章目录 前言 Chisel开发环境部署 安装步骤 环境测试 实验环境问题说明 数据类型 UInt SInt Bool Vec T Bundle 操作符 总结 前言 前面的部分简单介绍了Chisel 新型敏捷硬件开发语言 也简单说明了开发环
  • 黑马并发编程JUC(信号量、线程安全类)总结

    黑马并发编程JUC总结 9 JUC Semaphore 定义 原理 acquire release CountDownLatch 为什么需要用到CountDownLatch 定义 为什么加载的时候需要使用到countDownLock 商品问
  • EsayExcle的简单使用