最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

實現(xiàn)Excel模板內(nèi)容對應的實體類

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;

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

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

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

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

    /**
     * 默認每隔500條存儲數(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ù)
        	// 獲取目標屬性上@ExcelProperty的值,即屬性的中文名稱
            String[] nameValue = AnnotationUtil.getAnnotationValue(RuleExcel.class.getDeclaredField("name"), ExcelProperty.class);
            titleList.add(nameValue[0]);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        // 檢測獲取到的Excel標題頭是否合法
        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("模版標題不允許修改");
            }
        }
    }


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

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

調(diào)用方法示例

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

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

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

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

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

相關文章

  • JAVA實現(xiàn)往字符串中某位置加入一個字符串

    JAVA實現(xiàn)往字符串中某位置加入一個字符串

    這篇文章主要介紹了JAVA實現(xiàn)往字符串中某位置加入一個字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java解決刪除字符使頻率相同問題

    Java解決刪除字符使頻率相同問題

    給你一個下標從0開始的字符串 word ,字符串只包含小寫英文字母,你需要選擇一個下標并刪除下標處的字符,使得word中剩余每個字母出現(xiàn)頻率相同,本文給大家介紹了Java解決刪除字符使頻率相同問題,需要的朋友可以參考下
    2024-02-02
  • Java簡單實現(xiàn)銀行ATM系統(tǒng)

    Java簡單實現(xiàn)銀行ATM系統(tǒng)

    這篇文章主要為大家詳細介紹了Java簡單實現(xiàn)銀行ATM系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java1.7全網(wǎng)最深入HashMap源碼解析

    Java1.7全網(wǎng)最深入HashMap源碼解析

    HashMap 是一個散列表,它存儲的內(nèi)容是鍵值對(key-value)映射。HashMap 實現(xiàn)了 Map 接口,根據(jù)鍵的 HashCode 值存儲數(shù)據(jù),具有很快的訪問速度,最多允許一條記錄的鍵為 nul
    2021-11-11
  • Java語言Iterator轉(zhuǎn)換成 List的方法

    Java語言Iterator轉(zhuǎn)換成 List的方法

    在 Java 中,迭代器(Iterator)是一種用于遍歷集合中元素的對象,它提供了一種簡單而一致的方式來訪問集合中的元素,而不需要暴露集合內(nèi)部的結(jié)構(gòu),這篇文章主要介紹了Java語言Iterator轉(zhuǎn)換成 List的方法,需要的朋友可以參考下
    2023-08-08
  • java Array和Arrays的區(qū)別總結(jié)

    java Array和Arrays的區(qū)別總結(jié)

    在本篇內(nèi)容里小編給大家整理的是一篇關于java Array和Arrays的區(qū)別總結(jié)內(nèi)容,有需要的朋友們可以學習下。
    2021-03-03
  • 微信小程序后端Java接口開發(fā)的詳細步驟

    微信小程序后端Java接口開發(fā)的詳細步驟

    現(xiàn)在微信小程序越來越火了,相信不少人都通過各種途徑學習過微信小程序或者嘗試開發(fā),本文就介紹了微信小程序后端Java接口開發(fā)的詳細步驟,感興趣的同學可以學習一下
    2021-11-11
  • Spring MVC 接口 ResponseBodyAdvice 及其應用最佳實踐記錄

    Spring MVC 接口 ResponseBodyAdvice 及其應用最佳實

    ResponseBodyAdvice?是 Spring MVC 提供的一個強大接口,允許你在響應體被寫入 HTTP 響應之前對其進行全局處理,下面我將全面介紹它的工作原理、使用場景和最佳實踐,感興趣的朋友一起看看吧
    2025-04-04
  • 如何將Set直接轉(zhuǎn)成數(shù)組

    如何將Set直接轉(zhuǎn)成數(shù)組

    這篇文章主要介紹了如何將Set直接轉(zhuǎn)成數(shù)組,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java中Builder模式的實現(xiàn)詳解

    Java中Builder模式的實現(xiàn)詳解

    在設計模式中對Builder模式的定義是用于構(gòu)建復雜對象的一種模式,所構(gòu)建的對象往往需要多步初始化或賦值才能完成。下面這篇文章主要給大家介紹了在Java各個版本中Builder模式實現(xiàn)的相關資料,文中介紹的非常詳細,需要的朋友可以參考學習。
    2017-05-05

最新評論

陕西省| 监利县| 阳新县| 全州县| 荔波县| 牟定县| 大关县| 突泉县| 文安县| 吴桥县| 长白| 定州市| 临颍县| 乌拉特前旗| 明星| 潞城市| 岑巩县| 绿春县| 平塘县| 宝山区| 太保市| 舟曲县| 潍坊市| 都匀市| 南汇区| 福泉市| 崇明县| 竹溪县| 鹤庆县| 枣强县| 赣榆县| 德州市| 邢台市| 金乡县| 门源| 察雅县| 扬州市| 沙坪坝区| 时尚| 张家港市| 洪雅县|