1、静态类中的静态方法可以通过类名直接调用静态方法,不需要实例化对象。但是无法和Spring容器中的bean进行交互,例如:
@Slf4j
public class ExcelUtil {
public static <T> void writeEasyExcel(HttpServletResponse response, Class<T> tClass, List<T> datas, String fileName, List<Code> codeList) throws IOException, NoSuchFieldException, IllegalAccessException {
TimeInterval timer = DateUtil.timer();
if(ObjectUtil.isNull(response) || ObjectUtil.isNull(tClass)){
return;
}
if(StrUtil.isBlank(fileName)){
fileName = "excel.xlsx";
}else{
if(!fileName.contains(".xlsx")){
fileName = fileName+".xlsx";
}
}
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName, "utf-8"));
//处理注解 start
if (CollUtil.isNotEmpty(datas) && CollUtil.isNotEmpty(codeList)) {
for (T dataObj : datas) {
AnnotationUtil.resolveAnnotation(tClass, dataObj, codeList);
}
}
//处理注解 start
//registerWriteHandler 设置列宽自适应
EasyExcel.write(response.getOutputStream(), tClass)
.needHead(true)
.excelType(ExcelTypeEnum.XLSX)
.registerWriteHandler(new CustomCellWriteHandler())
.sheet("sheet")
.doWrite(datas);
log.info("导出exlce数据:{}条,耗时:{}秒!", datas.size(), timer.intervalSecond());
}
}
说明:
如果类中全是静态代码,可以使用 ExcelUtil.writeEasyExcel() 直接调用。如果类中需要和数据库交互或者需要和Spring容器交互,需要使用JavaBean动态组件类,如2说明
2、动态类是指一个类使用@Component注解标记为组件并加入到Spring容器中的类,此方式可以通过@Resource注入的方式调用方法,例如:
@Slf4j
@SuppressWarnings("all")
@Component
public class ExcelUtil {
@Resource
AnnotationUtil annotationUtil;
public <T> void writeEasyExcel(HttpServletResponse response, Class<T> tClass, List<T> datas, String fileName) throws Exception {
TimeInterval timer = DateUtil.timer();
if(ObjectUtil.isNull(response) || ObjectUtil.isNull(tClass)){
return;
}
if(StrUtil.isBlank(fileName)){
fileName = "excel.xlsx";
}else{
if(!fileName.contains(".xlsx")){
fileName = fileName+".xlsx";
}
}
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(fileName, "utf-8"));
//处理注解 start
if (CollUtil.isNotEmpty(datas)) {
for (T dataObj : datas) {
annotationUtil.resolveAnnotation(tClass, dataObj);
}
}
//处理注解 start
//registerWriteHandler 设置列宽自适应
EasyExcel.write(response.getOutputStream(), tClass)
.registerWriteHandler(new CustomCellWriteHandler())
.excelType(ExcelTypeEnum.XLSX)
.sheet("sheet")
.doWrite(datas);
log.info("导出exlce数据:{}条,耗时:{}秒!", datas.size(), timer.intervalSecond());
}
}
说明:
1、因为此类中 writeEasyExcel() 方法中调用了 annotationUtil.resolveAnnotation() 方法,而 AnnotationUtil 类中的 resolveAnnotation() 方法需要和 redis 数据库交互,所以需要把 AnnotationUtil 类标记为组件对象加入容器,使用注入的方式调用 redisTemplate 对象
2、然后通过注入 ExcelUtil 的对象,调用 writeEasyExcel() 方法,如:
//注入
@Resource
ExcelUtil excelUtil;
//调用
excelUtil.writeEasyExcel()
3、总结:只要类中使用容器注入对象,那么这个类需要使用组件注解 @Component 把本类标记为组件类,加入到Spring容器中,才可以参与对象依赖注入。被调用的类规则也是如此
网友评论