ExcelUtils样式相关工具

建议把样式相关工具统一放到 ExcelUtils 中的一个区域,例如:

复制代码
// =========================
// Style 工具
// =========================

下面是整理后的完整版(带详细注释和参数说明)。


创建居中样式

复制代码
/**
 * 创建居中样式
 *
 * 功能:
 * 1. 水平居中
 * 2. 垂直居中
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createCenterStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    // 水平居中
    style.setAlignment(
            HorizontalAlignment.CENTER
    );

    // 垂直居中
    style.setVerticalAlignment(
            VerticalAlignment.CENTER
    );

    return style;
}

创建边框样式

复制代码
/**
 * 创建边框样式
 *
 * 功能:
 * 给单元格增加四周边框
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createBorderStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    style.setBorderTop(
            BorderStyle.THIN);

    style.setBorderBottom(
            BorderStyle.THIN);

    style.setBorderLeft(
            BorderStyle.THIN);

    style.setBorderRight(
            BorderStyle.THIN);

    return style;
}

创建标题样式

复制代码
/**
 * 创建标题样式
 *
 * 示例:
 * 考勤统计表
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createTitleStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    Font font =
            workbook.createFont();

    // 粗体
    font.setBold(true);

    // 字体大小
    font.setFontHeightInPoints(
            (short) 16
    );

    style.setFont(font);

    // 居中
    style.setAlignment(
            HorizontalAlignment.CENTER
    );

    style.setVerticalAlignment(
            VerticalAlignment.CENTER
    );

    return style;
}

创建表头样式

复制代码
/**
 * 创建表头样式
 *
 * 功能:
 * 适用于第一行表头
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createHeaderStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    Font font =
            workbook.createFont();

    font.setBold(true);

    style.setFont(font);

    style.setAlignment(
            HorizontalAlignment.CENTER
    );

    style.setVerticalAlignment(
            VerticalAlignment.CENTER
    );

    style.setBorderTop(
            BorderStyle.THIN);

    style.setBorderBottom(
            BorderStyle.THIN);

    style.setBorderLeft(
            BorderStyle.THIN);

    style.setBorderRight(
            BorderStyle.THIN);

    return style;
}

自动换行

复制代码
/**
 * 自动换行样式
 *
 * 示例:
 * 第一行
 * 第二行
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createWrapStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    style.setWrapText(true);

    return style;
}

竖向文字

复制代码
/**
 * 创建竖向文字样式
 *
 * 示例:
 * 考
 * 勤
 * 统
 * 计
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createVerticalTextStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    // 旋转90度
    style.setRotation(
            (short) 90
    );

    style.setAlignment(
            HorizontalAlignment.CENTER
    );

    style.setVerticalAlignment(
            VerticalAlignment.CENTER
    );

    return style;
}

红色字体

复制代码
/**
 * 红色字体样式
 *
 * 适用于:
 * 迟到
 * 缺卡
 * 旷工
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createRedFontStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    Font font =
            workbook.createFont();

    font.setColor(
            IndexedColors.RED.getIndex()
    );

    style.setFont(font);

    return style;
}

日期格式

复制代码
/**
 * 日期格式
 *
 * yyyy-MM-dd
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createDateStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    DataFormat format =
            workbook.createDataFormat();

    style.setDataFormat(
            format.getFormat(
                    "yyyy-MM-dd"
            )
    );

    return style;
}

时间格式

复制代码
/**
 * 时间格式
 *
 * HH:mm:ss
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createTimeStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    DataFormat format =
            workbook.createDataFormat();

    style.setDataFormat(
            format.getFormat(
                    "HH:mm:ss"
            )
    );

    return style;
}

百分比格式

复制代码
/**
 * 百分比格式
 *
 * 12.35%
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createPercentStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    DataFormat format =
            workbook.createDataFormat();

    style.setDataFormat(
            format.getFormat(
                    "0.00%"
            )
    );

    return style;
}

金额格式

复制代码
/**
 * 金额格式
 *
 * 1,999.00
 *
 * @param workbook 工作簿
 * @return CellStyle
 */
public static CellStyle createMoneyStyle(
        Workbook workbook) {

    CellStyle style =
            workbook.createCellStyle();

    DataFormat format =
            workbook.createDataFormat();

    style.setDataFormat(
            format.getFormat(
                    "#,##0.00"
            )
    );

    return style;
}

背景色

复制代码
/**
 * 创建背景色样式
 *
 * @param workbook 工作簿
 * @param color 背景颜色
 *              示例:
 *              IndexedColors.YELLOW
 *              IndexedColors.GREEN
 *              IndexedColors.RED
 *
 * @return CellStyle
 */
