excel导出
springboot导出Excel报表
一.实现流程
1.添加POI 的相关jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
2.编写服务接口
比如说你要通过Excel表导出用户信息,你在用户管理接口中添加一个导出用户信息Excel报表的方法,采用分页查询的方式,可以传入要导出数据的范围,如需要导出全部,将页数据调制很大即可,同时因为调用的是分页查询方法查询数据,所以同样支持传入过滤字段进行数据过滤。SysUserService接口代码:
/**
* 生成用户信息Excel文件
* @param pageRequest 要导出的分页查询参数
* @return
*/
File createUserExcelFile(PageRequest pageRequest);
3.编写服务实现
在用户管理服务实现类中编写实现代码,生成Excel。SysUserServiceImpl实现类代码:
@Override
public File createUserExcelFile(PageRequest pageRequest) {
PageResult pageResult = findPage(pageRequest);
return createUserExcelFile(pageResult.getContent());
}
public static File createUserExcelFile(List<?> records) {
if (records == null) {
records = new ArrayList<>();
}
Workbook workbook = new XSSFWorkbook();
//创建一个sheet,括号里可以输入sheet名称,默认为sheet0
Sheet sheet = workbook.createSheet();
Row row0 = sheet.createRow(0);
int columnIndex = 0;
row0.createCell(columnIndex).setCellValue("No");
row0.createCell(++columnIndex).setCellValue("ID");
row0.createCell(++columnIndex).setCellValue("用户名");
row0.createCell(++columnIndex).setCellValue("昵称");
row0.createCell(++columnIndex).setCellValue("机构");
row0.createCell(++columnIndex).setCellValue("角色");
row0.createCell(++columnIndex).setCellValue("邮箱");
row0.createCell(++columnIndex).setCellValue("手机号");
row0.createCell(++columnIndex).setCellValue("状态");
row0.createCell(++columnIndex).setCellValue("头像");
row0.createCell(++columnIndex).setCellValue("创建人");
row0.createCell(++columnIndex).setCellValue("创建时间");
row0.createCell(++columnIndex).setCellValue("最后更新人");
row0.createCell(++columnIndex).setCellValue("最后更新时间");
for (int i = 0; i < records.size(); i++) {
SysUser user = (SysUser) records.get(i);
Row row = sheet.createRow(i + 1);
for (int j = 0; j < columnIndex + 1; j++) {
row.createCell(j);
}
columnIndex = 0;
row.getCell(columnIndex).setCellValue(i + 1);
row.getCell(++columnIndex).setCellValue(user.getId());
row.getCell(++columnIndex).setCellValue(user.getName());
row.getCell(++columnIndex).setCellValue(user.getNickName());
row.getCell(++columnIndex).setCellValue(user.getDeptName());
row.getCell(++columnIndex).setCellValue(user.getRoleNames());
row.getCell(++columnIndex).setCellValue(user.getEmail());
row.getCell(++columnIndex).setCellValue(user.getStatus());
row.getCell(++columnIndex).setCellValue(user.getAvatar());
row.getCell(++columnIndex).setCellValue(user.getCreateBy());
row.getCell(++columnIndex).setCellValue(DateTimeUtils.getDateTime(user.getCreateTime()));
row.getCell(++columnIndex).setCellValue(user.getLastUpdateBy());
row.getCell(++columnIndex).setCellValue(DateTimeUtils.getDateTime(user.getLastUpdateTime()));
}
//调用PoiUtils工具包
return PoiUtils.createExcelFile(workbook, "download_user");
}
4.编写控制器
在用户管理控制器类添加一个接口,并调用service获取File,最终通过文件操作工具类将File下载到本地。SYSUserController类代码:
@PostMapping(value="/exportExcelUser")
public void exportExcelUser(@RequestBody PageRequest pageRequest, HttpServletResponse res) {
File file = sysUserService.createUserExcelFile(pageRequest);
FileUtils.downloadFile(res, file, file.getName());
}
二.工具类文件
为了简化代码,前面代码的实现封装了一些工具类。
2.1 PoiUtils
在编写服务的时候我们通过PoiUtils中的createExcelFile方法生成Excel文件。代码:
/**
* POI相关操作
* @author Louis
* @date Jan 14, 2019
*/
public class PoiUtils {
/**
* 生成Excel文件
* @param workbook
* @param fileName
* @return
*/
public static File createExcelFile(Workbook workbook, String fileName) {
OutputStream stream = null;
File file = null;
try {
//用了createTempFile,这是创建临时文件,系统会自动给你的临时文件编号,所以后面有号码,你用createNewFile的话就完全按照你指定的名称来了
file = File.createTempFile(fileName, ".xlsx");
stream = new FileOutputStream(file.getAbsoluteFile());
workbook.write(stream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//这里调用了IO工具包控制开关
IOUtils.closeQuietly(workbook);
IOUtils.closeQuietly(stream);
}
return file;
}
}
IOUtils
/**
* IO相关工具类
* @author Louis
* @date Oct 29, 2018
*/
public class IOUtils {
/**
* 关闭对象,连接
* @param closeable
*/
public static void closeQuietly(final Closeable closeable) {
try {
if (closeable != null) {
closeable.close();
}
} catch (final IOException ioe) {
// ignore
}
}
}
2.2 FileUtils
在编写导出接口的时候我们通过FileUtils中的downloadFile将Excel文件下载到本地。代码:
/**
* 文件相关操作
* @author Louis
* @date Jan 14, 2019
*/
public class FileUtils {
/**
* 下载文件
* @param response
* @param file
* @param newFileName
*/
public static void downloadFile(HttpServletResponse response, File file, String newFileName) {
try {
response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8"));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
InputStream is = new FileInputStream(file.getAbsolutePath());
BufferedInputStream bis = new BufferedInputStream(is);
int length = 0;
byte[] temp = new byte[1 * 1024 * 10];
while ((length = bis.read(temp)) != -1) {
bos.write(temp, 0, length);
}
bos.flush();
bis.close();
bos.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2.3 创建excel直接下载
try {
Workbook workbook = new XSSFWorkbook();
response.setHeader("Content-Disposition", "attachment; filename=" + (new Date()).getTime() + ".xlsx");
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
workbook.write(bos);
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}


浙公网安备 33010602011771号