使用easyexcel做数据校验错误导出excel表格批注+背景(1.0) 继续优化升级

news/2024/11/24 13:42:06/

最终效果:
在这里插入图片描述
这次对文件进行了进一步的提升,优化, 这次是批量数据校验判断,只判断了是否为空,空就作批注加背景.如下:
这模拟数据.还需要更多的实验才能优化

待优化点:
待升级 动态获取获取head头
待处理 对没一列进行数据校验,因为目前只做了""处理
待优化批注提示语 目前使用的是map 使用的是map.get(i) 来填充.

//批注语 
Map<Integer, String> map = new HashMap<Integer, String>();map.put(0, "必填");map.put(1, "必填!");map.put(2, "重要");

目前使用的是模拟数据测试

//模拟表格空数据. 
private List<DemoData1> data1() {List<DemoData1> list = new ArrayList<DemoData1>();list.add(new DemoData1("字符串1",new Date(),0.56));list.add(new DemoData1("字符串2",new Date(),0.57));list.add(new DemoData1(null,new Date(),0.58));list.add(new DemoData1("字符串4",new Date(),0.59));list.add(new DemoData1("字符串5",null,0.60));list.add(new DemoData1("字符串6",new Date(),null));list.add(new DemoData1("字符串7",new Date(),0.62));list.add(new DemoData1("字符串8",new Date(),0.63));return list;}

实体类 :
需要注意点就是表格头是根据value值来填充的,如果没有
value注解(@ExcelProperty(index = 0,value = “字符串标题”))默认使用的 变量名来代替

package com.alibaba.easyexcel.test.demo.write;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/*** 基础数据类** @author Jiaju Zhuang**/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DemoData1 {@ExcelProperty(index = 0,value = "字符串标题")private String string;@ExcelProperty(index = 1,value = "日期标题")private Date date;@ExcelProperty(index = 2,value = "数字标题")private Double doubleData;
}

