引入maven依賴
<properties> <easyui-poi.version>4.0.0</easyui-poi.version> </properties> <dependencies> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>${easyui-poi.version}</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-web</artifactId> <version>${easyui-poi.version}</version> </dependency> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-annotation</artifactId> <version>${easyui-poi.version}</version> </dependency> </dependencies>
工具類
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package com.chitic.module.poi.util; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import java.io.IOException; import java.net.URLEncoder; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Workbook; public abstract class EasypoiUtil { public EasypoiUtil() { } public static void templateExport(TemplateExportParams templateExcel, Map<String, Object> dataMap, String fileName, HttpServletResponse response) throws IOException { Workbook workbook = ExcelExportUtil.exportExcel(templateExcel, dataMap); if (workbook != null) { downLoadExcel(fileName, response, workbook); } } public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException { response.setCharacterEncoding("UTF-8"); response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); workbook.write(response.getOutputStream()); } private static String filename(HttpServletRequest request, String filename) throws Exception { String userAgent = request.getHeader("User-Agent"); if (!userAgent.contains("MSIE") && !userAgent.contains("Trident")) { filename = new String(filename.getBytes("UTF-8"), "ISO-8859-1"); } else { filename = URLEncoder.encode(filename, "UTF-8"); } return filename; } }
導入的實體類
package com.chitic.supplywater.common.api.request.excel; import cn.afterturn.easypoi.excel.annotation.Excel; import cn.afterturn.easypoi.handler.inter.IExcelDataModel; import cn.afterturn.easypoi.handler.inter.IExcelModel; import com.chitic.supplywater.common.api.request.worksheet.WorkSheetSourceRequest; import com.fasterxml.jackson.annotation.JsonInclude; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import javax.validation.constraints.DecimalMin; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; /** * @Description 工單批量導入參數 * IExcelModel, IExcelDataModel 是為了實現返回校驗失敗的信息 * @Author GX * @Date 2020/05/12 14:51 * @Version V1.0 **/ @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class WorkSheetExcelRequest implements IExcelModel, IExcelDataModel { @Excel(name = "第幾行") private int rowNum; @Excel(name = "錯誤信息") private String errorMsg; @Override public int getRowNum() { return rowNum; } @Override public void setRowNum(int rowNum) { this.rowNum = rowNum; } @Excel(name = "工單名稱(必填)") @NotBlank(message = "工單名稱不能為空") private String workSheetName; /** * 工單類型: 對應代碼表 */ @Excel(name = "工單類型(必填)", type = 10) @NotNull(message = "工單類型不能為空") private Integer workSheetType; /** * 泵房id */ private Long houseId; @Excel(name = "泵房名稱") private String houseName; /** * 單元id */ private Long unitId; @Excel(name = "單元編號") private String unitSn; @Excel(name = "工單內容(說明)") private String workSheetExplain; @Excel(name = "部位") private String position; @Excel(name = "計划開始時間(必填)") @NotNull(message = "計划開始時間不能為空") @Pattern(regexp = "^((?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$", message = "開始時間格式不正確") private String planStartDateString; private Long planStartDate; @Excel(name = "計划結束時間(必填)") @NotNull(message = "計划結束時間不能為空") @Pattern(regexp = "^((?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$", message = "結束時間格式不正確") private String planEndDateString; private Long planEndDate; @Excel(name = "計划小時", type = 10) @DecimalMin(value = "0", message = "計划小時不能小於0") private BigDecimal planHour; @Excel(name = "計划人數", type = 10) @DecimalMin(value = "1", message = "計划人數不能小於1") private Integer planUserNumber; @Excel(name = "計划費用: 單位(元)", type = 10) @DecimalMin(value = "0", message = "計划費用不能小於0") private BigDecimal planOutlay; @Excel(name = "備注", width = 15, replace = { "正常_0", "報警_1"}) private String remarks; }
導入的controller
@PostMapping(ModuleWaterConstant.MAPPING_PREFIX + "/workSheet/upload") public void importExcel(@RequestParam("file") MultipartFile file, HttpServletResponse response) throws Exception { String fileName = file.getOriginalFilename(); boolean fileIsExcel = Objects.requireNonNull(fileName).matches("^.+\\.(?i)(xls)$") || fileName.matches("^.+\\.(?i)(xlsx)$"); if (!fileIsExcel) { throw ChiticSsoException.of(SsoResponseCode.RESOURCE_FILE_READ_TYPE_FAIL); } InputStream inputStream = file.getInputStream(); ImportParams importParams = new ImportParams(); // 需要驗證 importParams.setNeedVerify(true); ExcelImportResult<WorkSheetExcelRequest> requestList = ExcelImportUtil.importExcelMore(inputStream, WorkSheetExcelRequest.class, importParams); List<WorkSheetExcelRequest> list = requestList.getList(); list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(WorkSheetExcelRequest :: getWorkSheetName))), ArrayList::new)); workSheetService.importExcel(list); //判斷是否有錯誤 if(requestList.isVerfiyFail()){ //getFailList()里面的就是所有校驗失敗的excel數據 List<WorkSheetExcelRequest> failList = requestList.getFailList(); System.out.println(failList); ExportParams params = new ExportParams(); params.setSheetName("工單批量導入錯誤數據"); Workbook workbook = ExcelExportUtil.exportExcel(params, WorkSheetExcelRequest.class, failList); EasypoiUtil.downLoadExcel("workSheet_error.xls", response, workbook); } }
導出的controller
//從項目根路徑導出 @PostMapping(ModuleWaterConstant.MAPPING_PREFIX + "/workSheet/download") public void exportExcel(HttpServletResponse response) throws IOException { ClassPathResource resource = new ClassPathResource("excel/工單.xlsx"); Workbook workbook = new XSSFWorkbook(resource.getInputStream()); try { EasypoiUtil.downLoadExcel("WorkOrderTemplate", response, workbook); } catch (ChiticException e) { throw e; } catch (Exception e) { throw ChiticException.of(SsoResponseCode.RESOURCE_FILE_EXPORT_FAIL.getCode(), SsoResponseCode.RESOURCE_FILE_EXPORT_FAIL.getMessage()); } } //從數據庫查詢導出 @PostMapping(ModuleWaterConstant.MAPPING_PREFIX + "/report/water/exportData") public void exportWaterData(@RequestBody @Valid HistoryDataExportRequest request, HttpServletResponse response) { List<DataWaterHistoryExport> listData = dataWaterHistoryService.exportWaterData(request); ExportParams params = new ExportParams(); params.setSheetName("水質歷史數據"); Workbook workbook = ExcelExportUtil.exportExcel(params, DataWaterHistoryExport.class, listData); try { EasypoiUtil.downLoadExcel("water.xls", response, workbook); } catch (ChiticException e) { throw e; } catch (Exception e) { throw ChiticException.of(SsoResponseCode.RESOURCE_FILE_EXPORT_FAIL.getCode(), SsoResponseCode.RESOURCE_FILE_EXPORT_FAIL.getMessage()); } }
模板方式導出
//模板路徑 resources/model/model-inv.xls String url = "model/model-inv.xls"; TemplateExportParams exportParams = new TemplateExportParams(url); exportParams.setHeadingRows(6); Map<String, Object> dataMap=new HashMap<String, Object>(); dataMap.put("pname",plantinfo.getPlantname()); dataMap.put("punit",request.getPlantunit()); dataMap.put("time", DateStringUtil.Date2String(new Date(),"yyyy-MM-dd HH:mm:ss")); dataMap.put("list", list); dataMap.put("sign", "歷史"); Workbook workbook = ExcelExportUtil.exportExcel(exportParams, dataMap); EasypoiUtil.downLoadExcel("DEVICE_HISDATA" + System.currentTimeMillis() + ".xls", response, workbook);
其中 {{$fe:}} 和 t. 默認寫法