国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java應用EasyExcel工具類(lèi)

發(fā)布時(shí)間:2021-07-17 21:51 來(lái)源:腳本之家 閱讀:0 作者:legendaryhaha 欄目: 編程語(yǔ)言 歡迎投稿:712375056

目錄

一、前言

關(guān)于EasyExcel,它對poi做了進(jìn)一步的封裝,使得整個(gè)編寫(xiě)流程更加的面向對象。好處嘛,我認為流程上更加清晰即易懂、可讀性更好,壞處的話(huà),則是操作上沒(méi)有原生的方式那么靈活。

二、導入

  • StudentVo為實(shí)體類(lèi), 注意實(shí)體中的各個(gè)屬性要和excel按順序一 一對應,建議都用String類(lèi)型,真正插入時(shí),才去做轉換
  • ImportExcelListener 類(lèi)為真正處理數據的類(lèi)
  • CommonService 只是一個(gè)Spring的service bean,用來(lái)執行curd操作
 private CommonService commonService;
    public void importExcel(MultipartFile file) throws IOException {
    // HEAD_ROW_NUMBER為Excel中的頭部行數, 這里的關(guān)于ImportExcelListener的構造方法中HEAD_ROW_NUMBER參數可以根據需要決定傳或者不傳
        EasyExcel.read(file.getInputStream(), StudentVo.class, new ImportExcelListener<StudentVo>(HEAD_ROW_NUMBER, commonService)).sheet().headRowNumber(HEAD_ROW_NUMBER).doRead();
    }

ImportExcelListener 類(lèi)如下,這里根據實(shí)際需要,可以不用泛型。

public class ImportExcelListener<T> extends AnalysisEventListener<T> {
        /**
         * 每隔BATCH_COUNT條存儲數據庫 然后清理list ,方便內存回收
         */
        private static final int BATCH_COUNT = 500;
        private int headRowNum;
        private CommonService commonService;
        private List<T> list = new ArrayList<>();

        public ImportExcelListener(int headRowNumber, CommonService commonService) {
            this.headRowNum = headRowNumber;
            this.commonService = commonService;
        }

        /**
         * 這個(gè)每一條數據解析都會(huì )來(lái)調用
         */
        @Override
        public void invoke(T data, AnalysisContext context) {
            // 這里也可以將data轉為對應實(shí)體, 然后做一些參數校驗
            Integer rowNum = context.readRowHolder().getRowIndex();
           log.info("當前解析的數據為第{}行", rowNum);
          
            list.add(data);
            // 批量保存, 防止一次性數據過(guò)多, 內存溢出
            if (list.size() >= BATCH_COUNT) {
                // 保存
                commonService.save(list);
                list.clear();
            }
        }


        // 在解析之后, 也要記得再判斷是否為空, 不為空要保存一下
        @Override
        public void doAfterAllAnalysed(AnalysisContext context) {
            if (CollectionUtils.isEmpty(list)) {
                return;
            }
            commonService.save(list);
            list.clear();
        }
    }

如果對導入的數據沒(méi)啥特別處要求且數據量也不多,也可以直接采用如下這種方式:

List<Object> data = null;
        try {
            data = EasyExcelFactory.read(file.getInputStream()).sheet().doReadSync();
        } catch (IOException e) {
            log.error("讀取失敗", e);
            throw new BusinessException("讀取失敗");
        }
        // 保存操作
        // ...

三、導出

  • 無(wú)需映射實(shí)體對象, 實(shí)際運用中查出來(lái)數據后, 需要自己去遍歷組裝成List<List<?>>的二維類(lèi)型,表示第幾行第幾列。
public void test() throws FileNotFoundException {
        File file = new File("E:\\work-grandview\\測試.xlsx");
        // 創(chuàng  )建writerBuilder對象,自動(dòng)調整列寬
        ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .autoCloseStream(Boolean.TRUE)
                .build();

        //  List<List<?>>類(lèi)型, 二維數據, 表示第幾行第幾列, 設置表頭內容
        List<List<String>> titleList = new ArrayList<>();
        titleList.add(Arrays.asList("名稱(chēng)", "key", "value"));
        int sheetNum = 0;
        WriteSheet writeSheet = EasyExcel.writerSheet(sheetNum,"導出數據").build();
        excelWriter.write(titleList, writeSheet);

        // 生成導出內容;
        List<List<Object>> content = new ArrayList<>();
        // 10行3列
        for (int i = 0; i < 10; i++) {
            List<Object> dataList = new ArrayList<>();
            for (int j = 0; j < 3; j++) {
                dataList.add(j);
            }
            content.add(dataList);
        }


        // 寫(xiě)入文件
        excelWriter.write(content, writeSheet);
        // 關(guān)閉文件流
        excelWriter.finish();
    }

  • 通過(guò)EasyExcel提供的注解,將實(shí)體映射到對應列中:
@Data
 public class VO {
        @ExcelProperty(value = "姓名", index = 0)
        int name;
        @ExcelProperty(value = "key", index = 1)
        int key;
        @ExcelProperty(value = "value", index = 2)
        int value;
    }

@Test
    public void test() throws FileNotFoundException {
        File file = new File("E:\\work-grandview\\測試.xlsx");
        // 創(chuàng  )建writerBuilder對象,自動(dòng)調整列寬
        ExcelWriter excelWriter = EasyExcel.write(new FileOutputStream(file))
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .autoCloseStream(Boolean.TRUE)
                .build();

        // 生成導出內容;
        List<VO> content = new ArrayList<>();
        // 10行3列
        for (int i = 0; i < 10; i++) {
            VO vo = new VO();
            vo.setKey(i);
            vo.setName(i);
            vo.setValue(i);
           content.add(vo);
        }
		// 創(chuàng  )建sheet, 設置0號表, 實(shí)際運用中可能得創(chuàng  )建多張, 可以遍歷數據, 每滿(mǎn)足n條就創(chuàng  )建i號sheet表
        WriteSheet writeSheet = EasyExcel.writerSheet(0,"導出數據").build();
        // 設置表頭
        writeSheet.setClazz(content.get(0).getClass());
        // 寫(xiě)入文件
        excelWriter.write(content, writeSheet);
        excelWriter.finish();

    }

一開(kāi)始創(chuàng )建后,莫名奇妙多了個(gè)this0 列 , 后 來(lái) 想 了 想 , 原 來(lái) 我 的 實(shí) 體 類(lèi) 是 T e s t 類(lèi) 的 內 部 類(lèi) 來(lái) 著(zhù) , 而 ‘ c o n t e n t . g e t ( 0 ) . g e t C l a s s ( ) ‘ 拿 到 的 是 一 個(gè) 代 理 類(lèi) T e s t 0列,在設置表頭時(shí),同時(shí)被處理為屬性值了。在將VO類(lèi)寫(xiě)到外部后解決。

到此這篇關(guān)于Java應用EasyExcel工具類(lèi)的文章就介紹到這了,更多相關(guān)Java EasyExcel工具類(lèi)內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

日韩成人无码影院| 欧美大黑BBBBBBBBB| 精品一区二区三区在线成人| 九九精品99久久久香蕉| 国产精品爽爽VA在线观看网站| 精品日本一区二区三区在线观看|