POI全家桶

19 篇文章 0 订阅
10 篇文章 0 订阅

1. 导入依赖包


        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-text</artifactId>
            <version>1.6</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-lang/commons-lang -->
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>${commons-lang.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.4.10</version>
        </dependency>

2.生成cell 样式

package cn.cncommdata.template.utils;

import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

    /**
     * 生成 HSSFCellStyle 样式
     *
     * @param workbook    当前文档
     * @param required    是否必须,必须是color为红色,否者为绿色
     * @param fieldBaseVO 单元格
     * @return HSSFCellStyle样式
     */
    private HSSFCellStyle getCellStyle(HSSFWorkbook workbook, Boolean required, FieldBaseVO fieldBaseVO) {

        // Sheet样式
        HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
        // 背景色的设定
        columnHeadStyle.setWrapText(true); // 自动换行
        //设置字体颜色
        HSSFFont font = workbook.createFont();
        //如果字段为required(必填)则字体设置为红色,如果不是则设置为黑色
        font.setColor(needEmphasizeCell(required, fieldBaseVO)
                ? HSSFColor.HSSFColorPredefined.RED.getIndex() : HSSFColor.HSSFColorPredefined.BLACK.getIndex());
        //将字体设置应用到当前样式
        columnHeadStyle.setFont(font);
        // 作色 setFillForegroundColor设置前景色 不需要
        //columnHeadStyle.setFillForegroundColor(required != null && required ? HSSFColor.RED.index : HSSFColor.LIME.index);
        //solid 填充  foreground  前景色  setFillPattern设置填充图案 不需要
        //columnHeadStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 设置边框 暂时不需要
//        columnHeadStyle.setBorderBottom(BorderStyle.THIN);
//        columnHeadStyle.setBorderLeft(BorderStyle.THIN);
//        columnHeadStyle.setBorderRight(BorderStyle.THIN);
//        columnHeadStyle.setBorderTop(BorderStyle.THIN);

        //水平居中,垂直居中
        columnHeadStyle.setAlignment(HorizontalAlignment.CENTER); // 居中
        columnHeadStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        return columnHeadStyle;
    }

    /**
     * 判断填色逻辑,除了对Required进行判断外,另外开放了对几种类型的默认选项
     *
     * @param required    field字段定义
     * @param fieldBaseVO 字段本身,需要获取其类型
     * @return boolean, true代表需要填充颜色,false为不需要
     * @author LiuLuhao
     */
    private boolean needEmphasizeCell(Boolean required, FieldBaseVO fieldBaseVO) {

        String type = fieldBaseVO.getType();
        boolean typeCheck = !"increment".equals(type)
                && !"current".equals(type)
                && !"date".equals(type);
        return required != null && required && typeCheck;
    }

3.创建单元格、合并单元格、设置单元格其他样式

    /**
     * 创建并合并list类型的一级header
     *
     * @param workbook    当前表
     * @param sheet       当前sheet
     * @param row0        首行
     * @param fieldBaseVO 对象
     * @param column      列下标
     */
    private void createAndMergeListCell(HSSFWorkbook workbook, HSSFSheet sheet, HSSFRow row0, FieldBaseVO fieldBaseVO, int column) {

        createRowCell(workbook, row0, fieldBaseVO, column);
        List<FieldBaseVO> seList = ((TableVO) fieldBaseVO).getFields();

        //合并单元格
        CellRangeAddress range;
        range = new CellRangeAddress(0, 0, column, column + seList.size() - 1);
        sheet.addMergedRegion(range);
    }

    /**
     * 创建rowCell
     *
     * @param workbook    当前workbook
     * @param row0        第一行
     * @param fieldBaseVO 单元格对象
     * @param column      单元格列下标
     */
    private void createRowCell(HSSFWorkbook workbook, HSSFRow row0, FieldBaseVO fieldBaseVO, int column) {
        HSSFCell cell0 = row0.createCell(column);
        cell0.setCellValue(fieldBaseVO.getName());
        cell0.setCellStyle(getCellStyle(workbook, fieldBaseVO.getRequired(), fieldBaseVO));
    }

    /**
     * 合并一级表头
     *
     * @param workbook    当前workbook
     * @param sheet       当前sheet
     * @param row0        第一行
     * @param row1        第二行
     * @param fieldBaseVO 单元格对象
     * @param column      单元格列下标
     */
    private void createAndMergeTwoRowCell(HSSFWorkbook workbook, HSSFSheet sheet, HSSFRow row0, HSSFRow row1, FieldBaseVO fieldBaseVO, int column) {
        //0,i
        HSSFCell cell0 = row0.createCell(column);
        cell0.setCellValue(fieldBaseVO.getName());
        cell0.setCellStyle(getCellStyle(workbook, fieldBaseVO.getRequired(), fieldBaseVO));

        //设置第二行样式   设置表头样式 getCellStyle()方法
        HSSFCell cellNull = row1.createCell(column);
        cellNull.setCellStyle(getCellStyle(workbook, fieldBaseVO.getRequired(), fieldBaseVO));

        //合并单元格
        CellRangeAddress range = new CellRangeAddress(0, 1, column, column);
        sheet.addMergedRegion(range);
    }

    /**
     * 设置表格的列宽
     *
     * @param fieldBaseVOS 源表头
     * @param sheet        当前表
     */
    private void setColWidth(List<FieldBaseVO> fieldBaseVOS, HSSFSheet sheet) {
        sheet.autoSizeColumn(1);
        sheet.autoSizeColumn(1, true);
        int colNum = getColumnNumber(fieldBaseVOS, 0);
        for (int i = 0; i < colNum; i++) {
            sheet.setColumnWidth(i, CELL_WIDTH);
        }

    }

4.yaml

不需要配置yml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值