java基于HuTool工具类ExcelWriter合并单元格

HuTool工具类ExcelWriter合并单元格

基于HuTool工具类ExcelWriter合并单元格并且使用 jdk1.8 lambda表达式
效果如下:
在这里插入图片描述

  1. 创建注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Created by Intellij IDEA. Copyright@ zqy
 *
 * @Author: zqy
 * @Date: 2021/8/11
 * @Description: excel表头注解
 */

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface HeaderName {
    String value() default "";
}
  1. 创建实类
import java.io.Serializable;
import java.math.BigDecimal;

import cn.stylefeng.guns.modular.business.annotation.HeaderName;
import lombok.Data;

/**
 * Created by Intellij IDEA. Copyright@ zqy
 * 
 * @Author: zqy
 * @Date: 2021/8/2
 * @Description:
 */

/**
 * 材料实验
 */
@Data
public class MaterialsTestExcelVO implements Serializable {
    private static final long serialVersionUID = -3621354299691315539L;

    /**
     * 来源名称
     */
    @HeaderName("来源名称")
    private String msName;

    /**
     * 材料名称
     */
    @HeaderName("材料名称")
    private String mName;

    /**
     * 上端材料
     */
    @HeaderName("上端材料")
    private String materialSpringSide;

    /**
     * 下端材料
     */
    @HeaderName("下端材料")
    private String materialCarriageSide;

    /**
     * 温度
     */
    @HeaderName("温度")
    private String temp;

    /**
     * 相对湿度
     */
    @HeaderName("相对湿度")
    private String relattiveHumiduty;

    /**
     * 压力
     */
    @HeaderName("压力")
    private Integer normalForce;

    /**
     * 批次名称
     */
    @HeaderName("批次名称")
    private String batch;

    /**
     * 速度
     */
    @HeaderName("速度")
    private String relativeVelocity;

    /**
     * 啸叫率
     */
    @HeaderName("啸叫率")
    private BigDecimal groanGate;

    /**
     * 滑动摩擦力
     */
    @HeaderName("滑动摩擦力")
    private BigDecimal dynFrictForce;

    /**
     * 静摩擦力
     */
    @HeaderName("静摩擦力")
    private BigDecimal statFrictForce;

    /**
     * 测试时间
     */
    @HeaderName("测试时间")
    private String testTime;
}
  1. 代码逻辑
    1.查找数据库返回数据voList
    2.设置导出表头数据
    3.用lambda表达式获取字段分组数据;
    4.遍历数据,设置合并规则:
    5.将数据保存在list中
    6.ExcelWriter导出excel文件
  2. 代码:
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import lombok.SneakyThrows;
/***
 * @Description: 导出数据查询
 * @Author: zqy
 * @Date: 2021/8/12 14:56
 * @Param: dto response
 * @Return: void
 */
@SneakyThrows
@Override
public void export(MaterialsTestListSearchDTO dto, HttpServletResponse response) {
    List<MaterialsTestExcelVO> voList = testMapper.findExcelList(dto);
    downloadReport(voList, response);
}
/***
 * @Description: 下载数据
 * @Author: zqy
 * @Date: 2021/8/12 14:57
 * @Param: voList response
 * @Return: void
 */
public void downloadReport(List<MaterialsTestExcelVO> voList, HttpServletResponse response) throws IOException {
    // 定义基础数据
    List<String> rowHead = loadRowHead(MaterialsTestExcelVO.class);
    ExcelWriter writer = ExcelUtil.getBigWriter();
    // 写入标题
    writer.writeHeadRow(rowHead);
    // 获取导出数据
    List<List<Object>> rows = loadRowList(voList, writer);
    // 导出数据
    // 一次性写出内容,使用默认样式,强制输出标题
    writer.write(rows, true);
    // response为HttpServletResponse对象
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    // test.xls是弹出下载对话框的文件名,不能为中文,中文请自行编码
    response.setHeader("Content-Disposition", "attachment;filename=file.xlsx");
    ServletOutputStream out = response.getOutputStream();
    writer.flush(out, true);
    // 此处记得关闭输出Servlet流
    IoUtil.close(out);
}
/***
 * @Description: 封装导出数据,并合并列
 * @Author: zqy
 * @Date: 2021/8/12 14:59
 * @Param: voList writer
 * @Return: java.util.List<java.util.List<java.lang.Object>>
 */
