EasyExcel导出、按列设置样式、根据表头字数设置列宽、Converter转换

一、Excel导出实体类
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.zjn.eng.data.controller.excel.converter.ProcessConverter;
import lombok.Data;

import java.util.Date;

@Data
//@ColumnWidth(value = 20)
//行高全部设为40
//@HeadRowHeight(value = -1)
//标题全部居中
//@HeadStyle(horizontalAlignment = HorizontalAlignmentEnum.LEFT, fillBackgroundColor = 8, fillForegroundColor = 21)
//@ContentFontStyle(color =)
public class DailyData {
    /**
     * 问题描述
     */
    @ExcelProperty("问题描述")
    private String problemDescription;

    /**
     * 问题提交时间
     */
    @ExcelProperty("问题提交时间")
    @DateTimeFormat("yyyy/MM/dd HH:mm") //出参
    private Date submissionTime;

    /**
     * 问题提交人
     */
    @ExcelProperty("问题提交人")
    private String submitter;

    /**
     * 0 处理中 1 已处理
     */
    @ExcelProperty(value = "是否处理", converter = 	ProcessConverter.class)
    private Integer processingStatus;

    /**
     * 事件处理人
     */
    @ExcelProperty("事件处理人")
    private String transactorName;
}

二、自定义样式handler
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.AbstractVerticalCellStyleStrategy;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;

import java.util.Arrays;

public class StyleHandler extends AbstractVerticalCellStyleStrategy {
    private static String fontName = "等线";
    private static Integer[] columnIndex = {1, 2, 3, 4, 7, 8, 9};

    @Override
    protected WriteCellStyle headCellStyle(Head head) {
// 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景设置为灰色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.BLUE_GREY.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short) 12);
        // 字体样式
//        headWriteFont.setFontName("Frozen");
        headWriteFont.setFontName(fontName);
        headWriteFont.setColor(IndexedColors.WHITE.getIndex());
        headWriteCellStyle.setWriteFont(headWriteFont);
        //自动换行
        headWriteCellStyle.setWrapped(false);
        // 水平对齐方式
        if (Arrays.asList(columnIndex).contains(head.getColumnIndex())) {
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        } else {
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        }
        // 垂直对齐方式
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        headWriteFont.setBold(true);
        return headWriteCellStyle;
    }

    @Override
    protected WriteCellStyle contentCellStyle(Head head) {
        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        if (Arrays.asList(columnIndex).contains(head.getColumnIndex())) {
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        } else {
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        }
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
        // 背景白色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short) 12);
        // 字体样式
//        contentWriteFont.setFontName("Calibri");
        contentWriteFont.setFontName(fontName);
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        return contentWriteCellStyle;
    }
}
三、servicesImple类中实现方法
 public void downloadDaily(HttpServletResponse response, DailyVo dailyVo) {
        //获取当前时间
        String currentTimeStr = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        //文件名
        String fileName = currentTimeStr + "-日报";
        dailyVo.setCurrent(1);
        dailyVo.setSize(1000);
        //获取导出列表数据
        Map data = (Map) this.dailyList(dailyVo).getData();
        List<Map> records = (List<Map>) data.get("records");
        List<DailyData> list = JSON.parseObject(JSON.toJSONString(records), new TypeReference<List<DailyData>>() {
        });

        try {
            OutputStream outputStream = response.getOutputStream();
            //添加响应头信息
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String encodeFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name());
            response.setHeader("Content-Disposition", "attachment;filename=" + encodeFileName + ".xlsx");

//            StyleHandler styleHandler = new StyleHandler();
            //实例化 ExcelWriter
            ExcelWriter writer = EasyExcel
                    .write(outputStream)
                    .registerWriteHandler(new StyleHandler())
//                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .registerWriteHandler(new LongestCellWidthHandler())
                    .build();
            WriteSheet sheet = EasyExcel.writerSheet(0, currentTimeStr + "-日报").head(DailyData.class).build();
            writer.write(list, sheet);
            writer.finish();
            outputStream.flush();
        } catch (IOException e) {
            log.error("导出用户列表方法失败", e);
        }

    }
四、表头设置列宽handler
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;

import java.util.List;

/**
 * 根据表头设置列宽
 */
public class LongestCellWidthHandler extends AbstractColumnWidthStyleStrategy {
    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        if (Boolean.TRUE.equals(isHead)) {
            int columnWidth = cell.getStringCellValue().length();
            columnWidth = Math.max(columnWidth * 5, 20);
            if (columnWidth > 255) {
                columnWidth = 255;
            }
            writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
        }
    }
}
五、Converter转换
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.converters.WriteConverterContext;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;

public class ProcessConverter implements Converter<Integer> {
    @Override
    public Class<?> supportJavaTypeKey() {
        return Integer.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        if ("处理中".equals(cellData.getStringValue())) {
            return 0;
        } else if ("已处理".equals(cellData.getStringValue())) {
            return 1;
        } else {
            return 2;
        }
    }

    @Override
    public WriteCellData<String> convertToExcelData(WriteConverterContext<Integer> context) throws Exception {
        boolean b = context.getValue() == 0;
        if (0 == context.getValue()) {
            return new WriteCellData("处理中");
        } else if (1 == context.getValue()) {
            return new WriteCellData("已处理");
        } else {
            return new WriteCellData("未处理");
        }
    }
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于使用 EasyExcel 导出数据时设置多级表头,你可以按照以下步骤进行操作: 1. 创建一个 WriteSheet 对象,用于设置导出的 sheet。 2. 使用 WriteSheet 的 setRelativeHeadRowIndex 方法,设置相对于数据起始行的表头行索引。如果数据起始行是第 1 行,设置为 1,以此类推。 3. 使用 WriteSheet 的 setNeedHead 方法,设置是否需要表头。如果需要表头,则设置为 true;否则设置为 false。 4. 创建一个 List<List<String>> 对象,用于存储多级表头的数据。 5. 按照多级表头的层级关系,将每个层级的表头数据存储在 List<String> 中,并将其添加到 List<List<String>> 对象中。 6. 使用 WriteSheet 的 setHead 方法,将 List<List<String>> 对象设置导出表头数据。 7. 使用 EasyExcel 的 write 方法,将数据写入 Excel 文件。 以下是一个示例代码: ```java // 创建一个 WriteSheet 对象 WriteSheet writeSheet = EasyExcel.writerSheet().build(); // 设置相对于数据起始行的表头行索引 writeSheet.setRelativeHeadRowIndex(1); // 设置是否需要表头 writeSheet.setNeedHead(true); // 创建一个 List<List<String>> 对象,用于存储多级表头的数据 List<List<String>> headList = new ArrayList<>(); // 添加第一级表头数据 List<String> firstLevelHead = new ArrayList<>(); firstLevelHead.add("A"); firstLevelHead.add("B"); headList.add(firstLevelHead); // 添加第二级表头数据 List<String> secondLevelHead = new ArrayList<>(); secondLevelHead.add("C"); secondLevelHead.add("D"); headList.add(secondLevelHead); // 设置导出表头数据 writeSheet.setHead(headList); // 使用 EasyExcel 的 write 方法,将数据写入 Excel 文件 EasyExcel.write("output.xlsx").sheet().doWrite(dataList); ``` 在上述示例代码中,dataList 是要导出的数据列表。你可以根据实际需求修改表头的层级关系和数据内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值