精华内容
下载资源
问答
  • easyexcel 合并单元格

    千次阅读 2020-07-25 21:15:07
    easyexcel合并单元格

    easyexcel 合并单元格

     

     

    *********************

    相关注解

     

    ContentLoopMerge:标注在字段上

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    public @interface ContentLoopMerge {
    
        int eachRow() default -1;      //合并行
        int columnExtend() default 1;  //合并列
    }
    

     

    OnceAbsoluteMerge:标注在类上

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    public @interface OnceAbsoluteMerge {
    
        int firstRowIndex() default -1;      //初始行
        int lastRowIndex() default -1;       //最后一行
    
        int firstColumnIndex() default -1;   //初始列
        int lastColumnIndex() default -1;    //最后一列
    }
    

     

     

    *********************

    示例

     

    Test

    @Data
    class Book{
    
        @ContentLoopMerge(eachRow = 2)
        private Integer id;
    
        private String name;
    
        private Double price;
    }
    
    public class Test {
    
        private static final String write_path="e:"+ File.separator+"java"+File.separator+"easyexcel"+File.separator+"write.xlsx";
    
        public static void write(){
            List<Book> list=new ArrayList<>();
    
            for (int i=0;i<5;i++){
                Book book=new Book();
                book.setId(i);
                book.setName("海贼王"+i);
                book.setPrice((double)(i+10));
    
                list.add(book);
            }
    
            EasyExcel.write(write_path,Book.class).sheet().doWrite(list);
        }
    
        public static void main(String[] args){
            write();
        }
    }
    

     

    ****************

    使用测试

     

                            

     

     

    展开全文
  • easyexcel 合并单元格-表头

    千次阅读 2021-02-01 09:04:18
    1. 添加依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>...2.表头(含单元格合并) public List<

    1. 添加依赖

        <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.6</version>
            </dependency>

    2.表头(含单元格合并)

     public List<List<String>> ExcelHead() {
            List<List<String>> headList = new ArrayList();
    
            headList.add(new ArrayList() {{
                add("时间");
                add("参数名\\回路名");
            }});
            headList.add(new ArrayList() {{
                add("时间"        }});
            headList.add(new ArrayList() {{
                add("时间");
                add("电流I(A)");
            }});
            headList.add(new ArrayList() {{
                add("环境温度:" + temperature);
                add("相电压U");
            }});
            headList.add(new ArrayList() {{
                add("环境温度");
                add("线电压U");
            }});
            headList.add(new ArrayList() {{
                   add("环境温度");
                add("频率(Hz)");
            }});
            headList.add(new ArrayList() {{
                add("环境湿度");
                add("开关分合(分\\合)");
            }});
            headList.add(new ArrayList() {{
                 add("环境湿度");
                add("总有功功率(kW)");
            }});
            headList.add(new ArrayList() {{
                add("抄表记录单");
                add("总无功功率(kVar)");
            }});
            headList.add(new ArrayList() {{
                add("抄表记录单");
                add("总功率因数");
            }});
            headList.add(new ArrayList() {{
                add("抄表记录单");
                add("正向有功电能(kW.h)");
            }});
            headList.add(new ArrayList() {{
                add("项目");
                add("正向无功电能(kVar.h)");
            }});
            headList.add(new ArrayList() {{
                add("表单号");
                add("所属变压器");
            }});
            headList.add(new ArrayList() {{
                add("表单号");
                add("变压器温度(℃)");
            }});
    
            return headList;
        }

    3. 数据逻辑

        List<HashMap> data = statisticmapper.runreport(statisticdto);
            for (int i = 0; i < data.size(); i++) {
                String id = data.get(i).get("id").toString();
                String name = data.get(i).get("equipment_name").toString();
                if (data.get(i).get("paramid") == null) continue;
                String paramid = data.get(i).get("paramid").toString();
                String point_id = data.get(i).get("point_id").toString();
                String value = data.get(i).get("value").toString();
                switch (paramid) {
                    case "e2fa092c-6146-11eb-82f0-6c2b59bec1ff":
                        temperature = value + "℃ ";
                        continue;
                    case "70536171-6147-11eb-82f0-6c2b59bec1ff":
                        humidity = value + "%";
                        continue;
                }
    
                if (!devicecheck.contains(id)) {
                    tosave.add(rowdata(name, "A相"));
                    tosave.add(rowdata(name, "B相"));
                    tosave.add(rowdata(name, "C相"));
                    devicecheck.add(id);
                }
    
                if (dic.containsKey(id + point_id)) continue;
                dic.put(id + point_id, i);
    
                int index = devicecheck.indexOf(id) * 3;
                switch (paramid) {
                    case "069d9c73-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(5, value);
                        tosave.get(index + 1).set(5, value);
                        tosave.get(index + 2).set(5, value);
                        break;
                    case "068d17d6-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(7, value);
                        tosave.get(index + 1).set(7, value);
                        tosave.get(index + 2).set(7, value);
                        break;
                    case "071ce9e3-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(8, value);
                        tosave.get(index + 1).set(8, value);
                        tosave.get(index + 2).set(8, value);
                        break;
                    case "05b23645-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(9, value);
                        tosave.get(index + 1).set(9, value);
                        tosave.get(index + 2).set(9, value);
                        break;
                    case "062ee255-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(10, value);
                        tosave.get(index + 1).set(10, value);
                        tosave.get(index + 2).set(10, value);
                        break;
                    case "06dd3edb-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(11, value);
                        tosave.get(index + 1).set(11, value);
                        tosave.get(index + 2).set(11, value);
                        break;
                    case "061fa440-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(2, value);
                        break;
                    case "06fa867e-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(3, value + "kV");
                        break;
                    case "05952cc2-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index).set(4, "Uab(" + value + "kV)");
                        break;
                    case "06805737-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index + 1).set(2, value);
                        break;
                    case "05f1ca1b-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index + 1).set(3, value + "kV");
                        break;
                    case "06ab9dbf-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index + 1).set(4, "Uab(" + value + "kV)");
                        break;
                    case "0604e966-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index + 2).set(2, value);
                        break;
                    case "058946a7-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index + 2).set(3, value + "kV");
                        break;
                    case "06b858c6-6148-11eb-82f0-6c2b59bec1ff":
                        tosave.get(index + 2).set(4, "Uab(" + value + "kV)");
                        break;
                }
            }
     public List<String> rowdata(String name, String type) {
            return new ArrayList() {{
                add(name);
                add(type);
                add("-");
                add("-");
                add("-");
                add("-");
                add("-");
                add("-");
                add("-");
                add("-");
                add("-");
                add("-");
                add("无");
                add("-");
            }};
        }

    3.excel

       List<List<String>> head = ExcelHead();
    
            EasyExcel.write(fileUrl).head(head).sheet(sheetname)
               //     .registerWriteHandler(StyleStrategy())
               //     .registerWriteHandler(new ReportMergeStrategy(devicecheck.size()))//自定义合并 单元格
               //     .registerWriteHandler(new RowWriteHandler())
                    .doWrite(tosave);

    4. 结果

    时间环境温度环境湿度抄表记录单项目表单号
    参数名\回路名电流I(A)相电压U线电压U频率(Hz)开关分合(分\合)总有功功率(kW)总无功功率(kVar)总功率因数正向有功电能(kW.h)正向无功电能(kVar.h)所属变压器变压器温度(℃)
    1#高压出线A相0.0010.54kVUab(10.54kV)50.00-0.00-0.00---
    1#高压出线B相0.0010.52kVUab(10.50kV)50.00-0.00-0.00---
    1#高压出线C相0.0010.50kVUab(10.52kV)50.00-0.00-0.00---

     

    展开全文
  • EasyExcel合并单元格(一)

    千次阅读 2021-02-01 01:21:09
    前言 导出excel,这里介绍每隔2行... * 合并单元格 * @date 01/31/2021 03:11 */ public class Demo { /** * 合并单元格 */ @Test public void testMyMergeWrite() { // String fileName = TestFileUtil.getPat

    前言

    导出excel,介绍如何使用LoopMergeStrategy实现简单的合并

    效果

    每隔2行,合并一次

    在这里插入图片描述

    横向合并

    在这里插入图片描述

    横向和纵向合并

    在这里插入图片描述

    实现

    导入依赖

     <!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.7</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>30.1-jre</version>
            </dependency>
    
            <!-- springboot test启动器 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
    

    单元测试

    /**
     * 合并单元格
     * @date 01/31/2021 03:11
     */
    public class Demo {
    
        /**
         * 合并单元格
         */
        @Test
        public void testMyMergeWrite() {
    
            String fileName = "/Users/quanlinglong/Downloads/mergeDemo/" + "mymergeWrite" + System.currentTimeMillis() + ".xlsx";
            System.out.println("fileName = " + fileName);
    
            // 每隔2行合并一次,横向合并1列,从第0列开始
    //        LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 1, 0);
            // 上面的等价于
    //        LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 0);
    
            // 从第columnIndex列开始,向右合并(columnExtend-1)列
    //        LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(1, 2, 0);
    
            // 合并2行2列
            LoopMergeStrategy loopMergeStrategy = new LoopMergeStrategy(2, 2, 0);
    
            EasyExcel.write(fileName, WriteDemo.DemoData.class)
                    .registerWriteHandler(loopMergeStrategy)
                    .sheet("aaa")
                    .doWrite(data());
        }
    
        private List<List<Object>> data() {
            List<List<Object>> result = new ArrayList<>();
            for (int i = 0; i < 3; i++) {
                result.add(Lists.newArrayList("标题" + i, new Date(), i * 0.1));
            }
            return result;
        }
    }
    
    

    分析LoopMergeStrategy类,它继承AbstractRowWriteHandler,在afterRowDispose方法里对每行做了处理,LoopMergeStrategy的构造函数传参是用来设置合并范围CellRangeAddress,再添加到当前sheet。

    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
            if (!isHead) {
                if (relativeRowIndex % this.eachRow == 0) {
                    CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum(), row.getRowNum() + this.eachRow - 1, this.columnIndex, this.columnIndex + this.columnExtend - 1);
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(cellRangeAddress);
                }
    
            }
        }
    

    CellRangeAddress构造函数有4个参数
    参数
    0:合并起始行
    1:合并终止行
    2:合并起始列
    3:合并终止列

     CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum(), row.getRowNum() + this.eachRow - 1, this.columnIndex, this.columnIndex + this.columnExtend - 1);
     writeSheetHolder.getSheet().addMergedRegionUnsafe(cellRangeAddress);
    

    构造函数传进来的eachRow, columnExtend, columnIndex,都用在这里了

    相关链接
    easyexcel 动态合并单元格

    展开全文
  • easyexcel 合并单元格(非注解)

    千次阅读 热门讨论 2020-09-16 14:02:27
    --引入 阿里的 easyexcel 同时需要引入 asm 或者 cglib--> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.4</...

    引入 jar

          <!--引入 阿里的  easyexcel  如果报错 需要引入  asm   jar-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                  <version>2.2.6</version>
            </dependency>
        <!--  <dependency>
                <groupId>org.ow2.asm</groupId>
                <artifactId>asm</artifactId>
                <version>9.0-beta</version>
            </dependency>-->
    

    1 生成表头和数据

    package com.example.jddemo.excel.mergecell;
    
    import com.alibaba.excel.EasyExcel;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MergeCell {
    
    
        public static void main(String[] args) {
            // 写法1
            String fileName = "D:\\" + System.currentTimeMillis() + ".xlsx";
            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
            EasyExcel.write(fileName).head(head()).sheet("模板")
                    .registerWriteHandler(new MyMergeStrategy())//自定义合并 单元格
                    .doWrite(dataList());
        }
    
        /**
         * 创建表头
         * @return
         */
        private static List<List<String>> head() {
            List<List<String>> list = new ArrayList<List<String>>();
            List<String> head0 = new ArrayList<String>();
            head0.add("字符串");
            List<String> head1 = new ArrayList<String>();
            head1.add("数字");
            List<String> head2 = new ArrayList<String>();
            head2.add("日期");
            list.add(head0);
            list.add(head1);
            list.add(head2);
            return list;
        }
    
        /**
         * 创建数据
         * @return
         */
        private static List<List<Object>> dataList() {
            List<List<Object>> list = new ArrayList<List<Object>>();
            for (int i = 0; i < 3; i++) {
                List<Object> data = new ArrayList<Object>();
                data.add("字符串" + i);
                data.add("数字" + i);
                data.add("时间" + i);
                list.add(data);
            }
            return list;
        }
    }
    
    

    2合并单元格

    package com.example.jddemo.excel.mergecell;
    
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.merge.AbstractMergeStrategy;
    import org.apache.commons.collections.CollectionUtils;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MyMergeStrategy extends AbstractMergeStrategy {
        //合并坐标集合
        private List<CellRangeAddress> cellRangeAddresss;
        //构造
        public MyMergeStrategy() {
            List<CellRangeAddress> list = new ArrayList<>();
            //合并 单元格坐标
            CellRangeAddress item1 = new CellRangeAddress(0, 0, 2, 5);
            CellRangeAddress item2 = new CellRangeAddress(2, 2, 2, 5);
            CellRangeAddress item3 = new CellRangeAddress(3, 3, 0, 1);
            list.add(item1);
            list.add(item2);
            list.add(item3);
            this.cellRangeAddresss = list;
        }
        /**
         * merge
         * @param sheet
         * @param cell
         * @param head
         * @param relativeRowIndex
         */
        @Override
        protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
            //合并单元格
            /**
             *  ****加个判断:if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {}****
             * 保证每个cell被合并一次,如果不加上面的判断,因为是一个cell一个cell操作的,
             * 例如合并A2:A3,当cell为A2时,合并A2,A3,但是当cell为A3时,又是合并A2,A3,
             * 但此时A2,A3已经是合并的单元格了
             */
            if (CollectionUtils.isNotEmpty(cellRangeAddresss)) {
                if (cell.getRowIndex() == 1 && cell.getColumnIndex() == 0) {
                    for (CellRangeAddress item : cellRangeAddresss) {
                        sheet.addMergedRegionUnsafe(item);
                    }
                }
            }
        }
    }
    
    
    

    执行测试

    public static void main(String[] args) {
            // 写法1
            String fileName = "D:\\" + System.currentTimeMillis() + ".xlsx";
            // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
            EasyExcel.write(fileName).head(head()).sheet("模板")
                    .registerWriteHandler(new MyMergeStrategy())//自定义合并 单元格
                    .doWrite(dataList());
        }
    

    合并后效果

    在这里插入图片描述
    下篇文章讲述如何自定义单元格样式: 点击跳转下篇文章

    展开全文
  • easyExcel 2.1.7 poi 3.17 springboot 2.2.5 lombok 1.18.12
  • easyexcel读取合并单元格

    千次阅读 热门讨论 2020-12-01 18:01:43
    文章目录easy-excel读取合并单元格一、设置读取额外信息二、重写Listener中的extra()方法,获取合并单元格的信息三、遍历合并单元格的信息四、代码清单1. UploadDataListener.java2. ExcelAnalysisHelper.java 一、...
  • easyexcel 动态合并单元格

    千次阅读 2020-12-01 14:54:08
    easyexcel 动态合并单元格 目前操作excel文档的底层都是用poi来进行的,在早期工作开发过程中,是基于poi,然后对每一个数据单元格进行操作代码编写,后面有一些比较好的开源项目,像easyexcel、easypoi、hutool等,...
  • //需要做合并单元格,对应的列数 int[] mergeColumeIndex = {0,1,2,3,4,5,6,7,8,9,10,11}; 以上可多可少 , 看自己实际需要 。 然后就是, EasyExcel.write(response.getOutputStream(), 导出.class)
  • 根据业务需求会有导出中需要合并的功能,但是当根据数据合并时又不能使用注解来进行合并,只能自定义合并,根据官网中介绍可以使用第二种方式,官网地址https://www.yuque.com/easyexcel/doc/write#cac25459 ...
  • EasyExcel解析合并单元格@ExcelProperty

    万次阅读 2020-12-23 15:38:30
    } /** * 处理合并单元格 * * @param data 解析数据 * @param extraMergeInfoList 合并单元格信息 * @param headRowNumber 起始行 * @return 填充好的解析数据 */ private List<T> explainMergeData(List<T> data, ...
  • easyexcel 导入、导出合并单元格的表格 现在经常遇到导入导出表格,又有列重复的数据,想要合并,手动有太慢的(所以直接导入或导入和并的表格) 1. 引入pom 引入pom 参考 java导入Excel(使用阿里巴巴的easyexcel...
  • 因为POI/EasyExcel合并单元格的数据只读取一次,需要把为空的单元格也赋值,这是核心技术难点。 对数据进行校验、封装然后写入数据库 存在校验不通过的数据返回给前端,所有数据校验通过写入数据库。 相关代码 ...
  • poi导入/导出Excel表格,合并单元格的读取和设置
  • EasyExcel填充时合并单元格

    千次阅读 2021-01-20 17:03:41
    由于填充时第二行开始,easyexcel不会自动合并单元格,所以需要自定义handler根据上一行的合并信息自行合并 public class MyHandler extends AbstractMergeStrategy { @Override protected void merge(Sheet ...
  • 1 pom.xml(Maven配置文件) cn.hutool hutool-all 5.5.1 com.alibaba easyexcel 2.2.8 2 CustomMergeHandler(自定义合并单元格处理器) package com.easyexcel; import cn.hutool.core.util.StrUtil; import...
  • EasyExcel导出动态合并单元格策略

    千次阅读 2020-12-22 15:49:06
    EasyExcel导出动态合并单元格策略 1.导入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </...
  • 使用POI做导出没有问题,样式也OK,也能导出,但是,数据量过大的时候,会内存溢出,于是使用EasyExcel导出避免内存溢出。 EasyExcel也可用于普通导出。 一.先说创建的样式 二.创建结果Bean,为对应的表头 @...
  • easyExcel导出表格及合并单元格

    千次阅读 2021-02-03 14:43:47
    easyExcel导出表格及合并单元格 前言 废话不多说,直接上效果图。 效果图 合并之前导出的: 合并之后导出的: 代码的实现主要是合并之后的,为了更好的分清数据之间的关系。 二、代码 目录 <只需要注意红色的&...
  • EasyExcel导出自定义合并单元格策略

    千次阅读 2019-12-25 17:15:06
    EasyExcel导出自定义合并单元格策略 调用方式 //引用自定义合并单元格 ExcelWriter excelWriter = EasyExcel.write(outputStream) .withTemplate(getTemplateInputStream("excel_templates/xxx.xlsx")) .regi...
  • EasyExcel: ... 这里主要是数据写入excel 并且将单元格合并 第一步 引入EasyExcel依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</arti...
  • 合并单元格的数据顺序,和数据填入的顺序不一样,会导致excel数据展示紊乱。 所以在进行分组时需要指定排序规则,使用TreeMap来进行数据存储,可以保证数据按字符顺序进行排序。 Map, Long> clusterGroup = ...
  • 但客户实际需求是根据条款内容的行数进行合并(也就是图中第三种),第二列和第三列对应的考核部门以及推送状态是动态行数数量不固定的,有easyExcel运用的熟练的大佬指点一下我该如何编写合并的方法?目前用的2.2.3...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 741
精华内容 296
关键字:

easyexcel合并单元格