使用easy_poi完成excel表的传输
easypoi介绍
EasyPoi
是一个基于Apache POI
的Java Excel
导入导出框架,它可以帮助开发人员快速、方便地实现Excel
文件的导入和导出功能。EasyPoi
提供了丰富的API
和注解,使得操作Excel
变得简单而高效。
@Excel注解参数
属性 |
类型 |
默认值 |
功能 |
name |
String |
null |
列名,支持name_id |
needMerge |
boolean |
fasle |
是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row) |
orderNum |
String |
“0” |
列的排序,支持name_id |
replace |
String[] |
{} |
值得替换 导出是{a_id,b_id} 导入反过来 |
savePath |
String |
“upload” |
导入文件保存路径,如果是图片可以填写,默认是upload/className/ IconEntity这个类对应的就是upload/Icon/ |
type |
int |
1 |
导出类型 1 是文本 2 是图片,3 是函数,10 是数字 默认是文本 |
width |
double |
10 |
列宽 |
height |
double |
10 |
列高,后期打算统一使用@ExcelTarget的height,这个会被废弃,注意 |
isStatistics |
boolean |
fasle |
自动统计数据,在追加一行统计,把所有数据都和输出[这个处理会吞没异常,请注意这一点] |
isHyperlink |
boolean |
false |
超链接,如果是需要实现接口返回对象 |
isImportField |
boolean |
true |
校验字段,看看这个字段是不是导入的Excel中有,如果没有说明是错误的Excel,读取失败,支持name_id |
exportFormat |
String |
“” |
导出的时间格式,以这个是否为空来判断是否需要格式化日期 |
importFormat |
String |
“” |
导入的时间格式,以这个是否为空来判断是否需要格式化日期 |
format |
String |
“” |
时间格式,相当于同时设置了exportFormat 和 importFormat |
databaseFormat |
String |
“yyyyMMddHHmmss” |
导出时间设置,如果字段是Date类型则不需要设置 数据库如果是string 类型,这个需要设置这个数据库格式,用以转换时间格式输出 |
numFormat |
String |
“” |
数字格式化,参数是Pattern,使用的对象是DecimalFormat |
imageType |
int |
1 |
导出类型 1 从file读取 2 是从数据库中读取 默认是文件 同样导入也是一样的 |
suffix |
String |
“” |
文字后缀,如% 90 变成90% |
isWrap |
boolean |
true |
是否换行 即支持\n |
mergeRely |
int[] |
{} |
合并单元格依赖关系,比如第二列合并是基于第一列 则{0}就可以了 |
mergeVertical |
boolean |
fasle |
纵向合并内容相同的单元格 |
fixedIndex |
int |
-1 |
对应excel的列,忽略名字 |
isColumnHidden |
boolean |
false |
导出隐藏列 |
依赖导入
1 2 3 4 5
| <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.3.0</version> </dependency>
|
导出(包含图片)
实体类
创建实体类,其中我们的一个user
对应着多个course
,我们使用ExcelCollection
注解表示。如果是一对一的关系,我们这个实体还需要对应一个对象的话,可以使用ExcelEntity
注解表示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Data @NoArgsConstructor @AllArgsConstructor @ExcelTarget("user") public class User implements Serializable { @ExcelIgnore private static final long serialVersionUID = 8396566671249699691L; @Excel(name = "学生编号") Integer id; @Excel(name = "姓名") String name;
@Excel(name = "学生头像",width = 20,height = 20,type = 2) String photo;
@ExcelCollection(name = "选课") List<Course> courses; }
|
1 2 3 4 5 6 7 8 9 10
| @Data @AllArgsConstructor @NoArgsConstructor public class Course { @Excel(name = "课程编号") Integer courseId;
@Excel(name = "课程名") String courseName; }
|
Controller(上传本地的图片)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @RestController @RequestMapping("/easypoi") public class POIController {
@RequestMapping("/export") public int importExcel(HttpServletRequest request) throws IOException { ExportParams params = new ExportParams("学生表","sheet1"); User user = new User(1,"zgy","D:\\desktop\\Snipaste_2024-01-22_14-13-04.png", Arrays.asList(new Course(1,"课程1"),new Course(2,"课程12"))); List<User> users = new ArrayList<>(); users.add(user); Workbook sheets = ExcelExportUtil.exportExcel(params, User.class, users); FileOutputStream outputStream = new FileOutputStream("D:\\desktop\\users.xls"); sheets.write(outputStream); outputStream.close(); sheets.close(); return 1; } }
|
效果图

Controller(上传远程的图片)
从远程url读取byte
数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| @RestController @RequestMapping("/easypoi") public class POIController {
@RequestMapping("/export") public int importExcel(HttpServletRequest request) throws Exception { ExportParams params = new ExportParams("学生表","sheet1"); User user = new User(1,"zgy",readUrlAsBytes("https://cdn.acwing.com/media/user/profile/photo/80738_lg_e91297d1fd.jpg"), Arrays.asList(new Course(1,"课程1"),new Course(2,"课程12"))); List<User> users = new ArrayList<>(); users.add(user);
Workbook sheets = ExcelExportUtil.exportExcel(params, User.class, users); FileOutputStream outputStream = new FileOutputStream("D:\\desktop\\users.xls"); sheets.write(outputStream); outputStream.close(); sheets.close();
return 1; }
public static byte[] readUrlAsBytes(String urls) throws Exception { URL url = new URL(urls); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); URLConnection urlConnection = url.openConnection(); urlConnection.setReadTimeout(10*1000); InputStream inputStream = urlConnection.getInputStream(); byte[] bytes = new byte[1024]; int len = 0; while((len = inputStream.read(bytes)) != -1){ byteArrayOutputStream.write(bytes,0,len); } byte[] result = byteArrayOutputStream.toByteArray(); byteArrayOutputStream.close(); inputStream.close(); return result; } }
|
pojo
这里我们不仅需要把图片的类型改成byte[]
还需要把注解里面的imageType
设置成2。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Data @NoArgsConstructor @AllArgsConstructor @ExcelTarget("user") public class User implements Serializable { @ExcelIgnore private static final long serialVersionUID = 8396566671249699691L; @Excel(name = "学生编号") Integer id; @Excel(name = "姓名") String name;
@Excel(name = "学生头像",width = 20,height = 20,type = 2,imageType = 2) byte[] photo;
@ExcelCollection(name = "选课") List<Course> courses
}
|
效果

导入
这里面的导入只选择简单的导入,我们修改pojo
内部不包含任何对象。注意导入需要设置图片的保存路径,不然的话回保存在默认的位置。
pojo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| @Data @NoArgsConstructor @AllArgsConstructor @ExcelTarget("user") public class User implements Serializable { @ExcelIgnore private static final long serialVersionUID = 8396566671249699691L; @Excel(name = "学生编号") Integer id; @Excel(name = "姓名") String name;
@Excel(name = "学生头像",width = 20,height = 20,type = 2,imageType = 1,savePath = "D:\\desktop") String photo; }
|
controller
1 2 3 4 5 6 7 8 9 10
| @RequestMapping("/import") public int importExcel(HttpServletRequest request) throws Exception { ImportParams importParams = new ImportParams(); importParams.setHeadRows(1); importParams.setTitleRows(1); FileInputStream inputStream = new FileInputStream("D:\\desktop\\users.xls"); List<Object> objects = ExcelImportUtil.importExcel(new File("D:\\desktop\\users.xls"), User.class, importParams); objects.stream().forEach(System.out::println); return 1; }
|
版权声明: 此文章版权归waar299所有,如有转载,请注明来自原作者!