国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用EasyExcel導(dǎo)出表格時合并單元格

這篇具有很好參考價值的文章主要介紹了使用EasyExcel導(dǎo)出表格時合并單元格。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

背景

現(xiàn)在需要將一個導(dǎo)出列表數(shù)據(jù)到Excel表格的功能進(jìn)行改造,將指定列相同數(shù)據(jù)自動合并單元格。
使用EasyExcel導(dǎo)出表格時合并單元格
如上圖所示,指定A、B兩列自動合并,如圖所示(6、7),(8、9),(13、14、15)要自動合并單元格。

EasyExcel 介紹

EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能。

EasyExcel相比其他Excel解析框架(Apache poi和jxl),擁有更好的內(nèi)存消耗管理算法。特別是對07版Excel的解決,EasyExcel重寫了底層解析邏輯,一個3M的Excel解析只需要幾M內(nèi)存,但是用poi解析可能需要100M左右的內(nèi)存。EasyExcel提高了讀取性能,64M內(nèi)存20秒讀取75M的Excel,還有更快的極速模式,但是消耗的內(nèi)存會更多一些。

EasyExcel支持自定義策略合并單元格,可以方便快捷填充數(shù)據(jù)到模板中,有活躍的中文社區(qū)支持,完善的測試用例可以覆蓋大部分業(yè)務(wù)場景的使用。

合并單元格案例講解

使用EasyExcel導(dǎo)出Excel代碼示例:

	@Test
    public void testWrite() throws IOException {
        List<DemoMergeData> resultList = new ArrayList<>();
        resultList.add(DemoMergeData.builder().id(1).sub("張勝男").date("12").build());
        resultList.add(DemoMergeData.builder().id(1).sub("李四").date("224").build());
        resultList.add(DemoMergeData.builder().id(3).sub("王五").date("224").build());
        resultList.add(DemoMergeData.builder().id(4).sub("趙柳").date("224").build());
        resultList.add(DemoMergeData.builder().id(5).sub("趙柳").date("224").build());
        resultList.add(DemoMergeData.builder().id(5).sub("趙柳").date("224").build());
        resultList.add(DemoMergeData.builder().id(8).sub("趙柳").date("224").build());
        resultList.add(DemoMergeData.builder().id(8).sub("趙柳").date("224").build());
        resultList.add(DemoMergeData.builder().id(9).sub("陳琪").date("224").build());
        resultList.add(DemoMergeData.builder().id(10).sub("小白").date("241").build());
        resultList.add(DemoMergeData.builder().id(11).sub("小黑").date("241").build());
        resultList.add(DemoMergeData.builder().id(12).sub("小黑").date("241").build());
        resultList.add(DemoMergeData.builder().id(12).sub("小黑").date("241").build());
        resultList.add(DemoMergeData.builder().id(12).sub("小黑").date("241").build());
        resultList.add(DemoMergeData.builder().id(13).sub("小黑").date("241").build());
        //  設(shè)置文件名稱
        String fileName = "C:\\Users\\Administrator\\Downloads\\test\\t1.xlsx";
        File file = new File(fileName);
        if (!file.exists()) {
            file.createNewFile();
        }

        //  sheet名稱
        EasyExcel.write(fileName, DemoMergeData.class)
                .autoCloseStream(Boolean.TRUE)
                .sheet("測試導(dǎo)出").doWrite(resultList);
    }

導(dǎo)出表格樣式:
使用EasyExcel導(dǎo)出表格時合并單元格

自定義策略一:上下行數(shù)據(jù)相同合并單元格

自定義策略一代碼示例:

public class ExcelFillCellMergeStrategy implements CellWriteHandler {

    private int[] mergeColumnIndex;
    private int mergeRowIndex;
    
    public ExcelFillCellMergeStrategy() {
    }

    public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {
        this.mergeRowIndex = mergeRowIndex;
        this.mergeColumnIndex = mergeColumnIndex;
    }


    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
        //當(dāng)前行
        int curRowIndex = cell.getRowIndex();
        //當(dāng)前列
        int curColIndex = cell.getColumnIndex();

