All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.swak.excel.DataValidationCellWriteHandler Maven / Gradle / Ivy

package com.swak.excel;

import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import com.swak.excel.metadata.ExcelWriteData;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.apache.poi.xssf.usermodel.XSSFDataValidation;

/**
 * DataValidationCellWriteHandler.java
 *
 * @author colley.ma
 * @since  2022/9/20 13:27
 */
public class DataValidationCellWriteHandler implements CellWriteHandler {

    public static final int MAX_ROW = 200;
    private ExcelWriteData excelWriteData;
    /**
     * 样式类
     */
    private CellStyle cellStyle = null;
    private WriteWorkbookHolder writeWorkbookHolder;

    public DataValidationCellWriteHandler(ExcelWriteData excelWriteData) {
        this.excelWriteData = excelWriteData;
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
                                 Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        if (this.cellStyle == null) {
            this.cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle();
        }
        this.writeWorkbookHolder = writeSheetHolder.getParentWriteWorkbookHolder();
    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
                                Head head, Integer relativeRowIndex, Boolean isHead) {
        Sheet sheet = writeSheetHolder.getSheet();
        DataValidationHelper helper = sheet.getDataValidationHelper();
        Workbook workbook = writeWorkbookHolder.getWorkbook();
        String[] dropDownDatas = excelWriteData.getValidSelect(head.getFieldName());
        if (ArrayUtils.isEmpty(dropDownDatas)) {
            return;
        }
        int col = cell.getColumnIndex();
        DataValidation dataValidation = null;
        String sheetname = sheet.getSheetName();
        String dropSheetName = sheetname + "_dropDownsheet" + col;
        if (dropDownDatas.length > 200) {// 采用引用的方式建立下拉
            Sheet dropListSheet = workbook.getSheet(dropSheetName);
            if (dropListSheet == null) {
                dropListSheet = workbook.createSheet(dropSheetName);
                int i = 0;
                for (String item : dropDownDatas) {
                    Row droprow = dropListSheet.createRow(i);
                    Cell dropcell = droprow.createCell(0);
                    dropcell.setCellValue(item);
                    i++;
                }
            }
            String dropDataListname = sheetname + "_dropDownlist" + cell.getColumnIndex();
            Name nameCell = workbook.getName(dropDataListname);
            if (nameCell == null) {
                nameCell = workbook.createName();
                nameCell.setNameName(dropDataListname);
                String strFormula = dropSheetName + "!$A$1:$A$" + dropDownDatas.length;
                nameCell.setRefersToFormula(strFormula);
                DataValidationConstraint constraint = helper.createFormulaListConstraint(strFormula);
                CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, MAX_ROW, col, col);
                dataValidation = helper.createValidation(constraint, cellRangeAddressList);
            }
        } else {
            // 区间设置
            CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, MAX_ROW, col, col);
            // 下拉内容
            DataValidationConstraint constraint = helper.createExplicitListConstraint(dropDownDatas);
            dataValidation = helper.createValidation(constraint, cellRangeAddressList);
        }
        // Note the check on the actual type of the DataValidation object.
        // If it is an instance of the XSSFDataValidation class then the
        // boolean value 'false' must be passed to the setSuppressDropDownArrow()
        // method and an explicit call made to the setShowErrorBox() method.
        if (dataValidation != null) {
            if (dataValidation instanceof XSSFDataValidation) {
                dataValidation.setSuppressDropDownArrow(true);
                dataValidation.setShowErrorBox(true);
            } else {
                dataValidation.setSuppressDropDownArrow(false);
            }
            int hideIndex = workbook.getSheetIndex(dropSheetName);
            if (hideIndex > -1) {
                workbook.setSheetHidden(hideIndex, true);
            }
            sheet.addValidationData(dataValidation);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy