欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用EasyExcel實(shí)現(xiàn)簡(jiǎn)單的Excel表格解析操作

 更新時(shí)間:2025年03月17日 10:11:56   作者:"貳拾叁"  
這篇文章主要介紹了如何使用EasyExcel完成簡(jiǎn)單的表格解析操作,同時(shí)實(shí)現(xiàn)了大量數(shù)據(jù)情況下數(shù)據(jù)的分次批量入庫,并記錄每條數(shù)據(jù)入庫的狀態(tài),感興趣的可以了解下

前言

本文記錄了如何使用EasyExcel完成簡(jiǎn)單的表格解析操作,同時(shí)實(shí)現(xiàn)了大量數(shù)據(jù)情況下數(shù)據(jù)的分次批量入庫,并記錄每條數(shù)據(jù)入庫的狀態(tài),以便進(jìn)行結(jié)果統(tǒng)計(jì)。

固定模板及表數(shù)據(jù)格式的解析

實(shí)現(xiàn)Excel模板內(nèi)容對(duì)應(yīng)的實(shí)體類

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 lombok.Data;
import java.io.Serializable;

@Data
@ColumnWidth(24)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class RuleExcel implements Serializable {

    private static final long serialVersionUID = 1L;

    // 被該注解修飾的實(shí)體類中的屬性值,會(huì)作為excel對(duì)應(yīng)的標(biāo)題頭文字
    @ExcelProperty(value = "規(guī)則名稱")
    private String name;
    
    // 被該注解修飾的實(shí)體類中的屬性,會(huì)在excel與實(shí)體類的轉(zhuǎn)換中被忽略
    // 該變量用于標(biāo)記該條實(shí)體類是否成功入庫,在入庫后操作后更新值為true
    @ExcelIgnore
    private boolean isSuccess;
}

實(shí)現(xiàn)AnalysisEventListener監(jiān)聽類

為需要讀取的Excel新建一個(gè)監(jiān)聽類,用于專門處理該類型數(shù)據(jù)的Excel,數(shù)據(jù)庫的解析邏輯主要都放在這里邊。

@Data
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class RuleExcelImportListener extends AnalysisEventListener<RuleExcel> {

    /**
     * 默認(rèn)每隔500條存儲(chǔ)數(shù)據(jù)庫
     */
    private int batchCount = 500;
    /**
     * 緩存的數(shù)據(jù)列表
     */
    private List<RuleExcel> list = new ArrayList<>();
    /**
     * service
     */
    private final IRuleExcelService RuleExcelService;
	
	// 解析表頭
    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        List<String> titleList = new ArrayList<>();
        try {
	        // 獲取必要表頭列數(shù)據(jù)
        	// 獲取目標(biāo)屬性上@ExcelProperty的值,即屬性的中文名稱
            String[] nameValue = AnnotationUtil.getAnnotationValue(RuleExcel.class.getDeclaredField("name"), ExcelProperty.class);
            titleList.add(nameValue[0]);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        // 檢測(cè)獲取到的Excel標(biāo)題頭是否合法
        for (String title : titleList) {
            boolean isExist = false;
            for (Integer i : headMap.keySet()) {
                if (title.equals(headMap.get(i))) {
                    isExist = true;
                }
            }
            if (!isExist) {
                throw new ExcelAnalysisException("模版標(biāo)題不允許修改");
            }
        }
    }


	// 解析表格內(nèi)容,一行就是一個(gè)RuleExcel實(shí)體類
    @Override
    public void invoke(RuleExcel RuleExcel, AnalysisContext analysisContext) {
	    // 數(shù)據(jù)合法性校驗(yàn)
        if (String.isEmpty(RuleExcel.getName()) {
            throw new ExcelAnalysisException("導(dǎo)入失敗,必填項(xiàng)按要求填寫");
        }
       
        list.add(RuleExcel);
        // 數(shù)據(jù)入庫2:
        // 如果表格數(shù)據(jù)量很大,可以設(shè)定暫存數(shù)據(jù)量閾值,當(dāng)現(xiàn)存list數(shù)量超過閾值后,會(huì)先向數(shù)據(jù)庫中存入一批數(shù)據(jù)、清空內(nèi)存后再繼續(xù)解析
        // 達(dá)到BATCH_COUNT,則調(diào)用importer方法入庫,防止數(shù)據(jù)幾萬條數(shù)據(jù)在內(nèi)存,容易OOM
        if (list.size() >= batchCount) {
            // 調(diào)用importer方法
            RuleExcelService.importRuleExcel(list);
            // 存儲(chǔ)完成清理list
            list.clear();
        }
    }

	// 將所有的表格行數(shù)據(jù)解析完畢后會(huì)執(zhí)行該方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    	// 數(shù)據(jù)入庫1:
    	// 一般來說,如果確定表格數(shù)據(jù)量不大,那么可以在解析完全部excel數(shù)據(jù)后進(jìn)行數(shù)據(jù)入庫操作
        RuleExcelService.importRuleExcel(list);
        // 存儲(chǔ)完成清理list
        list.clear();
    }
}

調(diào)用方法示例

