使用apache poi和反射实现公共方法来导出Excel,仅使用几十行简单的代码就能替代掉很多繁琐和重复的工作,这里只实现了一个简单的方法,实现了主要的逻辑,剩余的可以根据自己的需求进行扩展,有不对的地方或者有更好的方法可以一起交流。
- 添加依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.1</version>
</dependency>
- 创建ExportUtils类,实现公共导出方法,复制后可以直接使用
/**
* Description: pms
*
* @author songyu
* @date 2020/4/23 15:00
*/
public class ExportUtils {
public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
/**
*
* @param list 需要导出的数据
* @param fileName 文件名称
* @param columnHeadArr 列头
* @param columnNameArr 列名 顺序与列头保持一致
*/
public static void export(List<Object> list, String fileName, String[] columnHeadArr, String[] columnNameArr, HttpServletResponse response) {
try {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Sheet1");
//需要设置表格样式的可以自己添加,比如宽度自适应、字体颜色等等
//处理表头
HSSFRow row = sheet.createRow(0);
IntStream.range(0,columnHeadArr.length).forEach(i -> {
row.createCell(i).setCellValue(columnHeadArr[i]);
});
//处理需要导出的数据
IntStream.range(0,list.size()).forEach(i -> {
HSSFRow r = sheet.createRow(i + 1);
Class c = list.get(i).getClass();
IntStream.range(0,columnNameArr.length).forEach(j -> {
try {
//获取属性的get方法名称,比如getName,下一步使用反射获取属性的值。
String getMethodName = "get" + columnNameArr[j].substring(0, 1).toUpperCase() + columnNameArr[j].substring(1);
Method getMethod = c.getMethod(getMethodName, new Class[] {});
Object value = getMethod.invoke(list.get(i), new Object[] {});
//一些特殊类型的值可以在这里处理,这里只简单的写了一个日期类型的格式化,可以自己根据实际需求添加
if (value instanceof Date) {
r.createCell(j).setCellValue(value==null?"":format.format(value));
} else {
r.createCell(j).setCellValue(value==null?"":value.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
});
});
//弹出一个"文件下载"的对话框
response.setContentType("application/octet-stream");
//文件名为中文时会乱码,需要转一下
response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName,"UTF-8") + ".xls");
response.flushBuffer();
workbook.write(response.getOutputStream());
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 使用Student表来演示效果,数据库中两条数据。 image.png
创建pojo
public class Student implements Serializable {
private Integer id;
private String name;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name == null ? null : name.trim();
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address == null ? null : address.trim();
}
}
- 编写StudentMapper,实现查询需要导出的学生信息
@Mapper
public interface StudentMapper {
List<Object> getAllStudent();
}
5.编辑StudentMapper.xml,实现查询学生信息
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sy.mybatis.mapper.StudentMapper" >
<cache></cache>
<resultMap id="BaseResultMap" type="com.sy.mybatis.pojo.Student" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="address" property="address" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
id, name, address
</sql>
<select id="getAllStudent" resultMap="BaseResultMap">
select *
from students
</select>
</mapper>
- 添加StudentService类,实现导出功能
@Service
public class StudentService {
@Autowired
StudentMapper studentMapper;
public void exportStudent(HttpServletResponse response) {
List<Object> stus = studentMapper.getAllStudent();
//开始执行导出逻辑,后续其它的导出都可以直接使用下面的几行代码实现,比如学生成绩等等等
//定义导出文件的名称
String fileName = "学生信息";
//列头
String[] columnHeadArr = {"姓名","地址"};
//列属性(pojo的属性名称),要与列头一一对应
String[] columnNameArr = {"name","address"};
//调用公共导出方法
ExportUtils.export(stus, fileName, columnHeadArr, columnNameArr,response);
}
}
- 编辑StudenController,添加导出方法
@RestController
@RequestMapping(value = "/student")
public class StudenController {
@Autowired
private StudentService studentService;
@GetMapping(path = "/export_student")
public void exportStudent(HttpServletResponse response) {
studentService.exportStudent(response);
}
}
测试
调用导出方法:http://localhost:9091/student/export_student
image.png
数据已经正常导出到了EXCEL。
上面罗里吧嗦的说了那么多,导出相关的实际不多,获取到想要导出的数据后,只需要使用下面几行代码调用公共导出方法即可。
//文件名称
String fileName = "文件名称";
//列头
String[] columnHeadArr = {"姓名","地址"};
//列属性(pojo的属性名称),要与列头一一对应
String[] columnNameArr = {"name","address"};
//调用公共导出方法
ExportUtils.export(qxds, fileName, columnHeadArr, columnNameArr,response);
网友评论