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 键实现换行。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java POI是一个用于操作Microsoft Office格式文件的开源库,在处理Excel文件时可以使用它来实现单元格的合并数据读取。下面是一个使用Java POI合并单元格并读取数据的示例: 1. 导入Java POI的相关库: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.IOException; ``` 2. 定义一个方法来读取Excel文件: ```java public static void readExcel(String filePath) { try { FileInputStream fileInputStream = new FileInputStream(filePath); Workbook workbook = new XSSFWorkbook(fileInputStream); Sheet sheet = workbook.getSheetAt(0); // 循环遍历每一行 for (Row row : sheet) { // 循环遍历每一列 for (Cell cell : row) { // 判断单元格的合并状态 if (cell.getCellType() == CellType.STRING && cell.getCellStyle().getAlignment() == HorizontalAlignment.CENTER) { // 获取合并区域的开始行、结束行、开始列、结束列 int firstRow = sheet.getMergedRegion(cell.getColumnIndex(), cell.getRowIndex()).getFirstRow(); int lastRow = sheet.getMergedRegion(cell.getColumnIndex(), cell.getRowIndex()).getLastRow(); int firstColumn = sheet.getMergedRegion(cell.getColumnIndex(), cell.getRowIndex()).getFirstColumn(); int lastColumn = sheet.getMergedRegion(cell.getColumnIndex(), cell.getRowIndex()).getLastColumn(); // 获取合并区域的数据 String mergedData = sheet.getRow(firstRow).getCell(firstColumn).getStringCellValue(); // 打印合并区域的数据 System.out.println(mergedData); } } } workbook.close(); fileInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } ``` 3. 调用readExcel方法来读取Excel文件: ```java public static void main(String[] args) { readExcel("excelFile.xlsx"); } ``` 以上就是使用Java POI合并单元格并读取数据的一个简单示例。通过判断单元格的合并状态,可以获取到合并区域的数据。根据具体的需求可以进一步处理合并区域的数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值