EasyExcel全面教程快速上手

EasyExcel教程

本文使用的技術是Alibaba集團開源的EasyExcel技術,該技術是針對Apache POI技術的封裝和優化,主要解決了POI技術的耗內存問題,並且提供了較好的API使用。不需要大量的代碼就可以實現excel的操作功能。

更多學習資料,可以關注下方微信公衆號,回覆關鍵字:Java高級資料 。 即可免費獲取完整的Java高級開發工程師視頻課程。
在這裏插入圖片描述

一、簡介

EasyExcel是一個基於Java的簡單、省內存的讀寫Excel的開源項目。在儘可能節約內存的情況下支持讀寫百M的Excel。

二、傳統解析的弊端

Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴重的問題就是非常的耗內存,poi有一套SAX模式的API可以一定程度的解決一些內存溢出的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓後存儲都是在內存中完成的,內存消耗依然很大。easyexcel重寫了poi對07版Excel的解析,能夠原本一個3M的excel用POI sax依然需要100M左右內存降低到幾M,並且再大的excel不會出現內存溢出,03版依賴POI的sax模式。在上層做了模型轉換的封裝,讓使用者更加簡單方便。

三、快速感受

excel內容

字符串標題 日期標題 數值標題
字符串10 2019/1/1 10
字符串20 2019/2/1 21
字符串30 2019/3/1 32
字符串40 2019/4/1 43
字符串50 2019/5/1 54

讀Excel

/**
	簡單的讀取excel文件
*/
@Test
public void read() {
    String fileName = "demo.xlsx";
    // 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet 文件流會自動關閉
    // 參數一:讀取的excel文件路徑
    // 參數二:讀取sheet的一行,將參數封裝在DemoData實體類中
    // 參數三:讀取每一行的時候會執行DemoDataListener監聽器
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}

寫Excel

/**
	簡單的寫入數據到excel
*/
@Test
public void simpleWrite() {
    String fileName = "demo.xlsx";
    // 這裏 需要指定寫用哪個class去讀,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    // 如果這裏想使用03 則 傳入excelType參數即可
    // 參數一:寫入excel文件路徑
    // 參數二:寫入的數據類型是DemoData
    // data()方法是寫入的數據,結果是List<DemoData>集合
    EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
}

Web上傳與下載

/**
	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(), DownloadData.class).sheet("模板").doWrite(data());
}

/**
	excel文件的上傳
*/
@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
    EasyExcel.read(file.getInputStream(), DemoData.class, new DemoDataListener()).sheet().doRead();
    return "success";
}

四、詳解讀取Excel

簡單讀取

對象

// 如果沒有特殊說明,下面的案例將默認使用這個實體類
public class DemoData {
    private String string;
    private Date date;
    private Double doubleData;
    // getting setting
}

監聽器

// 如果沒有特殊說明,下面的案例將默認使用這個監聽器
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));
    }
}

代碼

@Test
public void simpleRead() {
    // 寫法1:
    String fileName = "demo.xlsx";
    // 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet 文件流會自動關閉
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();

    // 寫法2:
    fileName = "demo.xlsx";
    ExcelReader excelReader = EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).build();
    ReadSheet readSheet = EasyExcel.readSheet(0).build();
    excelReader.read(readSheet);
    // 這裏千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的
    excelReader.finish();
}

指定列的下標或名稱

對象

public class DemoData {
    /**
     * 強制讀取第三個 這裏不建議 index 和 name 同時用,要麼一個對象只用index,要麼一個對象只用name去匹配
     */
    @ExcelProperty(index = 2)
    private Double doubleData;
    /**
     * 用名字去匹配,這裏需要注意,如果名字重複,會導致只有一個字段讀取到數據
     */
    @ExcelProperty("字符串標題")
    private String string;
    @ExcelProperty("日期標題")
    private Date date;
}

代碼

@Test
public void indexOrNameRead() {
    String fileName = "demo.xlsx";
    // 這裏默認讀取第一個sheet
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead();
}

讀取多個sheet

代碼

