国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java 導(dǎo)出Excel表格生成下拉框-EasyExcel

這篇具有很好參考價(jià)值的文章主要介紹了Java 導(dǎo)出Excel表格生成下拉框-EasyExcel。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

1.導(dǎo)入EasyExcel,maven依賴

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

2.添加EasyExcelUtil工具類

package org.springblade.modules.system.EuipmentExcelImplement;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.write.metadata.WriteSheet;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

@Slf4j
public class EasyExcelUtil {

	/**
	 * 創(chuàng)建即將導(dǎo)出的sheet頁(sheet頁中含有帶下拉框的列)
	 * @param head 導(dǎo)出的表頭信息和配置
	 * @param sheetNo sheet索引
	 * @param sheetName sheet名稱
	 * @param <T> 泛型
	 * @return sheet頁
	 */
	public static <T> WriteSheet writeSelectedSheet(Class<T> head, Integer sheetNo, String sheetName) {
		Map<Integer, ExcelSelectedResolve> selectedMap = resolveSelectedAnnotation(head);

		return EasyExcel.writerSheet(sheetNo, sheetName)
			.head(head)
			.registerWriteHandler(new SelectedSheetWriteHandler(selectedMap))
			.build();
	}

	/**
	 * 解析表頭類中的下拉注解
	 * @param head 表頭類
	 * @param <T> 泛型
	 * @return Map<下拉框列索引, 下拉框內(nèi)容> map
	 */
	private static <T> Map<Integer, ExcelSelectedResolve> resolveSelectedAnnotation(Class<T> head) {
		Map<Integer, ExcelSelectedResolve> selectedMap = new HashMap<>();

		// getDeclaredFields(): 返回全部聲明的屬性;getFields(): 返回public類型的屬性
		Field[] fields = head.getDeclaredFields();
		for (int i = 0; i < fields.length; i++){
			Field field = fields[i];
			// 解析注解信息
			ExcelSelected selected = field.getAnnotation(ExcelSelected.class);
			ExcelProperty property = field.getAnnotation(ExcelProperty.class);
			if (selected != null) {
				ExcelSelectedResolve excelSelectedResolve = new ExcelSelectedResolve();
				String[] source = excelSelectedResolve.resolveSelectedSource(selected);
				if (source != null && source.length > 0){
					excelSelectedResolve.setSource(source);
					excelSelectedResolve.setFirstRow(selected.firstRow());
					excelSelectedResolve.setLastRow(selected.lastRow());
					if (property != null && property.index() >= 0){
						selectedMap.put(property.index(), excelSelectedResolve);
					} else {
						selectedMap.put(i, excelSelectedResolve);
					}
				}
			}
		}

		return selectedMap;
	}
}
package org.springblade.modules.system.EuipmentExcelImplement;

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.AllArgsConstructor;
import lombok.Data;
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.Map;

@Data
@AllArgsConstructor
public class SelectedSheetWriteHandler implements SheetWriteHandler {

	private final Map<Integer, ExcelSelectedResolve> selectedMap;

	/**
	 * Called before create the sheet
	 */
	@Override
	public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {

	}

	/**
	 * Called after the sheet is created
	 */
	@Override
	public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
		// 這里可以對(duì)cell進(jìn)行任何操作
		Sheet sheet = writeSheetHolder.getSheet();
		DataValidationHelper helper = sheet.getDataValidationHelper();
		selectedMap.forEach((k, v) -> {
			// 設(shè)置下拉列表的行: 首行,末行,首列,末列
			CellRangeAddressList rangeList = new CellRangeAddressList(v.getFirstRow(), v.getLastRow(), k, k);
			// 設(shè)置下拉列表的值
			DataValidationConstraint constraint = helper.createExplicitListConstraint(v.getSource());
			// 設(shè)置約束
			DataValidation validation = helper.createValidation(constraint, rangeList);
			// 阻止輸入非下拉選項(xiàng)的值
			validation.setErrorStyle(DataValidation.ErrorStyle.STOP);
			validation.setShowErrorBox(true);
			validation.setSuppressDropDownArrow(true);
			validation.createErrorBox("提示", "請(qǐng)輸入下拉選項(xiàng)中的內(nèi)容");
			sheet.addValidationData(validation);
		});
	}
}

3 .創(chuàng)建實(shí)體類

package org.springblade.modules.question.entity;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springblade.modules.question.excelImplement.*;
import org.springblade.modules.system.EuipmentExcelImplement.DeptSelectedImpl;
import org.springblade.modules.system.EuipmentExcelImplement.ExcelSelected;

import java.io.Serializable;


@Data
@ColumnWidth(16)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class QuestionExcel implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * 課程名稱
	 */
	@ExcelIgnore //忽略生成表頭
	//@ExcelSelected(sourceClass = CourseSelected.class)
	private String courseName;

	/**
	 * 章節(jié)名稱
	 */
	@ExcelProperty(index = 0,value ="課程章節(jié)名稱")//表頭名稱
	@ExcelSelected(sourceClass = ChapterSelected.class)
	private String chapterName;

	/**
	 * 實(shí)驗(yàn)名稱
	 */
	@ExcelProperty(index = 1,value ="實(shí)驗(yàn)名稱")
	@ColumnWidth(25)
	@ExcelSelected(sourceClass = ExperimentSelected.class)
	private String experimentName;

	/**
	 * 題型(1:單選2:多選3:判斷4:問答)
	 */
	@ExcelProperty(index = 2,value ="題型(1:單選2:多選3:判斷4:問答)")
	@ExcelSelected(sourceClass = TypeSelected.class)
	private String questionType;
}

4.導(dǎo)入自定義注解ExcelSelected

package org.springblade.modules.system.EuipmentExcelImplement;

import java.lang.annotation.*;

/**
 * 標(biāo)注導(dǎo)出的列為下拉框類型,并為下拉框設(shè)置內(nèi)容
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelSelected {
	/**
	 * 固定下拉內(nèi)容
	 */
	String[] source() default {};

	/**
	 * 動(dòng)態(tài)下拉內(nèi)容
	 */
	Class<? extends ExcelDynamicSelect>[] sourceClass() default {};

	/**
	 * 設(shè)置下拉框的起始行,默認(rèn)為第二行
	 */
	int firstRow() default 1;

	/**
	 * 設(shè)置下拉框的結(jié)束行,默認(rèn)為最后一行
	 */
	int lastRow() default 0x10000;
}

5.導(dǎo)入Excel選擇解析-ExcelSelectedResolve?

package org.springblade.modules.system.EuipmentExcelImplement;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

@Data
@Slf4j
public class ExcelSelectedResolve {
	/**
	 * 下拉內(nèi)容
	 */
	private String[] source;

	/**
	 * 設(shè)置下拉框的起始行,默認(rèn)為第二行
	 */
	private int firstRow;

	/**
	 * 設(shè)置下拉框的結(jié)束行,默認(rèn)為最后一行
	 */
	private int lastRow;

	public String[] resolveSelectedSource(ExcelSelected excelSelected) {
		if (excelSelected == null) {
			return null;
		}

		// 獲取固定下拉框的內(nèi)容
		String[] source = excelSelected.source();
		if (source.length > 0) {
			return source;
		}

		// 獲取動(dòng)態(tài)下拉框的內(nèi)容
		Class<? extends ExcelDynamicSelect>[] classes = excelSelected.sourceClass();
		if (classes.length > 0) {
			try {
				ExcelDynamicSelect excelDynamicSelect = classes[0].newInstance();
				String[] dynamicSelectSource = excelDynamicSelect.getSource();
				if (dynamicSelectSource != null && dynamicSelectSource.length > 0) {
					return dynamicSelectSource;
				}
			} catch (InstantiationException | IllegalAccessException e) {
				log.error("解析動(dòng)態(tài)下拉框數(shù)據(jù)異常", e);
			}
		}
		return null;
	}
}

6.添加動(dòng)態(tài)選擇接口-ExcelDynamicSelect

package org.springblade.modules.system.EuipmentExcelImplement;

public interface ExcelDynamicSelect {
	/**
	 * 獲取動(dòng)態(tài)生成的下拉框可選數(shù)據(jù)
	 * @return 動(dòng)態(tài)生成的下拉框可選數(shù)據(jù)
	 */
	String[] getSource();
}

7.編寫自己需要展示下拉框?qū)崿F(xiàn)-ExcelDynamicSelect接口

package org.springblade.modules.question.excelImplement;

import org.apache.commons.collections.CollectionUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.modules.question.mapper.QuestionMapper;
import org.springblade.modules.system.EuipmentExcelImplement.ExcelDynamicSelect;
import org.springblade.modules.system.EuipmentExcelImplement.SpringContextUtil;

import java.util.List;

public class ChapterSelected implements ExcelDynamicSelect {

	@Override
	public String[] getSource() {

		QuestionMapper questionMapper = SpringContextUtil.getBean(QuestionMapper.class);
		return questionMapper.selectAllChapter().toArray(new String[]{});
	}
}

8.添加SpringContextUtil工具類

