利用反射實(shí)現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對(duì)象功能
首先,我們將依賴關(guān)系添加到 Maven。
<dependency> <groupId>com.adnanebk</groupId> <artifactId>excel-csv-converter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
了解 POJO 類
在深入研究該庫(kù)之前,讓我們仔細(xì)看看作為數(shù)據(jù)模型的 Java 示例類:
@Data @Builder @AllArgsConstructor @NoArgsConstructor @SheetDefinition(datePattern = "dd/MM/yyyy") public class Product { @CellDefinition(0) private String name; @CellDefinition(1) private long price; @CellDefinition(2) @CellBoolean(trueValue = "yes",falseValue = "no") private boolean active; @CellDefinition(value = 3, title = "Promo price") private double promoPrice; // Additional fields... @CellEnum(enumsMapperMethod = "categoryMap") @CellDefinition(10) private Category category; @CellDefinition(11) private LocalDateTime localDateTime; private Map<Category,String> categoryMap(){ return Map.of(Category.A,"Formatted A", Category.B,"Formatted B"); } }
該類Product
帶有各種注釋,這些注釋在轉(zhuǎn)換過(guò)程中起著至關(guān)重要的作用。每個(gè)字段都帶有注釋@CellDefinition
,指示其在Excel 或 CSV 文件中的位置。
我們還可以定義單元格的標(biāo)題,默認(rèn)情況下,它會(huì)將字段的駝峰式名稱轉(zhuǎn)換為帶空格的名稱(例如:firstName=>First name)
該@SheetDefinition
注釋提供了附加信息,例如將在日期字段類型轉(zhuǎn)換期間使用的日期格式化模式。
枚舉注釋:@CellEnum(enumsMapperMethod = “categoryMap”)
在Product
類中,我們使用@CellEnum
枚舉 Category 字段中的注釋。enumsMapperMethod 參數(shù)允許我們定義方法名稱;此方法應(yīng)返回一個(gè)映射,該映射定義枚舉常量與 Excel/CSV 單元格中的格式化值之間的映射(轉(zhuǎn)換)(默認(rèn)情況下,將使用枚舉常量),請(qǐng)注意,方法名稱必須與 enumsMapperMethod 參數(shù)值相同。
[布爾注解:@CellBoolean(trueValue = “yes”,falseValue = “no”)]
在我們需要使用Boolean類型的字段中使用 @CellBoolean 注釋,它有兩個(gè)參數(shù)代表我們要在 Excel/CSV 字段中使用的格式值。
現(xiàn)在,讓我們介紹 POJO 類的更新版本ProductV2
:
@Data @Builder @AllArgsConstructor @NoArgsConstructor @SheetDefinition(includeAllFields = true,titles={"Name","Category","Date"}) public class ProductV2 { private String name; // Additional fields... private Category category; @IgnoreCell private LocalDateTime localDateTime; }
@SheetDefinition
通過(guò)類中提供的注釋將字段映射到 Excel 文件中的相應(yīng)單元格,將 Excel 文件轉(zhuǎn)換為 POJO 變得更加簡(jiǎn)單。
當(dāng) includeAllFields 參數(shù)設(shè)置為 true 時(shí),字段將根據(jù)其聲明的順序自動(dòng)包含并映射到單元格中,并忽略使用 @IgnoreCell 注釋進(jìn)行注釋的字段。
我們可以在標(biāo)題參數(shù)中定義標(biāo)題,條件是它們必須與字段的順序一致。
將 Excel/CSV 轉(zhuǎn)換為 POJO
@RestController @RequestMapping("excel/products") public class ExcelFieldsController { private final ExcelHelper<Product> excelHelper = ExcelHelper.create(Product.class); @GetMapping public List<Product> excelToProducts(@RequestBody MultipartFile file){ return excelHelper.toStream(file.getInputStream()).toList(); } @GetMapping("/download") public ResponseEntity<InputStreamResource> downloadExcelFromProducts() { String filename = "products-" + LocalDate.now() + ".xlsx"; InputStreamResource file = new InputStreamResource(excelHelper.toExcel(getProducts())); return ResponseEntity.ok() .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename) .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) .body(file); } }
這同樣適用于轉(zhuǎn)換 CSV 文件,只是我們需要定義將使用的分隔符
private final CsvHelper<ProductV2> csvHelper = CsvHelper.create(ProductV2.class,";");
ReflectionUtil:動(dòng)態(tài)檢驗(yàn)類
ReflectionUtil 類是該 Java 庫(kù)的支柱,通過(guò) Java 反射的強(qiáng)大功能促進(jìn)動(dòng)態(tài)類檢查和操作。ReflectionUtil 類的一個(gè)顯著特點(diǎn)是為提高性能而進(jìn)行的優(yōu)化。在初始化過(guò)程中,所有的get、set和字段都會(huì)被快速加載并封裝在 SheetField 中。這種有意識(shí)的操作最大限度地減少了后續(xù)操作中的反射查找需求,提高了整體效率。
主要方法:
public Object getValue(T obj)
:使用對(duì)象的 getter 方法檢索字段的值。如果該字段是枚舉,它會(huì)根據(jù)定義的枚舉映射提供格式化值。
public void setValue(T obj, Object value)
:使用對(duì)象的 setter 方法設(shè)置對(duì)象中字段的值。它處理枚舉值并確保正確的轉(zhuǎn)換。
結(jié)論
通過(guò)利用這個(gè)自定義庫(kù),開(kāi)發(fā)人員可以顯著簡(jiǎn)化將 Excel 和 CSV 文件轉(zhuǎn)換為Java 中的 POJO的過(guò)程。Java 反射的集成以及深思熟慮的設(shè)計(jì)考慮支持動(dòng)態(tài)映射,使其成為數(shù)據(jù)處理任務(wù)的寶貴工具。
以上就是利用反射實(shí)現(xiàn)將Excel和CSV 轉(zhuǎn)換為Java對(duì)象功能的詳細(xì)內(nèi)容,更多關(guān)于Excel和CSV轉(zhuǎn)換為Java對(duì)象的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Spring Cache時(shí)設(shè)置緩存鍵的注意事項(xiàng)詳解
在現(xiàn)代的Web應(yīng)用中,緩存是提高系統(tǒng)性能和響應(yīng)速度的重要手段之一,Spring框架提供了強(qiáng)大的緩存支持,通過(guò)??@Cacheable??、??@CachePut??、??@CacheEvict??等注解可以方便地實(shí)現(xiàn)緩存功能,本文給大家介紹了使用Spring Cache時(shí)設(shè)置緩存鍵的注意事項(xiàng)2025-01-01SpringApplicationRunListener監(jiān)聽(tīng)器源碼詳解
這篇文章主要介紹了SpringApplicationRunListener監(jiān)聽(tīng)器源碼詳解,springboot提供了兩個(gè)類SpringApplicationRunListeners、SpringApplicationRunListener(EventPublishingRunListener),spring框架還提供了一個(gè)ApplicationListener接口,需要的朋友可以參考下2023-11-11Mybatis動(dòng)態(tài)拼接sql提高插入速度實(shí)例
這篇文章主要介紹了Mybatis動(dòng)態(tài)拼接sql提高插入速度實(shí)例,當(dāng)數(shù)據(jù)量少的時(shí)候,沒(méi)問(wèn)題,有效時(shí)間內(nèi)可能完成插入,但是當(dāng)數(shù)據(jù)量達(dá)到一定程度的時(shí)候,每次都一個(gè)sql插入超時(shí),所以采用了拼接sql的方式加快速度,需要的朋友可以參考下2023-09-09java優(yōu)先隊(duì)列PriorityQueue中Comparator的用法詳解
這篇文章主要介紹了java優(yōu)先隊(duì)列PriorityQueue中Comparator的用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Springboot中使用Redis實(shí)現(xiàn)分布式鎖的示例代碼
在分布式系統(tǒng)中,為了保證數(shù)據(jù)的一致性和任務(wù)的互斥執(zhí)行,分布式鎖是一種常見(jiàn)的解決方案,本文主要介紹了Springboot中使用Redis實(shí)現(xiàn)分布式鎖的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解
這篇文章主要為大家介紹了SpringSecurity微服務(wù)實(shí)戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Spring Cloud Gateway 獲取請(qǐng)求體(Request Body)的多種方法
這篇文章主要介紹了Spring Cloud Gateway 獲取請(qǐng)求體(Request Body)的多種方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java?webservice的POST和GET請(qǐng)求調(diào)用方式
這篇文章主要介紹了Java?webservice的POST和GET請(qǐng)求調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03