常用的EasyExcel表格处理-1(设置批注、下拉选)

EasyExcel官网:点击查看

1、模板表头设置批注

此处主要根据自定义处理类CustomCellWriteHandler进行处理。

1.1 前端调用controller

 @PostMapping("/download/template")public void toDoExport(HttpServletResponse response) {// 设置模拟表头(此处为多表头,也可以传入单表头)List<List<String>> headList = new ArrayList<>();List<String> heads1 = new ArrayList<>();heads1.add("总表头");heads1.add("表头1");List<String> heads2 = new ArrayList<>();heads2.add("总表头");heads2.add("表头2");List<String> heads3 = new ArrayList<>();heads3.add("总表头");heads3.add("特殊表头");headList.add(heads1);headList.add(heads2);headList.add(heads3);// 设置模拟内容(不需要data可为null)List<List<String>> data = new ArrayList<>();List<String> data1 = new ArrayList<>(); // 第1行的内容data1.add("内容1-1");data1.add("内容1-2");data1.add("内容1-3");List<String> data2 = new ArrayList<>();// 第2行的内容data2.add("内容2-1");data2.add("内容2-2");data2.add("内容2-3");data.add(data1);data.add(data2);try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 防止中文乱码String fileName = URLEncoder.encode("导入模板名称", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");ServletOutputStream outputStream = response.getOutputStream();ExcelWriter writer = EasyExcel.write(outputStream).build();WriteSheet sheet = EasyExcel.writerSheet(0).needHead(Boolean.FALSE).sheetName("sheet页名称").build();WriteTable table1 = EasyExcel.writerTable(1).head(headList).registerWriteHandler(new AutoHeadColumnWidthStyleStrategy()) // 自动宽度.registerWriteHandler(new CustomCellWriteHandler())//CustomCellWriteHandler进行处理.needHead(Boolean.TRUE).build();writer.write(data, sheet, table1); // data 如果不需要可以为nullwriter.finish();} catch (IOException e) {e.printStackTrace();}}

1.2 批注渲染处理类(CustomCellWriteHandler)

package com.xjj.task.util;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;import java.util.List;public class CustomCellWriteHandler implements CellWriteHandler {@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();CellStyle cellStyle = workbook.createCellStyle();// 居中/换行cellStyle.setAlignment(HorizontalAlignment.CENTER);cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);cellStyle.setWrapText(true);cellStyle.setFillBackgroundColor(IndexedColors.PALE_BLUE.getIndex());Font font = workbook.createFont();if (aBoolean) { // 判断是否为表头,true则是// 首行字体略大Integer row = cell.getRowIndex();// 行号(从0开始)if (row == 0) {font.setFontHeightInPoints((short) 15); // 首行设置字体大小为15} else {font.setFontHeightInPoints((short) 13);String stringCellValue = cell.getStringCellValue();int columnIndex = cell.getColumnIndex();String txt = "此为批注内容";if (columnIndex == 0 || stringCellValue.contains("特殊")) { // 设置第1列或包含“特殊”内容的列表头加批示Sheet sheet = writeSheetHolder.getSheet();Drawing draw = sheet.createDrawingPatriarch();Comment comment = draw.createCellComment(new XSSFClientAnchor(1, 1, 1, 1, (short) columnIndex, 1, 1, 1));// 批注内容comment.setString(new XSSFRichTextString("表头" + (columnIndex + 1) + "的批注:" + txt));cell.setCellComment(comment);}}// 字体样式font.setFontName("宋体");font.setBold(true);} else {font.setFontHeightInPoints((short) 11);// 边框cellStyle.setBorderLeft(BorderStyle.NONE);//细实线cellStyle.setBorderTop(BorderStyle.NONE);cellStyle.setBorderRight(BorderStyle.NONE);cellStyle.setBorderBottom(BorderStyle.NONE);}cellStyle.setFont(font);cell.setCellStyle(cellStyle);}}

1.3 效果
在这里插入图片描述

2、导入模板设置下拉选择

此处主要根据自定义处理类SpinnerWriteHandler进行处理。

2.1 前端调用controller

/*** 下载模板*/@PostMapping("/downLoad/template")public void export(HttpServletResponse response) {try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("导入模板", "UTF-8");response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");//1-TrainWay 为具体的业务类,可根据实际业务替换//2-SpinnerWriteHandler为自定义的下拉选处理类EasyExcel.write(response.getOutputStream(), TrainWay.class).registerWriteHandler(new SpinnerWriteHandler()).sheet("模板名称").doWrite(new ArrayList<>());} catch (IOException e) {e.printStackTrace();}}

2.2 下拉选处理类(SpinnerWriteHandler)

package jnpf.util;import cn.hutool.core.collection.CollUtil;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Han* @Description* @date 2024/2/8*/
public class SpinnerWriteHandler implements SheetWriteHandler {@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {List<String> wayList = new ArrayList<>(); // 自定义的下拉选选项wayList.add("方式1");wayList.add("方式2");List<String> orgList = new ArrayList<>(); // 自定义的下拉选选项orgList.add("单位1");orgList.add("单位2");Map<Integer, String[]> mapDropDown = new HashMap<>(); // 需要渲染的下拉选对象if(CollUtil.isNotEmpty(wayList)){String[] wayArray =  wayList.toArray(new String[wayList.size()]); // 数组类型mapDropDown.put(1, wayArray); // 此处1为对应选择的列数(从0列开始计算),wayArray为可以下拉选择的列}if(CollUtil.isNotEmpty(orgList)){String[] orgArray =  wayList.toArray(new String[orgList.size()]); // 数组类型mapDropDown.put(5, orgArray);// 此处5为对应选择的列数(从0列开始计算),orgArray为可以下拉选择的列}Sheet sheet = writeSheetHolder.getSheet();/// 开始设置下拉框DataValidationHelper helper = sheet.getDataValidationHelper();for (Map.Entry<Integer, String[]> entry : mapDropDown.entrySet()) {//设置起始行为1(从0行开始)、终止行为1000CellRangeAddressList addressList = new CellRangeAddressList(1, 1000, entry.getKey(), entry.getKey());//设置下拉框数据 DataValidationConstraint constraint = helper.createExplicitListConstraint(entry.getValue());DataValidation dataValidation = helper.createValidation(constraint, addressList);//处理Excel兼容性问题if (dataValidation instanceof XSSFDataValidation) {dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);} else {dataValidation.setSuppressDropDownArrow(false);}sheet.addValidationData(dataValidation);}}
}

2.3 效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/465583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

###C语言程序设计-----C语言学习(12)#进制间转换,十进制,二进制,八进制,十六进制

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 计算机处理的所有信息都以二进制形式表示&#xff0c;即数据的存储和计算都采…

数模.微分方程

或者可以建立一个是实时脚本&#xff0c;也可以转化成上图公式 solver只是一个代名词&#xff0c;代表的是后面七种函数的名字 百分之九十用ode45函数 注意df1是在另外一个文件里面 计算导弹追击问题没有记录&#xff0c;去文件找代码

从github上拉取项目到pycharm中

有两种方法&#xff0c;方法一较为简单&#xff0c;方法二用到了git bash&#xff0c;推荐方法一 目录 有两种方法&#xff0c;方法一较为简单&#xff0c;方法二用到了git bash&#xff0c;推荐方法一方法一&#xff1a;方法二&#xff1a; 方法一&#xff1a; 在github上复制…

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam&#xff08;Acessing Steam&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是译者&…

LeetCode Python - 9.回文数

文章目录 题目答案运行结果 题目 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&am…

中文GPTS使用秘籍,字节扣子Coze工作流使用全教程

大家好&#xff0c;我是斜杠君。今天和大家分享字节扣子Coze工作流创建和使用全教程&#xff0c;手把手教会你。 首先我们先来看一下如何创建一个工作流。 我们以创建这样一个工作流为例。这个工作流程的作用是&#xff1a;把用户输入的内容通过头条接口查询信息&#xff0c;把…

数模.捕食者猎物模型

代码在文件中&#xff0c;不在具体赘述

3D高斯溅射:面向三维场景的实时渲染技术

1. 前言 高斯溅射技术【1】一经推出&#xff0c;立刻引起学术界和工业界的广泛关注。相比传统的隐式神经散射场渲染技术&#xff0c;高斯溅射依托椭球空间&#xff0c;显性地表示多目图像的三维空间关系&#xff0c;其计算效率和综合性能均有较大的提升&#xff0c;且更容易理…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(八)(4)

实验八&#xff1a;近似计算 练习四 1.自己设置一种计算欧拉常数近似值的方法&#xff0c;看你对欧拉常数的计算能精确到小数点后多少位&#xff1f; 从示例7的图8.5我们已经得知&#xff0c;只要求出每个小矩形中在函数y1/x以上的部分的面积之和&#xff0c;我们就可以得知…

Structured Streaming

目录 一、概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;两种处理模型 &#xff08;三&#xff09;Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 &#xff08;一&#xff09;实现步骤 &…

操作系统基础:IO核心子系统【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 &#x1f3c6;&#x1f3c6;本文完整PDF源文件请翻阅至文章底部下载。&#x1f3c6;&#x1f3c6; ♈1 SPOOLing技术&#x1f531;1.1 总览&#x1f531;1.2 什么是脱机技…

CodeMeter强化了ETM WinCC 开放架构平台的许可与安全保护

在面对日益复杂的网络安全威胁时&#xff0c;ETM professional control采取了前瞻性的措施&#xff0c;选择了业界领先的威步CodeMeter技术&#xff0c;以保护其标志性的WinCC开放架构平台。这一选择不仅体现了ETM对安全的高度重视&#xff0c;也标志着其在保障关键基础设施运营…