EasyPoi实现excel多sheet导入

2023-11-07

EXCEL

导入模板

在这里插入图片描述

MAVEN

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

Controller

package io.btm.modules.importexcel;

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.result.ExcelImportResult;
import io.btm.common.utils.R;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;


@RestController
@RequestMapping("importExcel")
public class ExcelController {

    /**
     * 导入
     */
    @PostMapping("import")
    @ApiOperation(value = "导入")
    public R ordergeneratexml(MultipartFile file) throws Exception {
        //根据file得到Workbook,主要是要根据这个对象获取,传过来的excel有几个sheet页
        Workbook hssfWorkbook = getWorkBook(file);
        //获取sheet数量
        int sheetNum = hssfWorkbook.getNumberOfSheets();
        ImportParams params = new ImportParams();
        //表头在第几行
        params.setTitleRows(3);
        //是否需要通过key-value导入方法,获取特定字段
        params.setReadSingleCell(true);
        //判断一个cell是key的规则,可以自定义,默认就是 “:”
        params.setKeyMark(":");
        List<ExcelVo> listAll = new ArrayList<>();
        for (int sheetIndex = 0; sheetIndex < sheetNum; sheetIndex++) {
            //第几个sheet页
            params.setStartSheetIndex(sheetIndex);
            //获取表头下的数据
            ExcelImportResult<ExcelVo> result = ExcelImportUtil.importExcelMore(file.getInputStream(), ExcelVo.class, params);
            List<ExcelVo> list = result.getList();
            //获取特定字段的map
            Map<String, Object> map = result.getMap();
            list.forEach(entity -> {
                entity.setRukuriqi(map.get("日期:").toString());
                entity.setDianpumingchen(map.get("店铺名:").toString());
            });
            listAll.addAll(list);
        }
        return R.ok().put("listAll", listAll);
    }

    public static Workbook getWorkBook(MultipartFile file) throws IOException {
        //这样写excel能兼容03和07
        InputStream is = file.getInputStream();
        Workbook hssfWorkbook = null;
        try {
            hssfWorkbook = new HSSFWorkbook(is);
        } catch (Exception ex) {
            is =file.getInputStream();
            hssfWorkbook = new XSSFWorkbook(is);
        }
        return hssfWorkbook;
    }

}

实体类VO

package io.btm.modules.importexcel;

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ExcelVo {
    @Excel(name = "序号")
    private String indexNum;
    @Excel(name = "品名")
    private String name;
    @Excel(name = "订货数(斤)")
    private String dinghuoNum;
    @Excel(name = "去皮斤数")
    private String qupiNum;
    @Excel(name = "去皮斤数")
    private String sunhaoNum;
    @Excel(name = "供货单价")
    private String gonghuoNum;
    @Excel(name = "订单金额")
    private String dingnanNum;
    @Excel(name = "订单金额")
    private String qupijine;
    @Excel(name = "订单金额")
    private String sunhaojine;
    @Excel(name = "产品差价")
    private String chanpindanjia;
    @Excel(name = "实际结账")
    private String shijijiezhang;
    @Excel(name = "是否结款")
    private String shifoujiekuan;
	@Excel(name = "是否结款")
    private String beizhu;
    private String rukuriqi;
    private String dianpumingchen;
}

源码地址
开发指南

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

EasyPoi实现excel多sheet导入 的相关文章

  • Spark集群搭建记录

    本文目录 写在前面 step1 Spark下载 step2 修改环境变量 bashrc etc profile step3 配置Master 文件修改 slaves spark env sh step4 配置slave节点 step5 集群
  • 图形图像基础 之 jpeg介绍

    一 概念 jpeg相关概念简介 jpeg 一种影像有损压缩标准方法 后缀jpg jpeg JPEG Joint Photographic Experts Group 联合图像专家小组 是一种针对照片影像而广泛使用的有损压缩标准方法 面向连续
  • 【报错】onMounted is called when there is no active component instance too be associated with.

    文章目录 报错 分析 解决 报错 onMounted is called when there is no active component instance too be associated with Lifecycle injecti
  • 统计分析:聚类分析(详细讲解)

    聚类分析是研究 物以类聚 的一种方法 人类认识世界往往首先将被认识的对象进行分类 早起人们主要靠经验和专业知识实现分类 但随着生产技术和社会科学的发展 对分类学的要求越来越高 靠经验和专业知识来分类越来越难 于是数学这一有力工具被引入分类学

