EasyExcel导出添加批注
直接看代码。根据个人需要做改动
注:POI也可以做批注,文章链接https://www.cnblogs.com/qq1445496485/p/15622664.html

/**
* 导出(批注)
*
* @param response
*/
@GetMapping("/exportComment")
public void exportComment(HttpServletResponse response)
{
try
{
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
// 设置背景颜色
headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
// 设置头字体
WriteFont headWriteFont = new WriteFont();
headWriteFont.setFontHeightInPoints((short)14);
// 字体加粗
headWriteFont.setBold(true);
headWriteCellStyle.setWriteFont(headWriteFont);
// 设置头居中
headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); // 内容策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 设置内容字体
WriteFont contentWriteFont = new WriteFont();
contentWriteFont.setFontHeightInPoints((short)12);
contentWriteFont.setFontName("宋体");
contentWriteCellStyle.setWriteFont(contentWriteFont);
// 设置 水平居中
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
// 设置 垂直居中
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 设置单元格格式为 文本
contentWriteCellStyle.setDataFormat((short)49); HorizontalCellStyleStrategy horizontalCellStyleStrategy =
new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); // 生成表格数据
List<List<Object>> dataList = new ArrayList<>();
dataList.add(new ArrayList<>(Arrays.asList(new Object[] {"表头11", "表头2", "表头3", "表头4"})));
dataList.add(new ArrayList<>(Arrays.asList(new Object[] {"表头1", "表头2", "表头3", "表头4"})));
dataList.add(new ArrayList<>(Arrays.asList(new Object[] {"表头31", "表头2", "表头3", "表头4"})));
// 导出文件
String fileName = new String("文件名称.xlsx".getBytes(), "UTF-8");
String sheetName = "模板";
List<Map<String, String>> commentList = new ArrayList<>();
commentList.add(CommentWriteHandler.createCommentMap(sheetName, 0, 0, "A批注。"));
commentList.add(CommentWriteHandler.createCommentMap(sheetName, 0, 1, "B批注。"));
commentList.add(CommentWriteHandler.createCommentMap(sheetName, 2, 0, "B批注。")); response.addHeader("Content-Disposition", "filename=" + fileName);
// 设置类型,扩展名为.xls
response.setContentType("application/vnd.ms-excel");
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream())
.inMemory(Boolean.TRUE)
.registerWriteHandler(new CommentWriteHandler(commentList, "xlsx"))
.registerWriteHandler(horizontalCellStyleStrategy)
.build();
WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
excelWriter.write(dataList, writeSheet);
// 千万别忘记finish 会帮忙关闭流
excelWriter.finish(); }
catch (Exception e)
{
e.printStackTrace();
}
}
controller