package org.springblade.modules.system.EuipmentExcelImplement;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class SpringContextUtil implements ApplicationContextAware {

	private static ApplicationContext applicationContext;

	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		SpringContextUtil.applicationContext = applicationContext;
	}

	// 獲取ApplicationContext
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}

	// 通過class獲取Bean
	public static <T> T getBean(Class<T> clazz) {
		return applicationContext.getBean(clazz);
	}

	// 通過name以及class獲取Bean
	public static <T> T getBean(String name, Class<T> clazz) {
		return applicationContext.getBean(name, clazz);
	}
}

9.編寫查詢下拉框顯示內(nèi)容mapping

public interface QuestionMapper extends BaseMapper<Question> {
public List<String> selectAllChapter();
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.modules.question.mapper.QuestionMapper">


  <select id="selectAllChapter" resultType="java.lang.String">
        SELECT
            CONCAT(sc.NAME,'/',sc1.NAME) AS chapterName
        FROM
            sxdx_course sc
                INNER JOIN sxdx_chapter sc1 ON sc.id = sc1.course_id
        WHERE
            sc.is_deleted = 0
          AND sc1.is_deleted = 0
    </select>

</mapper>

10.也可以不查詢數(shù)據(jù)庫,直接再接口返回需要的數(shù)據(jù)。

package org.springblade.modules.question.excelImplement;

import org.springblade.modules.question.mapper.QuestionMapper;
import org.springblade.modules.system.EuipmentExcelImplement.ExcelDynamicSelect;
import org.springblade.modules.system.EuipmentExcelImplement.SpringContextUtil;

import java.util.ArrayList;

public class TypeSelected implements ExcelDynamicSelect {

	@Override
	public String[] getSource() {
//直接返回需要的數(shù)據(jù)
		return new ArrayList<String>(){{add("單選");add("多選");add("判斷");add("問答");}}.toArray(new String[]{});
	}
}

11.最終效果

Java 導(dǎo)出Excel表格生成下拉框-EasyExcel

?Java 導(dǎo)出Excel表格生成下拉框-EasyExcel文章來源地址http://www.zghlxwxcb.cn/news/detail-508027.html

到了這里,關(guān)于Java 導(dǎo)出Excel表格生成下拉框-EasyExcel的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 使用EasyExcel實(shí)現(xiàn)Excel的導(dǎo)入導(dǎo)出

    在真實(shí)的開發(fā)者場(chǎng)景中,經(jīng)常會(huì)使用excel作為數(shù)據(jù)的載體,進(jìn)行數(shù)據(jù)導(dǎo)入和導(dǎo)出的操作,使用excel的導(dǎo)入和導(dǎo)出有很多種解決方案,本篇記錄一下EasyExcel的使用。 EasyExcel是一個(gè)開源的項(xiàng)目,是阿里開發(fā)的。EasyExcel可以簡化Excel表格的導(dǎo)入和導(dǎo)出操作,使用起來簡單快捷,易上手

    2023年04月15日
    瀏覽(33)
  • EasyExcel實(shí)現(xiàn)Excel文件導(dǎo)入導(dǎo)出功能

    EasyExcel實(shí)現(xiàn)Excel文件導(dǎo)入導(dǎo)出功能

    Java領(lǐng)域解析、生成Excel比較有名的框架有Apache poi、jxl等。但他們都存在一個(gè)嚴(yán)重的問題就是非常的耗內(nèi)存。如果你的系統(tǒng)并發(fā)量不大的話可能還行,但是一旦并發(fā)上來后一定會(huì)OOM或者JVM頻繁的full gc。 EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡單、節(jié)省內(nèi)存著稱。

    2024年02月02日
    瀏覽(23)
  • easyexcel根據(jù)模板導(dǎo)出Excel文件,表格自動(dòng)填充問題

    同事在做easyexcel導(dǎo)出Excel,根據(jù)模板導(dǎo)出的時(shí)候,發(fā)現(xiàn)導(dǎo)出的表格,總會(huì)覆蓋落款的內(nèi)容。 這就很尷尬了,表格居然不能自動(dòng)填充,直接怒噴工具,哈哈。 然后一起看了一下這個(gè)問題。 我找了自己的系統(tǒng)中關(guān)于表格導(dǎo)出的頁面,導(dǎo)出了一下,發(fā)現(xiàn)可以正常擴(kuò)充。 于是排查問

    2024年02月06日
    瀏覽(28)
  • spring boot導(dǎo)入導(dǎo)出excel,集成EasyExcel

    spring boot導(dǎo)入導(dǎo)出excel,集成EasyExcel

