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

news2024/9/21 20:40:55

需求

接了需求,下载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); // 写入头部标题
		//建立新的sheet
        writer.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);

		//创建新的sheet
        writer.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.coloradmin.cn/o/1685346.html

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

相关文章

Linux|ubuntu22.04安装CUDA最新完整教程

文章目录 一、安装前准备工作查看GPU和型号查看GCC版本*下载gcc12 *检查驱动 二、安装CUDA Toolkit*安装驱动 三、安装后的工作必要操作推荐的操作开启守护进程模式删除本地下载安装包 四、验证删除CUDA常见问题及解决方案还需要安装cuDNN吗&#xff1f;nvcc: No such file or …

GitKraken克隆Git仓库

克隆Git仓库 修改本地仓库 在此新增了一个test.txt文件 GitKraken提醒有一处改变 暂存&#xff08;Stage&#xff09;该文件&#xff0c;添加描述后提交修改&#xff1a; 修改成功&#xff1a;

【数据结构】【C语言】堆~动画超详细解读!

目录 1 什么是堆1.1 堆的逻辑结构和物理结构1.2 堆的访问1.3 堆为什么物理结构上要用数组?1.4 堆数据上的特点 2 堆的实现2.1 堆类型定义2.2 需要实现的接口2.3 初始化堆2.4 销毁堆2.5 堆判空2.6 交换函数2.7 向上调整(小堆)2.8 向下调整(小堆)2.9 堆插入2.10 堆删除2.11 //堆…

Flink常见面试题总结

文章目录 1. 简单介绍一下Flink2. Flink 的运行必须依赖Hadoop组件吗?3. Flink 和 Spark Streaming 的区别&#xff1f;4. Flink集群角色5. Flink核心概念5.1 并行度5.2 算子链&#xff08;Operator Chain&#xff09;5.3 任务槽&#xff08;Task Slots&#xff09;5.4 任务槽…

Python | Leetcode Python题解之第108题将有序数组转换为二叉搜索树

题目&#xff1a; 题解&#xff1a; class Solution:def sortedArrayToBST(self, nums: List[int]) -> TreeNode:def helper(left, right):if left > right:return None# 选择任意一个中间位置数字作为根节点mid (left right randint(0, 1)) // 2root TreeNode(nums…

cesium绘制三角网可视化及mesh网格数据解析

可视化运行效果(水质污染扩散) 实现运行效果 术语 Mesh网格数据解析 Mesh&#xff08;网格&#xff09;在不同领域有不同的应用和定义。在计算机网络中&#xff0c;Mesh网络指的是一种无中心的网状结构&#xff0c;每个节点都与其他节点相连。而在3D计算机图形学中&#…

计算机专业实习生应该去哪实习?

计算机专业实习生可以选择在各种不同类型的公司和组织中实习。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 这取…

局部直方图均衡化去雾算法

目录 1. 引言 2. 算法流程 3. 代码 4. 去雾效果 1. 引言 局部直方图算法是一种基于块的图像去雾方法&#xff0c;它将图像分割为若干个块&#xff0c;并在每个块内计算块的局部直方图。通过对各个块的直方图进行分析和处理&#xff0c;该算法能够更好地适应图像中不同区域的…

聚鼎科技:现在的装饰画怎么样

当代装饰画以其多样化的风格和形式&#xff0c;在装点生活的同时反映了现代人的审美趣味和文化追求。如今&#xff0c;装饰画不再局限于传统的油画、水彩或版画&#xff0c;它们已经跨越了材质与技法的界限&#xff0c;呈现出前所未有的丰富性。 走进任一家装潢精致的咖啡馆或现…

基于机器学习模型预测信用卡潜在用户(XGBoost、LightGBM和Random Forest)

基于机器学习模型预测信用卡潜在用户&#xff08;XGBoost、LightGBM和Random Forest&#xff09; 随着数据科学和机器学习的发展&#xff0c;越来越多的企业开始利用这些技术来提高运营效率。在这篇博客中&#xff0c;我将分享如何利用机器学习模型来预测信用卡的潜在客户。此…

