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

利用反射實現(xiàn)Excel和CSV 轉(zhuǎn)換為Java對象功能

 更新時間:2023年11月05日 09:18:48   作者:it鍵盤俠  
將Excel或CSV文件轉(zhuǎn)換為Java對象(POJO)以及將Java對象轉(zhuǎn)換為Excel或CSV文件可能是一個復(fù)雜的過程,但如果使用正確的工具和技術(shù),這個過程就會變得十分簡單,在本文中,我們將了解如何利用一個Java反射的庫來實現(xiàn)這個功能,需要的朋友可以參考下

首先,我們將依賴關(guān)系添加到 Maven。

<dependency>
  <groupId>com.adnanebk</groupId>
  <artifactId>excel-csv-converter</artifactId>
  <version>0.0.1-SNAPSHOT</version>
</dependency>

了解 POJO 類

在深入研究該庫之前,讓我們仔細(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ān)重要的作用。每個字段都帶有注釋@CellDefinition,指示其在Excel 或 CSV 文件中的位置。

我們還可以定義單元格的標(biāo)題,默認(rèn)情況下,它會將字段的駝峰式名稱轉(zhuǎn)換為帶空格的名稱(例如:firstName=>First name)

@SheetDefinition注釋提供了附加信息,例如將在日期字段類型轉(zhuǎn)換期間使用的日期格式化模式。

枚舉注釋:@CellEnum(enumsMapperMethod = “categoryMap”)

Product類中,我們使用@CellEnum枚舉 Category 字段中的注釋。enumsMapperMethod 參數(shù)允許我們定義方法名稱;此方法應(yīng)返回一個映射,該映射定義枚舉常量與 Excel/CSV 單元格中的格式化值之間的映射(轉(zhuǎn)換)(默認(rè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 文件中的相應(yīng)單元格,將 Excel 文件轉(zhuǎn)換為 POJO 變得更加簡單。

當(dāng) includeAllFields 參數(shù)設(shè)置為 true 時,字段將根據(jù)其聲明的順序自動包含并映射到單元格中,并忽略使用 @IgnoreCell 注釋進行注釋的字段。

我們可以在標(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:動態(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對象功能的詳細(xì)內(nèi)容,更多關(guān)于Excel和CSV轉(zhuǎn)換為Java對象的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用Spring Cache時設(shè)置緩存鍵的注意事項詳解

    使用Spring Cache時設(shè)置緩存鍵的注意事項詳解

    在現(xiàn)代的Web應(yīng)用中,緩存是提高系統(tǒng)性能和響應(yīng)速度的重要手段之一,Spring框架提供了強大的緩存支持,通過??@Cacheable??、??@CachePut??、??@CacheEvict??等注解可以方便地實現(xiàn)緩存功能,本文給大家介紹了使用Spring Cache時設(shè)置緩存鍵的注意事項
    2025-01-01
  • SpringApplicationRunListener監(jiān)聽器源碼詳解

    SpringApplicationRunListener監(jiān)聽器源碼詳解

    這篇文章主要介紹了SpringApplicationRunListener監(jiān)聽器源碼詳解,springboot提供了兩個類SpringApplicationRunListeners、SpringApplicationRunListener(EventPublishingRunListener),spring框架還提供了一個ApplicationListener接口,需要的朋友可以參考下
    2023-11-11
  • Mybatis動態(tài)拼接sql提高插入速度實例

    Mybatis動態(tài)拼接sql提高插入速度實例

    這篇文章主要介紹了Mybatis動態(tài)拼接sql提高插入速度實例,當(dāng)數(shù)據(jù)量少的時候,沒問題,有效時間內(nèi)可能完成插入,但是當(dāng)數(shù)據(jù)量達到一定程度的時候,每次都一個sql插入超時,所以采用了拼接sql的方式加快速度,需要的朋友可以參考下
    2023-09-09
  • java優(yōu)先隊列PriorityQueue中Comparator的用法詳解

    java優(yōu)先隊列PriorityQueue中Comparator的用法詳解

    這篇文章主要介紹了java優(yōu)先隊列PriorityQueue中Comparator的用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Java中分割字符串的兩種方法實例詳解

    Java中分割字符串的兩種方法實例詳解

    這篇文章主要介紹了Java中分割字符串的兩種方法,一種是java.lang.String 的 split() 方法,,另外一種是用String Tokenizer類。文中的每種方法都給出了詳細(xì)的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-12-12
  • Java多線程中的CyclicBarrier詳解

    Java多線程中的CyclicBarrier詳解

    這篇文章主要介紹了Java多線程中的CyclicBarrier詳解,同步屏障,允許一組線程互相等待以到達一個公共的障礙點,當(dāng)設(shè)定的線程數(shù)到達屏障時,阻塞的線程繼續(xù)執(zhí)行,需要的朋友可以參考下
    2023-11-11
  • Springboot中使用Redis實現(xiàn)分布式鎖的示例代碼

    Springboot中使用Redis實現(xiàn)分布式鎖的示例代碼

    在分布式系統(tǒng)中,為了保證數(shù)據(jù)的一致性和任務(wù)的互斥執(zhí)行,分布式鎖是一種常見的解決方案,本文主要介紹了Springboot中使用Redis實現(xiàn)分布式鎖的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解

    SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解

    這篇文章主要為大家介紹了SpringSecurity微服務(wù)實戰(zhàn)之公共模塊詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Spring Cloud Gateway 獲取請求體(Request Body)的多種方法

    Spring Cloud Gateway 獲取請求體(Request Body)的多種方法

    這篇文章主要介紹了Spring Cloud Gateway 獲取請求體(Request Body)的多種方法,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Java?webservice的POST和GET請求調(diào)用方式

    Java?webservice的POST和GET請求調(diào)用方式

    這篇文章主要介紹了Java?webservice的POST和GET請求調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論