    一、安裝依賴 二、新建導(dǎo)出工具類 三、新建實(shí)體類 @ExcelProperty: 核心注解,value屬性可用來設(shè)置表頭名稱,converter屬性可以用來設(shè)置類型轉(zhuǎn)換器; @ColumnWidth: 用于設(shè)置表格列的寬度; @DateTimeFormat: 用于設(shè)置日期轉(zhuǎn)換格式; @NumberFormat: 用于設(shè)置數(shù)字轉(zhuǎn)換格式。 四、如果需

    2024年02月06日
    瀏覽(32)
  • springboot中使用EasyExcel實(shí)現(xiàn)Excel 導(dǎo)入導(dǎo)出

    springboot中使用EasyExcel實(shí)現(xiàn)Excel 導(dǎo)入導(dǎo)出

    EasyExcel 是一款基于 Java 的簡單易用的 Excel 文件操作工具。它提供了豐富的 API,可以方便地讀取、寫入和操作 Excel 文件,支持常見的 Excel 操作,如讀取/寫入單元格數(shù)據(jù)、合并單元格、設(shè)置樣式、處理大數(shù)據(jù)量等。EasyExcel能大大減少占用內(nèi)存的主要原因是在解析Excel時(shí)沒有將

    2024年02月12日
    瀏覽(39)
  • SpringBoot整合Easyexcel實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Excel表格的功能

    SpringBoot整合Easyexcel實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Excel表格的功能

    本文主要介紹基于SpringBoot +MyBatis-Plus+Easyexcel+Vue實(shí)現(xiàn)缺陷跟蹤系統(tǒng)中導(dǎo)出缺陷數(shù)據(jù)的功能,實(shí)現(xiàn)效果如下圖: EasyExcel是一個(gè)基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能。 本文

    2024年02月14日
    瀏覽(31)
  • SpringBoot整合EasyExcel,Excel導(dǎo)入導(dǎo)出就靠它了

    SpringBoot整合EasyExcel,Excel導(dǎo)入導(dǎo)出就靠它了

    作者主頁 :Designer 小鄭 作者簡介 :3年JAVA全棧開發(fā)經(jīng)驗(yàn),專注JAVA技術(shù)、系統(tǒng)定制、遠(yuǎn)程指導(dǎo),致力于企業(yè)數(shù)字化轉(zhuǎn)型,CSDN學(xué)院、藍(lán)橋云課認(rèn)證講師。 主打方向 :Vue、SpringBoot、微信小程序 本文講解了如何在SpringBoot項(xiàng)目中整合EasyExcel,實(shí)現(xiàn)Excel快捷導(dǎo)入導(dǎo)出,解析Excel導(dǎo)入導(dǎo)

    2024年02月16日
    瀏覽(23)
  • Spring Boot集成EasyExcel實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出操作

    Spring Boot集成EasyExcel實(shí)現(xiàn)excel導(dǎo)入導(dǎo)出操作

    Easy Excel 官網(wǎng) Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個(gè)嚴(yán)重的問題就是非常的耗內(nèi)存,poi有一套SAX模式的API可以一定程度的解決一些內(nèi)存溢出的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓后存儲(chǔ)都是在內(nèi)存中完成的,內(nèi)存消耗依然很

    2024年02月14日
    瀏覽(19)
  • 使用POI和EasyExcel來實(shí)現(xiàn)excel文件的導(dǎo)入導(dǎo)出

    使用POI和EasyExcel來實(shí)現(xiàn)excel文件的導(dǎo)入導(dǎo)出

    廢話不多說咱們直接上干貨?。。?! 一.讀取Excel表格 【1】使用POI讀取excel表格中的數(shù)據(jù) POI還可以操作我們這個(gè)word文檔等等,他不僅僅只能弄Excel,而JXI只能操作excel 1.POI的結(jié)構(gòu),我們可以更具文件的類去選擇 相關(guān)的對(duì)象我當(dāng)前是使用的XLSX來操作的 HSSF - 提供讀寫Microsoft

    2024年02月05日
    瀏覽(26)
  • SpringBoot 集成 EasyExcel 3.x 優(yōu)雅實(shí)現(xiàn) Excel 導(dǎo)入導(dǎo)出

    EasyExcel 是一個(gè)基于 Java 的、快速、簡潔、解決大文件內(nèi)存溢出的 Excel 處理工具。它能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成 Excel 的讀、寫等功能。 EasyExcel文檔地址: https://easyexcel.opensource.alibaba.com/ 引入依賴 簡單導(dǎo)出 以導(dǎo)出用戶信息為例,接下來手把手教

    2024年02月15日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包