今天开发遇到需要导出excel表格的需求,在网上选择了阿里的easyExcel
线上阿里demo里面的代码
/**
* 文件下载
* <p>
* 1. 创建excel对应的实体对象 参照{@link DownloadData}
* <p>
* 2. 设置返回的 参数
* <p>
* 3. 直接写,这里注意,finish的时候会自动关闭OutputStream,当然你外面再关闭流问题不大
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
// 这里注意 有同学反应下载的文件名不对。这个时候 请别使用swagger 他会影像
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}
private List<DownloadData> data() {
List<DownloadData> list = new ArrayList<DownloadData>();
for (int i = 0; i < 10; i++) {
DownloadData data = new DownloadData();
data.setString("字符串" + 0);
data.setDate(new Date());
data.setDoubleData(0.56);
list.add(data);
}
return list;
}
DownloadData 对象
@Data
public class DownloadData {
@ExcelProperty("字符串标题")
private String string;
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
private Double doubleData;
}
然后自己把这些代码封装成一个工具类 ExcelUtils
import com.alibaba.excel.EasyExcel;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@Slf4j
public class ExcelUtils {
public static void downLoadExcel(HttpServletResponse response,Class<?> clazz,List<?> data,String fileName){
try {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename="+fileName+".xlsx");
EasyExcel.write(response.getOutputStream(),clazz).sheet("sheet1").doWrite(data);
}catch (Exception e){
log.error("excel处理异常:" + e);
}
}
}
使用
ExcelUtils.downLoadExcel(response,DownloadDTO.class,data(), “xiazai”)
这个工具还有一个小bug,就是filename不能是中文否则下载后成了____.xlsx
git地址
https://github.com/alibaba/easyexcel