(二)Easyexcel 的使用(读取数据到map集合中)

这篇具有很好参考价值的文章主要介绍了(二)Easyexcel 的使用(读取数据到map集合中)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        前面讲述了使用实体类的方式绑定excel表头的方式进行读取和写入操作,是比较简单的,那么由于表头可能会变,那么就不能使用绑定实体类的方式进行了,于是搜索百度一番,借鉴别人的博客,使用map集合的方式进行读取和写入操作。

目录

1、导入相关依赖

2、读取Excel的服务调用

3、将excel数据读取到map中并保存到数据库

4、编写通过map保存到数据库的SQL语句

 5、保存到数据库的结果

6、写入数据到excel

7、总结


1、导入相关依赖

<!--   easyexcel     -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.1.1</version>
        </dependency>

2、读取Excel的服务调用

 @Override
    public void saveTypeSpectrumInfosFromExcel(MultipartFile file, SelfDefineTypeSpectrumInfoService selfDefineTypeSpectrumInfoService, Integer treeNodeId, HeaderTableService headerTableService) {
            //文件输入流
        InputStream is = null;
        try {
            is = file.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //调用方法进行读取
            EasyExcel.read(is, new TypeSpectrumInfoExcelListener(selfDefineTypeSpectrumInfoService, treeNodeId, headerTableService)).sheet().doRead();
}

3、将excel数据读取到map中并保存到数据库


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bjsasc.productksys.exceptionHandler.SelfDefinitionException;
import com.bjsasc.productksys.headertableservice.entity.HeaderTable;
import com.bjsasc.productksys.headertableservice.service.HeaderTableService;
import com.bjsasc.productksys.selfdefinetypespectruminfoservice.service.SelfDefineTypeSpectrumInfoService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author 不要有情绪的  ljy
 * @Date 2022/11/16 9:41
 * @Description:
 */
public class TypeSpectrumInfoExcelListener extends AnalysisEventListener<Map<Integer, Object>> {
    private SelfDefineTypeSpectrumInfoService selfDefineTypeSpectrumInfoService;
    private Integer treeNodeId;
    //用于存储表头的信息
    private Map<Integer, String> headMap;

    public TypeSpectrumInfoExcelListener(SelfDefineTypeSpectrumInfoService selfDefineTypeSpectrumInfoService, Integer treeNodeId) {
        this.selfDefineTypeSpectrumInfoService = selfDefineTypeSpectrumInfoService;
        this.treeNodeId = treeNodeId;
    }

    @Override
    public void invoke(Map<Integer, Object> stringObjectMap, AnalysisContext analysisContext) {
        HashMap<String, Object> paramsMap = new HashMap<>();
        for (int i = 0; i < stringObjectMap.size(); i++) {
            String s = headMap.get(i);
            Object o = stringObjectMap.get(i);
//            System.out.println(s+"  "+o);
            //将表头作为map的key,每行每个单元格的数据作为map的value
            paramsMap.put(s, o);
        }
        paramsMap.put("sys_tree_id", treeNodeId);
        System.out.println(paramsMap);
        //将数据插入到数据库中
        selfDefineTypeSpectrumInfoService.addTypeSpectrumInfo(paramsMap);
    }


    //读取excel表头信息
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        this.headMap = headMap;
        System.out.println("表头信息:" + headMap);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {

    }

}

        对以上代码进行解读下:首先创建了个map用于存储表头,是为了后面将数据存入数据库做准备,paramsMap 是一个存储所有插入数据库的(即excel一行的数据字段)参数,其中key为表头。value为读取的数据。

4、编写通过map保存到数据库的SQL语句

由于不是绑定的实体类,就不能直接使用mybatis-plus通过传递实体类进行数据的保存了,因此要自己的手动写SQL语句,SQL语句如下:

@Insert("<script> " +
            "insert into self_define_type_spectrum_info (" +
            "<foreach collection='paramsMap' item='value' index='key' separator=','>"
            + "${key}"
            + "</foreach>" +
            ")"
            + "values ("
            + "<foreach collection='paramsMap' item='value' index='key' separator=','>"
            + "#{value}"
            + "</foreach>"
            + ")"
            +   "</script>")
    public int addTypeSpectrumInfo(@Param("paramsMap") HashMap<String, Object> paramsMap);

为了清晰表达,再给个截图,如下:

(二)Easyexcel 的使用(读取数据到map集合中)

 5、保存到数据库的结果

        这儿就不展示了

以上就是读取excel到map集合,然后保存到数据库的过程。

6、写入数据到excel

@ApiOperation(value = "选择一个路径,将当前的列表导出到excel")
    @GetMapping("/xxxxxx/{treeNodeId}")
    public R xxxxxx(HttpServletResponse response,
                                            @ApiParam(name = "treeNodeId", value = "当前树节点id", required = true) @PathVariable Integer treeNodeId) {
        SysTree treeNode = sysTreeService.getById(treeNodeId);
        String treeNodeName = treeNode.getNodeName();
        String fileName = treeNodeName + "_型谱信息.xlsx";
        List<Map<String, Object>> list = selfDefineTypeSpectrumInfoService.getAll(treeNodeId);
        List<HeaderTable> headerTableList = headerTableService.list(new QueryWrapper<HeaderTable>().eq("sys_tree_id", treeNodeId));
        String[] headArr = new String[headerTableList.size()+3];
        int i = 0;
        headArr[i++] = "产品专业";
        headArr[i++] = "产品类别";
        headArr[i++] = "产品规格";
        for (; i < headArr.length; i++) {
            headArr[i] = headerTableList.get(i-3).getHeaderName();
        }
        List<Object> dataList = new ArrayList<>();
        for (Map<String, Object> stringObjectMap : list) {
            List<Object> headList = new ArrayList<>();
            for (String s : headArr) {
                headList.add(stringObjectMap.get(s));
            }
            dataList.add(headList);
        }
        EasyExcel.write(fileName).head(createdHead(headArr)).sheet(treeNodeName).doWrite(dataList);
        return R.ok();
    }

    //处理字段的表头值
    private static List<List<String>> createdHead(String[] headMap) {
        List<List<String>> headList = new ArrayList<List<String>>();
        for (String head : headMap) {
            List<String> list = new ArrayList<String>();
            list.add(head);
            headList.add(list);
        }
        return headList;
    }

对以上代码进行解读:

        由于表头不固定,但是我们是让自己配置表头,当配置的一致时,才可以让excel导入,因此,headerTableService是为了查询配置的表头为哪些的操作,此外,

headArr[i++] = "产品专业";
headArr[i++] = "产品类别";
headArr[i++] = "产品规格";

        这三个是写入excel必须的表头,以及数据库中有相应的数据。

其主要看这行代码

EasyExcel.write(fileName).head(createdHead(headArr)).sheet(treeNodeName).doWrite(dataList);

顺便看下表头是如何与数据进行对应起来的!!!其中createdHead()函数是参考别人的博客,具体哪个的博客忘掉了,在此感谢无名的他或她,嘻嘻嘻!

        上面代码的功能是通过查询哪些表头对应的数据需要写入excel,即比如数据库表中有 姓名 这一列,但是excel中不想需要写入,那么就可以改变以上代码完成相应需求。

        下面附上查询数据库将数据封装到map中的SQL语句

@ResultType(Map.class)
    @Select("select * from self_define_type_spectrum_info where sys_tree_id = #{treeNodeId}")
    public List<Map<String, Object>> getAll(Integer treeNodeId);

7、总结

        以上就是通过map对excel 的读取和写入操作,整个过程相对于绑定实体类的方式是较复杂的,希望你们认真看,认真读,我在尽力地写清楚我所说的话,可能其中没说明白,也希望谅解下,真心希望读完后能够帮助到你完成你的需求,哪怕一点点!!! 如果可以给个zan    赞!   

学习之所以会想睡觉,是因为那是梦开始的地方。
ଘ(੭ˊᵕˋ)੭ (开心) ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)ଘ(੭ˊᵕˋ)੭ (开心)
                                                                                                         ------不写代码不会凸的小刘文章来源地址https://www.toymoban.com/news/detail-490315.html

