EasyExcel自动设置列宽

前言

用EaxyExcel默认的宽度,有时不够宽,数据会自动换行。为了追求美观,想手动设置列宽。

效果

设置前

在这里插入图片描述

设置后

在这里插入图片描述

代码实现

导入依赖

本人习惯用springboot自带的单元测试,一个注解就够,不用到处写main方法

<!-- springboot test启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>

列宽设置有两种方式,一种是设置HorizontalCellStyleStrategy,为表头和内容设置宽度,字体,边框等其他内容,另一种是继承AbstractColumnWidthStyleStrategy,在setColumnWidth方法里简单设置,这里介绍后一种,第一种在我的其它excel文章有。

继承并实现setColumnWidth方法

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.util.CollectionUtils;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Sheet;

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

/**
 * 自动设置列宽
 *
 * @date 01/22/2021 14:53
 */
public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {
    
    

    // 统计setColumnWidth被调用多少次
    private static int count = 0;
    
    @Override
    protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> cellDataList, Cell cell, Head head,
                                  Integer relativeRowIndex, Boolean isHead) {
    
    
        // 简单设置
        Sheet sheet = writeSheetHolder.getSheet();
        sheet.setColumnWidth(cell.getColumnIndex(), 5000);
        System.out.println(count++);
    }
}

测试

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.google.common.collect.Lists;
import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;

/**
 * Java 通过EasyExcel导出的Excel文档的字体,背景色,自动列宽等符合要求
 * https://blog.csdn.net/weixin_44811578/article/details/107101248
 *
 * @date 01/24/2021 23:04
 */
public class Demo6 {
    
    

    @Test
    public void test() throws IOException {
    
    

        // 文件输出位置
        OutputStream out = new FileOutputStream("/Users/quanlinglong/Downloads/mergeDemo/demo" + System.currentTimeMillis() + ".xlsx");
        EasyExcel.write(out).needHead(true)
                .head(head()) //表头
                .excelType(ExcelTypeEnum.XLSX)
                .registerWriteHandler(new ExcelWidthStyleStrategy()) // 设置宽度
                .sheet(0, "城市介绍")
                .doWrite(contentData()); // 内容
    }

    private List<List<String>> head() {
    
    
        List<List<String>> headTitles = Lists.newArrayList();
        headTitles.add(Lists.newArrayList("城市"));
        headTitles.add(Lists.newArrayList("人口数目"));
        headTitles.add(Lists.newArrayList("出行方式"));
        headTitles.add(Lists.newArrayList("著名景点"));
        return headTitles;
    }

    private List<List<String>> contentData() {
    
    
        List<List<String>> data = Lists.newArrayList();
        data.add(Lists.newArrayList("深圳", "200", "地铁", "深圳湾"));
        data.add(Lists.newArrayList("广州", "100", "地铁", "珠江"));
        data.add(Lists.newArrayList("北京", "300", "地铁", "故宫"));
        data.add(Lists.newArrayList("杭州", "400", "地铁", "西湖"));
        return data;
    }
}

导出的excel有20个单元格内容,setColumnWidth方法被调用20次,说明每个单元格都调用一次。后续可以利用这一点设置单元格样式。

希望对你有帮助

完。

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

猜你喜欢

转载自blog.csdn.net/qq_42747210/article/details/113106997