package com.tyhb.admin.core.config;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;
public class ExcelUtils {
/**
* 导出多个 Sheet 页
* @param response
* @param sheetList 页数据
* @param fileName 文件名
*/
public static void exportExcel(HttpServletResponse response, List<SheetDTO> sheetList, String fileName) {
ExcelWriter bigWriter = ExcelUtil.getBigWriter();
// 重命名第一个Sheet的名称,不然会默认多出一个Sheet1的页
bigWriter.renameSheet(0, sheetList.get(0).getSheetName());
for (SheetDTO sheet : sheetList) {
// 指定要写出的 Sheet 页
bigWriter.setSheet(sheet.getSheetName());
Integer[] columnWidth = sheet.getColumnWidth();
if (columnWidth == null || columnWidth.length != sheet.getFieldAndAlias().size()) {
// 设置默认宽度
for (int i = 0; i < sheet.getFieldAndAlias().size(); i++) {
bigWriter.setColumnWidth(i, 25);
}
} else {
// 设置自定义宽度
for (int i = 0; i < columnWidth.length; i++) {
bigWriter.setColumnWidth(i, columnWidth[i]);
}
}
// 设置字段和别名
bigWriter.setHeaderAlias(sheet.getFieldAndAlias());
// 设置只导出有别名的字段
bigWriter.setOnlyAlias(true);
// 设置默认行高
bigWriter.setDefaultRowHeight(18);
// 设置冻结行
bigWriter.setFreezePane(1);
// 一次性写出内容,使用默认样式,强制输出标题
bigWriter.write(sheet.getCollection(), true);
// 设置所有列为自动宽度,不考虑合并单元格
// bigWriter.autoSizeColumnAll();
}
ServletOutputStream out = null;
try {
//response为HttpServletResponse对象
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition",
"attachment;filename=" +
URLEncoder.encode(fileName + DateUtil.today() + ".xlsx", "UTF-8"));
out = response.getOutputStream();
bigWriter.flush(out, true);
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭writer,释放内存
bigWriter.close();
}
//此处记得关闭输出Servlet流
IoUtil.close(out);
}
}
package com.tyhb.admin.core.config;
import lombok.Data;
import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
@Data
public class SheetDTO implements Serializable {
private static final long serialVersionUID = 1L;
/** sheet页名称 */
private String sheetName;
/** 字段和别名,如果使用这个,properties 和 titles可以不用处理 */
private Map<String, String> fieldAndAlias;
/** 字段 */
private String[] properties;
/** 标题/别名 */
private String[] titles;
/** 列宽 */
private Integer[] columnWidth;
/** 数据集 */
private Collection<?> collection;
public Map<String, String> getFieldAndAlias() {
if (fieldAndAlias == null) {
this.fieldAndAlias = new LinkedHashMap<String, String>();
for (int i = 0; i < properties.length; i++) {
fieldAndAlias.put(properties[i], titles[i]);
}
}
return fieldAndAlias;
}
public void setFieldAndAlias(Map<String, String> fieldAndAlias) {
this.fieldAndAlias = fieldAndAlias;
}
// 省略其他set get
}
@RequestMapping("/export")
@ResponseBody
public void export(HttpServletResponse response){
List<User> list = new ArrayList<>();
list.add(new User("zhangsan","1231",new Date()));
list.add(new User("zhangsan1","1232",new Date()));
list.add(new User("zhangsan2","1233",new Date()));
list.add(new User("zhangsan3","1234",new Date()));
list.add(new User("zhangsan4","1235",new Date()));
list.add(new User("zhangsan5","1236", DateUtil.date(new Date())));
String [] titles = {"姓名","年龄","日期"};
String [] columns ={"name","age","birthDay"};
List<SheetDTO> sheetList = new ArrayList<SheetDTO>();
SheetDTO sheet1 = new SheetDTO();
sheet1.setTitles(titles);
sheet1.setProperties(columns);
sheet1.setSheetName("第一个sheet页");
sheet1.setCollection(list);
sheetList.add(sheet1);
SheetDTO sheet2 = new SheetDTO();
sheet2.setTitles(titles);
sheet2.setProperties(columns);
sheet2.setSheetName("第2个sheet页");
sheet2.setCollection(list);
sheetList.add(sheet2);
ExcelUtils.exportExcel(response,sheetList,"测试导出sheet");
}