使用easyExcel 导出文件并合并相同内容的单元格-导出下拉模板-数据有效性校验

首先看下效果:

在这里插入图片描述

一、导入依赖

		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.3</version>
        </dependency>

二、准备工具类

1.操作的工具类
package com.yuncheng.utils.excel;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.style.column.SimpleColumnWidthStyleStrategy;
import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy;
import com.yuncheng.utils.excel.handler.AutoWidthHandler;
import com.yuncheng.utils.excel.handler.SelectSheetWriteHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.util.*;
/**
 * @Description: 动态excel工具类
 * @Author: ChenH
 * @Date: 2024/7/23 10:50
 */

@Component
@Slf4j
public class  DynamicExcelUtils {
   

    /**
     * 动态excel模板下载
     * @param response  响应
     * @param title     大标题说明,多行使用转义符\n换行
     * @param names     列集合
     * @param fieldEn   列英文名称
     * @param selectMap 下拉框
     * @param fileName  自定义文件名称
     * @param sheetName 自定义sheet页名称
     */
    public void excelDownloadLink(HttpServletResponse response, String title,List<String> names, List<String> fieldEn ,List list ,Map<Integer,
            List<String>> selectMap,String sheetName, String fileName) {
   
        try {
   
            //设置表格示例数据的值
            List<List<String>> datas = setData(list,fieldEn);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            response.setCharacterEncoding("UTF-8");
            EasyExcel.write(response.getOutputStream())
                    .excelType(ExcelTypeEnum.XLSX)
                    .head(head(CollectionUtil.isNotEmpty(names) ? names.toArray(new String[0]) : new String[0], title))
                    //开启内存模式才能使用动态设置标题样式
                    .inMemory(true)
                    .registerWriteHandler(new TitleStyleUtils(names))
                    .registerWriteHandler(new SelectSheetWriteHandler(selectMap))
                    .registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
                    .sheet(sheetName)
                    .doWrite(CollectionUtil.isNotEmpty(datas) ? datas:new ArrayList());
        } catch (IOException e) {
   
            e.printStackTrace();
            response.reset();
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json");
            try {
   
                response.getWriter().println("打印失败");
            } catch (IOException ex) {
   
                ex.printStackTrace();
            }
        }
    }


    /**
     * 动态excel数据导出
     * @param response 响应
     * @param fileName  自定义文件名称
     * @param sheetName 自定义sheet页名称
     * @param list     数据集合
     */
    public void excelExportData(HttpServletResponse response,List<String> names,List<String> fieldEn,List list ,String sheetName, String fileName){
   
        try {
   
            //设置返回数据的值跟动态列一一对应
            List<List<String>> datas = setData(list,fieldEn);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            response.setCharacterEncoding("UTF-8");
            EasyExcel.write(response.getOutputStream())
                    .excelType(ExcelTypeEnum.XLSX)
                    .head(headData(CollectionUtil.isNotEmpty(names) ? names.toArray(new String[0]) : new String[0]))
                    .registerWriteHandler(new AutoWidthHandler())
                    .registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 25, (short) 25))
                    .sheet(sheetName)
                    .doWrite(CollectionUtil.isNotEmpty(datas) ? datas:new ArrayList());

        } catch (IOException e) {
   
            e.printStackTrace();
            response.reset();
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/json");
            try {
   
                response.getWriter().println("打印失败");
            } catch (IOException ex) {
   
                ex.printStackTrace();
            }
        }
    }
    /**
     * 动态excel数据导出
     * @param response 响应
     * @param fileName  自定义文件名称
     * @param sheetName 自定义sheet页名称
     * @param list     数据集合
     */
    public void excelExportData(HttpServletResponse response, List<String> names, List list, String sheetName, String fileName){
   
        try {
   
            //设置返回数据的值跟动态列一一对应
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
            response.setCharacterEncoding("UTF-8");
            EasyExcel.write(response.getOutputStream())
                    .excelType(ExcelTypeEnum.XLSX)
                    //.head(head(CollectionUtil.isNotEmpty(names) ? names.toArray(new String[0]) : new String[0], title))
                    .head(headData(CollectionUtil.isNotEmpty(names) ? names.toArray(new String[0]) : new String[0]))
                    .registerWriteHandler(new AutoWidthHandler())
                    .registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 25, (short) 25))
                    .sheet(sheetName)
                    .doWrite(CollectionUtil.isNotEmpty(list) ? list:new ArrayList());
        } catch (IOException e) {
   
            e.printStackTrace();
            response.reset();
            response.setCharacterEncoding("utf-8")
要实现在EasyExcel导出相同内容单元格合并,可以使用EasyExcel提供的合并单元格的方法。具体步骤如下: 1. 在实体类中添加一个用于记录合并单元格行数的属性。 ```java public class ExcelData { // 其他属性... private int rowspan; // getter、setter方法... } ``` 2. 在导出数据时,对相邻且内容相同单元格进行合并,并设置合并的行数。 ```java // 创建ExcelWriter对象 ExcelWriter writer = EasyExcel.write(outputStream, ExcelData.class).build(); // 获取数据列表 List<ExcelData> dataList = getDataList(); // 写入数据 Sheet sheet = writer.sheet().build(); int rowIndex = 0; for (ExcelData data : dataList) { Row row = sheet.row(rowIndex++); // 写入其他单元格数据... // 合并相同内容单元格 if (rowIndex > 1 && data.getContent().equals(dataList.get(rowIndex - 2).getContent())) { data.setRowspan(dataList.get(rowIndex - 2).getRowspan() + 1); } else { data.setRowspan(1); } if (data.getRowspan() > 1) { CellRangeAddress range = new CellRangeAddress(rowIndex - data.getRowspan(), rowIndex - 1, 0, 0); sheet.addMergedRegion(range); } } // 关闭ExcelWriter对象 writer.finish(); ``` 其中,`addMergedRegion`方法用于添加合并单元格的区域,第一个参数为合并单元格左上角的单元格行号,第二个参数为合并单元格右下角的单元格行号,第三个参数为合并单元格左上角的单元格列号,第四个参数为合并单元格右下角的单元格列号。 这样就可以实现在EasyExcel导出相同内容单元格合并的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值