java 导入导出excel表格

article/2025/9/23 14:04:20

java 导入导出excel表格

业务上有需求上传excel表格并读取内容,本文记录一下该方法

表格导入

引入相应的工具包

    <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.4.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.4.0</version></dependency>

要清楚表格的格式,这样才能建对应的实体类,例如,表格如下:

在这里插入图片描述

要明确有3列,每列标题是什么,从第2行开始是正式的数据。

创建对应的实体类

注意使用@Excel注解,name即表格中列的名称,orderNum是列的顺序

import cn.afterturn.easypoi.excel.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Province {@Excel(name = "id", orderNum = "0")private String id;@Excel(name = "countryCode", orderNum = "1")private String countryCode;@Excel(name = "countryName", orderNum = "2", type = 10)private String countryName;}

controller层写方法接收excel文件并解析

本文举例比较简单,实际项目中可以封装一个解析excel的工具类,controller层收到请求后在service层调用工具类解析,再处理相关逻辑。本文直接在controller层解析了,不写那么麻烦了。

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.Vo.Province;
import org.apache.commons.compress.utils.Lists;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;@RestController
public class TestController {@PostMapping("/test/import")public void getList(@RequestPart MultipartFile file) {ImportParams params = new ImportParams();//从第一行开始解析params.setHeadRows(1);List<Province> provinces = Lists.newArrayList();try {//解析后每一行转换成Province对象provinces = ExcelImportUtil.importExcel(file.getInputStream(), Province.class, params);} catch (Exception e) {e.printStackTrace();}System.out.println(provinces);}
}

运行方法进行测试

引入swagger或者使用postman或其他方法调用该接口,传入excel,看是否打印正确。
本文使用postman进行测试,如图:

在这里插入图片描述

控制台输出的结果如图,已经正确读到excel的内容。

在这里插入图片描述

表格导出

创建对应的实体类

与导入表格类似,创建要导出表格的实体类,注意使用@Excel注解,标明列明和第几列。
比如我想导出一个手机品牌的excel,第一列是序号,第二列是手机品牌名称。

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PhoneVo {@Excel(name = "序号", orderNum = "1")private int code;@Excel(name = "手机品牌名称", orderNum = "1")private String name;
}

controller层写方法导出

本文简写,直接在controller层写逻辑方法了,可按实际情况放到service层写。
比如我用一个枚举列举所有手机品牌,将枚举的内容导出。


@Getter
public enum PhoneEnum {APPLE(0,"苹果"),HUAWEI(1,"华为"),MI(2,"小米"),OPPO(3,"oppo"),SAMSUNG(4,"三星"),;private int code;private String type;PhoneEnum(int code, String type) {this.code = code;this.type = type;}
}

controller层先把枚举内容转换成list,然后调工具类接口生成excel。

@RestController
@RequestMapping("/")
public class TestController {@GetMapping("/test/download")public void getExcel(HttpServletResponse response) throws Exception {// 表格名称String fileName = "手机品牌.xls";// 导出的表格title和sheet页名ExportParams exportParams = new ExportParams("手机品牌", "phone");// 导出的内容的listList<PhoneVo> list = getList();// 传参是要转换的对象类型,和listWorkbook workbook = ExcelExportUtil.exportExcel(exportParams, PhoneVo.class, list);if (workbook != null) {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition","attachment;filename=" + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"));workbook.write(response.getOutputStream());} catch (IOException e) {throw new Exception(e.getMessage());} finally {workbook.close();}}}private List<PhoneVo> getList(){List<PhoneVo> res = Lists.newArrayList();for (PhoneEnum phoneEnum : PhoneEnum.values()) {res.add(PhoneVo.builder().code(phoneEnum.getCode()).name(phoneEnum.getType()).build());}return res;}
}

测试

启动工程,在浏览器中输入url,回车,即可下载excel。

在这里插入图片描述
导出结果如图片所示
在这里插入图片描述

@Excel注解参数介绍

@Excel 注解源码对于参数的介绍

package cn.afterturn.easypoi.excel.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;/*** Excel 导出基本注释* @author JueYue*  2014年6月20日 下午10:25:12*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {/*** 导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式*/public String databaseFormat() default "yyyyMMddHHmmss";/*** 导出的时间格式,以这个是否为空来判断是否需要格式化日期*/public String exportFormat() default "";/*** 导入的时间格式,以这个是否为空来判断是否需要格式化日期*/public String importFormat() default "";/*** 时间格式,相当于同时设置了exportFormat 和 importFormat*/public String format() default "";/*** 时间时区*/public String timezone() default "";/*** 数字格式化,参数是Pattern,使用的对象是DecimalFormat*/public String numFormat() default "";/*** 导出时在excel中每个列的高度 单位为字符,一个汉字=2个字符* 优先选择@ExportParams中的 height*/@Deprecatedpublic double height() default 10;/*** 导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的*/public int imageType() default 1;/*** 文字后缀,如% 90 变成90%*/public String suffix() default "";/*** 是否换行 即支持\n*/public boolean isWrap() default true;/*** 合并单元格依赖关系,比如第二列合并是基于第一列 则{1}就可以了*/public int[] mergeRely() default {};/*** 纵向合并内容相同的单元格*/public boolean mergeVertical() default false;/*** 导出时,对应数据库的字段 主要是用户区分每个字段, 不能有annocation重名的 导出时的列名* 导出排序跟定义了annotation的字段的顺序有关 可以使用a_id,b_id来确实是否使用*/public String name();/*** 导出时,表头双行显示,聚合,排序以最小的值参与总体排序再内部排序* 导出排序跟定义了annotation的字段的顺序有关 可以使用a_id,b_id来确实是否使用* 优先弱与 @ExcelEntity 的name和show属性*/public String groupName() default "";/*** 是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)*/public boolean needMerge() default false;/*** 展示到第几个可以使用a_id,b_id来确定不同排序*/public String orderNum() default "0";/*** 值得替换  导出是{a_id,b_id} 导入反过来,所以只用写一个*/public String[] replace() default {};/***  字典名称*/public String dict() default  "";/*** 下拉列表,仅支持replace和dict,dict优先* @return*/public boolean addressList() default false;/*** 导入路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/**/public String savePath() default "/excel/upload/img";/*** 导出类型 1 是文本 2 是图片,3 是函数,10 是数字, 11 特殊符号 默认是文本*/public int type() default 1;/*** 导出时在excel中每个列的宽 单位为字符,一个汉字=2个字符 如 以列名列内容中较合适的长度 例如姓名列6 【姓名一般三个字】* 性别列4【男女占1,但是列标题两个汉字】 限制1-255*/public double width() default 10;/*** 是否自动统计数据,如果是统计,true的话在最后追加一行统计,把所有数据都和* 这个处理会吞没异常,请注意这一点* @return*/public boolean isStatistics() default false;/*** 这个是不是超链接,如果是需要实现接口返回对象* @return*/public boolean isHyperlink() default false;/***  导入时会校验这个字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel*  本意是想用true的,想想还是false比较好*  可以使用a_id,b_id来确实是否使用* @return*/public String isImportField() default "false";/*** 固定的某一列,解决不好解析的问题* @return*/public int fixedIndex() default -1;/***  是否需要隐藏该列* @return*/public boolean isColumnHidden() default  false;/*** 枚举导出使用的字段* @return*/public String enumExportField() default "";/*** 枚举导入使用的函数* @return*/public String enumImportMethod() default "";/*** 数据脱敏规则* 规则1: 采用保留头和尾的方式,中间数据加星号* 如: 身份证  6_4 则保留 370101********1234*    手机号   3_4 则保留 131****1234* 规则2: 采用确定隐藏字段的进行隐藏,优先保留头* 如: 姓名   1,3 表示最大隐藏3位,最小一位*          李 -->  **          李三 --> 李**          张全蛋  --> 张*蛋*          李张全蛋 --> 李**蛋*          尼古拉斯.李张全蛋 -> 尼古拉***张全蛋* 规则3: 特殊符号后保留* 如: 邮箱    1~@ 表示只保留第一位和@之后的字段*        afterturn@wupaas.com -> a********@wupaas.com* 复杂版本请使用接口* {@link cn.afterturn.easypoi.handler.inter.IExcelDataHandler}*/public String   desensitizationRule() default "";
}

测试几个常用的参数

修改导出excel例子中的PhoneVo,用来测试suffix,format,replace参数

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PhoneVo {@Excel(name = "序号", orderNum = "1")private int code;// suffix:后面加上“手机”  replace:replace = {"展示数据_替换数据"}@Excel(name = "手机品牌名称", orderNum = "1",suffix = "手机", replace = {"OPPO_oppo"})private String name;// format指定时间转换的格式@Excel(name = "时间", orderNum = "2",format = "yyyy-MM-dd-HH:mm:ss")private Timestamp time;
}

controller层方法修改如下