        if (curRowIndex > mergeRowIndex) {
            for (int columnIndex : mergeColumnIndex) {
                if (curColIndex == columnIndex) {
                    mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                    break;
                }
            }
        }
    }



    /**
     * 當(dāng)前單元格向上合并
     *
     * @param cell             當(dāng)前單元格
     * @param curRowIndex      當(dāng)前行
     * @param curColIndex      當(dāng)前列
     */
    private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
        //獲取當(dāng)前行的當(dāng)前列的數(shù)據(jù)和上一行的當(dāng)前列列數(shù)據(jù),通過上一行數(shù)據(jù)是否相同進(jìn)行合并
        Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
        Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
        Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() : preCell.getNumericCellValue();

        // 比較當(dāng)前行的第一列的單元格與上一行是否相同,相同合并當(dāng)前單元格與上一行
        if (curData.equals(preData)) {
            Sheet sheet = writeSheetHolder.getSheet();
            List<CellRangeAddress> mergeRegions = sheet.getMergedRegions();
            boolean isMerged = false;
            for (int i = 0; i < mergeRegions.size() && !isMerged; i++) {
                CellRangeAddress cellRangeAddr = mergeRegions.get(i);
                // 若上一個單元格已經(jīng)被合并,則先移出原有的合并單元,再重新添加合并單元
                if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) {
                    sheet.removeMergedRegion(i);
                    cellRangeAddr.setLastRow(curRowIndex);
                    sheet.addMergedRegion(cellRangeAddr);
                    isMerged = true;
                }
            }
            // 若上一個單元格未被合并,則新增合并單元
            if (!isMerged) {
                CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex);
                sheet.addMergedRegion(cellRangeAddress);
            }
        }
    }

    @Override
    public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {

    }

    @Override
    public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {

    }
}

測試代碼示例:

@Test
    public void testWrite() throws IOException {
        int[] mergeColumnIndex = {0,1};
	    // 需要從第幾行開始合并
        int mergeRowIndex = 1;
        // 數(shù)據(jù)就不初始化了
        List<DemoMergeData> resultList = new ArrayList<>();
        // 設(shè)置文件名稱
        String fileName = "C:\\Users\\Administrator\\Downloads\\test\\t1.xlsx";
        File file = new File(fileName);
        if (!file.exists()) {
            file.createNewFile();
        }

        //  sheet名稱
        EasyExcel.write(fileName, DemoMergeData.class)
                .autoCloseStream(Boolean.TRUE)
                .registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex,mergeColumnIndex))
                .sheet("測試導(dǎo)出").doWrite(resultList);
    }

導(dǎo)出樣式:
使用EasyExcel導(dǎo)出表格時合并單元格

自定義策略二:指定列數(shù)據(jù)都相同才合并單元格

自定義策略二代碼示例:

public class MultiColumnMergeStrategy extends AbstractMergeStrategy {

    // 合并的列編號,從0開始,指定的index或自己按字段順序數(shù)
    private Integer startCellIndex = 0;
    private Integer endCellIndex = 0;

    // 數(shù)據(jù)集大小,用于區(qū)別結(jié)束行位置
    private Integer maxRow = 0;

    // 禁止無參聲明
    private MultiColumnMergeStrategy() {
    }


    public MultiColumnMergeStrategy(Integer maxRow, Integer startCellIndex, Integer endCellIndex) {
        this.startCellIndex = startCellIndex;
        this.endCellIndex = endCellIndex;
        this.maxRow = maxRow;
    }

    // 記錄上一次合并的信息
    private final List<List<String>> dataList = new ArrayList<>();