测试类:
需开启内存不然无法批注

 /*** 插入批注* <p>* 1. 创建excel对应的实体对象 参照{@link DemoData}* <p>* 2. 注册拦截器 {@link CommentWriteHandler}* <p>* 2. 直接写即可*/@Testpublic void commentWrite1() {String fileName = "d:/"+ "commentWrite" + System.currentTimeMillis() + ".xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 这里要注意inMemory 要设置为true,才能支持批注。目前没有好的办法解决 不在内存处理批注。这个需要自己选择。EasyExcel.write(fileName, DemoData1.class).inMemory(Boolean.TRUE).registerWriteHandler(new CommentWriteHandler1()).sheet("模板").doWrite(data1());}

实现类 CommentWriteHandler1
注意一点,如果是对空单元格进行处理的话,写的话是需要创建单元格的不能使用getCell来获取,不然会报错:
sheet.getRow(relativeRowIndex + 1).createCell(i).setCellComment(comment);

package com.alibaba.easyexcel.test.demo.write;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.excel.write.handler.AbstractRowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Comment;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/*** 自定义拦截器.新增注释,第一行头加批注** @author Jiaju Zhuang*/
public class CommentWriteHandler1 extends AbstractRowWriteHandler {@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Integer relativeRowIndex, Boolean isHead) {//如果false 就读取行数据.if (!isHead) {Sheet sheet = writeSheetHolder.getSheet();//用来做批注语Map<Integer, String> map = new HashMap<Integer, String>();map.put(0, "必填");map.put(1, "必填!");map.put(2, "重要");//循环是设置批量批示的for (int i = 0; i < 3; i++) {// String value = row.getCell(i+1).getStringCellValue();Cell cell = row.getCell(i);if ("".equals(cell.toString())) {setPostil(sheet, relativeRowIndex, i,map.get(i));}}}}private void setPostil(Sheet sheet, Integer relativeRowIndex, Integer i,String msg) {Workbook workbook = sheet.getWorkbook();CellStyle cellStyle = workbook.createCellStyle();//设置前景填充样式cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//设置前景色为红色cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());//设置垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);Drawing<?> drawingPatriarch = sheet.createDrawingPatriarch();// 在第一行 第二列创建一个批注Comment comment =drawingPatriarch.createCellComment(new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));// 输入批注信息comment.setString(new XSSFRichTextString(msg));// 将批注添加到单元格对象中 对空处理的话是需要创建的 createCellsheet.getRow(relativeRowIndex + 1).createCell(i).setCellComment(comment);sheet.getRow(relativeRowIndex + 1).createCell(i).setCellStyle(cellStyle);}
}

依赖:
目前最新2.2.0-beta2
由于使用mvn导入无法下载,只能通过下载源码进行测试,有很多限制.

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.0-beta2</version></dependency>

后续会继续更新. 如有帮助麻烦点个赞谢谢.如有问题,欢迎指正.共同学习


http://www.ppmy.cn/news/466139.html

相关文章

excel表格公式无效、不生效的解决方案及常见问题、常用函数

1、表格公式无效、不生效 使用公式时碰到了一个问题&#xff0c;那就是公式明明已经编辑好了&#xff0c;但是在单元格里不生效&#xff0c;直接把公式显示出来了&#xff0c;网上资料说有4种原因&#xff0c;但是我4种都不是&#xff0c;是第5种原因&#xff0c;如下图&#x…

粘贴板工具:PPT或Excel复制粘贴成图片问题的解决方案

粘贴板工具&#xff1a;PPT或Excel复制粘贴成图片问题的终极解决方案 一、小工具介绍 针对PPT或Excel复制粘贴成图片问题&#xff0c;Clipboard是一个将图像粘贴板内容转化为文字粘贴板内容的小工具。下载链接&#xff1a;https://github.com/MarkCens/Clipboard2text/blob/mas…

excel粘贴时出现故障_excel无法复制粘贴怎么办?告诉你解决方法

在日常工作中&#xff0c;我们可能会用excel处理很多数据&#xff0c;在遇到相同数据的时候我们通常会选择复制粘贴。然而在出现无法复制粘贴的情况时很多用户不知道该如何解决&#xff0c;下面小编就带来了详细的图文教程&#xff0c;希望可以帮助大家解决excel无法复制粘贴的…

防止excel单元格有效性验证因被粘贴而失效

将代码放在sheet1后&#xff0c;当单元格内容有变化时&#xff0c;会触发change事件&#xff0c;达到验证目的 Private Sub Worksheet_Change(ByVal Target As Range)Dim rng As RangeDim c As StringFor Each rng In TargetIf Not rng.Validation.Value ThenApplication.UndoD…

详细的聊一聊如何使用响应式图片,提升网页加载速度

开篇 确保图片在所有屏幕尺寸上都能良好显示是一项困难的任务&#xff0c;因为你需要考虑图片的大小、图片的放置位置、显示图片的比例、用户连接的速度等等众多因素。结果是&#xff0c;大多数开发者只会为所有屏幕尺寸使用同一张图片&#xff0c;并让浏览器调整图片的大小以适…

30 .

package edu.tjcu.wfh2.Demo02;/* 题目: 定义一个方法&#xff0c;把数组{1,2,3}按照指定格式拼接成一个字符串。 格式参照如下:[word1#word2#word3]。分析: 1.首先准备一个int[]数组&#xff0c;内容是:1、2、3 2.定义一个方法,用来将数组变成字符串 三要素 返回值类型: Stri…

荣耀30和荣耀V30的区别哪个好

荣耀30&#xff1a;正面配备的是一块6.53英寸高端OLED材质极点全面屏&#xff0c;分辨率2400x1080像素&#xff0c;像素密度403PPI&#xff08;钻石排列&#xff09;&#xff0c;支持屏幕指纹&#xff1b;机身侧边采用了高端金属材质中框&#xff1b; 荣耀30更多使用感受和评价…

30

人初生叫婴儿&#xff0c;不满周岁称襁褓。2至3岁称孩提。女孩7岁称髫年。男孩7岁称韶年。10岁以下称黄口。13岁至15岁称舞勺之年。15岁至20岁称舞象之年。女孩12岁称金钗之年。女孩13岁称豆蔻年华。女孩15岁称及笄之年。16岁称碧玉年华&#xff1b;20岁称桃李年华。24岁称花信…