使用 EasyExcel 在 Android 應用中實現(xiàn)高效的 Excel 文件操作

在 Android 應用開發(fā)中,操作 Excel 文件是一項常見的需求勇劣。為了簡化開發(fā)過程并提供更強大的功能怎棱,我們可以使用第三方庫來處理 Excel 文件。使用 EasyExcel 實現(xiàn) Excel 文件操作桦踊。

Apache POI:

Apache POI 是一個流行的 Java 庫,提供了強大的功能來讀取终畅、寫入和操作 Microsoft Office 格式的文件籍胯,包括 Excel 文件∩耄可以通過以下方式將 Apache POI 庫引入您的項目:

implementation 'org.apache.poi:poi:5.0.0'
implementation 'org.apache.poi:poi-ooxml:5.0.0'

EasyExcel:

EasyExcel 是一個基于 Apache POI 封裝的易用的 Excel 文件處理庫芒炼,提供了簡潔的 API,使得操作 Excel 文件更加簡單和高效术徊。

implementation 'com.alibaba:easyexcel:2.4.3'

讀取 Excel 文件

// 讀取 Excel 文件
String filePath = "path/to/excel/file.xlsx";
ExcelReader excelReader = EasyExcel.read(filePath).build();
List<MyData> dataList = excelReader.readAll(MyData.class, new AnalysisEventListener<MyData>() {
    @Override
    public void invoke(MyData data, AnalysisContext context) {
        // 處理每一行的數(shù)據(jù)
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 數(shù)據(jù)讀取完成
    }
});
excelReader.finish();

寫入 Excel 文件

// 寫入 Excel 文件
String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class).sheet("Sheet1").doWrite(dataList);

寫入復雜數(shù)據(jù)結(jié)構(gòu):

EasyExcel 支持將復雜的數(shù)據(jù)結(jié)構(gòu)寫入到 Excel 文件中本刽,例如嵌套的對象、Map赠涮、List 等子寓。您可以使用 @ExcelProperty 注解來指定每個字段對應的 Excel 列,使用 @ExcelIgnore 注解來忽略某些字段笋除。

public class MyData {
    @ExcelProperty("姓名")
    private String name;

    @ExcelProperty("年齡")
    private int age;

    // 構(gòu)造函數(shù)斜友、getter 和 setter 方法省略
}

List<MyData> dataList = new ArrayList<>();
// 添加數(shù)據(jù)到 dataList

String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class).sheet("Sheet1").doWrite(dataList);

數(shù)據(jù)轉(zhuǎn)換和校驗:

EasyExcel 提供了數(shù)據(jù)轉(zhuǎn)換和校驗的功能,您可以使用 @ExcelProperty 注解的 converter 屬性來指定數(shù)據(jù)轉(zhuǎn)換器垃它,使用 @ExcelProperty 注解的 validator 屬性來指定數(shù)據(jù)校驗器鲜屏。

public class AgeConverter implements Converter<Integer> {
    @Override
    public Integer convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        // 將年齡轉(zhuǎn)換為 Excel 數(shù)據(jù)
    }

    @Override
    public Integer convertToJavaData(String value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        // 將 Excel 數(shù)據(jù)轉(zhuǎn)換為年齡
    }
}

public class MyData {
    @ExcelProperty(value = "年齡", converter = AgeConverter.class)
    private int age;

    // 構(gòu)造函數(shù)、getter 和 setter 方法省略
}

大數(shù)據(jù)量寫入和讀裙础:

EasyExcel 支持大數(shù)據(jù)量的寫入和讀取洛史,通過使用 excelWriterexcelReaderfinish 方法,可以實現(xiàn)分批次寫入和讀取數(shù)據(jù)酱吝,避免占用過多內(nèi)存也殖。

ExcelWriter excelWriter = EasyExcel.write("path/to/save/excel/file.xlsx").build();
WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build();

// 分批次寫入數(shù)據(jù)
for (int i = 0; i < totalDataSize; i += batchSize) {
    List<MyData> dataList = fetchData(i, batchSize); // 模擬獲取數(shù)據(jù)的方法
    excelWriter.write(dataList, writeSheet);
}

excelWriter.finish();

ExcelReader excelReader = EasyExcel.read("path/to/excel/file.xlsx").build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();

// 分批次讀取數(shù)據(jù)
List<MyData> dataList = new ArrayList<>();
excelReader.read(readSheet, new AnalysisEventListener<MyData>() {
    @Override
    public void invoke(MyData data, AnalysisContext context) {
        dataList.add(data);
        if (dataList.size() >= batchSize) {
            processData(dataList); // 處理數(shù)據(jù)

的方法
            dataList.clear();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        processData(dataList); // 處理最后一批數(shù)據(jù)
    }
});

excelReader.finish();

通過分批次處理數(shù)據(jù),可以提高性能和內(nèi)存利用率务热。

設置表頭樣式:

可以使用TableStyle類來設置表頭的樣式忆嗜,包括字體己儒、背景色、邊框等捆毫。示例代碼:

// 創(chuàng)建表頭樣式
TableStyle tableStyle = new TableStyle();
Font font = new Font();
font.setBold(true);
tableStyle.setTableHeadFont(font);
tableStyle.setTableHeadBackgroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
tableStyle.setTableHeadBorderStyle(BorderStyle.THIN);

String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class)
        .registerWriteHandler(new TableStyleWriteHandler(tableStyle))
        .sheet("Sheet1")
        .doWrite(dataList);

