Java实现集合和Excel文件相互转换

目录

    • 一、集合转化为Excel文件
    • 二、Excel文件转化为集合

一、集合转化为Excel文件

效果如下,是将集合转化为Excel文件,Excel包含合并单元格。
在这里插入图片描述
实体类:

@Data
public class ClassGrade {/** 年级 */private String grade;/** 班主任 */private String leader;/** 学生列表 */private List<Student> students;@Datapublic static class Student {/** 姓名 */private String name;/** 年龄 */private Integer age;/** 性别 */private String sex;/** 成绩 */private Integer gradeResult;}
}

需求就是将ClassGrade的集合转化为Excel表格对外输出。没有针对当前类去逐个取值处理,用到了反射来处理,达到了简化代码通用的目的。这个只针对有一个合并单元格的情形,如果是合并单元格中包含合并单元格的话,还需要加代码去处理。
实现代码如下:
1.初始化表头类,参数为表头集合

    public static SXSSFWorkbook makeExcelHead(String[] titles) {SXSSFWorkbook workbook = new SXSSFWorkbook();CellStyle styleTitle = getTitleStyle(workbook, (short) 16);SXSSFSheet sheet = workbook.createSheet();SXSSFRow rowTitle = sheet.createRow(0);for (int i = 0; i < titles.length; i++) {sheet.setDefaultColumnWidth(25);SXSSFCell cellTitle = rowTitle.createCell(i);// 为标题设置背景颜色styleTitle.setFillPattern(FillPatternType.SOLID_FOREGROUND);styleTitle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.GREY_25_PERCENT.getIndex());cellTitle.setCellValue(titles[i]);cellTitle.setCellStyle(styleTitle);}return workbook;}

2.反射获取实体的值

    public static <T> Object getProperty(T t, String propertyName) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException, IndexOutOfBoundsException {Class<?> aClass = t.getClass();propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);Method method = aClass.getMethod("get" + propertyName);Object invoke = method.invoke(t);return invoke;}

2.将集合转化为Excel

    @Testpublic void exportExcel() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {//初始化数据List<ClassGrade> fileList = new ArrayList<>();for (int m = 1; m <= 1; m++) {fileList.addAll(getGrades());}//表头名称String[] title = {"班主任", "学生姓名", "学生年龄", "学生性别", "学生成绩", "班级"};SXSSFWorkbook workbook = SXSSFWorkbookUtil.makeExcelHead(title);//每一列表头属性,如果子类里面的,则提取子类里面对应的属性名String[] properties = {"leader", "name", "age", "sex", "gradeResult", "grade"};//获取当前sheetSXSSFSheet sheet = workbook.getSheetAt(0);int initRowNum = 0;//遍历数据,需要根据业务逻辑去处理是否合并单元格for (int i = 0; i < fileList.size(); i++) {ClassGrade file = fileList.get(i);int size = file.getStudents().size();//创建行,以子类的集合数为准int startRowNum = initRowNum + 1;int lastRowNum = startRowNum + size - 1;SXSSFRow row = sheet.getRow(startRowNum);if (row == null) {row = sheet.createRow(startRowNum);}//班主任一列,处理合并单元格for (int m = 0; m < 1; m++) {if (lastRowNum - startRowNum > 0) {sheet.addMergedRegion(new CellRangeAddress(startRowNum, lastRowNum, m, m));}createCell(row, m, SXSSFWorkbookUtil.getProperty(file, properties[m]));}//处理学生姓名~学生成绩四列,非合并单元格信息int xRowNum = startRowNum;List<ClassGrade.Student> receiptItems = file.getStudents();for (ClassGrade.Student student : receiptItems) {SXSSFRow row1 = sheet.getRow(xRowNum);if (row1 == null) {row1 = sheet.createRow(xRowNum);}for (int q = 1; q <= 4; q++) {//利用反射获取到值,并且设置到cell里面createCell(row1, q, SXSSFWorkbookUtil.getProperty(student, properties[q]));}xRowNum++;}//处理班级信息合并单元格for (int n = 5; n <= 5; n++) {if (lastRowNum - startRowNum >= 1) {sheet.addMergedRegion(new CellRangeAddress(startRowNum, lastRowNum, n, n));}createCell(row, n, SXSSFWorkbookUtil.getProperty(file, properties[n]));}initRowNum = lastRowNum;}//导出try (FileOutputStream excel = new FileOutputStream("excel.xls");BufferedOutputStream bos = new BufferedOutputStream(excel)) {workbook.write(bos);System.out.println("导出完成");} catch (IOException e) {System.out.println("导出失败:" + e.getMessage());}}private void createCell(SXSSFRow row, int column, Object value) {SXSSFCell cell = row.createCell(column);if (value != null) {cell.setCellValue(String.valueOf(value));}}

效果
在这里插入图片描述

二、Excel文件转化为集合

如题,将获取到的excel文件流转化为集合进行处理。挺简单的。思路就是将一个文件流转化为一个备用类,再将备用类转化为想要的集合。
excel:
在这里插入图片描述
备用类代码:

@Data
public class ClassGrade2 {/** 年级 */private String grade;/** 班主任 */private String leader;/** 姓名 */private String name;/** 年龄 */private Integer age;/** 性别 */private String sex;/** 成绩 */private Integer gradeResult;
}

转化代码:

    @Testpublic void test1() {ExcelReader reader = ExcelUtil.getReader("excelToList.xls");List<List<Object>> rows = reader.read();//根据excel的结构,需要准备一个备用类接收数据List<ClassGrade2> listBaks = new ArrayList<>();//初始化属性,属性是备用类的属性名String[] properties = {"leader", "name", "age", "sex", "gradeResult", "grade"};for (int j = 1; j < rows.size(); j++) {List<Object> cells = rows.get(j);try {//反射获取值,组装成备用类ClassGrade2 file = new ClassGrade2();Class<?> clz = file.getClass();Method[] methods = clz.getDeclaredMethods();for (int i = 0; i < cells.size(); i++) {String propertyName = properties[i].substring(0, 1).toUpperCase() + properties[i].substring(1);Method method = Arrays.stream(methods).filter(m -> Objects.equal(m.getName(), "set" + propertyName)).findFirst().orElse(null);Object cell = cells.get(i);if (cell == null) {continue;}Field field = clz.getDeclaredField(properties[i]);String fieldType = field.getType().getName();if (fieldType.equals("java.lang.String")) {method.invoke(file, String.valueOf(cell));} else if (fieldType.equals("java.math.BigDecimal")) {method.invoke(file, new BigDecimal(String.valueOf(cell)));}}listBaks.add(file);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} finally {}}//备用类转化为想要的集合类int i = 0;List<ClassGrade> files = new ArrayList<>();for (int m = 0; m < listBaks.size(); m++) {ClassGrade2 fileBak = listBaks.get(m);if (Strings.isNotEmpty(fileBak.getGrade())) {ClassGrade file = BeanUtil.copyProperties(fileBak, ClassGrade.class);files.add(file);ClassGrade.Student item = BeanUtil.copyProperties(fileBak, ClassGrade.Student.class);List<ClassGrade.Student> items = new ArrayList<>();items.add(item);file.setStudents(items);i++;} else {ClassGrade.Student item = BeanUtil.copyProperties(fileBak, ClassGrade.Student.class);ClassGrade file = files.get(i - 1);List<ClassGrade.Student> items = CollectionUtils.isEmpty(file.getStudents()) ? new ArrayList<>() : file.getStudents();items.add(item);file.setStudents(items);}}log.info("{}", JSONArray.toJSONString(listBaks));log.info("{}", JSONArray.toJSONString(files));}

实现效果:

11:47:03.635 [main] INFO Excel3Test - [{"grade":"八年级1班","leader":"赵老师","name":"张三","sex":"女"},{"grade":"八年级1班","leader":"赵老师","name":"李四","sex":"女"},{"grade":"八年级1班","leader":"赵老师","name":"王五","sex":"女"}]
11:47:03.647 [main] INFO Excel3Test - [{"grade":"八年级1班","leader":"赵老师","students":[{"name":"张三","sex":"女"}]},{"grade":"八年级1班","leader":"赵老师","students":[{"name":"李四","sex":"女"}]},{"grade":"八年级1班","leader":"赵老师","students":[{"name":"王五","sex":"女"}]}]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯新手发布鸿蒙的第一个java应用

第一个java开发鸿蒙应用 1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;…

ConcurrentHashMap的数据结构+以及各个版本之间的区别

ConcurrentHashMap 1.7与1.8的区别 1、锁结构不同 2、put的流程不同 3、size的计算方式不同(1.8使用的使用basecell[]计算&#xff0c;有点类似于LongAdder&#xff0c;1.7使用三级通缉判断是否一样&#xff0c;不一样通过分段式加锁再求和) 4、数据结构不同&#xff0c;1.6 Re…

企业数据建设再思考

近些年企业数据建设进入深水区&#xff0c;近六成受访企业高管表示在未来一到两年会增加数据建设的投入。 数据建设得分最明显的三项指标分别为&#xff1a;开拓数据变现模式、实现数据流与业务流程在各部门间的无缝衔接、搭建基于数据分析的决策体系与管控体系。 因此&#…

文件太大彻底删除怎么找回?速来get这3个有效方法!

“我的电脑里保存了一些很大的文件&#xff0c;由于太占内存了&#xff0c;我就将它们删除掉了&#xff0c;但是我发现有些比较重要的文件也一起被删除了。这可怎么办呢&#xff1f;有什么方法可以找回这些删除文件吗&#xff1f;” 在日常使用电脑的过程中&#xff0c;可能很多…

自动驾驶学习笔记(十二)——定位技术

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 卫星定位 RTK定位 IMU定位 GNSS定…

力扣日记11.27-【二叉树篇】二叉树的最大深度

力扣日记&#xff1a;【二叉树篇】二叉树的最大深度 日期&#xff1a;2023.11.27 参考&#xff1a;代码随想录、力扣 104. 二叉树的最大深度 题目描述 难度&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最…

分布式篇---第六篇

系列文章目录 文章目录 系列文章目录前言一、说说什么是漏桶算法二、说说什么是令牌桶算法三、数据库如何处理海量数据?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码…

第二证券:数据要素概念活跃,零点有数“20cm”涨停,皖通科技3连板

数据要素概念27日盘中强势拉升&#xff0c;到发稿&#xff0c;零点稀有“20cm”涨停&#xff0c;易华录涨超10%&#xff0c;兴正确通、德生科技、皖通科技、中远海科等亦涨停&#xff0c;三维六合涨近10%。值得注意的是&#xff0c;皖通科技已接连3个生意日涨停。 消息面上&am…

GPTs 初体验 - 1 分钟就能创建一个自己的 ChatGPT? | 京东云技术团队

就在 11.10 号早上&#xff0c;ChatGPT 已经偷摸的把GPTs功能&#xff0c;开放给所有尊贵的 Plus 用户了。 随着这波的功能开放&#xff0c;界面也是改了不少。点击左侧的 Explore 或者左下角的用户处&#xff0c;就可以直接进入新的 GPTs 功能&#xff1a; 这里可以看到我们…

[网络] 5. TCP 链接的建立与释放~汇总

大部分内容源于网络加之个人理解&#xff5e;巨人的肩膀有多大决定你可以看得多远&#xff5e; 文章目录 1. 三次握手说一下三次握手的过程为什么是三次握手 2. 四次挥手说一下四次挥手的过程为什么需要四次挥手有可能出现三次挥手吗&#xff0c;什么时候会出现呢&#xff1f;为…

在 Banana Pi BPI-R2 PRO RK3568开源路由器上安装 OpenWrt 23 快照固件

这是在 BPI-R2 Pro&#xff08;到内部 eMMC&#xff09;上安装 OpenWrt 23 快照固件的快速指南。该固件已预装 LuCI 和一些软件包。这是 2023 年 9 月 2 日的屏幕截图。 LuCI 主页概述。Linux内核是6.1.50 网络接口概述。PPPoE 连接已启动并正在运行 速度测试和 CPU 使用情况…

MySQL-04-InnoDB存储引擎锁和加锁分析

Latch一般称为闩锁&#xff08;轻量级锁&#xff09;&#xff0c;因为其要求锁定的时间必须非常短。在InnoDB存储引擎中&#xff0c;latch又分为mutex&#xff08;互斥量&#xff09;和rwlock&#xff08;读写锁&#xff09;。 Lock的对象是事务&#xff0c;用来锁定的是…

minio客户端基本操作

minio客户端基本操作 桶 创建桶 如果要创建新的桶 输入名称&#xff0c;点击创建即可&#xff0c;默认权限就行 删除桶 点击要删除的桶 点击删除 修改桶 如果哪天需要修改桶的权限或者其他信息&#xff0c;还是先点击这个桶进入详情 然后点击要修改的属性&#xff0c;选择…

【沐风老师】3DMAX快速地板屋顶墙面铺设插件使用方法详解

3DMAX快速地板屋顶墙面铺设插件使用教程 3DMAX快速地板屋顶墙面铺设插件&#xff0c;一键生成各种地板、墙面纹理模型&#xff0c;是一款非常实用的室内设计和建筑建模插件。 【适用版本】 3dMax7或更新版本 【安装方法】 该插件无需安装&#xff0c;直接在建模过程中使用&a…

DevEco Studio中 关闭/开启 代码保存界面自动更新

例如 我们这里有这样一个案例 这里 我们直接将 字体的 50 改为 30 我们直接 Ctrl S 保存代码 效果立马就改了 很明显 这是个热更新的服务 但就例如 我们开发 java比较大的项目 我们不希望它自动更新 免得内存扛不住 我们可以看编辑器上面有一个像小插座一样的东西 目前是一…

MIT_线性代数笔记:第 07 讲 求解 Ax=0:主变量,特解

目录 前言计算零空间 Nullspace特解 Special solutions行最简阶梯矩阵 Reduced row echelon form &#xff08;rref&#xff09; 前言 我们定义了矩阵的列空间和零空间&#xff0c;那么如何求得这些子空间呢&#xff1f;本节课的内容即从定义转到算法。 计算零空间 Nullspace…

Arthas 使用

Arthas是阿里巴巴开源的Java诊断工具&#xff0c;采用命令行交互的形式进行问题的定位与诊断。它能够帮助你. 解决以下问题&#xff1a; 这个类从哪个 jar 包加载的&#xff1f;为什么会报各种类相关的 Exception&#xff1f;我改的代码为什么没有执行到&#xff1f;难道是我…

活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放PPT下载

11月24日“阿里云云原生 Serverless 技术实践营”深圳站圆满落幕。活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主&#xff0c;活动形式为演讲、动手实操&#xff0c;让开发者通过一个下午的时间增进对 Serverless 技术的理解&#xff0c;快速上手…

visual Studio MFC 绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形实例

MFC 绘制三角形 本文使用visual Studio MFC 平台实现绘制单一颜色三角形、渐变颜色边框三角形、渐变填充三角形、边框渐变的正方形与填充渐变的正方形. 关于基础工程的创建请参考Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 文章目录 MFC 绘制三角形…

在Python中matplotlib函数的plt.plot()函数的颜色参数设置,以及可以直接运行的程序代码!

文章目录 前言一、使用字符串颜色&#xff1a;二、使用十六进制颜色&#xff1a;三、使用RGB元组&#xff1a;四、使用颜色映射&#xff1a;总结 前言 在matplotlib中&#xff0c;plt.plot()函数可以接受颜色参数&#xff0c;可以设置为字符串颜色&#xff08;如red&#xff0…