@Test
public void repeatedRead() {
    String fileName = "demo.xlsx";
    // 讀取全部sheet
    // 這裏需要注意 DemoDataListener的doAfterAllAnalysed 會在每個sheet讀取完畢後調用一次。然後所有sheet都會往同一個DemoDataListener裏面寫
    EasyExcel.read(fileName, DemoData.class, new DemoDataListener()).doReadAll();

    // 讀取部分sheet
    fileName = "demo.xlsx";
    ExcelReader excelReader = EasyExcel.read(fileName).build();
    // 這裏爲了簡單 所以註冊了 同樣的head 和Listener 自己使用功能必須不同的Listener
    // readSheet參數設置讀取sheet的序號
    ReadSheet readSheet1 =
        EasyExcel.readSheet(0).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
    ReadSheet readSheet2 =
        EasyExcel.readSheet(1).head(DemoData.class).registerReadListener(new DemoDataListener()).build();
    // 這裏注意 一定要把sheet1 sheet2 一起傳進去,不然有個問題就是03版的excel 會讀取多次,浪費性能
    excelReader.read(readSheet1, readSheet2);
    // 這裏千萬別忘記關閉,讀的時候會創建臨時文件,到時磁盤會崩的
    excelReader.finish();
}

自定義格式轉換

對象

@Data
public class ConverterData {
    /**
     * converter屬性定義自己的字符串轉換器
     */
    @ExcelProperty(converter = CustomStringConverter.class)
    private String string;
    /**
     * 這裏用string 去接日期才能格式化
     */
    @DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒")
    private String date;
    /**
     * 我想接收百分比的數字
     */
    @NumberFormat("#.##%")
    private String doubleData;
}

自定義轉換器

public class CustomStringStringConverter implements Converter<String> {
    @Override
    public Class supportJavaTypeKey() {
        return String.class;
    }

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

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

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

}

代碼

@Test
public void converterRead() {
    String fileName = "demo.xlsx";
    // 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet 
    EasyExcel.read(fileName, ConverterData.class, new ConverterDataListener())
        // 這裏注意 我們也可以registerConverter來指定自定義轉換器, 但是這個轉換變成全局了, 所有java爲string,excel爲string的都會用這個轉換器。
        // 如果就想單個字段使用請使用@ExcelProperty 指定converter
        // .registerConverter(new CustomStringStringConverter())
        // 讀取sheet
        .sheet().doRead();
}

多行頭

代碼

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

讀取表頭數據

監聽器

/**
 * 這裏會一行行的返回頭
 * 監聽器只需要重寫這個方法就可以讀取到頭信息
 * @param headMap
 * @param context
 */
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
    LOGGER.info("解析到一條頭數據:{}", JSON.toJSONString(headMap));
}

代碼

@Test
public void headerRead() {
    String fileName = "demo.xlsx";
    // 這裏 需要指定讀用哪個class去讀,然後讀取第一個sheet
    EasyExcel.read(fileName, DemoData.class, new ReadDataListener()).sheet().doRead();
}

異常處理

監聽器

/**
* 監聽器實現這個方法就可以在讀取數據的時候獲取到異常信息
*/
@Override
public void onException(Exception exception, AnalysisContext context) {
    LOGGER.error("解析失敗,但是繼續解析下一行:{}", exception.getMessage());
    // 如果是某一個單元格的轉換異常 能獲取到具體行號
    // 如果要獲取頭的信息 配合invokeHeadMap使用
    if (exception instanceof ExcelDataConvertException) {
        ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
        LOGGER.error("第{}行,第{}列解析異常", excelDataConvertException.getRowIndex(),
            excelDataConvertException.getColumnIndex());
    }
}

web讀取

代碼

@PostMapping("upload")
@ResponseBody
public String upload(MultipartFile file) throws IOException {
    EasyExcel.read(file.getInputStream(), UploadData.class, new UploadDataListener(uploadDAO)).sheet().doRead();
    return "SUCCESS";
}

五、詳解寫入Excel

數據寫入公用方法

private List<DemoData> data() {
    List<DemoData> list = new ArrayList<DemoData>();
    for (int i = 0; i < 10; i++) {
        DemoData data = new DemoData();
        data.setString("字符串" + i);
        data.setDate(new Date());
        data.setDoubleData(0.56);
        list.add(data);
    }
    return list;
}

簡單寫入

對象

public class DemoData {
    @ExcelProperty("字符串標題")
    private String string;
    @ExcelProperty("日期標題")
    private Date date;
    @ExcelProperty("數字標題")
    private Double doubleData;
    // getting setting
}