到了这里,关于(二)Easyexcel 的使用(读取数据到map集合中)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 使用 easyexcel 读取 excel 文件

    easyexcel 官网:EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel 1. 引入依赖并给出示例 excel     2. 两种读取的方式         (1)确定表头:建立对象,和表头形成映射。(这里以此为例)         (2)不确定表头:每一行映射为 MapString, Object。 3. 先创建 excel 中表头对应

    2024年02月12日
    浏览(59)
  • Java学数据结构(3)——树Tree & B树 & 红黑树 & Java标准库中的集合Set与映射Map & 使用多个映射Map的案例

    1.B树,阶M,数据树叶上,根的儿子数在2和M之间,除根外,非树叶节点儿子为M/2和M之间; 2.B树的插入引起分裂,B树的删除,引起合并和领养; 3.红黑树,根是黑的,红色节点的儿子必须是黑的,所有路径的黑色节点数相同; 4.红黑树的插入,颜色翻转,单旋转,插入节点定

    2024年02月11日
    浏览(81)
  • 若依使用easyexcel读取解析excel文件示例

    睿洛医疗 目标:结构化自定义列数和列标题的excel数据。   创建数据类 创建监听类 创建数据类 创建监听类 参考:EasyExcel

    2024年02月11日
    浏览(43)
  • 使用java解析和读取excel表格(EasyExcel的简单使用)

    ** ** Apache POI、JXL、Alibaba EasyExcel等。其中Apache POI基于DOM方式进行解析,将文件直接加载内存,所以速度较快,适合Excel文件数据量不大的应用场景; EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。他能让你在不用考虑性能、内存的等因素的情况下

    2024年01月16日
    浏览(48)
  • 【Alibaba工具型技术系列】「EasyExcel技术专题」实战研究一下 EasyExcel 如何从指定文件位置进行读取数据

    EasyExcel的使用背景 工作中总会遇到对Excel读写功能,之前接触过EasyExcel,后续我们基本上用它代替了传统的POI和JXL、甚至还有一个EasyPOI技术。 EasyExcel的时候痛点 使用的EasyExcel时候,一般场景下表头比较传统,也不复杂,但是这次呢表头稍微有点复杂,读取数据要从指定的位

    2024年01月21日
    浏览(45)
  • Map,List,Set 等集合以及底层数据结构

    集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身。常见的集合主要有三种——Set(集)、List(列表)和Map(映射)。其中,List和Set 都 实现 了 Collection 接口,并且List和Set也是接口,而 Map 为独立接口 。常见的实现类如下: List 的实现类有:ArrayList、

    2024年02月09日
    浏览(46)
  • mongotop跟踪Mongodb集合读取和写入数据

    从 MongoDB 4.4 开始,MongoDB 数据库工具现在与 MongoDB 服务器分开发布,并使用自己的版本控制,初始版本为100.0.0. 此前,这些工具与 MongoDB 服务器一起发布,并使用匹配的版本控制。 mongotop 版本100.7.3支持以下版本的 MongoDB Server: MongoDB 6.0 MongoDB 5.0 MongoDB 4.4 MongoDB 4.2 行为 mongo

    2024年02月15日
    浏览(42)
  • 【数据结构】搜索树 与 Java集合框架中的Set,Map

    作者主页:paper jie_博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏:《

    2024年02月08日
    浏览(38)
  • Java8特性,Stream流的使用,收集成为map集合

    Java 8引入了Stream API,这是Java集合操作的一个重大改进。Stream API提供了一种高效且易于使用的处理数据的方式。 Stream是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。注意:Stream自己不会存储元素,它不会改变源对象,反而它的操作会返回一个全新的Strea

    2024年04月22日
    浏览(83)
  • 4.1、Flink任务怎样读取集合中的数据

    非并行数据源:         def fromElements [T: TypeInformation](data: T*): DataStream[T]         def fromCollection [T: TypeInformation](data: Seq[T]): DataStream[T]          def fromCollection [T: TypeInformation] (data: Iterator[T]): DataStream[T]  并行数据源:         def fromParallelCollection [T: TypeInformation] (dat

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包