public static CellStyle createBackgroundStyle(
        Workbook workbook,
        IndexedColors color) {

    CellStyle style =
            workbook.createCellStyle();

    style.setFillForegroundColor(
            color.getIndex()
    );

    style.setFillPattern(
            FillPatternType.SOLID_FOREGROUND
    );

    return style;
}

冻结表头

复制代码
/**
 * 冻结首行
 *
 * 效果:
 * 下拉时表头固定
 *
 * @param sheet Sheet
 */
public static void freezeHeader(
        Sheet sheet) {

    sheet.createFreezePane(
            0,
            1
    );
}

自动列宽

复制代码
/**
 * 自动列宽
 *
 * @param sheet Sheet
 * @param columnCount 列数量
 */
public static void autoSizeColumns(
        Sheet sheet,
        int columnCount) {

    for (int i = 0;
         i < columnCount;
         i++) {

        sheet.autoSizeColumn(i);

        int width =
                sheet.getColumnWidth(i);

        sheet.setColumnWidth(
                i,
                Math.min(
                        width + 1000,
                        255 * 256
                )
        );
    }
}

设置下拉框

需要额外导入:

复制代码
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.ss.usermodel.DataValidation;
import org.apache.poi.ss.usermodel.DataValidationConstraint;
import org.apache.poi.ss.usermodel.DataValidationHelper;

/**
 * 添加下拉框
 *
 * @param sheet Sheet
 * @param values 下拉数据
 * @param firstRow 开始行
 * @param lastRow 结束行
 * @param col 列号
 */
public static void addDropDownList(
        Sheet sheet,
        String[] values,
        int firstRow,
        int lastRow,
        int col) {

    DataValidationHelper helper =
            sheet.getDataValidationHelper();

    DataValidationConstraint constraint =
            helper.createExplicitListConstraint(
                    values
            );

    CellRangeAddressList addressList =
            new CellRangeAddressList(
                    firstRow,
                    lastRow,
                    col,
                    col
            );

    DataValidation validation =
            helper.createValidation(
                    constraint,
                    addressList
            );

    sheet.addValidationData(
            validation
    );
}

插入图片

复制代码
/**
 * 插入图片
 *
 * @param workbook 工作簿
 * @param sheet Sheet
 * @param imageBytes 图片字节数组
 * @param row 行号
 * @param col 列号
 */
public static void insertImage(
        Workbook workbook,
        Sheet sheet,
        byte[] imageBytes,
        int row,
        int col) {

    int pictureIdx =
            workbook.addPicture(
                    imageBytes,
                    Workbook.PICTURE_TYPE_PNG
            );

    Drawing<?> drawing =
            sheet.createDrawingPatriarch();

    CreationHelper helper =
            workbook.getCreationHelper();

    ClientAnchor anchor =
            helper.createClientAnchor();

    anchor.setRow1(row);
    anchor.setCol1(col);

    Picture picture =
            drawing.createPicture(
                    anchor,
                    pictureIdx
            );

    picture.resize();
}

批量设置整行样式

复制代码
/**
 * 设置整行样式
 *
 * @param row 行
 * @param style 样式
 */
public static void setRowStyle(
        Row row,
        CellStyle style) {

    for (Cell cell : row) {

        cell.setCellStyle(
                style
        );
    }
}

复制单元格样式(非常实用)

复制代码
/**
 * 复制样式
 *
 * @param workbook 工作簿
 * @param source 源样式
 * @return 新样式
 */
public static CellStyle cloneStyle(
        Workbook workbook,
        CellStyle source) {

    CellStyle style =
            workbook.createCellStyle();

    style.cloneStyleFrom(
            source
    );

    return style;
}
相关推荐
plainGeekDev19 小时前
工厂模式 → Hilt
android·java·kotlin
plainGeekDev19 小时前
Application 单例 → Hilt Singleton
android·java·kotlin
888CC++20 小时前
C语言与C++的区别:从面向过程到面向对象
java·c语言·c++
IT_陈寒20 小时前
SpringBoot自动配置的坑,这次真踩疼我了
前端·人工智能·后端
shengjk120 小时前
AI Engineering 五代演进史:Prompt、RAG、Agent 到 Graph 的架构革命
后端
子兮曰20 小时前
AI 浏览器 Agent 的安全困局:当自动化工具可以偷走你的登录态
前端·人工智能·后端
学者猫头鹰20 小时前
分布式事务实战教程
java·分布式
妙码生花20 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(四十八):菜单规则管理实现
前端·后端·ai编程
XuCoder21 小时前
Redis 持久化:RDB 与 AOF
后端
Conan在掘金21 小时前
鸿蒙 7.0 智能体框架 2.0:意图即服务根因——从 InsightIntentExecutor 到 HMAF 2.0 Skill 演进
后端