随机推荐

  • textarea接受后台数据

    在jsp页面使用EL接受后台数据到textarea
  • mybatis-plus-generator生成实体类时添加jdbcType

    效果 需要修改的文件 1 基本思路 1 使用变量 useJdbcType 控制是否需要生成jdbcType 2 生成时拼接相关字段信息 2 步骤 2 1重写TableField 添加jdbcType属性 在com baomidou myba
  • rollup怎么处理.node文件

    Rollup 是一个 JavaScript 模块打包器 它可以将多个模块合并成单个文件 它可以帮助你将你的代码打包成可以在浏览器中运行的文件 要使用 Rollup 处理 node 文件 你需要使用一个 Rollup 插件 如 rollup
  • 数据挖掘基础

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 数据挖掘定义及用途 1 定义 2 用途 二 决策树 1 理论知识 1 概念 2 算法一般过程 C4 5为例 2 小结 三 关联规则 1 概述 2 关联分析
  • MySQL之多表关联删除/更新

    日常测试的时候 需要连接其他表而删除某些脏数据 按照正常的查询的写法 会这样写删除语句 DELETE from order where id in SELECT o id from order o LEFT JOIN customer c
  • minicom键盘失效,不能输入问题

    转 http blog sina com cn s blog 5d0e8d0d01015svy html 这个问题可以参考secureCRT的时候遇到的问题 问题与minicom的一样 RTS 请求发送 CTS 清除发送 默认情况下mini
  • vue3配置proxy解决跨域

    跨域问题是前端开发中较常见的问题 因为javascript的浏览器会支持同源策略 如果域名 协议 端口任意不同就会产生跨域 如果非同源 那么在请求数据时 浏览器会在控制台中报一个异常 提示拒绝访问 错误信息如下 Access to XMLH
  • Linux常用命令整理(适合初学)

    关机 重启操作 帮助文档 1 帮助命令 1 1 help help cd 查看cd命令的帮助信息
  • 服务器推送消息SSE,HTTP 服务器消息推送之SSE

    HTTP 服务器推送也称 HTTP 流 是一种客户端 服务器通讯模式 它将信息从 HTTP 服务器异步推送到客户端 而无需客户端请求 如今的 web 和 app 中 愈来愈多的场景使用这种通讯模式 好比实时的消息提醒 IM在线聊天 多人文档
  • 将字符串转化为整数

    Java内部实现 param s the code String containing the integer representation to be parsed param radix the radix to be used whi
  • unet测试评估metric脚本

    全部复制的paddleseg的代码转torch import argparse import logging import os import numpy as np import torch import torch nn functio
  • 第十三届蓝桥杯 2022年省赛真题(Java 大学C组)

    蓝桥杯 2022年省赛真题 Java 大学C组 目录 试题 A 排列字母 试题 B 特殊时间 试题 C 纸张尺寸 试题 D 求和 试题 E 矩形拼接 试题 F 选数异或 试题 G GCD 试题 H 青蛙过河 试题 I 因数平方和 试题 J
  • 43 openEuler搭建Apache服务器-配置文件说明和管理模块

    文章目录 43 openEuler搭建Apache服务器 配置文件说明和管理模块 43 1 配置文件说明 43 2 管理模块和SSL 43 2 1 概述 43 2 2 加载模块 43 2 3 SSL介绍 43 openEuler搭建Apac
  • 浅谈(Java)JUC线程池ScheduledThreadPoolExecutor

    博主介绍 程序员悟啦 乌拉 个人仓库 码云 座右铭 懒 对一个人的毁灭性有多大 早起的重要性就多大 免责声明 文章由博主原创 部分文章整理于网络 仅供学习和知识分享 相遇是缘 既然来了就拎着小板凳 坐下来一起唠会儿 如果在文中有所收获 请别
  • 《银行法律法规》二、银行业务——3、结算、代理、托管业务

    第三章 结算 代理及托管业务 第一节 支付结算业务 考点1 国内结算 支付结算 是指结算客户之间由于商品交易 劳务供应等经济活动而产生的债权债务关系 通过银行实现资金转移而完成的结算过程 支付结算是银行的一项基础性服务 支付结算应遵循恪守信
  • 《北京市政务服务领域区块链应用创新蓝皮书(第一版)》正式发布

    为加快推动区块链技术和产业创新发展 北京市政务服务管理局 北京市科委 北京市经济和信息化局组织相关单位抓紧推进政务服务领域区块链应用建设 取得阶段性成果 在此基础上 北京市区块链工作专班专家组编制了 北京市政务服务领域区块链应用创新蓝皮书
  • SDC设计约束——IO延时约束

    原文链接 https juejin cn post 7123461617299226660 约束命令 set input delay clock CLK max 2 0 get ports IN set input delay clock
  • 百度地图+谷歌地图 勾画 行政区块边界

    最近公司做项目 需要用在谷歌地图上勾勒出搜索的行政区块的轮廓 于是在找各种资料 最后好像是有末尾CSDN的网友提供了思路 具体看正文 效果如下 先贴代码 html view plain copy
  • npm更换成淘宝镜像源以及cnpm

    需求由来 由于node安装插件是从国外服务器下载 受网络影响大 速度慢且可能出现异常 所以如果npm的服务器在中国就好了 所以我们乐于分享的淘宝团队 阿里巴巴旗下业务阿里云 干了这事 来自官网 这是一个完整 npmjs org 镜像 你可以
  • EasyPoi实现excel多sheet导入

    EXCEL 导入模板 MAVEN