Java 通过EasyExcel导出的Excel文档的字体,背景色,自动列宽等符合要求

这次开任务使用的是EasyExcel导出Excel文档,但是在任务过程中,生成的文档的格式要求并不符合产品和测试的期望值,如图:
在这里插入图片描述
想着自己地位低下,也无能力反驳。只好硬着头皮查阅资料来达到他们的想要的需求结果。如图:
在这里插入图片描述
经过百度工程师的各种挑战实验和查阅。终于让我实现了上述的要求。代码如下:

Excel文档的自动列宽设置

public class Custemhandler extends AbstractColumnWidthStyleStrategy {

    private static final int MAX_COLUMN_WIDTH = 255;
    //因为在自动列宽的过程中,有些设置地方让列宽显得紧凑,所以做出了个判断
    private static final int COLUMN_WIDTH = 20;
    private  Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);

    public Custemhandler() {
    }

    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
        if (needSetWidth) {
            Map<Integer, Integer> maxColumnWidthMap = (Map)CACHE.get(writeSheetHolder.getSheetNo());
            if (maxColumnWidthMap == null) {
                maxColumnWidthMap = new HashMap(16);
                CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
            }

            Integer columnWidth = this.dataLength(cellDataList, cell, isHead);
            if (columnWidth >= 0) {
                if (columnWidth > MAX_COLUMN_WIDTH) {
                    columnWidth = MAX_COLUMN_WIDTH;
                }else {
                    if(columnWidth<COLUMN_WIDTH){
                        columnWidth =columnWidth*2;
                    }
                }

                Integer maxColumnWidth = (Integer)((Map)maxColumnWidthMap).get(cell.getColumnIndex());
                if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
                    ((Map)maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
                    writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(),  columnWidth* 256);
                }
            }
        }
    }

    private  Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
        if (isHead) {
            return cell.getStringCellValue().getBytes().length;
        } else {
            CellData cellData = (CellData)cellDataList.get(0);
            CellDataTypeEnum type = cellData.getType();
            if (type == null) {
                return -1;
            } else {
                switch(type) {
                    case STRING:
                        return cellData.getStringValue().getBytes().length;
                    case BOOLEAN:
                        return cellData.getBooleanValue().toString().getBytes().length;
                    case NUMBER:
                        return cellData.getNumberValue().toString().getBytes().length;
                    default:
                        return -1;
                }
            }
        }
    }
}

Excel的字体,样式,背景色的设置

 public static HorizontalCellStyleStrategy getStyleStrategy(){
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 背景设置为灰色
        headWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        WriteFont headWriteFont = new WriteFont();
        headWriteFont.setFontHeightInPoints((short)12);
        // 字体样式
        headWriteFont.setFontName("Frozen");
        headWriteCellStyle.setWriteFont(headWriteFont);
        //自动换行
        headWriteCellStyle.setWrapped(false);
        // 水平对齐方式
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        // 垂直对齐方式
        headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
//        contentWriteCellStyle.setFillPatternType(FillPatternType.SQUARES);
        // 背景白色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
        WriteFont contentWriteFont = new WriteFont();
        // 字体大小
        contentWriteFont.setFontHeightInPoints((short)12);
        // 字体样式
        contentWriteFont.setFontName("Calibri");
        contentWriteCellStyle.setWriteFont(contentWriteFont);
        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
    }

调用方式

这部分是因为我的Excel都是自定义开头数据,所以用的是List。

     EasyExcel.write(outputStream).needHead(true)
                .head(getAssignmentTotalExcelSheet0Title())
                .excelType(ExcelTypeEnum.XLSX)
                .registerWriteHandler(new Custemhandler())
                .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
                .sheet(0, "Assignment Total Report")
                .doWrite(getAssignmentTotalSheet0Data(list));

下面部分是用上实体类的调用

public static void write(OutputStream outputStream, Class<?> clazz, String sheetName, List writeList){
        EasyExcel.write(outputStream).needHead(true)
                .head(clazz)
                .excelType(ExcelTypeEnum.XLSX)
                .registerWriteHandler(new Custemhandler())
                .registerWriteHandler(EasyExcelUtil.getStyleStrategy())
                .sheet(0, sheetName)
                .doWrite(writeList);
    }

实体类说明

    @ExcelProperty(value = "Tenant")  //表示Excel 显示的表头
    private String tenant;
    @ExcelProperty(value = "Locale")
    private String locale;

参考说明:

如有疑问,可以参考以下文档:
https://www.yuque.com/easyexcel/doc/easyexcel (EasyExcel 官网)
https://www.cnblogs.com/Hizy/p/11825886.html (Excel的字体,样式,背景色的设置参考)
https://blog.csdn.net/qq_37361535/article/details/106050623(Excel文档的自动列宽设置参考)

EasyExcel 是一款基于 Java 的高性能、轻量级的 Excel 导入导出工具库,它支持导入和导出 CSV 和 Excel 格式的文件,并且具备简单易用的 API 接口,非常适合处理复杂的表格数据。 当您需要将百分数从数据库或其他来源的数据中导出Excel 文件时,EasyExcel 提供了方便的方式来处理数值转成百分比表示的问题。以下是通过 EasyExcel 导出含有百分数的示例步骤: ### 准备工作 首先,确保引入 EasyExcel 相关依赖。如果你使用 Maven 或 Gradle 管理项目依赖,可以在相应的 `pom.xml` 或 `build.gradle` 文件中添加如下依赖: ```xml <!-- Maven --> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.x.x</version> </dependency> <!-- Gradle --> implementation 'com.alibaba:endExcel:3.x.x' ``` ### 实现代码 假设您已经有一个包含百分数的 List 对象存储于内存中,接下来展示如何将这个表中的数据导出Excel。 ```java import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.metadata.WriteSheet; import java.util.List; public class ExportPercentage { public static void main(String[] args) { // 示例数据 List<Map<String, String>> dataList = ...; // 这里应该填充实际的数据 try (WriteWriter writer = EasyExcel.write(new File("output.xlsx")).build()) { WriteSheet sheet = EasyExcel.writerSheet("百分数表格").build(); new DataHandler().writeData(writer, sheet, dataList); } } } class DataHandler { public void writeData(WriteWriter writer, WriteSheet sheet, List<Map<String, String>> dataList) { for (Map<String, String> data : dataList) { sheet.data(data).writeHeadLine(); // 写入表头 sheet.data(data).writeLine(); // 写入数据行 } // 自动调整等操作可以根据实际需求进行配置 // EasyExcel自动尝试优化布局 } } ``` ### 关键注意点 - **数据预处理**:确保将所有的数值转换成百分数形式(例如,如果原始值是0.5,则应显示为50%)。可以使用如下的 Java 表达式完成转换: ```java BigDecimal value = new BigDecimal(valueDouble * 100); data.put("percentage", value.setScale(2, RoundingMode.HALF_UP).toString() + "%"); ``` - **样式设置**:根据需要,可以自定义单元格的样式,比如字体颜色、背景色等。尽管 EasyExcel 默认提供了一些基础功能,对于更复杂的需求,可能还需要额外的定制化处理。 - **错误处理**:确保处理过程中所有异常情况,例如文件不存在、写入权限受限等问题。 通过上述步骤,您可以轻松地使用 EasyExcel 将包含百分数的数据导出Excel 文件。这种方式不仅简洁高效,还允许开发者针对特定场景进行高度定制化的数据处理和布局设计。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值