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.mzph.cn/web/14105.shtml

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

相关文章

Python使用virtualenv创建虚拟环境

目录 第一步&#xff1a;安装virtualenv 第二步&#xff1a;选择一个文件夹用来放所创建的虚拟环境 第三步&#xff1a;创建虚拟环境 第四步&#xff1a;激活虚拟环境 第五步&#xff1a;退出虚拟环境 第六步&#xff1a;测试安装django 前提&#xff1a;你得有个python环…

【STL专题】深入探索C++之std::string:不止于字符串【万字详解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;深入探索C之std::string&#xff1a;不止于字符串 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3…

aardio - godking.vlistEx虚表点击表头全选、排序

新版虚表内置了名称为 DefaultCheckedImg 和 DefaultUnCheckedImg 的两张图片&#xff0c;分别为 【选择框勾选状态默认图片】 和 【选择框未勾选状态默认图片】 以下代码调用了这两张图片&#xff0c;所以请将虚表库升级为最新版。 如果使用旧版库&#xff0c;可以自行添加这…

【Python自动化测试】:Unittest单元测试与HTMLTestRunner自动生成测试用例的好帮手

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;unittest编写测试用例&#x1f680;unittest测…

六种常用设计模式

单例设计模式 单例模式指在整个系统生命周期里&#xff0c;保证一个类只能产生一个实例&#xff0c;确保该类的唯一性。 单例模式分类 单例模式可以分为懒汉式和饿汉式&#xff0c;两者之间的区别在于创建实例的时间不同&#xff1a; 懒汉式&#xff1a;指系统运行中&#…

SpringBootWeb 篇-深入了解 Mybatis 删除、新增、更新、查询的基础操作与 SQL 预编译解决 SQL 注入问题

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Mybatis 的基础操作 2.0 基础操作 - 环境准备 3.0 基础操作 - 删除操作 3.1 SQL 预编译 3.2 SQL 预编译的优势 3.3 参数占位符 4.0 基础操作 - 新增 4.1 主键返回…

Python图像处理:从基础到高级的全方位指南

目录 第一部分&#xff1a;Python图像处理基础 1.1 图像处理概念 1.2 Python图像处理常用库 1.3 实战案例&#xff1a;图像显示与保存 1.4 注意事项 第二部分&#xff1a;Python图像处理高级技巧 2.1 图像变换 2.2 图像增强 2.3 图像复原 第三部分&#xff1a;Python…

20232802 黄千里 2023-2024-2 《网络攻防实践》实践十一报告

20232802 2023-2024-2 《网络攻防实践》实践十一报告 1.实践过程 1.1web浏览器渗透攻击 攻击机&#xff1a;kali172.20.10.10靶机&#xff1a;win2k172.20.10.3 首先在kali中启动msfconsole 输入命令search MS06-014&#xff0c;搜索渗透攻击模块 输入use exploit/window…

终于让我找到了,你也可以学会的人工智能-机器学习教程

给大家分享一套非常棒的python机器学习课程——《AI小天才&#xff1a;让小学生轻松掌握机器学习》&#xff0c;2024年5月完结新课&#xff0c;提供配套的代码笔记软件包下载&#xff01;学完本课程&#xff0c;可以轻松掌握机器学习的全面应用&#xff0c;复杂特征工程&#x…

关于新配置的adb,设备管理器找不到此设备问题

上面页面中一开始没有找到此android设备&#xff0c; 可能是因为我重新配置的adb和设备驱动&#xff0c; 只把adb配置了环境变量&#xff0c;驱动没有更新到电脑中&#xff0c; 点击添加驱动&#xff0c; 选择路径&#xff0c;我安装时都放在了SDK下面&#xff0c;可以尝试…

SpringBoot 实现 RAS+AES 自动接口解密

一、讲个事故 接口安全老生常谈了 过年之前做了过一款飞机大战的H5小游戏&#xff0c;里面无限模式-需要保存用户的积分&#xff0c;因为使用的Body传参&#xff0c;参数是可见的。 为了接口安全我&#xff0c;我和前端约定了传递参数是&#xff1a;用户无限模式的积分“我们…

HTML静态网页成品作业(HTML+CSS)——魅族商城首页网页(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

基于Python+OpenCV卷积神经网络的字符识别

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 字符识别是计算机视觉和模式识别领域的一个重要应用&#xff0c;它在文档数字化、车牌识别、验…

gpt-4o考场安排

说明 &#xff1a;经过多次交互&#xff0c;前后花了几个小时&#xff0c;总算完成了基本功能。如果做到按不同层次分配考场&#xff0c;一键出打印结果就完美了。如果不想看中间“艰苦”的过程&#xff0c;请直接跳到“最后结果”及“食用方法”。中间过程还省略了一部分交互&…

go slice 扩容

扩容 slice 会迁移到新的内存位置&#xff0c;新底层数组的长度也会增加&#xff0c;这样就可以放置新增的元素。同时&#xff0c;为了应对未来可能再次发生的 append 操作&#xff0c;新的底层数组的长度&#xff0c;也就是新 slice 的容量是留了一定的 buffer 的。否则&…

【C++】STL快速入门基础

文章目录 STL&#xff08;Standard Template Library&#xff09;1、一般介绍2、STL的六大组件2.1、STL容器2.2、STL迭代器2.3、相关容器的函数vectorpairstringqueuepriority_queuestackdequeset, map, multiset, multimapunordered_set, unordered_map, unordered_multiset, …

LabVIEW2022安装教程指南【附安装包】

文章目录 前言一、安装指南1、软件包获取 二、安装步骤总结 前言 LabVIEW是一种程序开发环境&#xff0c;提供一种图形化编程方法&#xff0c;可可视化应用程序的各个方面&#xff0c;包括硬件配置、测量数据和调试&#xff0c;同时可以通过FPGA数学和分析选板中的NI浮点库链接…

有趣的css - 两个圆形加载效果

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是一款小清新的加载动画&#xff0c;适用于 app 列表加载&#xff0c;页面加载或者弹层内容延迟加载等场景。 最新文章通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html…

20年交易老兵悟出的宝贵经验,做到这10点或许你也能躺着赚钱

交易要靠亲身体验来真正获得发展&#xff0c;在正确引导下&#xff0c;我们就不会把时间和精力浪费在弯路上。交易之技易学&#xff0c;实难在心态与思考。接下来&#xff0c;我将与您分享一位交易了20年的老兵所积累的10条珍贵经验。 Nial Fuller,一个交易了接近20年的市场“老…

Git远程控制

文章目录 1. 创建仓库1.1 Readme1.2 Issue1.3 Pull request 2. 远程仓库克隆3. 推送远程仓库4. 拉取远程仓库5. 配置Git.gitignore配置别名 使用GitHub可以&#xff0c;采用Gitee也行 1. 创建仓库 1.1 Readme Readme文件相当于这个仓库的说明书&#xff0c;gitee会初始化2两份…