Excel导入和导出

article/2025/9/8 14:10:01

一、添加需要用到的依赖

<!-- 实体类工具 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency><!-- excel工具 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version>
</dependency><!-- Alibaba Fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.74</version>
</dependency>

二、创建注解类

import java.lang.annotation.*;/*** excel注解** @author 胡晓波* @version V3.1.0* @copyright 微奇点网络工作室* @date 2022-11-03 17:00:03*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD})
public @interface Excel {/*** 导入导出数据的名称* @return*/String value();/*** 导出时每行数据是否有序号列(实体类上才有效)* @return*/boolean xh() default false;/*** 导出时列顺序* @return*/int sort() default 0;/*** 导出时需要格式化的数据* @return*/String format() default "";/*** 导出是否忽视* @return*/boolean hidden() default false;
}

三、异常类

/*** excel异常类** @author 胡晓波* @version V3.1.0* @copyright 微奇点网络工作室* @date 2022-11-03 14:58:32*/
public class ExcelException extends Exception {public ExcelException() {super();}public ExcelException(String message) {super(message);}
}

四、需要用到的时间工具类和json工具类

import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;/*** 时间类型工具** @author 胡晓波* @version V3.1.0* @copyright 微奇点网络工作室* @date 2022-11-04 15:28:06*/
public class DateUtil {/*** Date类型转字符串* @param date* @param pattern* @return* @throws Exception*/public static String dateFormat (Date date, String pattern) throws Exception {if (StringUtil.isEmpty(pattern)) {throw new Exception("转换格式为空");}if (date == null) {date = new Date();}SimpleDateFormat formatter = new SimpleDateFormat(pattern);String dateString = formatter.format(date);return dateString;}/*** LocalDateTime类型进行格式化输出(返回类型:String)* @param date* @return*/public static String dateFormat(LocalDateTime date) {DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String localTime = df.format(date);return localTime;}/*** LocalDate类型进行格式化输出(返回类型:String)* @param date* @return*/public static String dateFormat(LocalDate date) {DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");String localTime = df.format(date);return localTime;}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;import java.util.List;/*** json转换工具** @author 胡晓波* @version V3.1.0* @copyright 微奇点网络工作室* @date 2022-11-04 15:26:34*/
public class JsonUtil {/*** 功能描述:把java对象转换成JSON数据* @param object java对象* @return JSON数据*/public static String getObjectToString(Object object) {return JSON.toJSONString(object, SerializerFeature.WriteMapNullValue);}/*** 功能描述:把JSON数据转换成指定的java对象列表* @param dto dto对象* @param clazz 指定的java对象* @return List<T>*/public static <T> List<T> getJsonToList(Object dto, Class<T> clazz) {return JSON.parseArray(getObjectToString(dto), clazz);}}

五、导入导出excel工具类具体代码

import com.wx.annotation.Excel;
import com.wx.exception.ExcelException;
import lombok.Builder;
import lombok.Data;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.InputStream;
import java.lang.reflect.Field;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;/*** excel导入导出工具** @author 胡晓波* @version V3.1.0* @copyright 微奇点网络工作室* @date 2022-11-04 09:43:27*/
public class DoExcel {/*** excel数据导入* @param is excel 导入数据* @param oc 实体类类型* @param sheetIndex 工作簿下标* @param titleRowIndex 标题行下标* @param <T>* @return 实体类集合* @throws Exception*/public static <T> List<T> importExcel (InputStream is, Class<T> oc, Integer sheetIndex, Integer titleRowIndex) throws Exception {XSSFWorkbook workbook = new XSSFWorkbook(is);XSSFSheet sheet = workbook.getSheetAt(sheetIndex);// 标题行XSSFRow row = sheet.getRow(titleRowIndex ++);List<String> titleText = new ArrayList<>();for (Cell cell : row) {titleText.add(cell.getStringCellValue());}Field[] fields = oc.getDeclaredFields();Map<String, ExpectExcelVo> titleMap = new HashMap<>(15);for (Field field : fields) {Excel _excel = field.getAnnotation(Excel.class);if (_excel == null) {continue;}titleMap.put(_excel.value(), ExpectExcelVo.builder().name(field.getName()).type(field.getType().getName()).build());}if (titleMap.size() == 0) {throw new ExcelException("类中没有@Excel注解");}List<Map<String, Object>> list = new ArrayList<>();for (int i = titleRowIndex; i <= sheet.getLastRowNum(); i++) {row = sheet.getRow(i);Map<String, Object> map = new HashMap<>(15);for (int j = 0; j < titleText.size(); j++) {String s = titleText.get(j);ExpectExcelVo expectExcelVo = titleMap.get(s);if (expectExcelVo == null) {continue;}XSSFCell cell = row.getCell(j);map.put(expectExcelVo.getName(), cell.getStringCellValue());}list.add(map);}return JsonUtil.getJsonToList(list, oc);}/*** 导出数据为excel* @param list* @param oc* @return excel流* @throws Exception*/public static XSSFWorkbook expectExcel (List<Object> list, Class<?> oc) throws Exception {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("import");Integer rowIndex = 0;Integer cellIndex = 0;Integer header = header(oc, sheet, rowIndex);if (header == 1) {rowIndex ++;}else if (header == 2) {rowIndex ++;cellIndex ++;}ArrayList<String> fieldNames = title(oc, sheet, rowIndex, cellIndex);rowIndex ++;content(list, fieldNames, sheet, rowIndex, cellIndex);return workbook;}/*** 生成表的头部* @param oc* @param sheet* @param rowIndex*/private static Integer header (Class<?> oc, XSSFSheet sheet, Integer rowIndex) {Excel header = oc.getAnnotation(Excel.class);if (header != null) {XSSFRow row = sheet.createRow(rowIndex++);XSSFCell cell = row.createCell(0);cell.setCellValue(header.value());if (header.xh()) {return 2;}return 1;}return 0;}/*** 生成标题* @param oc* @param sheet* @param rowIndex* @param cellIndex* @return* @throws Exception*/private static ArrayList<String> title (Class<?> oc, XSSFSheet sheet, Integer rowIndex, Integer cellIndex) throws Exception {ArrayList<String> fieldNames = new ArrayList<>();Field[] fields = oc.getDeclaredFields();if (fields.length > 0) {for (Field field : fields) {field.setAccessible(true);Excel title = field.getAnnotation(Excel.class);if (title == null || title.hidden()) {continue;}fieldNames.add(field.getName() + "~" + title.sort() + "~" + title.value());}fieldNames.sort((o1, o2) -> {int $1 = Integer.parseInt(o1.split("~")[1]);int $2 = Integer.parseInt(o2.split("~")[1]);return $1 - $2;});}if (fieldNames.size() == 0) {throw new ExcelException("实体类中属性没有@Excel注解");}else {XSSFRow row = sheet.createRow(rowIndex++);XSSFCell xh = row.createCell(0);xh.setCellValue("序号");for (int i = 0; i < fieldNames.size(); i++) {String[] split = fieldNames.get(i).split("~");XSSFCell cell = row.createCell(i+cellIndex);cell.setCellValue(split[2]);fieldNames.set(i, split[0]);}}return fieldNames;}/*** 生成数据内容* @param list* @param fieldNames* @param sheet* @param rowIndex* @param cellIndex* @throws Exception*/private static void content (List<Object> list, ArrayList<String> fieldNames, XSSFSheet sheet, Integer rowIndex, Integer cellIndex) throws Exception {for (int i = 0; i < list.size(); i++) {Object o = list.get(i);Class<?> ec = o.getClass();XSSFRow row = sheet.createRow(rowIndex++);XSSFCell xh = row.createCell(0);xh.setCellValue((i + 1) + "");int colIndex = cellIndex;for (String fieldName : fieldNames) {Field field = ec.getDeclaredField(fieldName);field.setAccessible(true);Excel column = field.getAnnotation(Excel.class);XSSFCell cell = row.createCell(colIndex++);String typeName = field.getType().getName();String[] split = typeName.split("\\.");switch (split[split.length - 1]) {case "Date":cell.setCellValue(DateUtil.dateFormat((Date) field.get(o), column.format()));break;case "LocalDateTime":cell.setCellValue(DateUtil.dateFormat((LocalDateTime) field.get(o)));break;case "LocalDate":cell.setCellValue(DateUtil.dateFormat((LocalDate) field.get(o)));break;default: cell.setCellValue(field.get(o).toString());}}}}
}@Data
@Builder
class ExpectExcelVo {private String type;private String name;
}

六、测试类及测试实体

import com.wx.annotation.Excel;
import com.wx.utils.DoExcel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 测试类** @author 胡晓波* @version V3.1.0* @copyright 微奇点网络工作室* @date 2022-11-04 15:30:34*/
public class TestMain {public static void main(String[] args) throws Exception {List<Object> list = new ArrayList<Object>(){{add(ExcelTestVo.builder().no(9527).name("唐白虎").sex('男').birthday(new Date()).grad("一年级").school("加州大学").createTime(new Date()).build());add(ExcelTestVo.builder().no(9528).name("秋雅").sex('女').birthday(new Date()).grad("一年级").school("加州大学").createTime(new Date()).build());}};XSSFWorkbook workbook = DoExcel.expectExcel(list, ExcelTestVo.class);// 创建文件 或者直接用相应输出流输出结果(需要配置请求头)File file = new File("D://out/tmp.xlsx");file.createNewFile();FileOutputStream fos = new FileOutputStream(file);workbook.write(fos);workbook.close();fos.close();FileInputStream fis = new FileInputStream(file);List<ExcelTestVo> result = DoExcel.importExcel(fis, ExcelTestVo.class, 0, 1);System.out.println(result);}
}@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Excel(value = "excel导入导出测试实体", xh = true)
class ExcelTestVo {@Excel(value = "编号", sort = 1)private Integer no;@Excel(value = "姓名", sort = 2)private String name;@Excel(value = "性别", sort = 3)private Character sex;@Excel(value = "生日", sort = 4, hidden = true, format = "yyyy-MM-dd")private Date birthday;@Excel(value = "年级", sort = 5)private String grad;@Excel(value = "学校", sort = 6)private String school;@Excel(value = "创建时间", sort = 7, format = "yyyy-MM-dd HH:mm:ss")private Date createTime;}

七、测试结果

导入结果