private List<List<Object>> loadRowList(List<MaterialsTestExcelVO> voList, ExcelWriter writer) {
    // 定义启始行
    int index = 1;
    int index2 = 1;
    int index3 = 1;
    int index4 = 1;
    List<List<Object>> rows = new LinkedList<>();
    // 按照姓名分组数据汇总处理(lambda表达式,不了解可以百度)
    Map<String, List<MaterialsTestExcelVO>> msGroupMaps = voList.stream()
        .collect(Collectors.groupingBy(MaterialsTestExcelVO::getMsName, LinkedHashMap::new, Collectors.toList()));
    for (Map.Entry<String, List<MaterialsTestExcelVO>> listEntry : msGroupMaps.entrySet()) {
        List<MaterialsTestExcelVO> msList = listEntry.getValue();
        // 根据数据条数设置合并单元格信息
        if (msList.size() == 1) {// 一条数据不合并
            index = index + msList.size();
            index2 = index2 + msList.size();
            index3 = index3 + msList.size();
            index4 = index4 + msList.size();
        } else {
            // 规则编写
            writer.merge(index, index + msList.size() - 1, 0, 0, null, true);
            // 标题
            index = index + msList.size();
            // 按照编码进行分组
            Map<String, List<MaterialsTestExcelVO>> mGroupMaps = msList.stream().collect(
                Collectors.groupingBy(MaterialsTestExcelVO::getMName, LinkedHashMap::new, Collectors.toList()));
            for (Map.Entry<String, List<MaterialsTestExcelVO>> list2Entry : mGroupMaps.entrySet()) {
                List<MaterialsTestExcelVO> mList = list2Entry.getValue();
                // 根据数据条数设置合并单元格信息
                if (mList.size() == 1) {// 一条数据不合并
                    index2 = index2 + mList.size();
                    index3 = index3 + mList.size();
                    index4 = index4 + mList.size();
                } else {
                    // 规则编写
                    writer.merge(index2, index2 + mList.size() - 1, 1, 1, null, true);
                    index2 = index2 + mList.size();

                    // 按照编码进行分组
                    Map<String, List<MaterialsTestExcelVO>> ssGroupMaps =
                        mList.stream().collect(Collectors.groupingBy(MaterialsTestExcelVO::getMaterialSpringSide,
                            LinkedHashMap::new, Collectors.toList()));
                    for (Map.Entry<String, List<MaterialsTestExcelVO>> list3Entry : ssGroupMaps.entrySet()) {
                        List<MaterialsTestExcelVO> ssList = list3Entry.getValue();
                        // 根据数据条数设置合并单元格信息
                        if (ssList.size() == 1) {// 一条数据不合并
                            index3 = index3 + ssList.size();
                            index4 = index4 + ssList.size();
                        } else {
                            // 规则编写
                            writer.merge(index3, index3 + ssList.size() - 1, 2, 2, null, true);
                            index3 = index3 + ssList.size();

                            // 按照编码进行分组
                            Map<String,
                                List<MaterialsTestExcelVO>> csGroupMaps = ssList.stream()
                                    .collect(Collectors.groupingBy(MaterialsTestExcelVO::getMaterialCarriageSide,
                                        LinkedHashMap::new, Collectors.toList()));
                            for (Map.Entry<String, List<MaterialsTestExcelVO>> list4Entry : csGroupMaps
                                .entrySet()) {
                                List<MaterialsTestExcelVO> csList = list4Entry.getValue();
                                // 根据数据条数设置合并单元格信息
                                if (csList.size() == 1) {// 一条数据不合并
                                    index4 = index4 + csList.size();
                                } else {
                                    // 规则编写
                                    writer.merge(index4, index4 + csList.size() - 1, 3, 3, null, true);
                                    index4 = index4 + csList.size();
                                }
                            }
                        }
                    }
                }
            }
        }
        // 保存数据
        msList.forEach(sList -> {	
            List<Object> rowA = null;
            rowA = CollUtil.newArrayList(sList.getMsName(), sList.getMName(), sList.getMaterialSpringSide(),
                sList.getMaterialCarriageSide(), sList.getTemp(), sList.getRelattiveHumiduty(), sList.getBatch(),
                sList.getNormalForce(), sList.getRelativeVelocity(),  sList.getGroanGate(), sList.getDynFrictForce(), sList.getStatFrictForce(),
                sList.getTestTime());
            rows.add(rowA);
        });
    }
    return rows;
}
/***
 * @Description: 封装表头
 * @Author: zqy
 * @Date: 2021/8/12 15:00
 * @Param: albumClass 实体类class
 * @Return: java.util.List<java.lang.String>
 */
