easyExcel的填充式导出与XLSTransformer的模板导出类似,都可以将复杂表格的导出简单化,不需要自己去画复杂的表头和调样式;但是在大数据量的导出远远比XLSTransformer性能好。
1、首先还是先引入easyExcel依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.0-beta1</version>
</dependency>
2、然后在controller层进行导出的具体实现,主要包含使用模板填充的示例、多个sheet页的实现、横向数据展示的示例:
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.szpsbnpt.hrs.archive.dto.ArchiveDocsDTO;
import com.szpsbnpt.hrs.archive.facade.ArchiveDocsFacade;
import com.szpsbnpt.hrs.archive.web.vo.ArchiveDwVO;
import com.szpsbnpt.hrs.archive.web.vo.FillWrapper;
import com.szpsbnpt.hrs.util.FileUtil;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import jade.core.dto.TableTagBean;
public class TestController {
@Autowired
private ArchiveDocsFacade archiveDocsFacade;
@ApiOperation(value = "导出我的材料池")
@ApiImplicitParams({
@ApiImplicitParam(paramType = "query", name = "query", value = "姓名/J号", dataType = "String")
})
@GetMapping(value = "/exportMyArchiveList")
public void exportMyArchiveList(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("材料列表", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
OutputStream outputStream = response.getOutputStream();
TableTagBean ttb = TableTagBean.getFromExt(request);
List<ArchiveDocsDTO> list = archiveDocsFacade.listArchiveDocs(ttb);
List<ArchiveDwVO> list2 = new ArrayList<ArchiveDwVO>();
ArchiveDwVO vo = new ArchiveDwVO();
vo.setDwName("单位一");
list2.add(vo);
vo = new ArchiveDwVO();
vo.setDwName("单位二");
list2.add(vo);
Map<String, Object> map = new HashMap<String, Object>();
// 获取模板路径
String templateFileName = FileUtil.getPath() + "excel/exportArchiveList2.xls";
// 创建输出的excel对象
final ExcelWriter write = EasyExcel.write(outputStream).withTemplate(templateFileName).build();
// 创建第一个sheel页
final WriteSheet sheet1 = EasyExcel.writerSheet(0,"材料列表1").build();
// 创建第二个sheel页
final WriteSheet sheet2 = EasyExcel.writerSheet(1,"材料列表2").build();
// 设置列表横向展示
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
// 使用数据横向展示的示例
// write.fill(list,fillConfig,sheet1);
write.fill(list, sheet1);
map.put("total", "材料列表1");
write.fill(map, sheet1);
write.fill(list, sheet2);
map.put("total", "材料列表2");
write.fill(map, sheet2);
// 关闭流
write.finish();
}
}
3、创建实体对象
@Data
public class ArchiveDocsDTO{
private Integer idx;
// 资料类型代码
private String docType;
private String docTypeName;
// 姓名
private String personName;
// J号
private String policeNo;
// 身份证号
private String idCard;
// 编制单位名称
private String dwName;
// 归档状态
private Integer status;
private String statusName;
// 归档人单位编码
private String gdDwCode;
private String gdDwCodeName;
// 产生方式
private Integer source;
private String sourceName;
private String taskId;
// 材料名称
private String docName;
// 出生日期
private String birthDay;
}
4、模板样式,多个sheet页如果每个sheet页样式都不同需要自己手动提前为每个sheet页画模板,如果样式一样可以通过POI去拷贝;
5、最终导出结果
另外附属获取模板路径的工具类:
import java.io.File;
import java.io.InputStream;
public class FileUtil {
public static InputStream getResourcesFileInputStream(String fileName) {
return Thread.currentThread().getContextClassLoader().getResourceAsStream("" + fileName);
}
public static String getPath() {
return FileUtil.class.getResource("/").getPath();
}
public static File createNewFile(String pathName) {
File file = new File(getPath() + pathName);
if (file.exists()) {
file.delete();
} else {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
}
return file;
}
public static File readFile(String pathName) {
return new File(getPath() + pathName);
}
public static File readUserHomeFile(String pathName) {
return new File(System.getProperty("user.home") + File.separator + pathName);
}
}