利用反射實現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對象功能
首先,我們將依賴關(guān)系添加到 Maven。
<dependency> <groupId>com.adnanebk</groupId> <artifactId>excel-csv-converter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
了解 POJO 類
在深入研究該庫之前,讓我們仔細看看作為數(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ān)重要的作用。每個字段都帶有注釋@CellDefinition,指示其在Excel 或 CSV 文件中的位置。
我們還可以定義單元格的標題,默認情況下,它會將字段的駝峰式名稱轉(zhuǎn)換為帶空格的名稱(例如:firstName=>First name)
該@SheetDefinition注釋提供了附加信息,例如將在日期字段類型轉(zhuǎn)換期間使用的日期格式化模式。
枚舉注釋:@CellEnum(enumsMapperMethod = “categoryMap”)
在Product類中,我們使用@CellEnum枚舉 Category 字段中的注釋。enumsMapperMethod 參數(shù)允許我們定義方法名稱;此方法應返回一個映射,該映射定義枚舉常量與 Excel/CSV 單元格中的格式化值之間的映射(轉(zhuǎn)換)(默認情況下,將使用枚舉常量),請注意,方法名稱必須與 enumsMapperMethod 參數(shù)值相同。
[布爾注解:@CellBoolean(trueValue = “yes”,falseValue = “no”)]
在我們需要使用Boolean類型的字段中使用 @CellBoolean 注釋,它有兩個參數(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通過類中提供的注釋將字段映射到 Excel 文件中的相應單元格,將 Excel 文件轉(zhuǎn)換為 POJO 變得更加簡單。
當 includeAllFields 參數(shù)設(shè)置為 true 時,字段將根據(jù)其聲明的順序自動包含并映射到單元格中,并忽略使用 @IgnoreCell 注釋進行注釋的字段。
我們可以在標題參數(shù)中定義標題,條件是它們必須與字段的順序一致。
將 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:動態(tài)檢驗類
ReflectionUtil 類是該 Java 庫的支柱,通過 Java 反射的強大功能促進動態(tài)類檢查和操作。ReflectionUtil 類的一個顯著特點是為提高性能而進行的優(yōu)化。在初始化過程中,所有的get、set和字段都會被快速加載并封裝在 SheetField 中。這種有意識的操作最大限度地減少了后續(xù)操作中的反射查找需求,提高了整體效率。
主要方法:
public Object getValue(T obj):使用對象的 getter 方法檢索字段的值。如果該字段是枚舉,它會根據(jù)定義的枚舉映射提供格式化值。
public void setValue(T obj, Object value):使用對象的 setter 方法設(shè)置對象中字段的值。它處理枚舉值并確保正確的轉(zhuǎn)換。
結(jié)論
通過利用這個自定義庫,開發(fā)人員可以顯著簡化將 Excel 和 CSV 文件轉(zhuǎn)換為Java 中的 POJO的過程。Java 反射的集成以及深思熟慮的設(shè)計考慮支持動態(tài)映射,使其成為數(shù)據(jù)處理任務(wù)的寶貴工具。
以上就是利用反射實現(xiàn)將Excel和CSV 轉(zhuǎn)換為Java對象功能的詳細內(nèi)容,更多關(guān)于Excel和CSV轉(zhuǎn)換為Java對象的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringCloud如何利用Feign訪問外部http請求
這篇文章主要介紹了SpringCloud如何利用Feign訪問外部http請求,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
java中處理json各種各樣的轉(zhuǎn)換方法(推薦)
下面小編就為大家分享一篇java中處理json各種各樣的轉(zhuǎn)換方法小結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-11-11
Mybatis-plus使用selectList查詢數(shù)據(jù)為null的問題及解決辦法
這篇文章主要介紹了Mybatis-plus使用selectList查詢數(shù)據(jù)為null的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
Java Arrays.sort和Collections.sort排序?qū)崿F(xiàn)原理解析
這篇文章主要介紹了Java Arrays.sort和Collections.sort排序?qū)崿F(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
SpringBoot項目找不到j(luò)avax.servlet.Filter的問題及解決
這篇文章主要介紹了SpringBoot項目找不到j(luò)avax.servlet.Filter的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Spring Boot整合RabbitMQ實例(Topic模式)
Topic Exchange 轉(zhuǎn)發(fā)消息主要是根據(jù)通配符。接下來通過本文給大家分享Spring Boot整合RabbitMQ實例(Topic模式),需要的朋友參考下吧2017-04-04

