按步骤完成一个 spring boot 项目 (九) excel 导出集成
1 在 mango-common 下面创建包目录 增加 poi 依赖。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ylz.spring_boot.common</groupId>
<artifactId>spring_common</artifactId>
<packaging>jar</packaging>
<version>1.0.0</version>
<name>spring_common Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency>
<!-- poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<build>
<finalName>spring_common</finalName>
</build>
</project>
2 修改 user controller
package com.ylz.spring_boot.admin.controller;
import java.io.File;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ylz.spring_boot.admin.model.SysUser;
import com.ylz.spring_boot.admin.service.SysUserService;
import com.ylz.spring_boot.common.DateTimeUtils;
import com.ylz.spring_boot.common.FileUtils;
import com.ylz.spring_boot.common.PoiUtils;
@RestController
@RequestMapping("user")
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@GetMapping(value = "/findAll")
public Object findAll() {
return sysUserService.list();
}
@PostMapping(value = "/exportExcelUser")
public void exportExcelUser(HttpServletResponse res) {
List<SysUser> records = sysUserService.list();
Workbook workbook = new XSSFWorkbook();
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("");
row.getCell(++columnIndex).setCellValue("");
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()));
}
File file = PoiUtils.createExcelFile(workbook, "download_user");
FileUtils.downloadFile(res, file, file.getName());
}
}
3, common 项目中增加:
package com.ylz.spring_boot.common;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 日期时间相关工具
* @author Louis
* @date Jan 14, 2019
*/
public class DateTimeUtils {
public static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
/**
* 获取当前标准格式化日期时间
* @param date
* @return
*/
public static String getDateTime() {
return getDateTime(new Date());
}
/**
* 标准格式化日期时间
* @param date
* @return
*/
public static String getDateTime(Date date) {
return (new SimpleDateFormat(DATE_FORMAT)).format(date);
}
}
package com.ylz.spring_boot.common;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.servlet.http.HttpServletResponse;
/**
*/
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();
}
}
}
package com.ylz.spring_boot.common;
import java.io.Closeable;
import java.io.IOException;
/**
* 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
}
}
}
package com.ylz.spring_boot.common;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.poi.ss.usermodel.Workbook;
/**
* 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 {
file = File.createTempFile(fileName, ".xlsx");
stream = new FileOutputStream(file.getAbsoluteFile());
workbook.write(stream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(workbook);
IOUtils.closeQuietly(stream);
}
return file;
}
}
package com.ylz.spring_boot.common;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 反射相关辅助方法
* @author Louis
* @date Aug 19, 2018
*/
public class ReflectionUtils {
/**
* 根据方法名调用指定对象的方法
* @param object 要调用方法的对象
* @param method 要调用的方法名
* @param args 参数对象数组
* @return
*/
public static Object invoke(Object object, String method, Object... args) {
Object result = null;
Class<? extends Object> clazz = object.getClass();
Method queryMethod = getMethod(clazz, method, args);
if(queryMethod != null) {
try {
result = queryMethod.invoke(object, args);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
} else {
try {
throw new NoSuchMethodException(clazz.getName() + " 类中没有找到 " + method + " 方法。");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 根据方法名和参数对象查找方法
* @param clazz
* @param name
* @param args 参数实例数据
* @return
*/
public static Method getMethod(Class<? extends Object> clazz, String name, Object[] args) {
Method queryMethod = null;
Method[] methods = clazz.getMethods();
for(Method method:methods) {
if(method.getName().equals(name)) {
Class<?>[] parameterTypes = method.getParameterTypes();
if(parameterTypes.length == args.length) {
boolean isSameMethod = true;
for(int i=0; i<parameterTypes.length; i++) {
Object arg = args[i];
if(arg == null) {
arg = "";
}
if(!parameterTypes[i].equals(args[i].getClass())) {
isSameMethod = false;
}
}
if(isSameMethod) {
queryMethod = method;
break ;
}
}
}
}
return queryMethod;
}
}
package com.ylz.spring_boot.common;
/**
* 字符串工具类
* @author Louis
* @date Sep 1, 2018
*/
public class StringUtils {
/**
* 判空操作
* @param value
* @return
*/
public static boolean isBlank(String value) {
return value == null || "".equals(value) || "null".equals(value) || "undefined".equals(value);
}
}
4 ,之后通过 swagger 测试
可以正常下载和打开文件。