一、准备工作
1、pom依赖
在pom.xml中加入POI的依赖
1
2
3
4
5
6
7
8
9
10
|
< dependency >
< groupId >org.apache.poi</ groupId >
< artifactId >poi-ooxml</ artifactId >
< version >3.11-beta1</ version >
</ dependency >
< dependency >
< groupId >org.apache.poi</ groupId >
< artifactId >poi-ooxml-schemas</ artifactId >
< version >3.11-beta1</ version >
</ dependency >
|
2、自定义注解
自定义注解,用于定义excel单元格的相关信息,用在需要导出的类上。
大家可以根据自己的实际需求来定义更多的内容。
1
2
3
4
5
6
7
8
9
10
11
12
|
@Retention (RetentionPolicy.RUNTIME)
int order() default 9999 ; //定义字段在excel的单元格列坐标位置
String title() default "" ; //定义列坐标对应的标题
int cloumn() default 100 ; //定义列宽
String pattern() default "" ; //定义日期显示格式
}
|
3、定义需要导出的实体
举例说明@ExcelResources 的应用场景,我们创建一个demoModel,包含姓名、年龄、性别、日期。
后边的excel导出例子也采用这个实体类来举例。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Data
public class ExcelDemoModel {
@ExcelResources (order= 0 ,title = "姓名" ,cloumn = 10 )
private String name;
@ExcelResources (order= 1 ,title = "年龄" ,cloumn = 10 )
private Integer age;
@ExcelResources (order= 2 ,title = "创建时间" ,cloumn = 24 ,pattern = "yyyy-MM-dd HH:mm:ss" )
private Date createTime;
@ExcelResources (order= 3 ,title = "性别" ,cloumn = 10 )
private SexType sex; //枚举
}
|
4、定义导出辅助类
用于存放导出的excel对应标题和列宽
1
2
3
4
5
6
7
8
9
|
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TitleAndCloumn {
private String title; //标题
private int cloumn; //列宽
}
|
二、具体的导出方法
1、导出主要方法
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
@Service
public class ExcelService {
private static float title_row_height= 30 ; //标题行高
private static float data_row_height= 25 ; //数据行高
public void exportExcel(HttpServletRequest request, HttpServletResponse response, String fileName ,List<?> excelDatas,Class<?> clz ) {
try {
HSSFWorkbook resultWb= new HSSFWorkbook();
HSSFSheet sheet=resultWb.createSheet(); //创建sheet
//根据类类型信息获取导出的excel对应的标题和列宽 key-列号,value-标题和列宽
HashMap<Integer, TitleAndCloumn> orderTitleAndCloumnMap=getTitleAndCloumnMap(clz);
//设置列宽
orderTitleAndCloumnMap.forEach((k,v) -> {
sheet.setColumnWidth(k, v.getCloumn()* 256 );
});
HSSFRow row0=sheet.createRow( 0 );
//设置标题行高
row0.setHeightInPoints(title_row_height);
//创建标题单元格格式
HSSFCellStyle titleCellStyle=getCellStyle(resultWb, 11 , true ,HSSFColor.BLACK.index);
//填充标题行内容
orderTitleAndCloumnMap.forEach((k,v) -> {
HSSFCell row0Cell=row0.createCell(k);
row0Cell.setCellValue(v.getTitle());
row0Cell.setCellStyle(titleCellStyle);
});
//创建正文单元格格式
HSSFCellStyle dataStyle = getCellStyle(resultWb, 11 , false ,HSSFColor.BLACK.index);
//将正文转换为excel数据
int rowNum= 1 ;
for (Object data:excelDatas){
HSSFRow row=sheet.createRow(rowNum++);
row.setHeightInPoints(data_row_height);
//获取对象值 key-列号 value-String值
HashMap<Integer,String> orderValueMap=getValueMap(data);
orderValueMap.forEach((k,v) ->{
HSSFCell cell=row.createCell(k);
cell.setCellValue(v);
cell.setCellStyle(dataStyle);
}
);
}
String downFileName=fileName+ ".xls" ;
response.setContentType( "application/vnd.ms-excel; charset=UTF-8" ); // application/x-download
response.setHeader( "Content-Disposition" , "attachment; "
+encodeFileName(request, downFileName));
OutputStream outputStream = response.getOutputStream();
resultWb.write(outputStream);
outputStream.flush();
outputStream.close();
resultWb.close();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
|
2、通过反射获取excel标题和列宽
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
|
/**
* 获取类的属性对应单元格标题和列宽
* @param
* @return
*/
private static HashMap<Integer, TitleAndCloumn> getTitleAndCloumnMap(Class<?> clz) {
HashMap<Integer, TitleAndCloumn> orderTitleAndCloumnMap= new HashMap<>();
Field[] fs = clz.getDeclaredFields();
for (Field f:fs) {
f.setAccessible( true );
if (f.isAnnotationPresent(ExcelResources. class )) {
Integer order=f.getAnnotation(ExcelResources. class ).order();
String id="codetool">
3、创建CellStyle 通过传入参数定义简单地CellStyle
4、通过反射获取对象信息并处理成String字符串 我这里只涉及到基本数据类型和Date以及枚举的值获取和转换,小伙伴可以根据自己的实际情况进行修改。
5、枚举的定义 如果有用到枚举存储在数据库的小伙伴,可以自定义枚举的toString方法来实现excel导出时候相应的内容
6、encodeFileName
三、方法调用案例 1、方法调用
2、导出效果
到此这篇关于SpringBoot整合POI导出通用Excel的方法示例的文章就介绍到这了,更多相关SpringBoot整合POI导出Excel内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家! 原文链接:https://blog.csdn.net/mengdi_cao/article/details/108143004 延伸 · 阅读
精彩推荐
|