    private List<PhoneVo> getList() {List<PhoneVo> res = Lists.newArrayList();for (PhoneEnum phoneEnum : PhoneEnum.values()) {res.add(PhoneVo.builder().code(phoneEnum.getCode()).name(phoneEnum.getType()).time(new Timestamp(System.currentTimeMillis())).build());}return res;}

其余不动,在浏览器中输入url,回车,查看下载的excel。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/652XxvCE.shtml

相关文章

python逻辑回归

出现函数重名问题 异常抛出 异常抛出 #逻辑回归测试 import pandas as pd from sklearn.linear_model import LogisticRegression as LR filename C:/Users/29463/OneDrive/桌面/bankloan.xls data pd.read_excel(filename) #print(data) x data.iloc[:,:8].values y data…

实现带标题的ListView

在一些项目中&#xff0c;往往有要求为ListView里的内容分类&#xff0c;比如按日期分类&#xff0c;就要把相同日期的项目放在一起。可以看一些示例图&#xff0c;会清楚一些&#xff1a; 以上根据标题来进行分类&#xff0c;实现代码如下&#xff1a; 首先是数据项的模型…

java操作excel表格详解

在日常工作中&#xff0c;对Excel工作表格的操作处理可是多的数不清楚&#xff0c;下面是java语言对其的操作&#xff0c;有需要的小伙伴可以参考下 使用场景 1、将用户信息导出为excel表格&#xff08;导出数据…) 2、将Excel表中的信息录入到网站数据库(习题上传…&#xf…

安卓表格框架-ExcelView

转载请标明来源&#xff1a;安卓表格框架-ExcelView_分享记录-CSDN博客 Github地址&#xff0c;欢迎star&#xff1a;https://github.com/September26/ExcelView 一.项目介绍 项目是仿照WPS中Excel的功能实现的&#xff0c;实现了显示&#xff0c;滑动&#xff0c;编辑等基本…

html表格打印填充分页,window.print()页面打印之表格内容分页填充进行分页打印

windwow.print()用于打印当前窗口的内容,很简便,可当内容特殊并且打印有特殊需求的时候就要绕个圈了。下面是需要打印的表格: 当数据量少的时候像上面的表格一样,中间的内容只有5条数据,打印出来在纸上会有空白,不太好。中间内容是不确定的可能几十条,可能上百条,这样循…

在线表格

在线表格案例 模仿的是腾讯文档 首先观察腾讯文档的表格效果&#xff0c;然后在构建出思路&#xff0c;开始编写代码 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>在线表格<…

Java获取word表格中的数据

前言: 有时系统中需要提取各种文件中的数据&#xff0c;比如做报表的系统中就常常与Excel表格数据做交互。做Excel报表数据时有选择POI实现的&#xff0c;但是POI功能也很单一&#xff0c;对于文档格式维护性差&#xff0c;最重要的是POI在操作word数据时显得力不从心&#xf…

HTML 表格元素

表格元素 在日常生活中&#xff0c;我们对表格已经非常熟悉了&#xff0c;表格的基本作用是用来存放数据&#xff0c;它是数据的二维容器&#xff0c;人们常常用它来记录财务数据、列车时刻表、电视节目单等。 大多数情况下&#xff0c;表格都是由列标题或行标题&#xff0c;…

Bootstrap3 表格样式

表格 HTML表格是数据的二维容器&#xff0c;它的基本作用是用来存放数据。表格能够清晰、直观地描述数据间的逻辑关系&#xff0c;如果借助CSS设计表格的样式&#xff0c;阅读数据将会变得更轻松。 表格结构包括众多标签&#xff0c;这些标签各司其职&#xff0c;共同完成二维…

数据库表格查询

1、数据库表示存储数据中所有数据的对象&#xff0c;在表中&#xff0c;数据按行和烈格式逻辑组织&#xff0c;类似于电子表格&#xff0c;数据库是SchoolMangeSystem&#xff0c;使用数据库表是SYS_Student&#xff0c;如下图&#xff1a; select字段列表&#xff0c;字段别名…

html中标题距离顶部距离,版式设计中标题间距的使用法则

主标题与副标题定义 主标题是文案的核心主旨&#xff0c;可以直接表达&#xff0c;也可以含蓄表达&#xff0c; 副标题是对对主标题意思的具体阐释&#xff0c;或者主标题意思的进一步延伸。 字距与行距 横向的字间距与纵向的行间距的关系&#xff1a; 请保持行间距的高度&…

表格解析 概览

表格解析发展至今&#xff0c;仍然是一项很年轻的研究领域&#xff0c;出现了大量解决方案&#xff0c;常用的技术包括&#xff1a;线检测、box检测、分割、多模态融合、GCN、img2seq。以下按我的理解梳理一下表格解析各个流派&#xff0c;从中了解这项任务背后所采用的技术。在…

5.让表格的标题在滚动表格时一动不动

一、冻结首行首列 处理数据量较大的表格时&#xff0c;向下拖动滚动条&#xff0c;表格的标题栏就不见了&#xff0c;用户在查看数据时&#xff0c;需要来回拖动滚动条才能看到标题&#xff0c;那么是否可以将表格设置成无论怎样滚动表格&#xff0c;标题都始终显示呢&#xf…

python表格控件_python表格控件

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pyqt5表格控件qtableview简介在通常情况下,一个应用需要和一批数据进行交互,然后以表格的形式输出这些信息,这时就需要用到qtableview类了,在qtableview中可…

element-ui(vue)表格的自定义标题,逻辑判断

<el-table :data"tableData" style"width: 100%" border><el-table-column width"180"><!-- 自定义标题--><template slot"header"><i class"el-icon-time"></i><span>自定义标题…

tomcat-命令窗口乱码

问题描述&#xff1a;刚下载的tomgcat不添加任何项目直接运行时&#xff0c;tomcat的命令窗口出现中文乱码 解决方法&#xff1a; 1、找到${CATALINA_HOME}/conf/logging.properties 2、添加语句&#xff1a;java.util.logging.ConsoleHandler.encoding GBK 3、重启tomcat&…

在此处打开命令窗口 (Open command window here)

在此处打开命令窗口 (Open command window here) 1. 在此处打开命令窗口 (Open command window here) Shift 鼠标右键 2. .exe 执行 在 .exe 文件所在的文件夹打开命令提示符窗口。如果使用的是 Windows Vista 或 Windows 7 系统&#xff0c;则需要在 Windows Explorer 中右…

mysql自动弹出命令窗口 解决

为什么mysql会自动弹出来命令窗口 关键词&#xff1a; Unable to connect to remote host. Catalog download has failed. 解决办法&#xff1a; 控制面板&#xff08;小图标&#xff09;->管理工具->任务计划程序->mysql->installer 右键禁用即可

win10系统中如何显示在此处打开命令窗口

1、首先按住windowsr键&#xff0c;在弹出的窗口中输入regedit&#xff0c;点击回车 2、找到 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\cmd&#xff0c;在右侧的框中&#xff0c;鼠标选择“默认”项&#xff0c;右键点击“修改”&#xff0c;在弹出的窗口中输入“…

Windows10如何在文件夹打开DOS命令窗口

在安装RabbitMQ的时候&#xff0c;总结了一下在当前文件夹打开DOS窗口的方式&#xff0c;大概有三种方式&#xff0c;推荐使用第三种。 &#xff08;这里D:\Tools\RabbitMQ\RabbitMQServer\rabbitmq_server-3.9.8\sbin作为目标文件夹&#xff09; 第一种方式 1、winr&#xf…