private List<String> loadRowHead(Class<?> albumClass) {
    List<String> rowHead = new ArrayList<>();
    // 获取 实体类 中所有的字段
    Field[] declaredFields = albumClass.getDeclaredFields();
    for (Field declaredField : declaredFields) {
        // 这里设置为 true 才可以访问到 实体类中的 private 字段
        declaredField.setAccessible(true);
        // 获取字段所对应的注解
        HeaderName annotation = declaredField.getAnnotation(HeaderName.class);
        if (null != annotation) {
            // 有注解 则 获取 注解的值(表头名称)
            rowHead.add(annotation.value());
        }
    }
    return rowHead;
}

借鉴地址

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Hutool是一个Java工具类库,提供了很多便捷的工具类来操作Excel。要实现导出并合并单元格,可以使用Hutool提供的Excel工具类中的mergeCells()方法。 示例代码如下: ``` // 创建Excel工作簿 Workbook workbook = ExcelUtil.createWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet(); // 合并单元格 ExcelUtil.mergeCells(sheet, 1, 2, 2, 3); // 第1行第2列和第3列合并 // 导出Excel ExcelUtil.write(workbook, new File("result.xlsx")); ``` 需要注意的是,这个方法需要依赖 poi 包,需要额外引用。 ### 回答2: Hutool 是一款基于Java工具类库,其中包含了许多实用的工具类和方法,可以简化开发过程。其中,Hutool也提供了相关的方法来实现导出合并单元格。 要使用Hutool导出合并单元格,首先需要引入Hutool的相关依赖。然后,我们可以使用Hutool提供的ExcelUtil工具类来操作Excel文件。 首先,我们需要创建一个ExcelWriter对象,这个对象用于写入数据到Excel文件中。然后,我们可以使用ExcelWriter对象的merge方法来合并单元格。merge方法需要传入开始行、结束行、开始列和结束列来指定合并的区域。 接下来,我们可以使用ExcelWriter对象的writeCellValue方法来写入数据到指定的单元格中。writeCellValue方法需要传入行、列和值来指定要写入的单元格位置和值。 最后,我们需要使用ExcelWriter对象的close方法来关闭写入流,并将数据写入到Excel文件中。 以下是使用Hutool实现导出合并单元格的示例代码: ```java import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelWriter; public class ExportMergeCells { public static void main(String[] args) { // 创建ExcelWriter对象 ExcelWriter writer = ExcelUtil.getWriter("output.xlsx"); // 合并单元格,合并第1行到第2行、第1列到第3列 writer.merge(0, 1, 0, 2); // 写入数据到指定单元格 writer.writeCellValue(0, 0, "合并后的单元格"); // 关闭ExcelWriter对象,写入并保存Excel文件 writer.close(); } } ``` 以上代码将会创建一个名为output.xlsx的Excel文件,并在第1行到第2行、第1列到第3列合并了单元格,然后在合并后的单元格中写入了"合并后的单元格"。 以上就是使用Hutool实现导出合并单元格的简要过程。当然,Hutool还提供了许多其他的功能和方法,可以根据实际需求进行使用和扩展。 ### 回答3: Hutool是一个Java工具库,可以用来简化开发过程中的常见任务。其中包括导出Excel文件和合并单元格的操作。 在Hutool中,要使用导出Excel文件的功能,需要使用`ExcelUtil`类。可以通过该类的`write`方法来创建一个Excel文件,并将数据写入其中。同时,Hutool也提供了一些配置选项,可以很方便地设置样式、标题、列宽等等。 当需要合并单元格时,可以使用`CellUtil`类提供的方法。通过指定起始行、起始列、结束行、结束列,我们可以很轻松地实现单元格的合并操作。例如,`CellUtil.merge`方法可以用于合并指定范围内的单元格。 总结来说,使用Hutool导出Excel文件并合并单元格的步骤如下: 1. 引入Hutool的相关依赖。 2. 创建一个Excel文件对象,可以使用`ExcelUtil.createWorkbook`方法。 3. 创建一个Sheet对象,可以使用`ExcelUtil.createSheet`方法。 4. 写入数据,可以使用`ExcelUtil.write`方法。 5. 如果需要合并单元格,在写入数据之前调用`CellUtil.merge`方法来合并指定范围的单元格。 6. 最后,通过调用`ExcelUtil.close`方法来关闭文件流并保存Excel文件。 使用Hutool,我们可以方便地实现导出Excel文件并合并单元格的功能,提高开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值