package cc.mrbird.febs.others.controller; import cc.mrbird.febs.common.annotation.ControllerEndpoint; import cc.mrbird.febs.common.controller.BaseController; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.others.entity.Eximport; import cc.mrbird.febs.others.service.IEximportService; import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.wuwenze.poi.ExcelKit; import com.wuwenze.poi.handler.ExcelReadHandler; import com.wuwenze.poi.pojo.ExcelErrorField; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.IntStream; /** * @author MrBird */ @Slf4j @RestController @RequestMapping("eximport") @RequiredArgsConstructor public class EximportController extends BaseController { private final IEximportService eximportService; @GetMapping @RequiresPermissions("others:eximport:view") public FebsResponse findEximports(QueryRequest request) { Map dataTable = getDataTable(eximportService.findEximports(request, null)); return new FebsResponse().success().data(dataTable); } /** * 生成 Excel导入模板 */ @GetMapping("template") @RequiresPermissions("eximport:template") public void generateImportTemplate(HttpServletResponse response) { // 构建数据 List list = new ArrayList<>(); IntStream.range(0, 20).forEach(i -> { Eximport eximport = new Eximport(); eximport.setField1("字段1"); eximport.setField2(i + 1); eximport.setField3("mrbird" + i + "@gmail.com"); list.add(eximport); }); // 构建模板 ExcelKit.$Export(Eximport.class, response).downXlsx(list, true); } /** * 导入Excel数据,并批量插入 T_EXIMPORT表 */ @PostMapping("import") @RequiresPermissions("eximport:import") @ControllerEndpoint(exceptionMessage = "导入Excel数据失败") public FebsResponse importExcels(MultipartFile file) throws IOException { if (file.isEmpty()) { throw new FebsException("导入数据为空"); } String filename = file.getOriginalFilename(); if (!StringUtils.endsWith(filename, ".xlsx")) { throw new FebsException("只支持.xlsx类型文件导入"); } // 开始导入操作 Stopwatch stopwatch = Stopwatch.createStarted(); final List data = Lists.newArrayList(); final List> error = Lists.newArrayList(); ExcelKit.$Import(Eximport.class).readXlsx(file.getInputStream(), new ExcelReadHandler() { @Override public void onSuccess(int sheet, int row, Eximport eximport) { // 数据校验成功时,加入集合 eximport.setCreateTime(new Date()); data.add(eximport); } @Override public void onError(int sheet, int row, List errorFields) { // 数据校验失败时,记录到 error集合 error.add(ImmutableMap.of("row", row, "errorFields", errorFields)); } }); if (CollectionUtils.isNotEmpty(data)) { // 将合法的记录批量入库 this.eximportService.batchInsert(data); } ImmutableMap result = ImmutableMap.of( "time", stopwatch.stop().toString(), "data", data, "error", error ); return new FebsResponse().success().data(result); } @GetMapping("excel") @RequiresPermissions("eximport:export") @ControllerEndpoint(exceptionMessage = "导出Excel失败") public void export(QueryRequest queryRequest, Eximport eximport, HttpServletResponse response) { List eximports = this.eximportService.findEximports(queryRequest, eximport).getRecords(); ExcelKit.$Export(Eximport.class, response).downXlsx(eximports, false); } }