    /**
     * 每行每列都會進(jìn)入,循環(huán)注意條件限制
     */
    @Override
    protected void merge(Sheet sheet, Cell cell, Head head, int relativeRowIndex) {
        int currentCellIndex = cell.getColumnIndex();
        int currentRowIndex = cell.getRowIndex();

        // 判斷該列是否需要合并
        if (currentCellIndex < startCellIndex || currentCellIndex > endCellIndex) {
            return;
        }

        Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() : cell.getNumericCellValue();
        String currentCellValue = curData.toString();

        List<String> rowList;
        if (dataList.size() > currentRowIndex - 1) {
            rowList = dataList.get(currentRowIndex - 1);
        } else {
            rowList = new ArrayList<>();
            dataList.add(rowList);
        }
        rowList.add(currentCellValue);

        // 結(jié)束的位置觸發(fā)下最后一次沒完成的合并
        if (relativeRowIndex == (maxRow - 1) && currentCellIndex == endCellIndex) {
            System.out.println(JSONObject.toJSONString(dataList));
            List<String> tempList = null;
            Integer tempIndex = null;
            for (int i = 0; i < dataList.size(); i++) {
                if (tempList == null) {
                    tempList = dataList.get(i);
                    tempIndex = i;
                    continue;
                }
                List<String> currList = dataList.get(i);
                if (tempList.equals(currList)) {
                    if (i >= dataList.size() - 1) {
                        // 結(jié)束的位置觸發(fā)下最后一次沒完成的合并
                        for (int j = 0; j < tempList.size(); j++) {
                            sheet.addMergedRegionUnsafe(new CellRangeAddress(tempIndex + 1, i + 1, startCellIndex + j, startCellIndex + j));
                        }
                    }
                    continue;
                }

                // 當(dāng)前行數(shù)據(jù)和上一行數(shù)據(jù)不同且上面有多行相同數(shù)據(jù)時觸發(fā)合并
                if (i - tempIndex > 1) {
                    for (int j = 0; j < tempList.size(); j++) {
                        sheet.addMergedRegionUnsafe(new CellRangeAddress(tempIndex + 1, i, startCellIndex + j, startCellIndex + j));
                    }
                }


                tempIndex = i;
                tempList = currList;


            }

        }
    }
}

測試代碼示例:

@Test
    public void testWrite() throws IOException {
        // 數(shù)據(jù)就不初始化了
        List<DemoMergeData> resultList = new ArrayList<>();
        // 設(shè)置文件名稱
        String fileName = "C:\\Users\\Administrator\\Downloads\\test\\t1.xlsx";
        File file = new File(fileName);
        if (!file.exists()) {
            file.createNewFile();
        }

        //  sheet名稱
        EasyExcel.write(fileName, DemoMergeData.class)
                .autoCloseStream(Boolean.TRUE)
                .registerWriteHandler(new MultiColumnMergeStrategy(resultList.size(),0,1))
                .sheet("測試導(dǎo)出").doWrite(resultList);
    }

導(dǎo)出樣式:
使用EasyExcel導(dǎo)出表格時合并單元格

總結(jié)

EasyExcel功能靈活強(qiáng)大,可以根據(jù)自身業(yè)務(wù)場景去自定義樣式,也可以使用通過模板填充功能實(shí)現(xiàn)導(dǎo)出國際化語言等復(fù)雜功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-489465.html

