easyexcel自定义样式、选定列下拉数据

该代码示例展示了如何使用EasyExcel库配合自定义拦截器OrgSheetWriteHandler来导出Excel文件,包括设置不需要表头、内容和标题格式,以及特定列的数据格式。拦截器在创建sheet后将某些列设置为文本格式,同时提供了风格策略来定制头部和内容的样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、导入接口

导入工具类中
.registerWriteHandler(new OrgSheetWriteHandler()) 自定义拦截器进行设置

.registerWriteHandler(OrgSheetWriteHandler.getStyleStrategy()) 自定义内容、标题格式

.needHead(false) 不需要表头

.registerWriteHandler(new ExcelDropdownHandler()) 自定义下拉样式

	public static void exportOrgModelExcel(List<?> list, String sheetName, Class<?> pojoClass, String fileName,
								   HttpServletResponse response) {
		OutputStream out = null;
		try {
			if (fileName.indexOf(".") < 0) {
				throw new BizException("文件名必须带后缀");
			}
			response.reset();
			response.setCharacterEncoding("UTF-8");
			response.setContentType("charset=UTF-8;application/form-data");
			response.setHeader("Content-Disposition",
					"attachment; filename=" + new String(fileName.getBytes(), "ISO8859-1"));
			response.setHeader("Set-Cookie", "fileDownload=true; path=/");
			out = response.getOutputStream();
			EasyExcel.write(out, pojoClass).sheet(StringUtils.isEmpty(sheetName) ? "sheet0" : sheetName)
					// 宽度自适应
					.registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
					// 第9列设置为文本格式
					.registerWriteHandler(new OrgSheetWriteHandler())
					// 自定义全表的样式
					.registerWriteHandler(OrgSheetWriteHandler.getStyleStrategy())
					// 自定义下拉样式
//					.registerWriteHandler(new ExcelDropdownHandler())
					// 不需要表头
					.needHead(false)
					.doWrite(list);
		} catch (IOException e) {
			throw new BizException(e);
		} finally {
			if (out != null) {
				try {
					out.flush();
					out.close();
				} catch (IOException e) {
					logger.error("输出流关闭失败!", e);
				}
			}
		}
	}

2、拦截器代码

public class OrgSheetWriteHandler implements SheetWriteHandler  {

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 设置为文本格式
        SXSSFSheet sxssfSheet = (SXSSFSheet) writeSheetHolder.getSheet();
        CellStyle cellStyle = writeWorkbookHolder.getCachedWorkbook().createCellStyle();

        // 49为文本格式
        cellStyle.setDataFormat((short) 49);
        // 8为列,一整列设置为文本格式(从0开始)
        sxssfSheet.setDefaultColumnStyle(1, cellStyle);
        sxssfSheet.setDefaultColumnStyle(8, cellStyle);
        sxssfSheet.setDefaultColumnStyle(13, cellStyle);
        sxssfSheet.setDefaultColumnStyle(14, cellStyle);
    }

    public static HorizontalCellStyleStrategy getStyleStrategy() {
        // 头的策略
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        // 设置对齐
        //headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        // 背景色, 设置为绿色,也是默认颜色
        //headWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
        // 字体
        //WriteFont headWriteFont = new WriteFont();
        //headWriteFont.setFontHeightInPoints((short) 12);
        //headWriteCellStyle.setWriteFont(headWriteFont);

        // 内容的策略
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
        contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
        // 背景绿色
        contentWriteCellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());
//
//        // 字体策略
//        WriteFont contentWriteFont = new WriteFont();
//        //contentWriteFont.setFontHeightInPoints((short) 12);
//        contentWriteCellStyle.setWriteFont(contentWriteFont);
//        //设置 自动换行
        contentWriteCellStyle.setWrapped(true);
//        //设置 垂直居中
        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//        //设置 水平居中
//        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
//        //设置边框样式
//        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
//        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
//        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
//        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);

        // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        return horizontalCellStyleStrategy;
    }
}

4、自定义下拉数据

package com.boot.bean.handel;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddressList;

import java.util.HashMap;
import java.util.Map;