我們創(chuàng)建了一個TableStyle對象闪湾,并設置了表頭字體為粗體、背景色為灰色冻璃、邊框為細線响谓。然后,我們通過registerWriteHandler()方法將這個樣式應用于寫入操作省艳,實現(xiàn)了表頭樣式的設置。

自定義監(jiān)聽器:

EasyExcel 提供了監(jiān)聽器接口嫁审,允許在讀取和寫入 Excel 文件時處理特定事件跋炕。可以實現(xiàn)AnalysisEventListener接口或WriteHandler接口律适,并重寫相應的方法來實現(xiàn)自定義監(jiān)聽器辐烂。

// 自定義讀取監(jiān)聽器
public class MyReadListener extends AnalysisEventListener<MyData> {
    @Override
    public void invoke(MyData data, AnalysisContext context) {
        // 處理每一行的數(shù)據(jù)
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 數(shù)據(jù)讀取完成
    }
}

// 自定義寫入監(jiān)聽器
public class MyWriteListener extends WriteHandlerAdapter {
    @Override
    public void sheet(int sheetNo, Sheet sheet) {
        // 在寫入每個工作表之前的處理
    }

    @Override
    public void row(int rowNum, Row row) {
        // 在寫入每一行之前的處理
    }

    @Override
    public void cell(int cellNum, Cell cell) {
        // 在寫入每個單元格之前的處理
    }
}

// 使用自定義監(jiān)聽器進行讀取和寫入操作
String filePath = "path/to/excel/file.xlsx";
ExcelReader excelReader = EasyExcel.read(filePath, MyData.class, new MyReadListener()).build();
excelReader.read();

String filePath = "path/to/save/excel/file.xlsx";
ExcelWriter excelWriter = EasyExcel.write(filePath, MyData.class)
        .registerWriteHandler(new MyWriteListener())
        .build();
excelWriter.write(dataList);
excelWriter.finish();

創(chuàng)建了MyReadListenerMyWriteListener,分別繼承自AnalysisEventListenerWriteHandlerAdapter捂贿。通過在讀取和寫入操作中傳入自定義監(jiān)聽器纠修,可以實現(xiàn)對讀取和寫入過程的定制化處理。

處理空白單元格:

EasyExcel 默認會跳過空白單元格厂僧,不進行讀取或?qū)懭氩僮骺鄄荨H绻胍幚砜瞻讍卧瘢梢允褂?code>@ExcelProperty注解的defaultValue屬性來設置默認值颜屠。

public class MyData {
    @ExcelProperty(value = "姓名", defaultValue = "未知")
    private String name;

    @ExcelProperty(value = "年齡", defaultValue = "0")
    private int age;

    // 構(gòu)造函數(shù)辰妙、getter 和 setter 方法省略
}

// 讀取 Excel 文件
String filePath = "path/to/excel/file.xlsx";
ExcelReader excelReader = EasyExcel.read(filePath).build();
List<MyData> dataList = excelReader.readAll(MyData.class);
excelReader.finish();

// 寫入 Excel 文件
String filePath = "path/to/save/excel/file.xlsx";
EasyExcel.write(filePath, MyData.class).sheet("Sheet1").doWrite(dataList);

通過在@ExcelProperty注解中設置defaultValue屬性,為姓名和年齡字段指定了默認值甫窟。這樣密浑,在讀取過程中,如果某個單元格為空粗井,將會使用指定的默認值進行填充尔破;在寫入過程中,如果某個字段的值為默認值浇衬,則會將默認值寫入到對應的單元格中懒构。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市径玖,隨后出現(xiàn)的幾起案子痴脾,更是在濱河造成了極大的恐慌,老刑警劉巖梳星,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赞赖,死亡現(xiàn)場離奇詭異滚朵,居然都是意外死亡,警方通過查閱死者的電腦和手機前域,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門辕近,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匿垄,你說我怎么就攤上這事移宅。” “怎么了椿疗?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵漏峰,是天一觀的道長。 經(jīng)常有香客問我届榄,道長浅乔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任铝条,我火速辦了婚禮靖苇,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘班缰。我一直安慰自己贤壁,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布埠忘。 她就那樣靜靜地躺著脾拆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪给梅。 梳的紋絲不亂的頭發(fā)上假丧,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音动羽,去河邊找鬼包帚。 笑死,一個胖子當著我的面吹牛运吓,可吹牛的內(nèi)容都是我干的渴邦。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼拘哨,長吁一口氣:“原來是場噩夢啊……” “哼谋梭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倦青,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤瓮床,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體隘庄,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡踢步,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了丑掺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片获印。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖街州,靈堂內(nèi)的尸體忽然破棺而出兼丰,到底是詐尸還是另有隱情,我是刑警寧澤唆缴,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布鳍征,位于F島的核電站,受9級特大地震影響面徽,放射性物質(zhì)發(fā)生泄漏蟆技。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一斗忌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旺聚,春花似錦织阳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碱璃,卻和暖如春弄痹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嵌器。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工肛真, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人爽航。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓蚓让,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讥珍。 傳聞我的和親對象是個殘疾皇子历极,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容