package com.temporary.handle; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.write.handler.AbstractRowWriteHandler;
import com.alibaba.excel.write.metadata.holder.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; /**
* @author Han
* @Description 自定义批注处理器
* @date 2022/3/21
*/
public class CommentWriteHandler extends AbstractRowWriteHandler
{ /**
* sheet名称KEY
*/
public static final String SHEETNAME_NAME = "sheetName"; /**
* 文档后缀名
*/
private String extension; /**
* 列索引key
*/
public static final String COLINDEX_NAME = "colIndex"; /**
* 行索引key
*/
public static final String ROWINDEX_NAME = "rowIndex"; /**
* 批注内容key
*/
public static final String COMMENTCONTENT_NAME = "commentContent"; /**
* sheet页名称列表
*/
private List<String> sheetNameList; List<Map<String, String>> commentList = new ArrayList<>(); public CommentWriteHandler(List<Map<String, String>> commentList, String extension)
{
this.commentList = commentList != null && commentList.size() > 0 ? commentList.stream()
.filter(x -> x.keySet().contains(SHEETNAME_NAME) == true && x.get(SHEETNAME_NAME) != null
&& StrUtil.isNotBlank(x.get(SHEETNAME_NAME).toString()) && x.keySet().contains(COLINDEX_NAME) == true
&& x.get(COLINDEX_NAME) != null && StrUtil.isNotBlank(x.get(COLINDEX_NAME).toString())
&& x.keySet().contains(ROWINDEX_NAME) == true && x.get(ROWINDEX_NAME) != null
&& StrUtil.isNotBlank(x.get(ROWINDEX_NAME).toString())
&& x.keySet().contains(COMMENTCONTENT_NAME) == true && x.get(COMMENTCONTENT_NAME) != null
&& StrUtil.isNotBlank(x.get(COMMENTCONTENT_NAME).toString()))
.collect(Collectors.toList()) : new ArrayList<>();
sheetNameList =
this.commentList.stream().map(x -> x.get(SHEETNAME_NAME).toString()).collect(Collectors.toList());
this.extension = extension;
} /**
* 生成批注信息
*
* @param sheetName sheet页名称
* @param rowIndex 行号
* @param columnIndex 列号
* @param commentContent 批注内容
* @return
*/
public static Map<String, String> createCommentMap(String sheetName, int rowIndex, int columnIndex,
String commentContent)
{
Map<String, String> map = new HashMap<>();
// sheet页名称
map.put(SHEETNAME_NAME, sheetName);
// 行号
map.put(ROWINDEX_NAME, rowIndex + "");
// 列号
map.put(COLINDEX_NAME, columnIndex + "");
// 批注内容
map.put(COMMENTCONTENT_NAME, commentContent);
return map;
} @Override
public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
Integer relativeRowIndex, Boolean isHead)
{
Sheet sheet = writeSheetHolder.getSheet();
// 不需要添加批注,或者当前sheet页不需要添加批注
if (commentList == null || commentList.size() <= 0 || sheetNameList.contains(sheet.getSheetName()) == false)
{
return;
}
// 获取当前行的批注信息
List<Map<String, String>> rowCommentList = commentList.stream()
.filter(x -> StrUtil.equals(x.get(SHEETNAME_NAME).toString(), sheet.getSheetName())
&& relativeRowIndex == Integer.parseInt(x.get(ROWINDEX_NAME)))
.collect(Collectors.toList());
// 当前行没有批注信息
if (rowCommentList == null || rowCommentList.size() <= 0)
{
return;
}
List<String> colIndexList =
rowCommentList.stream().map(x -> x.get(COLINDEX_NAME)).distinct().collect(Collectors.toList());
for (String colIndex : colIndexList)
{
// 同一单元格的批注信息
List<Map<String, String>> cellCommentList = rowCommentList.stream()
.filter(x -> StrUtil.equals(colIndex, x.get(COLINDEX_NAME)))
.collect(Collectors.toList());
if (CollectionUtil.isEmpty(cellCommentList))
{
continue;
}
// 批注内容拼成一条
String commentContent =
cellCommentList.stream().map(x -> x.get(COMMENTCONTENT_NAME)).collect(Collectors.joining());
Cell cell = row.getCell(Integer.parseInt(colIndex));
addComment(cell, commentContent, extension);
}
// 删除批注信息
commentList.remove(rowCommentList);
// 重新获取要添加的sheet页姓名
sheetNameList = commentList.stream().map(x -> x.get(SHEETNAME_NAME).toString()).collect(Collectors.toList());
} /**
* 给Cell添加批注
*
* @param cell 单元格
* @param value 批注内容
* @param extension 扩展名
*/
public static void addComment(Cell cell, String value, String extension)
{
Sheet sheet = cell.getSheet();
cell.removeCellComment();
if ("xls".equals(extension))
{
ClientAnchor anchor = new HSSFClientAnchor();
// 关键修改
anchor.setDx1(0);
anchor.setDx2(0);
anchor.setDy1(0);
anchor.setDy2(0);
anchor.setCol1(cell.getColumnIndex());
anchor.setRow1(cell.getRowIndex());
anchor.setCol2(cell.getColumnIndex() + 5);
anchor.setRow2(cell.getRowIndex() + 6);
// 结束
Drawing drawing = sheet.createDrawingPatriarch();
Comment comment = drawing.createCellComment(anchor);
// 输入批注信息
comment.setString(new HSSFRichTextString(value));
// 将批注添加到单元格对象中
cell.setCellComment(comment);
}
else if ("xlsx".equals(extension))
{
ClientAnchor anchor = new XSSFClientAnchor();
// 关键修改
anchor.setDx1(0);
anchor.setDx2(0);
anchor.setDy1(0);
anchor.setDy2(0);
anchor.setCol1(cell.getColumnIndex());
anchor.setRow1(cell.getRowIndex());
anchor.setCol2(cell.getColumnIndex() + 5);
anchor.setRow2(cell.getRowIndex() + 6);
// 结束
Drawing drawing = sheet.createDrawingPatriarch();
Comment comment = drawing.createCellComment(anchor);
// 输入批注信息
comment.setString(new XSSFRichTextString(value));
// 将批注添加到单元格对象中
cell.setCellComment(comment);
}
} }
Handle
EasyExcel导出添加批注的更多相关文章
- NPOI 导出添加批注功能
这个问题在网上搜,都是说如下即可: //添加批注HSSFPatriarch patr = (HSSFPatriarch)sheet.CreateDrawingPatriarch();HSSFComme ...
- EasyExcel导出小结:动态标题、标题格式、相同值合并
1. 实列相关依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel& ...
- easyExcel导出excel的简单使用
easyExcel导出excel的简单使用 Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定 ...
- office excel中怎么添加批注及修改批注用户名
office excel中怎么添加批注及修改批注用户名 参考:https://jingyan.baidu.com/article/c33e3f48a52853ea15cbb5db.html 1. of ...
- Java 给Word指定字符串添加批注
本文将介绍在Java程序中如何给Word文档中的指定字符串添加批注.前文中,主要介绍的是针对某个段落来添加批注,以及回复.编辑.删除批注的方法,如果需要针对特定关键词或指定字符串来设置批注,可以参考本 ...
- WORD添加批注(JAVA)
import com.spire.doc.*;import com.spire.doc.documents.CommentMark;import com.spire.doc.documents.Com ...
- Activiti添加批注(comment)信息
在每次提交任务的时候需要描述一些批注信息,例如:请假流程提交的时候要描述信息为什么请假,如果领导驳回可以批注驳回原因等 1.添加批注 // 由于流程用户上下文对象是线程独立的,所以要在需要的位置设置, ...
- NOPI Excel插件导入导出 图片批注
dateTable导出到excel的MemoryStream /// <summary> /// DataTable导出到Excel的MemoryStream Export() /// & ...
- SpringBoot基于easyexcel导出和写入Excel
easyexcel是阿里巴巴旗下开源项目,主要用于Excel文件的导入和导出处理,今天我们利用SpringBoot和easyexcel实战演示如何导出和写入Excel文件. 一.加入我们需要的ea ...
随机推荐
- 算法基础⑧搜索与图论--dijkstra(迪杰斯特拉)算法求单源汇最短路的最短路径
单源最短路 所有边权都是正数 朴素Dijkstra算法(稠密图) #include<cstdio> #include<cstring> #include<iostream ...
- 联想Y7000安装 debian10 wifi 不好使解决方法
联想Y7000安装 debian10 wifi 不好使解决方法 wifi硬件高通QCA9377 把联想驱动加入黑名单 文件路径 /etc/modprobe.d/blacklist.conf 添加内容 ...
- 【FAQ】HMS Core推送服务与本地创建通知消息如何相互覆盖?
我们知道,单独使用HMS Core推送服务或本地创建通知消息,都可以实现通知消息的覆盖,方式分别为: 1.本地创建通知消息(简称本地通知消息) 通过notificationManager.notify ...
- Kernel pwn 基础教程之 Heap Overflow
一.前言 在如今的CTF比赛大环境下,掌握glibc堆内存分配已经成为了大家的必修课程.然而在内核态中,堆内存的分配策略发生了变化.笔者会在介绍内核堆利用方式之前先简单的介绍一下自己了解的内核内存分配 ...
- jmeter元件,作用域与优先级
jmeter元件,作用域与优先级 一.jmeter元件 1.配置元件:优先级最高 1.1 重点使用元件:csv数据文件设置.用户定义变量.计数器 2.取样器:根据不同协议来编写请求脚本的元件 2.1 ...
- 攻防世界-MISC:Aesop_secret
这是攻防世界高手进阶区的的第九题,题目如下: 点击下载附件一,得到一个压缩包,解压后得到一张GIF动图,找个网站给他分解一下,得到如下图片 不知道是什么意思,所以就跑去看WP了,用010editor打 ...
- XCTF练习题---MISC---再见李华
XCTF练习题---MISC---再见李华 flag:Stay hungry, Stay foolish. 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一张图片,其中有MD5,破解一下没有 ...
- 【MyBatis】多关键字的模糊查询
目录 情景分析 题目 要求 相关代码 Mapper.java Impl.java mapper.xml test.java 思路分析 1.最开始,参数没有使用List,引起的问题 2.Mybatis的 ...
- Excel文件读写操作1(xls)
一.Python-Excel常用的库:xlrd(read).xlwt(write).xlutils.openpyxl 1.xlrd 读取Excel文件,支持 .xls 和 .xlsx 格式. 2.x ...
- Docker容器的数据卷
一.数据卷概念 1.数据卷是宿主机中的一个目录或文件 2.当容器目录和数据卷目录绑定后,对方的修改会立即同步 3.一个数据卷可以被多个容器同时挂载 4.一个容器也可以挂载多个数据卷 简单理解:有点类似 ...