代碼

@Test
public void simpleWrite() {
    // 寫法1
    String System.currentTimeMillis() + ".xlsx";
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    // 如果這裏想使用03 則 傳入excelType參數即可
    EasyExcel.write(fileName, DemoData.class).sheet("寫入方法一").doWrite(data());

    // 寫法2,方法二需要手動關閉流
    fileName = System.currentTimeMillis() + ".xlsx";
    // 這裏 需要指定寫用哪個class去寫
    ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build();
    WriteSheet writeSheet = EasyExcel.writerSheet("寫入方法二").build();
    excelWriter.write(data(), writeSheet);
    /// 千萬別忘記finish 會幫忙關閉流
    excelWriter.finish();
}

導出指定的列

代碼

@Test
public void excludeOrIncludeWrite() {
    String fileName = "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";

    // 忽略 date 不導出
    Set<String> excludeColumnFiledNames = new HashSet<String>();
    excludeColumnFiledNames.add("date");
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    EasyExcel.write(fileName, DemoData.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("忽略date")
        .doWrite(data());

    fileName = "excludeOrIncludeWrite" + System.currentTimeMillis() + ".xlsx";
    // 根據用戶傳入字段 假設我們只要導出 date
    Set<String> includeColumnFiledNames = new HashSet<String>();
    includeColumnFiledNames.add("date");
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    EasyExcel.write(fileName, DemoData.class).includeColumnFiledNames(includeColumnFiledNames).sheet("導出date")
        .doWrite(data());
}

指定寫入的列

對象

public class IndexData {
    /**
    * 導出的excel第二列和第四列將空置
    */
    @ExcelProperty(value = "字符串標題", index = 0)
    private String string;
    @ExcelProperty(value = "日期標題", index = 2)
    private Date date;
    @ExcelProperty(value = "數字標題", index = 4)
    private Double doubleData;
}

代碼

@Test
public void indexWrite() {
    String fileName = "indexWrite" + System.currentTimeMillis() + ".xlsx";
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    EasyExcel.write(fileName, IndexData.class).sheet("模板").doWrite(data());
}

複雜頭寫入

對象

public class ComplexHeadData {
    /**
    * 主標題 將整合爲一個單元格效果如下:
    * —————————————————————————
    * |          主標題        |
    * —————————————————————————
    * |字符串標題|日期標題|數字標題|
    * —————————————————————————
    */
    @ExcelProperty({"主標題", "字符串標題"})
    private String string;
    @ExcelProperty({"主標題", "日期標題"})
    private Date date;
    @ExcelProperty({"主標題", "數字標題"})
    private Double doubleData;
}

代碼

@Test
public void complexHeadWrite() {
    String fileName = "complexHeadWrite" + System.currentTimeMillis() + ".xlsx";
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    EasyExcel.write(fileName, ComplexHeadData.class).sheet("模板").doWrite(data());
}

自定義格式轉換

public class ConverterData {
    /**
     * 自定義的轉換
     */
    @ExcelProperty(value = "字符串標題", converter = CustomStringConverter.class)
    private String string;
    /**
     * 我想寫到excel 用年月日的格式
     */
    @DateTimeFormat("yyyy年MM月dd日 HH時mm分ss秒")
    @ExcelProperty("日期標題")
    private Date date;
    /**
     * 我想寫到excel 用百分比表示
     */
    @NumberFormat("#.##%")
    @ExcelProperty(value = "數字標題")
    private Double doubleData;
    // getting setting
}

代碼

@Test
public void converterWrite() {
    String "converterWrite" + System.currentTimeMillis() + ".xlsx";
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    EasyExcel.write(fileName, ConverterData.class).sheet("模板").doWrite(data());
}

圖片導出

對象

@Data
@ContentRowHeight(200)
@ColumnWidth(200 / 8)
public class ImageData {
    // 圖片導出方式有5種
    private File file;
    private InputStream inputStream;
    /**
     * 如果string類型 必須指定轉換器,string默認轉換成string,該轉換器是官方支持的
     */
    @ExcelProperty(converter = StringImageConverter.class)
    private String string;
    private byte[] byteArray;
    /**
     * 根據url導出 版本2.1.1才支持該種模式
     */
    private URL url;
}

代碼

@Test
public void imageWrite() throws Exception {
    String fileName = "imageWrite" + System.currentTimeMillis() + ".xlsx";
    // 如果使用流 記得關閉
    InputStream inputStream = null;
    try {
        List<ImageData> list = new ArrayList<ImageData>();
        ImageData imageData = new ImageData();
        list.add(imageData);
        String imagePath = "converter" + File.separator + "img.jpg";
        // 放入五種類型的圖片 根據實際使用只要選一種即可
        imageData.setByteArray(FileUtils.readFileToByteArray(new File(imagePath)));
        imageData.setFile(new File(imagePath));
        imageData.setString(imagePath);
        inputStream = FileUtils.openInputStream(new File(imagePath));
        imageData.setInputStream(inputStream);
        imageData.setUrl(new URL(
            "https://raw.githubusercontent.com/alibaba/easyexcel/master/src/test/resources/converter/img.jpg"));
        EasyExcel.write(fileName, ImageData.class).sheet().doWrite(list);
    } finally {
        if (inputStream != null) {
            inputStream.close();
        }
    }
}

列寬、行高

對象

@Data
@ContentRowHeight(10)
@HeadRowHeight(20)
@ColumnWidth(25)
public class WidthAndHeightData {
    @ExcelProperty("字符串標題")
    private String string;
    @ExcelProperty("日期標題")
    private Date date;
    /**
     * 寬度爲50,覆蓋上面的寬度25
     */
    @ColumnWidth(50)
    @ExcelProperty("數字標題")
    private Double doubleData;
}

代碼

@Test
public void widthAndHeightWrite() {
    String fileName = "widthAndHeightWrite" + System.currentTimeMillis() + ".xlsx";
    // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
    EasyExcel.write(fileName, WidthAndHeightData.class).sheet("模板").doWrite(data());
}

合併單元格

代碼

 @Test
 public void mergeWrite() {
     String fileName = "mergeWrite" + System.currentTimeMillis() + ".xlsx";
     // 每隔2行會合並 把eachColumn 設置成 3 也就是我們數據的長度,所以就第一列會合並。當然其他合併策略也可以自己寫
     LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
     // 這裏 需要指定寫用哪個class去寫,然後寫到第一個sheet,名字爲模板 然後文件流會自動關閉
     EasyExcel.write(fileName, DemoData.class).registerWriteHandler(loopMergeStrategy).sheet("合併單元格")
         .doWrite(data());
 }

動態表頭

代碼

@Test
public void dynamicHeadWrite() {
    String fileName = "dynamicHeadWrite" + System.currentTimeMillis() + ".xlsx";
    EasyExcel.write(fileName)
        // 這裏放入動態頭
        .head(head()).sheet("模板")
        // 當然這裏數據也可以用 List<List<String>> 去傳入
        .doWrite(data());
}

// 動態表頭的數據格式List<List<String>>
private List<List<String>> head() {
    List<List<String>> list = new ArrayList<List<String>>();
    List<String> head0 = new ArrayList<String>();
    head0.add("字符串" + System.currentTimeMillis());
    List<String> head1 = new ArrayList<String>();
    head1.add("數字" + System.currentTimeMillis());
    List<String> head2 = new ArrayList<String>();
    head2.add("日期" + System.currentTimeMillis());
    list.add(head0);
    list.add(head1);
    list.add(head2);
    return list;
}

web數據寫出

代碼

@GetMapping("download")
public void download(HttpServletResponse response) throws IOException {
    response.setContentType("application/vnd.ms-excel");
    response.setCharacterEncoding("utf-8");
    // 這裏URLEncoder.encode可以防止中文亂碼 當然和easyexcel沒有關係
    String fileName = URLEncoder.encode("數據寫出", "UTF-8");
    response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
    EasyExcel.write(response.getOutputStream(), DownloadData.class).sheet("模板").doWrite(data());
}

六、詳解填充樣板寫入

這裏的案例填充都是模板向下,如果需要橫向填充只需要模板設置好就可以。

簡單的填充

Excel模板

A B C
姓名 數字 複雜
{name} {number} {name}今年{number}歲

Excel最終效果

A B C
姓名 數字 複雜
知春秋 25 知春秋今年25歲

對象

public class FillData {
    private String name;
    private double number;
    // getting setting
}

代碼

@Test
public void simpleFill() {
    // 模板注意 用{} 來表示你要用的變量 如果本來就有"{","}" 特殊字符 用"\{","\}"代替
    String templateFileName = "simple.xlsx";

    // 方案1 根據對象填充
    String fileName = System.currentTimeMillis() + ".xlsx";
    // 這裏 會填充到第一個sheet, 然後文件流會自動關閉
    FillData fillData = new FillData();
    fillData.setName("知春秋");
    fillData.setNumber(25);
    EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(fillData);

    // 方案2 根據Map填充
    fileName = System.currentTimeMillis() + ".xlsx";
    // 這裏 會填充到第一個sheet, 然後文件流會自動關閉
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("name", "知春秋");
    map.put("number", 25);
    EasyExcel.write(fileName).withTemplate(templateFileName).sheet().doFill(map);
}

複雜的填充

使用List集合的方法批量寫入數據,點表示該參數是集合

Excel模板

A B C
姓名 數字 複雜
{.name} {.number} {.name}今年{.number}歲

Excel最終效果

A B C
姓名 數字 複雜
知春秋 25 知春秋今年25歲
知春秋 25 知春秋今年25歲
知春秋 25 知春秋今年25歲
知春秋 25 知春秋今年25歲
知春秋 25 知春秋今年25歲
知春秋 25 知春秋今年25歲

代碼

@Test
public void complexFill() {
    // 模板注意 用{} 來表示你要用的變量 如果本來就有"{","}" 特殊字符 用"\{","\}"代替
    // {} 代表普通變量 {.} 代表是list的變量
    String templateFileName = "complex.xlsx";

    String fileName = System.currentTimeMillis() + ".xlsx";
    ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
    WriteSheet writeSheet = EasyExcel.writerSheet().build();
    // 這裏注意 入參用了forceNewRow 代表在寫入list的時候不管list下面有沒有空行 都會創建一行,然後下面的數據往後移動。默認 是false,會直接使用下一行,如果沒有則創建。
    // forceNewRow 如果設置了true,有個缺點 就是他會把所有的數據都放到內存了,所以慎用
    // 簡單的說 如果你的模板有list,且list不是最後一行,下面還有數據需要填充 就必須設置 forceNewRow=true 但是這個就會把所有數據放到內存 會很耗內存
    // 如果數據量大 list不是最後一行 參照下一個
    FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
    excelWriter.fill(data(), fillConfig, writeSheet);
    excelWriter.fill(data(), fillConfig, writeSheet);
    // 其他參數可以使用Map封裝
    Map<String, Object> map = new HashMap<String, Object>();
    excelWriter.fill(map, writeSheet);
    excelWriter.finish();
}

七、API

詳細參數介紹

關於常見類解析

Ø EasyExcel 入口類,用於構建開始各種操作

Ø ExcelReaderBuilder ExcelWriterBuilder 構建出一個 ReadWorkbook WriteWorkbook,可以理解成一個excel對象,一個excel只要構建一個

Ø ExcelReaderSheetBuilder ExcelWriterSheetBuilder 構建出一個 ReadSheet WriteSheet對象,可以理解成excel裏面的一頁,每一頁都要構建一個

Ø ReadListener 在每一行讀取完畢後都會調用ReadListener來處理數據

Ø WriteHandler 在每一個操作包括創建單元格、創建表格等都會調用WriteHandler來處理數據

Ø 所有配置都是繼承的,Workbook的配置會被Sheet繼承,所以在用EasyExcel設置參數的時候,在EasyExcel…sheet()方法之前作用域是整個sheet,之後針對單個sheet

註解

Ø ExcelProperty 指定當前字段對應excel中的那一列。可以根據名字或者Index去匹配。當然也可以不寫,默認第一個字段就是index=0,以此類推。千萬注意,要麼全部不寫,要麼全部用index,要麼全部用名字去匹配。千萬別三個混着用,除非你非常瞭解源代碼中三個混着用怎麼去排序的。

Ø ExcelIgnore 默認所有字段都會和excel去匹配,加了這個註解會忽略該字段

Ø DateTimeFormat 日期轉換,用String去接收excel日期格式的數據會調用這個註解。裏面的value參照java.text.SimpleDateFormat

Ø NumberFormat 數字轉換,用String去接收excel數字格式的數據會調用這個註解。裏面的value參照java.text.DecimalFormat

Ø ExcelIgnoreUnannotated 默認不加ExcelProperty 的註解的都會參與讀寫,加了不會參與

參數
通用參數

Ø ReadWorkbook,ReadSheet 都會有的參數,如果爲空,默認使用上級。

Ø converter 轉換器,默認加載了很多轉換器。也可以自定義。

Ø readListener 監聽器,在讀取數據的過程中會不斷的調用監聽器。

Ø headRowNumber 需要讀的表格有幾行頭數據。默認有一行頭,也就是認爲第二行開始起爲數據。

Ø head 與clazz二選一。讀取文件頭對應的列表,會根據列表匹配數據,建議使用class。

Ø clazz 與head二選一。讀取文件的頭對應的class,也可以使用註解。如果兩個都不指定,則會讀取全部數據。

Ø autoTrim 字符串、表頭等數據自動trim

Ø password 讀的時候是否需要使用密碼

ReadWorkbook(理解成excel對象)參數

Ø excelType 當前excel的類型 默認會自動判斷

Ø inputStream 與file二選一。讀取文件的流,如果接收到的是流就只用,不用流建議使用file參數。因爲使用了inputStream easyexcel會幫忙創建臨時文件,最終還是file

Ø file 與inputStream二選一。讀取文件的文件。

Ø autoCloseStream 自動關閉流。

Ø readCache 默認小於5M用 內存,超過5M會使用 EhCache,這裏不建議使用這個參數。

ReadSheet(就是excel的一個Sheet)參數

Ø sheetNo 需要讀取Sheet的編碼,建議使用這個來指定讀取哪個Sheet

Ø sheetName 根據名字去匹配Sheet,excel 2003不支持根據名字去匹配

註解

Ø ExcelProperty index 指定寫到第幾列,默認根據成員變量排序。value指定寫入的名稱,默認成員變量的名字,多個value可以參照快速開始中的複雜頭

Ø ExcelIgnore 默認所有字段都會寫入excel,這個註解會忽略這個字段

Ø DateTimeFormat 日期轉換,將Date寫到excel會調用這個註解。裏面的value參照java.text.SimpleDateFormat

Ø NumberFormat 數字轉換,用Number寫excel會調用這個註解。裏面的value參照java.text.DecimalFormat

Ø ExcelIgnoreUnannotated 默認不加ExcelProperty 的註解的都會參與讀寫,加了不會參與

參數
通用參數

Ø WriteWorkbook,WriteSheet ,WriteTable都會有的參數,如果爲空,默認使用上級。

Ø converter 轉換器,默認加載了很多轉換器。也可以自定義。

Ø writeHandler 寫的處理器。可以實現WorkbookWriteHandler,SheetWriteHandler,RowWriteHandler,CellWriteHandler,在寫入excel的不同階段會調用

Ø relativeHeadRowIndex 距離多少行後開始。也就是開頭空幾行

Ø needHead 是否導出頭

Ø head 與clazz二選一。寫入文件的頭列表,建議使用class。

Ø clazz 與head二選一。寫入文件的頭對應的class,也可以使用註解。

Ø autoTrim 字符串、表頭等數據自動trim

WriteWorkbook(理解成excel對象)參數

Ø excelType 當前excel的類型 默認xlsx

Ø outputStream 與file二選一。寫入文件的流

Ø file 與outputStream二選一。寫入的文件

Ø templateInputStream 模板的文件流

Ø templateFile 模板文件

Ø autoCloseStream 自動關閉流。

Ø password 寫的時候是否需要使用密碼

Ø useDefaultStyle 寫的時候是否是使用默認頭

WriteSheet(就是excel的一個Sheet)參數

Ø sheetNo 需要寫入的編碼。默認0

Ø sheetName 需要些的Sheet名稱,默認同sheetNo

WriteTable(就把excel的一個Sheet,一塊區域看一個table)參數

Ø tableNo 需要寫入的編碼。默認0

更多學習資料,可以關注下方微信公衆號,回覆關鍵字:Java高級資料 。 即可免費獲取完整的Java高級開發工程師視頻課程。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章