到了這里,關(guān)于使用EasyExcel導(dǎo)出表格時合并單元格的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 前端vue+elementui導(dǎo)出復(fù)雜(單元格合并,多級表頭)表格el-table轉(zhuǎn)為excel導(dǎo)出

    前端vue+elementui導(dǎo)出復(fù)雜(單元格合并,多級表頭)表格el-table轉(zhuǎn)為excel導(dǎo)出

    需求 :前端對el-table表格導(dǎo)出 插件 : npm install xlsx -S npm install file-saver --save 原理 :直接導(dǎo)出el-table的表格里面的數(shù)據(jù),這樣就會存在缺點(diǎn),只會導(dǎo)出當(dāng)前頁面的數(shù)據(jù),如果需要導(dǎo)出全部數(shù)據(jù),可以自己重新渲染一個全部數(shù)據(jù)不可見的el-table表格,來導(dǎo)出就可以了 擴(kuò)展 :經(jīng)過

    2024年02月04日
    瀏覽(31)
  • 使用EasyExcel實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出

    使用EasyExcel實(shí)現(xiàn)Excel表格的導(dǎo)入導(dǎo)出

    Java解析、生成Excel比較有名的框架有Apache poi、jxl。但他們都存在一個嚴(yán)重的問題就是非常的耗內(nèi)存,poi有一套SAX模式的API可以一定程度的解決一些內(nèi)存溢出的問題,但POI還是有一些缺陷,比如07版Excel解壓縮以及解壓后存儲都是在內(nèi)存中完成的,內(nèi)存消耗依然很大。 easyexcel重

    2024年02月12日
    瀏覽(18)
  • EasyExcel合并單元格(同列相同數(shù)據(jù)合并)

    EasyExcel合并單元格(同列相同數(shù)據(jù)合并)

    合并后效果如下: 合并策略代碼: 使用: 主體代碼來自網(wǎng)絡(luò),按自己業(yè)務(wù)修改,支持多列相同數(shù)據(jù)合并。

    2024年02月12日
    瀏覽(17)
  • EasyExcel合并單元格

    EasyExcel合并單元格

    EasyExcel默認(rèn)情況下寫Excel是一行一行的,單元格不會自動合并,現(xiàn)在需求是合并這幾列中相同的數(shù)據(jù) 開始自己也不想做過多改動代碼,經(jīng)過閱讀EasyExce官方文檔和大量博客之后總結(jié)了一個通用的工具類,重寫接口中的merge方法,然后自己在寫入Excel的時候指定實(shí)體類屬性以及對

    2024年02月15日
    瀏覽(18)
  • easyexcel內(nèi)容追加與單元格合并

    easyexcel內(nèi)容追加與單元格合并

    ? ? 這里的需求是,如果表格不存在,則新建表格,并填入數(shù)據(jù),如果表格存在,那么就追加內(nèi)容,并且支持單元格合并。 ? ? 內(nèi)容追加,需要分兩種方式插入,第一種就是沒有表格,需要生成表頭,并且插入內(nèi)容,第二種就是已經(jīng)有了表格,這個表格作為模板并,不用設(shè)置

    2023年04月22日
    瀏覽(17)
  • Java 導(dǎo)出Excel表格生成下拉框-EasyExcel
  • 關(guān)于Unity使用Aspose.Words創(chuàng)建表格單元格垂直合并不生效情況說明

    關(guān)于Unity使用Aspose.Words創(chuàng)建表格單元格垂直合并不生效情況說明

    ??一、前言 最近在使用Aspose.Words.dll實(shí)現(xiàn)創(chuàng)建表格功能時,遇到了一個讓我費(fèi)解了好幾天的問題——單元格垂直合并失效。我都快要懷疑人生了都,關(guān)鍵是它水平合并沒問題,而且創(chuàng)建別的表格垂直合并也沒問題;況且經(jīng)過我反復(fù)測試,代碼邏輯也是沒有問題的,你說這氣不

    2023年04月11日
    瀏覽(28)
  • easyexcel根據(jù)模板導(dǎo)出Excel文件,表格自動填充問題

    同事在做easyexcel導(dǎo)出Excel,根據(jù)模板導(dǎo)出的時候,發(fā)現(xiàn)導(dǎo)出的表格,總會覆蓋落款的內(nèi)容。 這就很尷尬了,表格居然不能自動填充,直接怒噴工具,哈哈。 然后一起看了一下這個問題。 我找了自己的系統(tǒng)中關(guān)于表格導(dǎo)出的頁面,導(dǎo)出了一下,發(fā)現(xiàn)可以正常擴(kuò)充。 于是排查問

    2024年02月06日
    瀏覽(28)
  • easyExcel 模版導(dǎo)出 中間數(shù)據(jù)縱向延伸,并且對指定列進(jìn)行合并

    easyExcel 模版導(dǎo)出 中間數(shù)據(jù)縱向延伸,并且對指定列進(jìn)行合并

    備注 : 模板注意 用{} 來表示你要用的變量 如果本來就有\(zhòng)\\"{\\\",\\\"}\\\" 特殊字符 用\\\"{\\\",\\\"}\\\"代替 // {} 代表普通變量 {.} 代表是list的變量 {前綴.} 前綴可以區(qū)分不同的list 合并策略代碼 : 導(dǎo)出部分 : 官方文檔 :? 填充Excel | Easy Excel 合并代碼參考 :? https://www.cnblogs.com/monianxd/p/16359369.html

    2024年04月11日
    瀏覽(22)
  • SpringBoot整合Easyexcel實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Excel表格的功能

    SpringBoot整合Easyexcel實(shí)現(xiàn)將數(shù)據(jù)導(dǎo)出為Excel表格的功能

    本文主要介紹基于SpringBoot +MyBatis-Plus+Easyexcel+Vue實(shí)現(xiàn)缺陷跟蹤系統(tǒng)中導(dǎo)出缺陷數(shù)據(jù)的功能,實(shí)現(xiàn)效果如下圖: EasyExcel是一個基于Java的、快速、簡潔、解決大文件內(nèi)存溢出的Excel處理工具。他能讓你在不用考慮性能、內(nèi)存的等因素的情況下,快速完成Excel的讀、寫等功能。 本文

    2024年02月14日
    瀏覽(31)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包