当前位置: 首页 > news >正文

Java Excel 合并单元格 Java Excel 实现尾部添加数据 Java Excel 合并单元格 添加数据 poi excel 合并单元格

        Java Excel 合并单元格 Java Excel 实现尾部添加数据 Java Excel 合并单元格 添加数据

一、前言

        最近的工作中,遇到一个需求,在生成的Excel表格后,需要在尾部添加 一个合并的单元格数据。 因生成的表格 行数 不确定,可以将需求理解为:导出Excel后,需要在尾部动态添加一行内容。

 

分析:

  • 导出 Excel 文件,现有功能,可以直接实现 ,比如参考这个。
  • 尾部的单元格,需要合并功能,且需要换行,支持行高,字体配置等。
  • 生成数据行数不确定,尾部内容需要在 生成数据后添加

二、代码实现

        1、Excel 合并单元格 伪代码如下:

sheet.addMergedRegion(new CellRangeAddress(起始行,终止行,起始列,终止列));

        2、创建一个 ExcelConfig 类,用于 excel 单元格合并 相关配置


/**
 * Description: Excel 合并单元格的配置
 * @author w
 * @version 1.0
 * @date 2022/8/23 9:25
 */
public class ExcelConfig {
    private List<Ext> extList;

    public static class Ext{
        private Integer offsetDown ; // 字体下移的位置
        private String color ; // 字体颜色: RED 红色 【可选】
        private String content ; // 添加的内容
        private Float height ; // 行高 【可选】
        private String fontName ; // 字体名称 【可选】
       // ignore getter , setter
    }

    public List<Ext> getExtList() {
        return extList;
    }

    public void setExtList(List<Ext> extList) {
        this.extList = extList;
    }
}

        3、完成的测试代码如下 , 核心方法:processExt

package poi.test;

import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Description: poi excel 尾部添加合并内容
 * <br> excel 合并单元格 测试 excel merge cell
 * @author w
 * @version 1.0
 * @date 2022/8/23 10:35
 */
public class ExcelMergeTest {

    public static void main(String[] args) throws IOException {
        genExcelTest();
    }

    /**
     * @Description: 生成 合并格式的excel 文件
     * @return void
     * @version v1.0
     * @author wu
     * @date 2022/8/23 10:36
     */
    private static void genExcelTest() throws IOException {
        SXSSFWorkbook workbook = new SXSSFWorkbook();
        SXSSFSheet sheet = workbook.createSheet("第一页");
        // 开始写入的行数
        SXSSFRow headerRow = sheet.createRow(0);

        List<String> headerList = Arrays.asList("姓名", "年龄", "addr");
        for (int i = 0; i < headerList.size(); i++) {
            SXSSFCell cell = headerRow.createCell(i);
            cell.setCellValue(headerList.get(i));
        }

        // 行数数据
        List<User> rowList = loadRowList();
        // 加载行数据
        loadRowData(workbook,sheet,rowList);

        // 处理尾部合并的数据
        processExt(workbook,sheet,headerList,rowList);
        
        // 导出文件
        String  fileName = "D:\\文件导出" +System.currentTimeMillis()+".xlsx" ;
        FileOutputStream out = new FileOutputStream(new File(fileName));
        workbook.write(out);
        workbook.dispose();

    }

    /**
     * @Description: 处理 excel 单元格 合并、扩展内容
     * @param workbook
     * @param sheet
     * @param headerList 表头
     * @param rowList
     * @return  void
     * @version v1.0
     * @author wu
     * @date 2022/8/25 21:24
     */
    private static void processExt(SXSSFWorkbook workbook, SXSSFSheet sheet, List<String> headerList, List<User> rowList) {
        // 加载合并的配置
        ExcelConfig config = loadExtList();
        List<ExcelConfig.Ext> extList = config.getExtList();
        // 计算 表头长度 、 内容数据长度
        int headerSize = headerList.size();
        int rowSize = rowList.size();

        for (ExcelConfig.Ext e : extList) {
            int rowIndex = rowSize + e.getOffsetDown();
            // 创建 合并的区域
            sheet.addMergedRegion(new CellRangeAddress(rowIndex,rowIndex,0,headerSize));
            SXSSFRow row = sheet.createRow(rowIndex);
            SXSSFCell cell = row.createCell(0); // 合并后的单元格
            cell.setCellValue(e.getContent());

            // 属性相关的配置
            CellStyle cellStyle = workbook.createCellStyle();
            Font font = workbook.createFont();

            // 配置字体
            if(StringUtils.isNotBlank(e.getFontName())){
                font.setFontName(e.getFontName());
            }
            // 配置字体颜色
            if(StringUtils.isNotBlank(e.getColor())){
                if("RED".equals(e.getColor())){
                    font.setColor(Font.COLOR_RED);
                }
            }

            // 配置行高
            if(null != e.getHeight()){
               row.setHeightInPoints(e.getHeight());
            }

            // 额外相关的配置
            cellStyle.setWrapText(true);
            cellStyle.setAlignment(HorizontalAlignment.LEFT); // 对齐方式
            cellStyle.setVerticalAlignment(VerticalAlignment.TOP);

            // 完成配置
            cellStyle.setFont(font);
            cell.setCellStyle(cellStyle);
        }
    }

