需要引入的jar包
<dependency>
<groupId>com.github.crab2died</groupId>
<artifactId>Excel4J</artifactId>
<version>2.1.4-Final2</version>
</dependency>
构造excel模板
import com.github.crab2died.annotation.ExcelField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
@Setter
@Getter
public class ExportDto implements Serializable {
@ExcelField(title = "标题1", order = 1)
private String title1;
@ExcelField(title = "标题2", order = 2)
private LocalDateTime title2;
@ExcelField(title = "标题3", order = 3)
private String title3;
}
controller层
@GetMapping("/export/file")
public void exportFile(
HttpServletRequest request,
HttpServletResponse response
) throws Exception {
//设置文件名
String fileName = new String(("测试文件名_" + DateUtil.getCurrentDate("yyyyMMddHHmmss")).getBytes(), "UTF-8");
fileName = UrlEncodingUtils.fileNameEncoding(fileName, request);
response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xlsx");
OutputStream outputStream = response.getOutputStream();
testService.exportFile(outputStream);
}
service层
@Override
public void exportFile(OutputStream outputStream) {
try {
//获取数据
List<ExportDto> exportDtoList = testMapper.findAll();
//组装excel
ExcelUtils.getInstance().exportObjects2Excel(exportDtoList , ExportDto.class, true, "sheet名", true, outputStream);
} catch (Excel4JException | IOException e) {
log.error("导出失败", e.getMessage());
}
}
防止文件名乱码,做的处理工具
import sun.misc.BASE64Encoder;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrlEncodingUtils {
private static final String BROWSER_TYPE_IE = "MSIE";
private static final String BROWSER_TYPE_FIREFOX = "Firefox";
/**
* 根据不同浏览器设置文件名编码
*
* @param fileName
* @param request
* @return
* @throws UnsupportedEncodingException
*/
public static String fileNameEncoding(String fileName, HttpServletRequest request) throws UnsupportedEncodingException {
// 获得请求头中的User-Agent
String agent = request.getHeader("User-Agent");
// 根据不同的客户端进行不同的编码
if (agent.contains(BROWSER_TYPE_IE)) {
// IE浏览器
fileName = URLEncoder.encode(fileName, "UTF-8");
} else if (agent.contains(BROWSER_TYPE_FIREFOX)) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
fileName = "=?utf-8?B?" + base64Encoder.encode(fileName.getBytes("UTF-8")) + "?=";
} else {
// 其它浏览器
fileName = URLEncoder.encode(fileName, "UTF-8");
}
return fileName;
}
}