EasyPoi导出excel动态选择列

主要使用easypoi中的ExcelExportEntity类对列进行封装,可以设置列的属性。

下面直接贴出自己的代码:(注意data数据类型List中的必须为map,不能为实体类,否则会报错)

pom文件依赖:

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

自己写的工具类:

/**
 * @author zhangz
 * @desc 简单excel动态选择列导出
 * @date 2020/6/16
 */
public class ExcelExportUtils {
    private static Logger logger = LoggerFactory.getLogger(ConnUtil.class);
    /**
     * 选择列导出(单sheet)
     * @param fileNameUrl 文件导出服务器路径
     * @param sheetName sheet名称
     * @param dataList 数据list(map封装)
     * @param excelRows 导出的选择的列
     * @param title 标题(为空就传null)
     */
    public static void exportExcel(String fileNameUrl, String sheetName, List<Map<String,Object>> dataList, List<ExcelExportDTO> excelRows,String title) throws Exception{
        // 使用easypoi中的ExcelExportEntity对象存储要导出的列
        List<ExcelExportEntity> entityList = new ArrayList<>();
        excelRows.forEach(item->{
            ExcelExportEntity exportEntity = new ExcelExportEntity(item.getLineName(), item.getFieldName());
            exportEntity.setHeight(item.getHeight());
            exportEntity.setWidth(item.getWidth());
            entityList.add(exportEntity);
        });
        // 执行方法
        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, entityList ,dataList);
        String fileName = fileNameUrl;
        File file = new File(fileName);
        try{
            FileOutputStream fout = new FileOutputStream(file);
            workbook.write(fout);
            fout.close();
        }catch (Exception e){
            logger.error("导出失败-----------------------------------");
            throw new Exception("导出失败!");
        }
    }

    /**
     * 多sheet导出
     * @param fileNameUrl 文件导出服务器路径
     * @param multiSheetDTOList 多sheet中的属性
     */
    public static void exportMultiSheetExcel(String fileNameUrl, List<MultiSheetDTO> multiSheetDTOList) throws Exception{
        try{
            Workbook workbook = new HSSFWorkbook();
            // 遍历sheet
            for (MultiSheetDTO multiSheetDTO:multiSheetDTOList){
                ExcelExportService server = new ExcelExportService();
                ExportParams exportParams = new ExportParams(multiSheetDTO.getTitle(), multiSheetDTO.getSheetName(), ExcelType.XSSF);
                List<ExcelExportEntity> entityList = new ArrayList<>();
                multiSheetDTO.getExcelRows().forEach(item->{
                    ExcelExportEntity exportEntity = new ExcelExportEntity(item.getLineName(), item.getFieldName());
                    exportEntity.setHeight(item.getHeight());
                    exportEntity.setWidth(item.getWidth());
                    entityList.add(exportEntity);
                });
                server.createSheetForMap(workbook, exportParams, entityList, multiSheetDTO.getDataList());
            }
            FileOutputStream fos = new FileOutputStream(fileNameUrl);
            workbook.write(fos);
            fos.close();
        }catch (Exception e){
            logger.error("导出失败-----------------------------------");
            throw new Exception("导出失败!");
        }
    }
}

依靠的一些其他类

ExcelExportDTO:
package com.tdh.light.spxt.api.domain.dto.excel;

/**
 * @author zhangz
 * @desc 动态选择列参数
 * @date 2020/6/16
 */
public class ExcelExportDTO {

    private String lineName;

    private String fieldName;

    private Double width = 20D;

    private Double height = 10D;

    public ExcelExportDTO(){}

    public ExcelExportDTO(String lineName, String fieldName) {
        this.lineName = lineName;
        this.fieldName = fieldName;
    }

    public ExcelExportDTO(String lineName, String fieldName, Double width, Double height) {
        this.lineName = lineName;
        this.fieldName = fieldName;
        this.width = width;
        this.height = height;
    }

    public String getLineName() {
        return lineName;
    }

    public void setLineName(String lineName) {
        this.lineName = lineName;
    }

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public Double getWidth() {
        return width;
    }

    public void setWidth(Double width) {
        this.width = width;
    }

    public Double getHeight() {
        return height;
    }

    public void setHeight(Double height) {
        this.height = height;
    }
}
MultiSheetDTO:
package com.tdh.light.spxt.api.domain.dto.excel;

import java.util.List;
import java.util.Map;

/**
 * @author zhangz
 * @desc 多sheet传参
 * @date 2020/6/16
 */
public class MultiSheetDTO {

    /**
     * sheet名称
     */
    private String sheetName;

    /**
     * 导出数据
     */
    private List<Map<String,Object>> dataList;

    /**
     * 导出列属性
     */
    private List<ExcelExportDTO> excelRows;

    /**
     * title
     */
    private String title;

    public String getSheetName() {
        return sheetName;
    }

    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }

    public List<Map<String, Object>> getDataList() {
        return dataList;
    }

    public void setDataList(List<Map<String, Object>> dataList) {
        this.dataList = dataList;
    }

    public List<ExcelExportDTO> getExcelRows() {
        return excelRows;
    }

    public void setExcelRows(List<ExcelExportDTO> excelRows) {
        this.excelRows = excelRows;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

这里面主要依靠了ExcelExportEntity 这个类来动态生成某个列

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值