惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
博客园_首页
Vercel News
Vercel News
WordPress大学
WordPress大学
美团技术团队
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 【当耐特】
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
腾讯CDC
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Recent Announcements
Recent Announcements
雷峰网
雷峰网
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
Jina AI
Jina AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
P
Privacy & Cybersecurity Law Blog
Recorded Future
Recorded Future
Help Net Security
Help Net Security
N
News and Events Feed by Topic
博客园 - Franky
P
Proofpoint News Feed
L
LINUX DO - 热门话题
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
D
Docker
Google DeepMind News
Google DeepMind News
有赞技术团队
有赞技术团队
IT之家
IT之家
Security Latest
Security Latest
L
LangChain Blog
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks

Y先生的火箭屋

Java常用代码工具类 - Y先生的火箭屋 软件的七大设计原则 - Y先生的火箭屋 JavaSE使用socket与线程实现控制台版的聊天室功能 - Y先生的火箭屋 天天基金中持仓收益率和持有收益率的区别 - Y先生的火箭屋 在N个球中用天平称最少次数找出坏球 - Y先生的火箭屋 MySQL新增排名字段 - Y先生的火箭屋 Java中23种设计模式 - Y先生的火箭屋 金融上的做多做空和杠杆 - Y先生的火箭屋 JVM调优常用的调优参数 - Y先生的火箭屋
基于EasyExcel的配置型导入导出V1.0 - Y先生的火箭屋
Y先生 · 2022-04-19 · via Y先生的火箭屋

前言

想自己写一个可以很方便的在工作中使用的配置多sheet页,复杂表头之类的导出导入工具类,第一版比较简单,还得受限制于实体类的配置,将来在第二第三版,或者更多版本中考虑实现一下全配置全自动导入导出。如果电脑屏幕前的你恰好能看到这篇文章,又恰好有些想法,欢迎评论区留言~

PS:请结合EasyExcel文档食用哦

导出

public static void writeExcel(HttpServletResponse response, List<List> dataList, List<Class> clazzList, List<String> sheetNames, String fileName) {
        //检查数据是否为空
        if (dataList.isEmpty() || sheetNames.isEmpty() || clazzList.isEmpty()) {
            throw new RuntimeException("数据为空,请检查");
        }
        //检查数据页是否一致
        if (dataList.size() != sheetNames.size() || dataList.size() != clazzList.size() || sheetNames.size() != clazzList.size()) {
            throw new RuntimeException("数据个数不一致,请检查");
        }
        ExcelWriter excelWriter = null;
        try {
            response.setHeader("content-type", "application/octet-stream");
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            ServletOutputStream os = response.getOutputStream();
            excelWriter = EasyExcel.write(os).build();
            for (int i = 0; i < dataList.size(); i++) {
                String sheetName = sheetNames.get(i);
                //导出的实体类型
                Class clazz = clazzList.get(i);
                //数据集合
                List data = dataList.get(i);
                WriteSheet writeSheet = EasyExcel.writerSheet(i, sheetName).head(clazz).build();
                excelWriter.write(data, writeSheet);
            }
        } catch (Exception e) {
            log.error("导出excel异常", e);
        }finally{
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

导入

public static Map<String, Object> readExcel(MultipartFile file, List<Class> clazzList) {
        ExcelReader excelReader = null;
        Map<String, Object> resultMap = new HashMap<>();
        try {
            excelReader = EasyExcel.read(file.getInputStream()).build();
            //获取sheet页
            List<ReadSheet> sheetList = excelReader.excelExecutor().sheetList();
            if (clazzList.size() != sheetList.size()) {
                //其实就是throw new RuntimeException,下同
                throw new KYException("sheet页数量与数据类型个数不一致,请检查");
            }
            List<ReadSheet> readSheetList = new ArrayList<>();
            //循环读取每页的数据
            for (int i = 0; i < sheetList.size(); i++) {
                Class clazz = clazzList.get(i);
                ReadSheet readSheet = EasyExcel.readSheet(i).head(clazz).registerReadListener(new ReadListener() {
                    List list = new ArrayList();

                    @Override
                    public void onException(Exception exception, AnalysisContext analysisContext) {
                        if (exception instanceof ExcelDataConvertException) {
                            exception.printStackTrace();
                            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
                            //StrUtil.format 此处用的是HuTool工具包里的格式化字符串
                            throw new KYException(StrUtil.format("第{}行,第{}列解析异常,数据为:{}", excelDataConvertException.getRowIndex(),
                                    excelDataConvertException.getColumnIndex(), excelDataConvertException.getCellData()));
                        }
                    }

                    @Override
                    public void invoke(Object o, AnalysisContext analysisContext) {
                        list.add(JSONObject.parseObject(JSONObject.toJSONString(o), clazz));
                        resultMap.put(clazz.getSimpleName(), list);
                    }

                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                        //这里可以直接做存入数据库操作
                    }

                    @Override
                    public boolean hasNext(AnalysisContext analysisContext) {
                        return true;
                    }

                    @Override
                    public void invokeHead(Map map, AnalysisContext analysisContext) {
                        //这里可以获取表头信息
                    }
                }).build();
                readSheetList.add(readSheet);
            }
            excelReader.read(readSheetList);
        } catch (IOException e) {
            log.error("读取excel异常", e);
        }
        finally{
            if (excelReader != null) {
                excelReader.finish();
            }
        }
        return resultMap;
    }

|´・ω・)ノ

ヾ(≧∇≦*)ゝ

(☆ω☆)

(╯‵□′)╯︵┴─┴

 ̄﹃ ̄

(/ω\)

∠( ᐛ 」∠)_

(๑•̀ㅁ•́ฅ)

→_→

୧(๑•̀⌄•́๑)૭

٩(ˊᗜˋ*)و

(ノ°ο°)ノ

(´இ皿இ`)

⌇●﹏●⌇

(ฅ´ω`ฅ)

(╯°A°)╯︵○○○

φ( ̄∇ ̄o)

ヾ(´・ ・`。)ノ"

( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃

(ó﹏ò。)

Σ(っ °Д °;)っ

( ,,´・ω・)ノ"(´っω・`。)

╮(╯▽╰)╭

o(*////▽////*)q

>﹏<

( ๑´•ω•) "(ㆆᴗㆆ)

😂

😀

😅

😊

🙂

🙃

😌

😍

😘

😜

😝

😏

😒

🙄

😳

😡

😔

😫

😱

😭

💩

👻

🙌

🖕

👍

👫

👬

👭

🌚

🌝

🙈

💊

😶

🙏

🍦

🍉

😣

Source: github.com/k4yt3x/flowerhd