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

2024-02-06 07:44

本文主要是介绍常用的EasyExcel表格处理(设置批注、下拉选),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 效果
在这里插入图片描述

这篇关于常用的EasyExcel表格处理(设置批注、下拉选)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/683610

相关文章

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab