EasyExcel 的使用


EasyExcel 的使用

一、簡介

EasyExcel是一個基於Java的簡單、省內存的讀寫Excel的開源項目。

ExsyExcel 的使用

  1. 依賴
<!-- easyexcel 依賴 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>
  1. 創建實體類
@Data
public class Student implements Serializable {
//    @ExcelProperty(index = 2) index 設置從第幾行讀取數據默認從第一行 通過index修改
    //@DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒") 時間格式化 想要的指定格式
    // @NumberFormat("#.##%")  想要的百分比數子
    /**
     * converter屬性定義自己的字符串轉換器
     *@ExcelProperty(converter = CustomStringConverter.class) 見下方自定義轉換器
     *private String string;
     *
     */
    @ExcelProperty(converter = CustomStringConverter.class)
    @ExcelProperty("id")
    private Integer id;
    @ExcelProperty("name")
    private String name;
}
  1. 讀表
@Test
public void read() {
    String fileName = "zzy.xlsx";
    // 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet 文件流會自動關閉
    // 參數一:讀取的excel文件路徑
    // 參數二:讀取sheet的一行,將參數封裝在DemoData實體類中
    // 參數三:讀取每一行的時候會執行DemoDataListener監聽器
    EasyExcel.read(fileName, Student.class, new DemoDataListener()).sheet().doRead();
}
  1. 寫表
@Test
public void simpleWrite() {
    String fileName = "zzy.xlsx";
    // 這里 需要指定寫用哪個class去讀,然后寫到第一個sheet,名字為模板 然后文件流會自動關閉
    // 如果這里想使用03 則 傳入excelType參數即可
    // 參數一:寫入excel文件路徑
    // 參數二:寫入的數據類型是DemoData
    // data()方法是寫入的數據,結果是List<DemoData>集合
    EasyExcel.write(fileName, Student.class).sheet("模板").doWrite(data());
}
  1. 文件的上傳和下載
/**
	excel文件的下載
*/
@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    response.setHeader("Content-disposition", "attachment;filename=demo.xlsx");
    EasyExcel.write(response.getOutputStream(), Student.class).sheet("zzy").doWrite(data());
}

/**
	excel文件的上傳
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
    EasyExcel.read(file.getInputStream(), Student.class, new DemoDataListener()).sheet().doRead();
    return "success";
}
  1. 創建監聽器
public class DemoDataListener extends AnalysisEventListener<DemoData> {

    List<DemoData> list = new ArrayList<DemoData>();
    
    /**
     * 如果使用了spring,請使用這個構造方法。每次創建Listener的時候需要把spring管理的類傳進來
     */
    public DemoDataListener() {}

    /**
     * @param data
     * @param context
     */
    @Override
    public void invoke(DemoData data, AnalysisContext context) {
        System.out.println("每一行的數據:{}", JSON.toJSONString(data));
        list.add(data);
    }

    /**
     * 數據處理完之后都會來調用
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        System.out.println(JSON.toJSONString(list));
    }
}
  1. 自定義轉化器
public class CustomStringConverter implements Converter<String> {
    @Override
    public Class supportJavaTypeKey() {
        return String.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    /**
     * 這里讀的時候會調用
     */
    @Override
    public String convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) {
        return "自定義:" + cellData.getStringValue();
    }

    /**
     * 這里是寫的時候會調用
     */
    @Override
    public CellData convertToExcelData(String value, ExcelContentProperty contentProperty,
        GlobalConfiguration globalConfiguration) {
        return new CellData(value);
    }

}
  1. 讀取頭文件
@Test
public void complexHeaderRead() {
    String fileName = "zzy.xlsx";
    // 這里 需要指定讀用哪個class去讀,然后讀取第一個sheet 
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet()
        // 這里可以設置1,因為頭就是一行。如果多行頭,可以設置其他值。不傳入默認1行
        .headRowNumber(1).doRead();
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM