前言
用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次,说明每个单元格都调用一次。后续可以利用这一点设置单元格样式。
希望对你有帮助
完。
更多推荐