cn.hutool.poi.excel 实现excel导出效果 首行高度,行样式,颜色,合并单元格,例子样式

需求

接了需求,下载excel模版,本来看着还是简单的,然后实现起来一把泪,首先是使用poi,我查了好久,才实现,然后是我用easyexcel又实现了一遍,用了一个周多才实现。
在这里插入图片描述
这是需求,第一行是一个多行文本,红色,第二行一个合并单元格题目,第三行是一个多单元格标题,第四行是一个例子,红色。

实现

@Operation(summary = "人员维护模版下载", description = "人员维护模版下载")@PostMapping("persondowntemplate")public void personDownTemplate(HttpServletResponse response) {ExcelWriter writer = ExcelUtil.getWriter(true);//主标题String note = "1.前四行数据,系统不读取,不需要删除\n" +"2.约束区县,请输入约束的部门或者区县或者地市\n" +"3.约束岗位族的值列表,请参考第二个Sheet2,多个岗位族,请使用英文逗号隔开\n" +"4.日期格式:yyyy-mm-dd\n" +"5.下拉数据的值,不允许输入下拉值以外的数据";// 创建总标题行List<String> totalHeader1 = Lists.newArrayList();totalHeader1.add(note);writer.writeHeadRow(totalHeader1); // 写入总标题行,使用默认样式short headerRowHeight = 80 * 20; // 设置行高为30磅Sheet sheet = writer.getSheet();//因为是多行所以要自己控制行高sheet.getRow(0).setHeight(headerRowHeight);// 创建样式,建立每一行的样式CellStyle cellStyle1 = createRedRightAlignedCellStyle(writer.getWorkbook());Row row1 = sheet.getRow(0);Cell cell = row1.getCell(0);cell.setCellStyle(cellStyle1);// 创建总标题行List<String> totalHeader = Lists.newArrayList();totalHeader.add("人员契约化管理导入");writer.writeHeadRow(totalHeader); // 写入总标题行// 创建样式CellStyle cellStyle2 = createRedRightAlignedCellStyle2(writer.getWorkbook());Row row2 = sheet.getRow(1);Cell cell1 = row2.getCell(0);cell1.setCellStyle(cellStyle2);List<String> header = Lists.newArrayList();header.add("组织名称");header.add("* 员工编号");header.add("加入本企业途径");header.add("是否启用约束区县");header.add("约束区县");header.add("约束区县开始日期");header.add("约束区县结束日期");header.add("是否启用约束岗位族");header.add("约束岗位族");header.add("约束岗位族开始日期");header.add("约束岗位族结束日期");int mergeRowIndex = 0; // 总标题所在行索引int mergeColumnStartIndex = 0; // 起始列索引int mergeColumnEndIndex = header.size() - 1; // 结束列索引//其实上面的这些索引没啥用,下面几行是合并某几行的单元格CellRangeAddress cellRangeAddress = new CellRangeAddress(mergeRowIndex, mergeRowIndex, mergeColumnStartIndex, mergeColumnEndIndex);sheet.addMergedRegion(cellRangeAddress);CellRangeAddress cellRangeAddress1 = new CellRangeAddress(1, 1, mergeColumnStartIndex, mergeColumnEndIndex);sheet.addMergedRegion(cellRangeAddress1);writer.writeHeadRow(header); // 写入头部标题//建立新的sheetwriter.renameSheet(0, "人员维护");StyleSet styleSet = writer.getStyleSet();//实话说这一块是直接抄的别的,你说有用处吧,可能也有,你说没用吧,可能也没有for (int i = 0; i < 11; i++) {CellStyle cellStyle = writer.createColumnStyle(i);DataFormat format = writer.getWorkbook().createDataFormat();cellStyle.setDataFormat(format.getFormat("@"));writer.setStyleSet(styleSet);}//实话说这一块好像是也没生效for (int i = 0; i < header.size(); i++) {int headerLength = header.get(i).length(); // 获取列名长度int cellWidth = headerLength * 500; // 将字符长度转换为列宽单位// 如果内容比默认宽度要宽,则使用内容宽度;否则使用默认宽度int defaultWidth = 24 * 256; // 默认宽度int columnWidth = Math.max(cellWidth, defaultWidth);sheet.setColumnWidth(i, columnWidth); // 设置列宽}//这是列表下面的示例行List<Map<String, Object>> dataList = new ArrayList<>();Map<String, Object> dataRow = new HashMap <>();dataRow.put("组织名称", "请参考hr标准组织名称");dataRow.put("* 员工编号", "0000001");dataRow.put("加入本企业途径", "社会招聘");dataRow.put("是否启用约束区县", "是");dataRow.put("约束区县", "泰安市分公司管理层");dataRow.put("约束区县开始日期", "2024-04-11");dataRow.put("约束区县结束日期", "2024-06-11");dataRow.put("是否启用约束岗位族", "是");dataRow.put("约束岗位族", "基层组织建设与党员教育管理");dataRow.put("约束岗位族开始日期", "2024-04-11");dataRow.put("约束岗位族结束日期", "2024-06-11");dataList.add(dataRow);writer.write(dataList, false);for (int i = 0; i < header.size(); i++) {// 创建样式CellStyle cellStyle4 = createRedRightAlignedCellStyle3(writer.getWorkbook());Row row4 = sheet.getRow(3);Cell cell4 = row4.getCell(i);cell4.setCellStyle(cellStyle4);// 创建样式CellStyle cellStyle5 = createRedRightAlignedCellStyle5(writer.getWorkbook());Row row5 = sheet.getRow(2);Cell cell5 = row5.getCell(i);cell5.setCellStyle(cellStyle5);}//这个是用来写下拉的,不同的下拉的,setXSSFValidation(sheet);// 创建样式CellStyle cellStyle3 = createRedRightAlignedCellStyle2(writer.getWorkbook());Row row3 = sheet.getRow(2);Cell cell3 = row3.getCell(0);cell3.setCellStyle(cellStyle3);//创建新的sheetwriter.setSheet("Sheet2");List<String> header1 = Lists.newArrayList();header1.add("岗位族信息");writer.writeHeadRow(header1);List<Map<String,Object>> personnelContractManagementList = personnelContractManagementMapper.jobFamilyList();List<String> personnelContractManagementSheet = new ArrayList<>();for (int i = 0; i < personnelContractManagementList.size(); i++) {personnelContractManagementSheet.add(String.valueOf(personnelContractManagementList.get(i).get("ZHUANYE")));}writer.write(personnelContractManagementSheet, true);setSizeColumn(writer.getSheet());response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");response.setHeader("Content-Disposition", "attachment;filename=人员维护导入模板.xlsx");ServletOutputStream out = null;try {out = response.getOutputStream();writer.flush(out, true);out.close();} catch (IOException e) {throw new RuntimeException(e);} finally {writer.close();}}
private static CellStyle createRedRightAlignedCellStyle(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);Font font = workbook.createFont();font.setColor(IndexedColors.RED.getIndex());cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.LEFT);return cellStyle;}private static CellStyle createRedRightAlignedCellStyle2(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}private static CellStyle createRedRightAlignedCellStyle3(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);Font font = workbook.createFont();font.setColor(IndexedColors.RED.getIndex());cellStyle.setFont(font);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}private static CellStyle createRedRightAlignedCellStyle5(Workbook workbook) {CellStyle cellStyle = workbook.createCellStyle();cellStyle.setWrapText(true);cellStyle.setAlignment(HorizontalAlignment.CENTER);return cellStyle;}
 /**** @param sheet* @return*/private static Sheet setXSSFValidation(Sheet sheet){String onelist[] = {"是","否"};String joinEnterpriseWay[] = {"校园招聘","社会招聘","接收复转军人","成建制划转","劳务派遣"};Workbook workbook = sheet.getWorkbook();/*** 创建一个名称为hidden的sheet页,用于是否启用约束区县*/Sheet hidden = workbook.createSheet("hidden");Cell cell = null;for (int i = 0, length = onelist.length; i < length; i++){String name = onelist[i];Row roww = hidden.createRow(i);cell = roww.createCell(0);cell.setCellValue(name);}Name namedCell = workbook.createName();namedCell.setNameName("hidden");namedCell.setRefersToFormula("hidden!$A$1:$A$" + onelist.length);//将第二个sheet页设置为隐藏workbook.setSheetHidden(1, true);XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet);//将名称为hidden的数据进行加载XSSFDataValidationConstraint constraint = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint("hidden");//设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList(1, 1000, 3, 3);XSSFDataValidation data_validation_list = (XSSFDataValidation) dvHelper.createValidation(constraint, regions);data_validation_list.setErrorStyle(XSSFDataValidation.ErrorStyle.STOP);data_validation_list.createErrorBox("提示", "不允许自己输入,请选择下拉框里的数据");sheet.addValidationData(data_validation_list);/*** 创建一个名称为hidden的sheet页,用于是否启用约束区县*/Sheet hidden1 = workbook.createSheet("hidden1");Cell cell1 = null;for (int i = 0, length = onelist.length; i < length; i++){String name1 = onelist[i];Row row1 = hidden1.createRow(i);cell1 = row1.createCell(0);cell1.setCellValue(name1);}Name namedCell1 = workbook.createName();namedCell1.setNameName("hidden1");namedCell1.setRefersToFormula("hidden1!$A$1:$A$" + onelist.length);//将第二个sheet页设置为隐藏workbook.setSheetHidden(2, true);//将名称为hidden的数据进行加载XSSFDataValidationConstraint constraint1 = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint("hidden1");//设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions1 = new CellRangeAddressList(1, 1000, 7, 7);XSSFDataValidation data_validation_list1 = (XSSFDataValidation) dvHelper.createValidation(constraint1, regions1);data_validation_list1.setErrorStyle(XSSFDataValidation.ErrorStyle.STOP);data_validation_list1.createErrorBox("提示", "不允许自己输入,请选择下拉框里的数据");sheet.addValidationData(data_validation_list1);Sheet hidden2 = workbook.createSheet("hidden2");Cell cell2 = null;for (int i = 0; i < joinEnterpriseWay.length; i++) {String name = joinEnterpriseWay[i];Row row = hidden2.createRow(i);cell2 = row.createCell(0);cell2.setCellValue(name);}Name namedCell2 = workbook.createName();namedCell2.setNameName("hidden2");namedCell2.setRefersToFormula("hidden2!$A$1:$A$" + joinEnterpriseWay.length);//将第二个sheet页设置为隐藏workbook.setSheetHidden(3, true);//将名称为hidden的数据进行加载XSSFDataValidationConstraint constraint2 = (XSSFDataValidationConstraint) dvHelper.createFormulaListConstraint("hidden2");//设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions2 = new CellRangeAddressList(1, 1000, 2, 2);XSSFDataValidation data_validation_list2 = (XSSFDataValidation) dvHelper.createValidation(constraint2, regions2);data_validation_list2.setErrorStyle(XSSFDataValidation.ErrorStyle.STOP);data_validation_list2.createErrorBox("提示", "不允许自己输入,请选择下拉框里的数据");sheet.addValidationData(data_validation_list2);return sheet;}

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

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

相关文章

web前端学习笔记11

11. CSS3高级特效 11.1 CSS3变形 CSS3变形是一些效果的集合, 如平移、旋转、缩放、倾斜效果 每个效果都可以称为变形(transform),它们可以分别操控元素发生平移、旋转、缩放、倾斜等变化 语法 transform:[transform-function] ; /* 设置变形函数,可以是一个,也可以是多…

python:__class_getitem__使用以及cached_property源码分析

python&#xff1a;__class_getitem__使用以及cached_property源码分析 1 前言 Python中如何模拟泛型类型&#xff1f; 当使用类型标注时&#xff0c;使用 Python 的方括号标记来形参化一个 generic type 往往会很有用处。 例如&#xff0c;list[int] 这样的标注可以被用来表…

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;是由开放原子开源基金会孵化及运营的开源项目&#xff0c;是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统&#xff0c;为系统提供了相机、…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

Offline RL : Beyond Reward: Offline Preference-guided Policy Optimization

ICML 2023 paper code preference based offline RL&#xff0c;基于HIM&#xff0c;不依靠额外学习奖励函数 Intro 本研究聚焦于离线偏好引导的强化学习&#xff08;Offline Preference-based Reinforcement Learning, PbRL&#xff09;&#xff0c;这是传统强化学习&#x…

js二进制数据,文件---ArrayBuffer,二进制数组

1.二进制数据 在 JavaScript 中有很多种二进制数据格式&#xff0c;比如&#xff1a;ArrayBuffer&#xff0c;Uint8Array&#xff0c;DataView&#xff0c;Blob&#xff0c;File 及其他。 2.ArrayBuffer 基本的二进制对象是 ArrayBuffer —— 对固定长度的连续内存空间…

linux:信号深入理解

文章目录 1.信号的概念1.1基本概念1.2信号的处理基本概念1.3信号的发送与保存基本概念 2.信号的产生2.1信号产生的五种方式2.2信号遗留问题(core,temp等) 3.信号的保存3.1 信号阻塞3.2 信号特有类型 sigset_t3.3 信号集操作函数3.4 信号集操作函数的使用 4.信号的处理4.1 信号的…

Qt输入输出类使用总结

Qt输入输出类简介 QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象…

Ubuntu切换内核版本

#安装内核安装工具 sudo apt-get install software-properties-common sudo add-apt-repository ppa:cappelikan/ppa sudo apt-get update sudo apt-get install mainline#安装指定内核版本(有些版本并不能安装成功) mainline install 5.14.10#更新GRUB配置 sudo update-grub#查…

Python实现将LabelMe生成的JSON格式转换成YOLOv8支持的TXT格式

标注工具 LabelMe 生成的标注文件为JSON格式&#xff0c;而YOLOv8中支持的为TXT文件格式。以下Python代码实现3个功能&#xff1a; 1.将JSON格式转换成TXT格式&#xff1b; 2.将数据集进行随机拆分&#xff0c;生成YOLOv8支持的目录结构&#xff1b; 3.生成YOLOv8支持的YAML文件…

操作教程|通过DataEase开源BI工具对接金山多维表格

前言 金山多维表格是企业数据处理分析经常会用到的一款数据表格工具&#xff0c;它能够将企业数据以统一的列格式整齐地汇总至其中。DataEase开源数据可视化分析工具可以与金山多维表格对接&#xff0c;方便企业更加快捷地以金山多维表格为数据源&#xff0c;制作出可以实时更…

【网络版本计算器的实现】

本章重点 理解应用层的作用, 初识HTTP协议理解传输层的作用, 深入理解TCP的各项特性和机制对整个TCP/IP协议有系统的理解对TCP/IP协议体系下的其他重要协议和技术有一定的了解学会使用一些分析网络问题的工具和方法 ⭐注意!! 注意!! 注意!! 本课是网络编程的理论基础.是一个服务…

Antd Vue项目引入TailwindCss之后出现svg icon下移,布局中的问题解决方案

目录 1. 现象&#xff1a; 2. 原因分析&#xff1a; 3. 解决方案&#xff1a; 写法一&#xff1a;扩展Preflight 写法二&#xff1a; 4. 禁用 Preflight 1. 现象&#xff1a; Antd Vue项目引入TailwindCss之后出现svg icon下移&#xff0c;不能对齐显示的情况&#xff0…

爬虫实训案例:中国大学排名

近一个月左右的时间学习爬虫&#xff0c;在用所积累的知识爬取了《中国大学排名》这个网站&#xff0c;爬取的内容虽然只是可见的文本&#xff0c;但对于初学者来说是一个很好的练习。在爬取的过程中&#xff0c;通过请求数据、解析内容、提取文本、存储数据等几个重要的内容入…

React-router 最佳实践

使用的是 BrowserRouter&#xff0c;Routes 和 Route&#xff0c;这是 react-router-dom v5 和 v6 都支持的 API。这种方式的优点是路由配置和应用的其它部分是紧密集成的&#xff0c;这使得路由配置更加直观和易于理解 // router/index.js import { BrowserRouter as Router,…

【Qt 学习笔记】Qt常用控件 | 布局管理器 | 网格布局Grid Layout

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 布局管理器 | 网格布局Grid Layout 文章编号&#xff1a…

成品短视频APP源码搭建

在数字化时代&#xff0c;短视频已成为全球范围内的流行趋势&#xff0c;吸引了大量的用户和内容创作者。对于有志于进入短视频领域的企业和个人来说&#xff0c;成品短视频APP源码搭建提供了一条快速、高效的路径。本文将探讨成品短视频APP源码搭建的过程及其优势&#xff0c;…

Mac维护神器CleanMyMac X成为你的苹果电脑得力助手

在数字化时代&#xff0c;Mac电脑已成为众多用户的首选。然而&#xff0c;随着频繁的使用和数据量的日益增长&#xff0c;许多Mac用户面临着系统杂乱、存储空间不足以及隐私保护等问题。幸运的是&#xff0c;"CleanMyMac X"这款优化和清理工具应运而生&#xff0c;它…

[论文笔记]REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

引言 今天带来一篇经典论文REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS的阅读笔记&#xff0c;论文中文意思是 在语言模型中协同推理和行动。 虽然大型语言模型(LLMs)在语言理解和互动决策任务中展现出强大的能力&#xff0c;但它们在推理(例如思维链提示)和…

【算法】栈算法——最小栈

题解&#xff1a;最小栈(栈算法) 目录 1.题目2.题解3.总结 1.题目 题目链接&#xff1a;LINK 这个题目题意说的有点绕&#xff0c;说白了让你在常数时间内检索到最小元素就是O(1)时间复杂度下找到栈中最小的元素。 2.题解 思路&#xff1a;这个栈可以内嵌套两个库栈来进行…