    /**
     * @Description: 加载 Excel 合并相关的配置信息
     * @return  poi.test.ExcelConfig
     * @version v1.0
     * @author wu
     * @date 2022/8/25 21:25
     */
    private static ExcelConfig loadExtList() {
        ExcelConfig excelConfig = new ExcelConfig();

        ExcelConfig.Ext ext = new ExcelConfig.Ext();
        ext.setColor("RED");
        ext.setContent(" 内容红色的字体 -- 全部配置");
        ext.setOffsetDown(1);
        ext.setHeight(33F);
        ext.setFontName("黑体");

        ExcelConfig.Ext ext2 = new ExcelConfig.Ext();
        ext2.setContent(" 最简单的 部分配置 ");
        ext2.setOffsetDown(3);

        ArrayList<ExcelConfig.Ext> list = Lists.newArrayList();
        list.add(ext);
        list.add(ext2);

        excelConfig.setExtList(list);
        return excelConfig;
    }

    /**
     * @Description: excel 填充数据
     * @param workbook
     * @param sheet
     * @param rowList
     * @return  void
     * @version v1.0
     * @author wu
     * @date 2022/8/25 21:25
     */
    public static void loadRowData(Workbook workbook, Sheet sheet, List<User> rowList) {
        int startRow = 1 ;
        for (int i = 0; i < rowList.size(); i++) {
            User user = rowList.get(i);
            Row row = sheet.createRow(i + startRow);

            Cell cell0 = row.createCell(0);
            cell0.setCellValue(user.getName());

            Cell cell1 = row.createCell(1);
            cell1.setCellValue(user.getAge());

            Cell cell2 = row.createCell(2);
            cell2.setCellValue(user.getAddr());
        }
    }

    /**
     * @Description: 加载 rowList 数据
     * @return  java.util.List<poi.test.User>
     * @version v1.0
     * @author wu
     * @date 2022/8/25 21:26
     */
    public static List<User> loadRowList() {
        ArrayList<User> rowList = Lists.newArrayList();
       rowList.add(new User("小明",18,"北京市"));
       rowList.add(new User("小狗",22,"河北省"));
       rowList.add(new User("小猫",33,"天津市"));
        return rowList;
    }
}

        4、测试后的效果如下:

 

        5、可以在指定位置完成数据填充,说明满足需求。

三、总结

        1、本文示例代码是基于 poi 3.16版本,原汁原味,没有其他的任何添加剂 。。。

        2、重点关注:loadExtList 方法中excel 合并部分内容的配置; 和 processExt 方法中,对于配置的处理 ;功能应用上,可以将 ExcelConfig.Ext 类的配置,转换为 JSON文件,改成配置,可以根据情况进行调整。

        3、配置中,文字要实现换行,可以用 \n 来实现换行;文字 加粗、靠右、居中 等效果还未找到办法来配置...

 

        4、excel软件中操作时,可以通过 ALT+Enter 键实现换行。

相关文章:

  • SSM仓库管理系统毕业设计-附源码061015
  • 猿创征文|Docker【配置好的镜像】 迁移到【新服务器】上 不需要重新配置环境参数·爽
  • 关于现代化应用和云原生应用
  • R语言矩阵运算:矩阵转置、计算逆矩阵、两个矩阵的相乘、构建nxn对角(单位)矩阵
  • 数据结构————堆
  • 【GNN报告】Mila实验室/蒙特利尔大学朱兆成:基于图神经网络的知识图谱推理
  • ssm大型商场移动导游系统的设计与实现毕业设计源码100853
  • springboot日结工管理小程序毕业设计-附源码070940
  • R语言生成字符串的所有成对组合:使用outer函数和paste函数生成所有字符串的成对组合(笛卡尔积)、自定义指定组合字符串的分隔符
  • 详解模板引擎二
  • Java Spring整合Redis工具类
  • 深入理解 Compose Navigation 实现原理
  • springboot小型教育网站的开发与建设毕业设计源码100853
  • js类型检测
  • 微服务网关Gateway实践总结
  • ----------
  • .pyc 想到的一些问题
  • 5、React组件事件详解
  • Docker容器管理
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • js中的正则表达式入门
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Redis的resp协议
  • 读懂package.json -- 依赖管理
  • 翻译:Hystrix - How To Use
  • 简单易用的leetcode开发测试工具(npm)
  • 利用DataURL技术在网页上显示图片
  • 每天一个设计模式之命令模式
  • 山寨一个 Promise
  • 栈实现走出迷宫(C++)
  • 正则与JS中的正则
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #《AI中文版》V3 第 1 章 概述
  • #if 1...#endif
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (三)Honghu Cloud云架构一定时调度平台
  • (算法)Game
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .form文件_SSM框架文件上传篇
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Micro Framework 4.2 beta 源码探析
  • .NET 中 GetProcess 相关方法的性能
  • .Net接口调试与案例
  • .NET与 java通用的3DES加密解密方法
  • .Net中的设计模式——Factory Method模式
  • /usr/bin/env: node: No such file or directory
  • ?
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [BSGS算法]纯水斐波那契数列
  • [BZOJ1040][P2607][ZJOI2008]骑士[树形DP+基环树]
  • [C#基础知识系列]专题十七:深入理解动态类型
  • [Codeforces1137D]Cooperative Game