Use EasyPoi para usar la plantilla de Excel para exportar la descarga del formulario de Excel

Prefacio: La ventaja de usar la plantilla de Excel para exportar Excel es que puede definir colores, formatos, etc. en la plantilla de antemano, lo cual es adecuado para escenarios donde el diseño de la plantilla es más flexible y complejo.

1. Agregar paquete de frasco

        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.2.0</version>
        </dependency>

2. Agregar herramientas

package com.xinke.sunshine_ebid.common.utils;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Map;


public class EasyPoiUtils {
    private EasyPoiUtils() {
    }

    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            fileName += ".xls";
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
            response.setHeader("Access-Control-Expose-Headers", "FileName");
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void downLoad2007Excel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            fileName += ".xlsx";
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
            response.setHeader("Access-Control-Expose-Headers", "FileName");
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static <T> void defaultExport(List<T> dataList, Class<?> clz, String fileName, HttpServletResponse response, ExportParams exportParams) {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, clz, dataList);
        if (workbook != null) {
            downLoadExcel(fileName, response, workbook);
        }
    }

    public static <T> void exportExcel(List<T> dataList, String title, String sheetName, Class<?> clz, String fileName, boolean isCreateHeader, HttpServletResponse response) {
        ExportParams exportParams = new ExportParams(title, sheetName);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(dataList, clz, fileName, response, exportParams);
    }

    public static <T> void exportExcel(List<T> dataList, String title, String sheetName, Class<?> clz, String fileName, HttpServletResponse response) {
        defaultExport(dataList, clz, fileName, response, new ExportParams(title, sheetName));
    }

    private static void defaultExport(List<Map<String, Object>> dataList, String fileName, HttpServletResponse response) {
        Workbook workbook = ExcelExportUtil.exportExcel(dataList, ExcelType.HSSF);
        if (workbook != null) {
            downLoadExcel(fileName, response, workbook);
        }
    }

    public static void exportExcel(List<Map<String, Object>> dataList, String fileName, HttpServletResponse response) {
        defaultExport(dataList, fileName, response);
    }

    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> clz) {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }

        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);

        try {
            return ExcelImportUtil.importExcel(new File(filePath), clz, params);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
    }

    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> clz) {
        if (file == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        try {
            return ExcelImportUtil.importExcel(file.getInputStream(), clz, params);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3. Haz una plantilla

Incluya los parámetros que se reemplazarán con { {}} y use la forma de { {!fe: nombre de la colección t. nombre del parámetro 1 t. nombre del parámetro 2}} para recorrer el tipo establecido de datos transversales . Se pueden usar varias hojas y deben estar centrados o la configuración de color, etc. se puede modificar directamente en la plantilla

4. Aplicación de código

clase de colección

package com.xinke.sunshine_ebid.dal.entity;

import lombok.Data;

@Data
public class TestEntity {
    private String name;
    private String phone;
    private String address;
}

capa de control

package com.xinke.sunshine_ebid.webapp;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import com.xinke.sunshine_ebid.common.utils.EasyPoiUtils;
import com.xinke.sunshine_ebid.service.TestService;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;

@CrossOrigin
@RestController
@RequestMapping(value = "/Test")
public class TestController {
    @Resource
    private TestService testService;

    /**
     * 使用Excel模板导出excel表格
     * @param response
     * @throws Exception
     */
    @GetMapping("/test")
    public void test(HttpServletResponse response) throws Exception{
        // 使用map来封装参数
        Map<String, Object> map = testService.test();
        // 模板路径
        TemplateExportParams params = new TemplateExportParams("fileRecord/template/excel/test1.xlsx", true);
        String fileName = "导出来的报表名称";
        Workbook workbook = ExcelExportUtil.exportExcel(params, map);
        workbook.setForceFormulaRecalculation(true);
        EasyPoiUtils.downLoad2007Excel(fileName, response, workbook);
    }
}

capa de lógica de negocios

package com.xinke.sunshine_ebid.service;

import com.xinke.sunshine_ebid.common.utils.CustomXWPFDocument;
import com.xinke.sunshine_ebid.common.utils.WordUtil;
import com.xinke.sunshine_ebid.dal.entity.TestEntity;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class TestService {

    public Map<String,Object> test() throws Exception{
        // 封装参数
        Map<String, Object> params = new HashMap<>();
        params.put("date","2023年3月7日");
        List<TestEntity> list = new ArrayList<>();
        TestEntity test = new TestEntity();
        test.setName("瓜");
        test.setPhone("18888888888");
        test.setAddress("PD");
        list.add(test);
        TestEntity test2 = new TestEntity();
        test2.setName("瓜2");
        test2.setPhone("1999999999");
        test2.setAddress("PD2");
        list.add(test2);
        params.put("list",list);
        return params;
    }
}

5. prueba

localhost: puerto local /Prueba/prueba

Exportación exitosa

Supongo que te gusta

Origin blog.csdn.net/GuaGea/article/details/129382696
Recomendado
Clasificación