EasyExcel自动设置列宽

前言

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

效果

设置前

EasyExcel自动设置列宽_第1张图片

设置后

EasyExcel自动设置列宽_第2张图片

代码实现

导入依赖

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


        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
        dependency>
        

        <dependency>
            <groupId>com.alibabagroupId>
            <artifactId>easyexcelartifactId>
            <version>2.2.7version>
        dependency>

        
        <dependency>
            <groupId>com.google.guavagroupId>
            <artifactId>guavaartifactId>
            <version>30.1-jreversion>
        dependency>

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

继承并实现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文档的字体,背景色,自动列宽等符合要求

你可能感兴趣的:(EasyExcel,java)