/**
 * 自定义下拉样式
 *
 * @Author yujianfei
 * @Date 2024/8/7 9:23
 * @Version 1.0
 */
@Slf4j
public class ExcelDropdownHandler implements SheetWriteHandler {

    /**
     * 多少行有下拉
     */
    private final static Integer rowSize = 1000;

    /**
     * 设置下拉数据的内容
     *
     * @return
     */
    public Map<Integer, String[]> getDropDownMap() {
        HashMap<Integer, String[]> result = new HashMap<>();
        // 指定下拉框
        String[] school = {"张三", "李四", "王五", "王二麻子"};
        // 从0开始,表示第二列是下拉
        result.put(1, school);
        return result;
    }

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();
        // 下拉框值
        Map<Integer, String[]> dropDownMap = this.getDropDownMap();
        dropDownMap.forEach((celIndex, strings) -> {
            // 区间设置
            CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, rowSize, celIndex, celIndex);
            // 下拉内容
            DataValidationConstraint constraint = helper.createExplicitListConstraint(strings);
            // 验证是否符合下拉
            DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList);
            sheet.addValidationData(dataValidation);
        });
    }

}

3、调用工具类

List<OrgStructureExportVO> restResult = orgStructureService.downloadOrg(uuid);
EasyExcelUtils.exportOrgModelExcel(restResult, "组织机构数据", OrgStructureExportVO.class, "组织机构数据.xlsx", response);
### 如何在Excel中为某一设置下拉选项或数据验证 #### 使用内置功能创建下拉表 在Excel中,可以通过“数据验证”功能为某一设置下拉选项。以下是具体的操作方法: 1. **准备源数据** 首先,在工作表的任意位置创建一个包含所需选项的表。例如,在A输入`苹果`、`香蕉`、`橙子`作为下拉选项的内容[^1]。 2. **选择目标单元格范围** 选中需要应用下拉表的目标区域(如B)。如果仅需应用于单个单元格,则只需点击该单元格即可。 3. **打开数据验证对话框** 转到菜单栏上的“数据”选项卡,找到并点击“数据验证”。这会弹出“数据验证”窗口。 4. **配置数据验证规则** 在“允许”下拉菜单中选择“表”,然后在“来源”框中输入之前创建的源数据所在的单元格范围(如`=A1:A3`),确保勾选“忽略空值”以及“提供下拉箭头”选项[^2]。 5. **保存设置** 单击“确定”按钮完成配置。现在,所选单元格范围内会出现带有向下箭头的小图标,点击后可显示预设的下拉选项。 #### 利用VBA脚本扩展功能 对于更复杂的场景,还可以借助Visual Basic for Applications (VBA) 来动态生成或管理这些下拉表。以下是一个简单的VBA代码示例,它会在选定区域内自动填充基于其他地方定义好的数组项的下拉表: ```vba Sub AddDropdown() Dim ws As Worksheet Set ws = ThisWorkbook.Sheets(1) With ws.Range("B:B").Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ xlBetween, Formula1:="=Sheet1!$A$1:$A$3" .IgnoreBlank = True .InCellDropdown = True .InputTitle = "" .ErrorTitle = "" .InputMessage = "" .ErrorMessage = "" .ShowInput = True .ShowError = True End With End Sub ``` #### 借助第三方库实现高级定制化需求 当涉及到跨平台开发或者批量处理大量带复杂属性的工作簿时,可以考虑采用编程语言配合专门设计用来操作Office文档类型的类库来达成目的。例如Java中有这样一个叫做EasyExcel开源项目就支持向导出模板里加入自定义样式及行为的功能之一就是能够轻松指定某些特定字段应该呈现为什么样的交互形式给最终使用者填写反馈回来——这里正好提到了关于怎样去添加可供挑选的有效值集合进去形成直观易懂的选择界面[^3]。 ```java import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; public class Fruit { @ExcelProperty(value = "Fruit Name", index = 0) private String name; public static final List<String> FRUIT_LIST = Arrays.asList("Apple","Banana","Orange"); } // More code to configure dropdown list using EasyExcel API... ``` 以上就是在Excel环境中针对某单一实施限制性输入控制机制的主要途径概述及其部分实例演示过程描述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值