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.hqwc.cn/news/234092.html

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

相关文章

SSM6 11-27 SpringMvc过滤器和异常处理

try catch:处理异常 throw/throws:不处理 抛出 jvm中断程序运行 打印错误信息 web:经典三层模型&#xff1a; dao(mapper) service web层 异常抛给web层Controller类的方法&#xff0c;每个方法可能处理异常,可能处理异常代码相似,造成重复代码重复编写 web层再往上抛 …

Small Data Transmission(一) overview

在R16之前,RRC Inactive 不支持数据传输,UE在RRC inactive状态有data要传输时,就要通过RRC resume过程,转换到RRC connected mode才能进行数据传输。 有时候UE要传输的数据包可能会很小,且发送频率也很低,如果每次发送数据都要进行上述过程,就会增加不必要的功耗和信令…

Adobe Illustrator绘图解决卡顿问题

最近在用AI做矢量图&#xff0c;但是遇到了一个很难搞的问题&#xff0c;当我们需要分辨率较高的图片的时候&#xff0c;Python用Matplotlib生成pdf时dpi参数会设置为600及以上&#xff0c;但这样的话就造成pdf文件过大以及AI卡顿两个问题&#xff0c;比如&#xff0c;下午生成…

【VScode】超详细图片讲解下载安装、环境配置、编译执行、调试

这里是目录 VScode是什么&#xff1f;VScode的下载和安装环境介绍安装中文插件 配置VScodeC/C开发环境下载和配置MinGW-w64 编译器套件下载&#xff1a;配置&#xff1a; 安装C/C插件在VScode上编写代码设置C/C编译选项创建执行任务编译执行如果想写其他代码在同一个文件夹在不…

.Net 8 Blazor下 Auto交互渲染模式试用

一、环境 C:\Users\zhuji>dotnet --version 8.0.100C:\Users\zhuji>dotnet --list-sdks 5.0.403 [C:\Program Files\dotnet\sdk] 6.0.404 [C:\Program Files\dotnet\sdk] 8.0.100 [C:\Program Files\dotnet\sdk] Microsoft Visual Studio Enterprise 2022 (64 位) - Cu…

如何在服务器上运行python文件

目录 前置准备 详细步骤 一&#xff0c;在服务器安装Anaconda 下载安装包 上传文件到服务器 安装环境 二&#xff0c;创建虚拟环境 创建环境 三&#xff0c;测试执行python文件 执行python文件 查看进程状态 总结 前置准备 如何在个人服务器上运行python文件&#x…

C陷阱与缺陷——第3章 语义陷阱

1. 指针和数组 C语言中只有一维数组&#xff0c;而且数组的大小必须在编译器就作为一个常数确定下来&#xff0c;然而在C语言中数组的元素可以是任何类型的对象&#xff0c;当然也可以是另外的一个数组&#xff0c;这样&#xff0c;要仿真出一个多维数组就不是难事。 对于一个…

【10】Python函数专题(上)

目录 1.什么是函数2.函数的参数2.1形参 和 实参2.2函数的传递方式2.3 不定长参数2.3.1 可变位置参数`*args`2.3.2可变关键字参数`**kwargs`2.3.3 小结2.4 参数的解包(也称拆包)1.什么是函数 在Python中,函数是一段可重复使用的代码块,用于执行特定任务。通过将代码封装在函…

Hive:从HDFS回收站恢复被删的表

场景 一张手工维护的内部表&#xff0c;本来排查没有使用&#xff0c;然后删掉了&#xff0c;发现又需要使用&#xff0c;只能恢复这张表了。 1.确认HDFS是否开启回收站功能 2.查看回收站中的数据 被删除的数据会放在删除数据时使用的用户目录下&#xff0c;如&#xff1a;使…

2023年掌控安全学院CTF暖冬杯——数据流分析

前言&#xff1a;打工仔一枚&#xff0c;第一波上新的3题misc 做完了 再打ISCTF随便记录一下 PS&#xff1a;环境关了&#xff0c;题目描述忘记了&#xff0c;反正就是找flag。 筛选HTTP数据流 导出数据流慢慢看 ctrl F 搜flag 看到一条 有flag.txt 的数据 导出另存.zip 这里…

Git提示 Connection closed by remote host

问题如下图&#xff1a; 解决&#xff1a; 删除./ssh目录下的config文件&#xff0c;如下图config文件是新增的 原因&#xff1a;不知道什么原因&#xff0c;连接外网后突然断开或导致自动增加config文件。

FPGA驱动CS4344 VHDL例程

CS4344是一款非常简单的I2S立体声24bit D/A芯片&#xff0c;采样率高达192KHz&#xff0c;相对于ADAU1761复杂的寄存器配置来说&#xff0c;CS4344非常友好&#xff0c;无需配置寄存器&#xff0c;只要按I2S时序输入数据&#xff0c;即可实现立体声输出&#xff0c;且10PIN TSS…