angr使用学习

首先我是直接在kali中安装的&#xff0c;也是边练边学的。 嗯&#xff0c;要在纯净python环境&#xff0c;所以是在 virtualenv 虚拟环境里&#xff0c;也不是特别会用这个&#xff0c;按照教程一步步做的 source venv/bin/activate 进入了对应环境 退出是 deactivate en,ipy…

pdf文件怎么编辑?分享3个专业的pdf软件!

在数字化时代&#xff0c;PDF文件已成为我们工作、学习中的得力助手。然而&#xff0c;面对需要修改的PDF文件&#xff0c;许多人却感到无从下手。今天&#xff0c;就让我们一起探索如何轻松编辑PDF文件&#xff0c;并介绍几款实用的编辑软件&#xff0c;让你轻松应对各种PDF编…

Spring:IoC容器(基于注解管理bean)

1. HelloWorld * 引入依赖* 开启组件扫描* 使用注解定义 Bean* 依赖注入 2.开启组件扫描 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/20…

免费开源人脸识别系统,支持RESTful API

简介 CompreFace 是一个免费开源的人脸识别项目&#xff0c;您不需要具备机器学习技能就能安装设置和使用 CompreFace&#xff0c;官方提供了基于 docker 的部署方法&#xff0c;可以方便地部署在本地或者云端服务器上。 CompreFace 提供了 RESTful API&#xff0c;用于人脸识别…

大模型效能工具之智能CommitMessage

01 背景 随着大型语言模型的迅猛增长&#xff0c;各种模型在各个领域的应用如雨后春笋般迅速涌现。在研发全流程的效能方面&#xff0c;也出现了一系列贯穿全流程的提效和质量工具&#xff0c;比如针对成本较高的Oncall&#xff0c;首先出现了高质量的RAG助手&#xff1b;在开…

云原生Kubernetes: K8S 1.26版本 部署KubeSphere

目录 一、实验 1.环境 2.K8S 1.26版本部署HELM 3.K8S 1.26版本 部署KubeSphere 4.安装KubeSphere DevOps 二、问题 1.如何安装Zadig 2.扩展插件Zadig安装失败 3.calico 如何实现不同node通信 4.如何清除docker占用的磁盘空间 5.如何强制删除资源 6.namespace删除不…

linux命令中arj使用

arj 用于创建和管理.arj压缩包 补充说明 arj命令 是 .arj 格式的压缩文件的管理器&#xff0c;用于创建和管理 .arj 压缩包。 语法 arj(参数)参数 操作指令&#xff1a;对 .arj 压缩包执行的操作指令&#xff1b;压缩包名称&#xff1a;指定要操作的arj压缩包名称。 更多…

非关系型数据库NOSQL

文章目录 1. NOSQL 概述2. 相关理论基础2.1 一致性2.2 分区2.3 存储分布2.4 查询模型 3. NOSQL 数据库的种类3.1 文档存储3.2 键值存储3.3 列存储3.3 图存储 4. NOSQL 应用案例和新技术4.1 HBase 数据库4.2 云数据库 GeminiDB 非关系型的数据库 NOSQL (Not Only SQL)是对不同于…

2024.05.23 学习记录

1、 react hooks 面经复习 2、xiaolin coding 计算机网络 复习 3、组件库 subMenu、test测试、tabs组件初步开发完成 4、代码随想录刷题&#xff1a;动态规划 01背包 all

sharded jedis pipelined 执行后 数据并未存入redis

前言 因为历史原因&#xff0c;在某个同步菜单操作的方法中先清除缓存&#xff0c;然后在初始化缓存。本来很正常的逻辑&#xff0c;但是这个清除是db查询获取所有的菜单 然后循环一条条删除 然后在db查询有效的菜单操作 在循环一条条插进去 经统计这个菜单操作大概有个7千个 …