这次开任务使用的是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文档的字体,背景色,自动列宽等符合要求相关推荐

  1. 如何将Revit明细表导出为Excel文档

    Revit软件没有将明细表直接导出为Excel电子表格的功能,Revit只能将明细表导出为TXT格式,但是这种TXT文件用EXCEL处理软件打开然后另存为XLS格式即可,以Revit2013版自带的建 ...

  2. 支持将数据导出到Excel文档的时候设置单元格格式的.NET控件Spire.DataExport

    Spire.DataExport for .NET是e-iceblue公司推出的一款数据导出类.NET控件.作为一款专业的数据导出控件,Spire.DataExport for .NET可以帮助开发人 ...

  3. 使用NPOI2.0.1.0自定义导出的excel文档数字为文本格式不能公式编辑计算的问题解决

    问题描述: 使用npoi2.0.1.0自定义导出的excel文档为文本格式,在excel中无法直接进行公式计算,不方便使用,需要手工转为数值型才能进行计算. 解决方式: 原先的方式时获取行(Row)进 ...

  4. Java 实现数据库数据 导入 导出成Excel文档的功能

    1.创建导入 导出工具类,写入其导入和导出方法 导出成外部文件: public static ResponseEntity<byte[]> emp2Excel(List<Emp> ...

  5. easyPoi单sheet与多sheet导出excel简单实用(重点:自动列宽的设置)

    导入依赖 <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base< ...

  6. java基于easypoi实现对导出的excel文档加密

    **项目背景 随着项目日新月异的变化,对数据的安全性也越来越高,特别是政府类型的项目,数据安全往往是非常重要的,最近项目中导出的文件被要求需要密码才能打开,所以写下这篇文章,特此记录一下. 文章目录 ...

  7. java使用easypoi导出为word文档

    环境:jdk1.8+springboot2.5.6+easypoi EasyPoi官网:1. 前言 - Powered by MinDoc (wupaas.com),easypoi的easypoi-s ...

  8. [自动化] 前端国际化导出中英文excel文档

    本文是根据自动扫描生成国际化文件后, 叠加的操作, 传送门: 国际化vue-i18n之i18next-scanner自动化使用教程_阿喵阿旺的博客-CSDN博客_i18next vue 然后现在拿到的 ...

  9. Powerdesigner导出为excel文档

    1.首先打开Powerdesigner打开你需要导出的表 2.ctrl+shift+x快捷键打开脚本运行器复制以下脚本到脚本框中点击run执行(如下图) 3.导出成功会自动打开导出的Excel文件自己 ...

最新文章

  1. MVC已经死了,接下来会发生什么?
  2. 多视图立体匹配论文分享:P-MVSNet
  3. ASP.NET 实践:写入 Cookie
  4. 资源不关闭,会导致什么最坏的结果
  5. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符
  6. javascript第三天(2)
  7. PMOS 和 NMOS区别
  8. 《C程序员从校园到职场》一1.2 C语言的主要特点
  9. 中国数字墨水行业市场供需与战略研究报告
  10. 通过例子理解 k8s 架构 - 每天5分钟玩转 Docker 容器技术(122)
  11. 【图卷积网络】Graph Convolutional Network
  12. 使用saminside破解WindowsXP密码
  13. linux 消息队列最大值,linux 消息队列的限制
  14. 量化交易18-先认识K线形态:下跌形态:十字暮星、暮星、墓碑十字/倒T十字、上吊线、风高浪大线、修正陷阱、颈内线、颈上线、黄包车夫、纺锤、停顿形态、条形三明治
  15. android手机双开微信方法,微信双开太简单了!学会这几种方法,就能同时登录2个微信...
  16. 【法律】如何保障未来夫妻合法权益:婚前房屋财产约定协议书
  17. 平板电脑怎么打开HTML,为什么平板电脑和笔记本电脑打开网页不一样,感觉平板电脑就是手机?...
  18. 树莓派3/4 实现天气语音播报与一种新的文本转语音方法 —— 百度云api +python +和风天气api
  19. Euclid‘s Game(博弈)
  20. mysql 锁定库存_mysql处理高并发,防止库存超卖

热门文章

  1. 这车模,就一个字:小巧灵动
  2. 服务器控件之asp:Button的onClick属性
  3. SeaJS 是什么?
  4. mysql中union学习总结
  5. 985毕业,半路出家28岁进军Java,坚持了三年现如今年薪36W
  6. python爬虫----简单的抓取斗鱼弹幕
  7. 上海共享办公,创新创业空间
  8. 既快又准并且低开销,一作亲解 MICRO 2021论文:一种自动化功耗模拟架构
  9. Python 爬取网易云音乐所有评论
  10. 猜数字游戏~~~~~~