public void importRuleExcel(MultipartFile file) {
		// 文件后綴檢查
		CommonUtil.checkImportFile(file.getOriginalFilename());
		InputStream inputStream;
		// 存儲(chǔ)表格解析結(jié)果
		List<RuleExcel> ruleExcels = new ArrayList<>();
		try {
			// 將Service層變量作為依賴傳入
			RuleImportListener importListener = new RuleImportListener(ruleService);
			inputStream = new BufferedInputStream(file.getInputStream());
			// EasyExcel.read()傳入:InputStream, 表格數(shù)據(jù)實(shí)體類,表格數(shù)據(jù)實(shí)體類監(jiān)聽器
			ExcelReaderBuilder builder = EasyExcel.read(inputStream, RuleExcel.class, importListener);
			// 執(zhí)行同步解析操作并返回解析結(jié)果
			ruleExcels = builder.doReadAllSync();
		} catch (Exception e) {
			throw new ServiceException(e.getMessage());
		}
		// 導(dǎo)入成功的列表
		List<RuleExcel> successList = ruleExcels .stream().filter(RuleExcel::isSuccess).collect(Collectors.toList());
	}

非固定模板及非固定表數(shù)據(jù)格式的解析

有時(shí)候需要讀取的模板并不是固定的、實(shí)現(xiàn)聲明好的列,對(duì)應(yīng)的數(shù)據(jù)也不能解析成某個(gè)固定的實(shí)體類,這個(gè)時(shí)候就需要我們讀取表的原始解析數(shù)據(jù),并自行進(jìn)行后續(xù)操作。

// EasyExcel.read()傳入:InputStream, 表格數(shù)據(jù)實(shí)體類,表格數(shù)據(jù)實(shí)體類監(jiān)聽器
// headRowNumber()傳入:表頭行的所在行數(shù)
List<Map<Integer, String>> resultList = EasyExcelUtil.getEasyExcelReaderBuilder(file.getInputStream, null, null)
											.headRowNumber(0).doReadAllSync();
// resultList 中存儲(chǔ)的就是自0行開始解析到的所有數(shù)據(jù)

到此這篇關(guān)于使用EasyExcel實(shí)現(xiàn)簡(jiǎn)單的Excel表格解析操作的文章就介紹到這了,更多相關(guān)EasyExcel解析Excel表格內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼

    Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼

    這篇文章主要介紹了Automapper實(shí)現(xiàn)自動(dòng)映射的實(shí)例代碼,需要的朋友可以參考下
    2017-09-09
  • java 打造阻塞式線程池的實(shí)例詳解

    java 打造阻塞式線程池的實(shí)例詳解

    這篇文章主要介紹了java 打造阻塞式線程池的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家,理解這部分知識(shí),需要的朋友可以參考下
    2017-07-07
  • Springboot中MyBatisplus使用IPage和Page分頁的實(shí)例代碼

    Springboot中MyBatisplus使用IPage和Page分頁的實(shí)例代碼

    這篇文章主要介紹了Springboot中MyBatisplus使用IPage和Page分頁,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)

    SpringBoot 枚舉類型的自動(dòng)轉(zhuǎn)換的實(shí)現(xiàn)

    一般我們?cè)跀?shù)據(jù)庫都會(huì)定義數(shù)值型的枚舉常量,不管是序列化還是反序列化都是需要我們手動(dòng)去轉(zhuǎn)換成枚舉類型的,本文主要介紹了Spring Boot 枚舉類型的自動(dòng)轉(zhuǎn)換,感興趣的可以了解一下
    2022-03-03
  • IDEA 2022 CPU占用100%的問題及解決方法

    IDEA 2022 CPU占用100%的問題及解決方法

    這篇文章主要介紹了IDEA 2022 CPU占用100%問題及解決方法,其實(shí)解決方法很簡(jiǎn)單,只需要禁用三個(gè)插件然后重啟idea即可成功解決,需要的朋友可以參考下本文
    2022-08-08
  • SpringBoot Druid配置過程圖解

    SpringBoot Druid配置過程圖解

    這篇文章主要介紹了SpringBoot Druid配置過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot日志配置簡(jiǎn)單介紹

    SpringBoot日志配置簡(jiǎn)單介紹

    這篇文章主要介紹了SpringBoot日志配置,需要的朋友可以參考下
    2017-09-09
  • SpringBoot+@EnableScheduling使用定時(shí)器的常見案例

    SpringBoot+@EnableScheduling使用定時(shí)器的常見案例

    項(xiàng)目開發(fā)中經(jīng)常需要執(zhí)行一些定時(shí)任務(wù),本文主要介紹了SpringBoot+@EnableScheduling使用定時(shí)器的常見案例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • mybatis配置獲取自增主鍵的操作方法

    mybatis配置獲取自增主鍵的操作方法

    當(dāng)需要?jiǎng)倓偛迦霐?shù)據(jù)庫的數(shù)據(jù)對(duì)應(yīng)的新增主鍵時(shí),通過配置xml文件,使數(shù)據(jù)庫返回新增主鍵id,并把主鍵id與類參數(shù)對(duì)應(yīng),本文給大家介紹了mybatis配置獲取自增主鍵的操作方法,需要的朋友可以參考下
    2024-05-05
  • 解析Spring RestTemplate必須搭配MultiValueMap的理由

    解析Spring RestTemplate必須搭配MultiValueMap的理由

    本文給大家介紹Spring RestTemplate必須搭配MultiValueMap的理由,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-11-11

最新評(píng)論