 导出结果


http://chatgpt.dhexx.cn/article/DKtXHoUo.shtml

相关文章

Java实现Excel导入和导出

1. 功能测试 1.1 测试准备 在做测试前&#xff0c;我们需要將【2. 环境准备】中的四个文件拷贝在工程里&#xff08;如&#xff1a;我这里均放在了com.zyq.util.excel 包下&#xff09;。 1.2 数据导入 1.2.1 导入解析为JSON 比如&#xff0c;我们有下面一个表格&#xff1…

前端 - excel导入 / 导出功能

1. 导入功能 1.1 前端主导(工作大量在前端) 上传excel文件&#xff0c;把excel文件的内容读出来&#xff0c;还原成最基本的行列结构&#xff0c;按后端的接口要求回传过去。 前端读excel文件&#xff0c;调接口 1.2 后端主导(工作大量在后端) 前端上传excel文件 1.3 实现 …

excel导入功能

------这里只是测试类------实际使用的看下面 需要用到ExcelUtils工具类 ExcelUtils的主要作用是把Excel转化成 List<List<Object>>类型的数据&#xff0c;方便遍历 package tech.niua.common.excelimport;import java.io.IOException; import java.io.InputStream…

Java实现Excel导入导出操作详解

本文转载自 :Java实现Excel导入和导出&#xff0c;看这一篇就够了(珍藏版)_zyqok的博客-CSDN博客_excel导入 java前言最近抽了两天时间&#xff0c;把Java实现表格的相关操作进行了封装&#xff0c;本次封装是基于POI的二次开发&#xff0c;最终使用只需要调用一个工具类中的方…

EasyExcel实现excel导入

文章目录 前言一、使用步骤1.添加依赖&#xff1a;2.创建和实体类对应的用于导入导出的模板类&#xff0c;尽量不要直接使用实体类。每个字段需添加ExcelProperty注解&#xff0c;作为导入导出的识别的依据。注意value值是跟excel里的列名保持一致&#xff0c;不是跟数据库里的…

Excel表格的导入导出——EasyExcel

参考视频 csdn参考地址 一、导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version> </dependency>二、实体类 方式一&#xff1a;Excel Property&#xff08;&…

实现Excel的导入、导出

实现Excel的导入、导出 关于excel的操作在工作中经常会遇到&#xff0c;如果只是一次性使用的话&#xff0c;最简单的方式就是通过数据库的可视化工具&#xff08;如Navicat&#xff09;查询结果集之后直接一键生成excel了&#xff0c;当然这只能解燃眉之急&#xff0c;并不是…

EasyExcel复杂excel导入

EasyExcel复杂excel导入 easyexcel官方都是一些简单的导入到处示例&#xff0c;复杂的excel文档导入&#xff0c;还得自己去慢慢琢磨、百度、思考、总结、学习、观察。 代码地址在文档的最后&#xff0c;如果你也遇到这种需求&#xff0c;不妨动动你的小拇指&#xff0c;点个…

导出Excel的方式

*数据是表格的形式&#xff0c;进常用到Excel *在程序中经常可以看到有导出Excel文档&#xff0c;Excel导入数据的情况&#xff0c;现在我就说一下我学到的导出Excel *导出Excel有两种方法&#xff0c;第一种是自己设置表头的&#xff0c;第二种是填充的&#xff0c;现在我说的…

Excel文件导入导出操作

> 注意&#xff01;注意&#xff01;&#xff01;注意&#xff01;&#xff01;&#xff01; 文末有惊喜彩蛋&#xff0c;请注意查收&#xff01;日常开发工作中对于文件的相关操作大家多少都会涉及&#xff1a;上传解析、数据导出等。此篇内容主要分享一下工作中常用的Exce…

Java实现Excel导入导出

一、导入 前言&#xff1a;导入必须用post请求 具体原因在2中叙述 1、Excel导入 总结一下目标&#xff0c;就是要将excel中的数据行、逐一提取&#xff0c;最后得到一个list&#xff0c;这个list的每个元素就是excel的每个数据行的实例&#xff0c;之后的操作就是常规的jav…

Java实现Excel导入

实现前准备&#xff08;导入所需要的依赖&#xff09; <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.22</version></dependency><dependency><groupId>org.apache.…

导入Excel文件的方法

我们在做一些项目的时候通常会遇到有导入文件的这种需求&#xff0c;下面我给大家分享一下导入Excel文件的方法。 首先我们得准备一个模板&#xff0c;下图就是一个简单的EX导入模板&#xff0c; 下图就是一个导入模板&#xff0c; 我们先把导入模板写好&#xff0c; 还有一个…

两种方式导入excel

第一种 easyExcel pom文件导入 com.alibaba easyexcel 2.2.3 然后 /** * 导入用户excel * param * return */ PostMapping(“manage/imporAcc”) Message<?> imporAcc(RequestParam(“accountFile”) MultipartFile file,RequestParam(“role”)String role,Request…

Java实现Excel导入和导出,看这一篇就够了(珍藏版)

目录 目录 前言 1. 功能测试 1.1 测试准备 1.2 数据导入 1.2.1 导入解析为JSON 1.2.2 导入解析为对象&#xff08;基础&#xff09; 1.2.3 导入解析为对象&#xff08;字段自动映射&#xff09; 1.2.4 导入解析为对象&#xff08;获取行号&#xff09; 1.2.5 导入解析…

常见机器学习面试题

参考&#xff1a;http://kubicode.me/2015/08/16/Machine%20Learning/Common-Interview/?fromsinglemessage# http://blog.csdn.NET/heyongluoyao8/article/details/49429629 http://lib.csdn.Net/article/machinelearning/33798 http://www.cnblogs.com/zuochongyan/p/540705…

机器学习面试题60~100

61.说说梯度下降法 LeftNotEasy&#xff0c;本题解析来源&#xff1a;http://www.cnblogs.com/LeftNotEasy/archive/2010/12/05/mathmatic_in_machine_learning_1_regression_and_gradient_descent.html 下面是一个典型的机器学习的过程&#xff0c;首先给出一个输入数据&#…

深度学习机器学习面试题汇——模型优化,轻量化,模型压缩

深度学习机器学习面试题汇——模型优化&#xff0c;轻量化&#xff0c;模型压缩 提示&#xff1a;互联网大厂可能考的面试题 若CNN网络很庞大&#xff0c;在手机上运行效率不高&#xff0c;对应模型压缩方法有了解吗 介绍一下模型压缩常用的方法&#xff1f;为什么用知识蒸馏&…

Python干货:破解40大机器学习面试题(包含初中高级)

机器学习&#xff08;ML&#xff09;是我们世界的未来。在未来的几年中&#xff0c;几乎每种产品都将包含ML组件。ML预计将从2020年的$ 7.3B增长到2024年的$ 30.6B。对ML技能的需求遍及整个行业。 机器学习面试是一个严格的过程&#xff0c;在此过程中&#xff0c;应聘者会评估…

2021机器学习面试必考面试题汇总(附答案详解)

问题&#xff1a;Xgboost、lightGBM和Catboost之间的异同&#xff1f; 树的特征 三种算法基学习器都是决策树&#xff0c;但是树的特征以及生成的过程仍然有很多不同。 CatBoost使用对称树&#xff0c;其节点可以是镜像的。CatBoost基于的树模型其实都是完全二叉树。 XGBoo…