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() {}@Overrideprotected 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文档的自动列宽设置参考)
Java 通过EasyExcel导出的Excel文档的字体,背景色,自动列宽等符合要求相关推荐
- 如何将Revit明细表导出为Excel文档
Revit软件没有将明细表直接导出为Excel电子表格的功能,Revit只能将明细表导出为TXT格式,但是这种TXT文件用EXCEL处理软件打开然后另存为XLS格式即可,以Revit2013版自带的建 ...
- 支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport
Spire.DataExport for .NET是e-iceblue公司推出的一款数据导出类.NET控件.作为一款专业的数据导出控件,Spire.DataExport for .NET可以帮助开发人 ...
- 使用NPOI2.0.1.0自定义导出的excel文档数字为文本格式不能公式编辑计算的问题解决
问题描述: 使用npoi2.0.1.0自定义导出的excel文档为文本格式,在excel中无法直接进行公式计算,不方便使用,需要手工转为数值型才能进行计算. 解决方式: 原先的方式时获取行(Row)进 ...
- Java 实现数据库数据 导入 导出成Excel文档的功能
1.创建导入 导出工具类,写入其导入和导出方法 导出成外部文件: public static ResponseEntity<byte[]> emp2Excel(List<Emp> ...
- easyPoi单sheet与多sheet导出excel简单实用(重点:自动列宽的设置)
导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base< ...
- java基于easypoi实现对导出的excel文档加密
**项目背景 随着项目日新月异的变化,对数据的安全性也越来越高,特别是政府类型的项目,数据安全往往是非常重要的,最近项目中导出的文件被要求需要密码才能打开,所以写下这篇文章,特此记录一下. 文章目录 ...
- java使用easypoi导出为word文档
环境:jdk1.8+springboot2.5.6+easypoi EasyPoi官网:1. 前言 - Powered by MinDoc (wupaas.com),easypoi的easypoi-s ...
- [自动化] 前端国际化导出中英文excel文档
本文是根据自动扫描生成国际化文件后, 叠加的操作, 传送门: 国际化vue-i18n之i18next-scanner自动化使用教程_阿喵阿旺的博客-CSDN博客_i18next vue 然后现在拿到的 ...
- Powerdesigner导出为excel文档
1.首先打开Powerdesigner打开你需要导出的表 2.ctrl+shift+x快捷键打开脚本运行器复制以下脚本到脚本框中点击run执行(如下图) 3.导出成功会自动打开导出的Excel文件自己 ...
最新文章
- MVC已经死了,接下来会发生什么?
- 多视图立体匹配论文分享:P-MVSNet
- ASP.NET 实践:写入 Cookie
- 资源不关闭,会导致什么最坏的结果
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符
- javascript第三天(2)
- PMOS 和 NMOS区别
- 《C程序员从校园到职场》一1.2 C语言的主要特点
- 中国数字墨水行业市场供需与战略研究报告
- 通过例子理解 k8s 架构 - 每天5分钟玩转 Docker 容器技术(122)
- 【图卷积网络】Graph Convolutional Network
- 使用saminside破解WindowsXP密码
- linux 消息队列最大值,linux 消息队列的限制
- 量化交易18-先认识K线形态:下跌形态:十字暮星、暮星、墓碑十字/倒T十字、上吊线、风高浪大线、修正陷阱、颈内线、颈上线、黄包车夫、纺锤、停顿形态、条形三明治
- android手机双开微信方法,微信双开太简单了!学会这几种方法,就能同时登录2个微信...
- 【法律】如何保障未来夫妻合法权益:婚前房屋财产约定协议书
- 平板电脑怎么打开HTML,为什么平板电脑和笔记本电脑打开网页不一样,感觉平板电脑就是手机?...
- 树莓派3/4 实现天气语音播报与一种新的文本转语音方法 —— 百度云api +python +和风天气api
- Euclid‘s Game(博弈)
- mysql 锁定库存_mysql处理高并发,防止库存超卖