SpringBoot整合EasyPoi 導入導出


引入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. 默認寫法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM