Excel 導入

依賴

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

service 讀取excel文件的行數據

DataExcelListener<DeviceTemplateExcel> listener = new DataExcelListener<DeviceTemplateExcel>();
// headRowNumber(1):表示第一行為表頭,從第二行取值
ExcelReader excelReader = EasyExcelFactory.read( file.getInputStream() , DeviceTemplateExcel.class, listener).headRowNumber(1).build();
excelReader.readAll();
List<DeviceTemplateExcel> data = listener.getDatas();
excelReader.finish();
    @Override@Transactional(rollbackFor = Exception.class)public RP importDevice(MultipartFile file, Long productId) throws IOException {DataExcelListener<DeviceTemplateExcel> listener = new DataExcelListener<DeviceTemplateExcel>();// headRowNumber(1):表示第一行為表頭,從第二行取值ExcelReader excelReader = EasyExcelFactory.read( file.getInputStream() , DeviceTemplateExcel.class, listener).headRowNumber(1).build();excelReader.readAll();List<DeviceTemplateExcel> data = listener.getDatas();excelReader.finish();if (data.size() == 3) {return RP.failure("導入失敗,請檢查導入文件是否正確");}Product product = productService.getById(productId);if (product == null) {throw new ServiceException("產品不存在");}List<String> deviceSnList = data.stream().map(DeviceTemplateExcel::getDeviceSn).collect(Collectors.toList());List<Device> repeatList = baseMapper.selectList(Wrappers.<Device>update().lambda().in(Device::getDeviceSn, deviceSnList));List<Device> deviceList = new ArrayList<>();//導出失敗原因List<DeviceFailureExportExcel> exportExcels = new ArrayList<>();for (DeviceTemplateExcel entity : data) {if (StringUtils.isBlank(entity.getDeviceName()) || StringUtils.isBlank(entity.getDeviceSn())) {DeviceFailureExportExcel reason = new DeviceFailureExportExcel();reason.setDeviceName(entity.getDeviceName());reason.setDeviceSn(entity.getDeviceSn());reason.setFailureReason(StringUtils.isBlank(entity.getDeviceName()) ? "設備名稱不能為空!" : "設備序列號不能為空!");exportExcels.add(reason);continue;}//數據庫中的判重Optional<Device> deviceOpt = repeatList.stream().filter(item -> item.getDeviceSn().equals(entity.getDeviceSn())).findFirst();//還未新增的設備判重Optional<Device> deviceAddOpt = deviceList.stream().filter(item -> item.getDeviceSn().equals(entity.getDeviceSn())).findFirst();if (deviceOpt.isPresent() || deviceAddOpt.isPresent()) {DeviceFailureExportExcel reason = new DeviceFailureExportExcel();reason.setDeviceName(entity.getDeviceName());reason.setDeviceSn(entity.getDeviceSn());reason.setFailureReason("設備序列號已存在!");exportExcels.add(reason);continue;}Device device = new Device();device.setDeviceName(entity.getDeviceName());device.setDeviceSn(entity.getDeviceSn());device.setProductId(productId);device.setTenantId(AuthUtil.getTenantId()); deviceList.add(device);}if (deviceList.size() > 0) {this.saveBatch(deviceList);}if (exportExcels.size() > 0) {return RP.failure("請重新處理失敗的數據!");} else {return RP.failure("操作成功");}}

監聽類

package com.sinenux.iot.core.exect;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;import java.util.ArrayList;
import java.util.List;/*** 解析監聽器*/
public class DataExcelListener<T> extends AnalysisEventListener<T> {/*** 自定義用于暫時存儲data* 可以通過實例獲取該值*/private List<T> datas = new ArrayList<>();/*** 每解析一行都會回調invoke()方法** @param object  讀取后的數據對象* @param context 內容*/@Override@SuppressWarnings("unchecked")public void invoke(Object object, AnalysisContext context) {T data = (T) object;//數據存儲到list,供批量處理,或后續自己業務邏輯處理。datas.add(data);}@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {//解析結束銷毀不用的資源//注意不要調用datas.clear(),否則getDatas為null}/*** 返回數據** @return 返回讀取的數據集合**/public List<T> getDatas() {return datas;}/*** 設置讀取的數據集合** @param datas 設置讀取的數據集合**/public void setDatas(List<T> datas) {this.datas = datas;}}

實體類 DeviceTemplateExcel

??注意這里 lombok的@Data注解 和EasyExcel有沖突 不能使用 ?@Data 要用 get set 方法

package com.sinenux.iot.core.exect;import com.alibaba.excel.annotation.ExcelProperty;import java.io.Serializable;/*** 設備導入模板* 注意這里 lombok的@Data注解 和EasyExcel有沖突 不能使用  @Data 要用 get set 方法** @author xulk*/public class DeviceTemplateExcel implements Serializable {private static final long serialVersionUID = 1L;@ExcelProperty(value = "設備名稱", index = 0)private String deviceName;@ExcelProperty(value = "設備序列號(不可重復)", index = 1)private String deviceSn;public String getDeviceName() {return deviceName;}public void setDeviceName(String deviceName) {this.deviceName = deviceName;}public String getDeviceSn() {return deviceSn;}public void setDeviceSn(String deviceSn) {this.deviceSn = deviceSn;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/19405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19405.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19405.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MFC CList<CRect, CRect> m_listRect;的用法

CList<CRect, CRect&> 是 MFC&#xff08;Microsoft Foundation Classes&#xff09;中定義的一個雙向鏈表模板類&#xff0c;用于存儲 CRect 對象。在使用 CList 時&#xff0c;你可以執行多種操作&#xff0c;比如添加、移除、查找和遍歷元素。以下是一些常見的用法…

SAP 生產訂單報工函數BAPI_PRODORDCONF_CREATE_TT不返回報錯信息

最近財務一直反饋MES報工的數據都沒有成本,然后去查看原因發現是財務當月的KP26的價格沒有進行維護,導致沒有收集到工單的報工成本。 但是在前臺操作CO11 報工的時候,系統會給出報錯的信息 但是我們在調用函數BAPI_PRODORDCONF_CREATE_TT的時候,系統并沒有返回報錯的信息…

普通測徑儀和智能測徑儀的五大區別

在工業自動化和精密測量的領域中&#xff0c;測徑儀是不可或缺的重要工具。隨著科技的進步&#xff0c;測徑儀也在不斷地進行技術革新和升級&#xff0c;從傳統的普通測徑儀發展到如今的智能測徑儀。本文將詳細探討普通測徑儀與智能測徑儀之間的五大區別。 一、測量精度與穩定…

【Tlias智能學習輔助系統】01 準備工作

Tlias智能學習輔助系統 01 創建員工、部門表創建springboot工程&#xff0c;引入對應的起步依賴(web、mybatis、mysql驅動、lombok)準備 Mapper、Service、Controller 等基礎結構MapperServiceControllerpojo封裝類application.properties 接口開發規范 創建員工、部門表 -- 創…

oracle sql--計算某一日期到當前日期的間隔天數

oracle sql–計算某一日期到當前日期的間隔天數 如題&#xff0c;是在工作中遇到的一個報表需求問題。用戶需要查詢“創建時間到當下的天數”&#xff0c;于是我這個可憐的打工仔就開始干活了。。。&#xff08;苦澀ing&#xff09;我發現oracle sql的自帶函數和普通的sql貌似…

FPGA基礎:觸發器和鎖存器

目錄 鎖存器&#xff08;Latch&#xff09;D觸發器&#xff08;Flip-Flop&#xff09;最基本時序電路時序塊&#xff08;Sequential blocks&#xff09;:同步與異步觸發器概念觸發器分類觸發器的Verilog實現1. 上升沿觸發的觸發器2. 帶異步復位、上升沿觸發的觸發器3. 帶異步復…

raid配置與實戰10

一、raid理論 1、raid概述 raid&#xff08;磁盤陣列&#xff09;&#xff1a;是用不同的硬盤分區&#xff0c;組成一個邏輯上的硬盤&#xff0c;高可用&#xff08;冗余&#xff09;。 2、raid級別 2.1、raid0條帶化存儲 數據分散在多個物理磁盤上的存儲方式&#xff0c;…

新媒體時代,LCD電子價簽賦予零售場景新活力

近年來&#xff0c;全球企業迅速掀起了數字化轉型的浪潮&#xff0c;加速了新零售科技的發展與應用。在實體零售門店中&#xff0c;商品貨架顯示逐漸趨向智能化和多樣化。然而&#xff0c;在信息傳播日益碎片化和視頻化的時代&#xff0c;零售門店如何更有效地吸引消費者的注意…

英飛凌 AURIX TriCore 單片機開發入門

文章目錄 目的硬件準備AURIX? Development StudioInfineon MemtoolAURIX? iLLD Drivers總結 目的 英飛凌的32位 AURIX? TriCore? 系列單片機 經常用于汽車和工業領域。開發該系列單片機比較常用的開發環境有 HighTec 和 AURIX? Development Studio 。本文將基于后者&…

TalkingData數據統計的力量

在數字化時代&#xff0c;數據已成為企業競爭的關鍵資源。而TalkingData作為一家領先的第三方數據平臺&#xff0c;其數據統計能力無疑是推動企業智能化轉型的重要力量。 首先&#xff0c;TalkingData的數據統計能力體現在其龐大的用戶基礎和豐富的數據來源上。通過與數千家應…

Java-常用模塊

文章目錄 日期時間stream流 日期時間 jdk8新的日期時間類 解析和格式化DateTimeFormatter類&#xff08;線程安全&#xff09; LocalDateTime類 Instant類 Duration類String time "2013-02-11 11:00:00";DateTimeFormatter dateTimeFormatter DateTimeFormatter.o…

linux鏡像虛擬機創建共享文件夾詳細步驟 -- 和本地電腦傳輸文件

主機與虛擬機之間傳遞文件&#xff0c;最快捷的方法莫過于共享文件夾。此方法不需要復制文件&#xff0c;而且可以節省硬盤空間。 具體設置步驟如下&#xff1a; 打開自己的電腦&#xff0c;創建共享的文件夾&#xff0c;完成后鼠標右擊剛剛創建的共享文件夾&#xff0c;選擇…

設計模式 18 迭代器模式 Iterator Pattern

設計模式 18 迭代器模式 Iterator Pattern 1.定義 迭代器模式 (Iterator Pattern) 是一種行為型設計模式&#xff0c;它提供了一種訪問集合元素的標準方法&#xff0c;而無需暴露集合的內部表示。 提供一種方法順序訪問一個聚合對象中的各個元素&#xff0c;而又不需要暴露該…

python猜數游戲限制次數

1、游戲規則 在這個游戲中&#xff0c;計算機會隨機生成一個1到100之間的整數&#xff0c;玩家需要在限定的次數內猜測這個數字是多少。如果玩家猜對了數字&#xff0c;游戲結束&#xff0c;玩家獲勝;如果玩家用完了所有的猜測次數仍然沒有猜對&#xff0c;游戲結束&#xff0…

Redis之內存管理過期、淘汰機制

1.Redis內存管理 我們的redis是一個內存型數據庫&#xff0c;我們的數據也都是放在內存中的&#xff0c;內存是有限的空間&#xff0c;當數據滿了之后&#xff0c;我們要怎么樣繼續保證redis的可用性呢?我們就需要采取點管理措施和機制來保證我們redis的可用性。 在redis.co…

一套saas模式云MES系統源碼,基于springboot+vue.js+uniapp開發

一套saas模式云MES系統源碼&#xff0c;基于springbootvue.jsuniapp開發 MES系統簡介 MES系統&#xff0c;即制造執行系統&#xff08;Manufacturing Execution System&#xff09;&#xff0c;是一種面向制造企業車間執行層的生產信息化管理系統。它位于上層的企業資源規劃&a…

Day01_CET4-Read synonymous substitutions

文章目錄 1.減少2.增加3.原因4.贊揚 1.減少 diminish v.減少 dwindle v.逐漸減少 lessen v.減少 slash v.削減 &#xff08;cut down&#xff09; slump v.暴跌&#xff1b;n.衰退 recession n.衰退 &#xff08;economic disruption&#xff09; lower v.降低 depress…

應用案例|精密制造中使用復合機器人得到顯著提升

精密制造行業對設備的精度、穩定性和效率要求極高&#xff0c;而復合機器人憑借其多功能性、高度靈活性和精準控制能力&#xff0c;正逐漸成為該領域的新寵。以下是一個富唯智能復合機器人在精密制造中的應用案例。 案例背景 某知名汽車零部件制造企業&#xff0c;專注于生產…

【JS】并發控制

需求 控制網絡請求并發數控制并發按順序返回結果 碼 /** * 控制并發 * param {Function} fn 邏輯處理函數 * param {Array} arr 發送的數據 * param {Number} [max3] 并發數 默認3 * param {Number} [orderfalse] 按順序返回執行結果 默認false * param {Number} [retry1] 重試…

vue項目集成螢石云在Web系統中實現實時攝像頭監控及控制功能

需求 需求&#xff1a; 開發人員在產線上放置一個螢石攝像頭&#xff0c;前端在可視化大屏上實時監控&#xff0c;且控制左右上下功能。 效果 螢石云接入web前期準備工作 閱讀螢石云API文檔&#xff1a;螢石云開放平臺開發者文檔 閱讀螢石云控制API文檔&#xff1a;螢石云攝…