精华内容
下载资源
问答
  • 如何计算合并后的单元格数据
    千次阅读
    2021-11-09 17:49:02

    1、引入easyexcel依赖

    !-- 阿里开源easyexcel-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.0-beta2</version>
            </dependency>

    2、ExcelMergeUtil工具类

    package com.sdy.resdir.biz.util;
    
    
    import com.alibaba.excel.metadata.CellData;
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.handler.CellWriteHandler;
    import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
    import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellType;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    import java.math.BigDecimal;
    import java.util.List;
    
    import static org.apache.poi.ss.usermodel.CellType.NUMERIC;
    
    public class ExcelMergeUtil implements CellWriteHandler {
        private int[] mergeColumnIndex;
        private int mergeRowIndex;
    
        public ExcelMergeUtil() {
        }
    
        public ExcelMergeUtil(int mergeRowIndex, int[] mergeColumnIndex) {
            this.mergeRowIndex = mergeRowIndex;
            this.mergeColumnIndex = mergeColumnIndex;
        }
    
        @Override
        public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        @Override
        public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        @Override
        public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
            //当前行
            int curRowIndex = cell.getRowIndex();
            //当前列
            int curColIndex = cell.getColumnIndex();
    
            if (curRowIndex > mergeRowIndex) {
                for (int i = 0; i < mergeColumnIndex.length; i++) {
                    if (curColIndex == mergeColumnIndex[i]) {
                        mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
                        break;
                    }
                }
            }
        }
    
    
        /**
         * 当前单元格向上合并
         *
         * @param writeSheetHolder
         * @param cell             当前单元格
         * @param curRowIndex      当前行
         * @param curColIndex      当前列
         */
        private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
            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();
            // 将当前单元格数据与上一个单元格数据比较
            Boolean dataBool = preData.equals(curData);
            //此处需要注意:因为我是按照工程名称确定是否需要合并的,所以获取每一行第二列数据和上一行第一列数据进行比较,如果相等合并,getCell里面的值,是工程名称所在列的下标
            BigDecimal d1 = new BigDecimal(cell.getRow().getCell(0).getNumericCellValue());
            BigDecimal d2 = new BigDecimal(cell.getSheet().getRow(curRowIndex - 1).getCell(0).getNumericCellValue());
            Boolean bool = d1.compareTo(d2) == 0 ? true:false;
            // 原始的
            // Boolean bool =  cell.getRow().getCell(1).getStringCellValue().equals(cell.getSheet().getRow(curRowIndex - 1).getCell(1).getStringCellValue());
            if (dataBool && bool) {
                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);
                    // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
                    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);
                }
            }
        }
    }
    
    
    
    
    
    
    
    
    
    

    3、导出的excel标题

    package com.sdy.resdir.biz.vo;
    
    import com.alibaba.excel.annotation.ExcelProperty;
    import com.alibaba.excel.annotation.write.style.ColumnWidth;
    import com.alibaba.excel.metadata.BaseRowModel;
    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.sdy.common.utils.DateUtil;
    import io.swagger.annotations.ApiModel;
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import lombok.experimental.Accessors;
    
    import java.util.Date;
    
    /**
     * Excel模板文件类
     *
     * @author hyh
     */
    @Data
    @EqualsAndHashCode(callSuper = true)
    @Accessors(chain = true)
    public class ResItemExcelVo extends BaseRowModel {
    
        /**
         * 序号
         */
        @ExcelProperty(value = {"资源基本信息", "序号"},index = 0)
        private Integer resNo;
    
        /**
         * 资源名称
         */
        @ColumnWidth(20)
        // @ExcelProperty(value = "资源名称",index = 1)
        @ExcelProperty(value = {"资源基本信息", "资源名称"}, index = 1)
        private String resName;
    
        /**
         * 资源类型
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "资源类型"} ,index = 2)
        private String resType;
    
        /**
         * 资源提供部门
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "资源提供部门"},index = 3)
        private String resSourceDept;
    
        /**
         * 资源权限
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "资源权限"},index = 4)
        private String resPower;
    
        /**
         * 资源层级(1.省级 2.市级 3.区级)
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "资源层级"},index = 5)
        private String resLevel;
    
        /**
         * 归集情况(1.已上线 2.未上线)
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "归集情况"},index = 6)
        private String collectionSituation;
    
        /**
         * 是否导入省里(0-否,1-是)
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "是否导入省里"},index = 7)
        private String isImport;
    
        /**
         * 回流标记(0-否,1-是)
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "是否回流"}, index = 8)
        private String backFlow;
    
        /**
         * 单位名称
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"资源基本信息", "单位名称"}, index = 9)
        private String companyName;
    
        /**
         * 数据项
         */
        @ColumnWidth(10)
        @ExcelProperty(value = {"编目信息","数据项"}, index = 10)
        private String chineseName;
    
        /**
         * 英文名称
         */
        @ColumnWidth(20)
        @ExcelProperty(value = {"编目信息","英文名称"}, index = 11)
        private String englishName;
    
        /**
         * 字段类型
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","字段类型"}, index = 12)
        private String fieldType;
    
        /**
         * 字段长度
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","字段长度"}, index = 13)
        private String fieldLength;
    
        /**
         * 字段精度
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","字段精度"}, index = 14)
        private String fieldAccuracy;
    
        /**
         * 是否主键
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","是否主键"}, index = 15)
        private String keywords;
    
        /**
         * 是否字典项(0-否,1-是)
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","是否字典项"}, index = 16)
        private String isDictionary;
    
        /**
         * 字段描述
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","字段描述"}, index = 17)
        private String fieldDesc;
    
        /**
         * 是否为空(0-否,1-是)
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","是否为空"}, index = 18)
        private String isEmpty;
    
        /**
         * 默认值
         */
        @ColumnWidth(15)
        @ExcelProperty(value = {"编目信息","默认值"}, index = 19)
        private String defaultValue;
    
        /**
         * 共享属性
         */
        @ColumnWidth(18)
        @ExcelProperty(value = {"编目信息","共享属性"}, index = 20)
        private String shareAttribute;
    
        /**
         * 共享条件
         */
        @ColumnWidth(18)
        @ExcelProperty(value = {"编目信息","共享条件"}, index = 21)
        private String shareCondition;
    
        /**
         * 开放属性
         */
        @ColumnWidth(18)
        @ExcelProperty(value = {"编目信息","开放属性"}, index = 22)
        private String openAttribute;
    
    
    }
    

    4、控制层调用

    public void downLoadResItem(HttpServletResponse response, String resName, Integer isOnline, Integer resType, Integer resLevel, Integer resPower, Integer resPowerDept, Integer realmId) throws IOException {
            if (StringUtil.isNotBlank(resName)) {
                resName = URLDecoder.decode(resName, "UTF-8");
            }
            List<RdResourceDirExcelDTO> rdResourceDirList = rdResourceDirService.getList(resName, isOnline, resType, resLevel, resPower, resPowerDept, realmId);
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("utf-8");
            String fileName = URLEncoder.encode("资源列表下载", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
            ServletOutputStream output = response.getOutputStream();
            ExcelWriter writer = new ExcelWriter(output, ExcelTypeEnum.XLS, true);
            Sheet sheet = new Sheet(1, 0, ResItemExcelVo.class);
            // sheet.setSheetName("第一页");
            List<ResItemExcelVo> voList = setResItemData(rdResourceDirList);
            // writer.write(voList, sheet);
            //需要合并的列
            int[] mergeColumeIndex = {0,1,2,3,4,5,6,7,8,9};
            // 从第二行后开始合并
            int mergeRowIndex = 2;
            EasyExcel.write(response.getOutputStream(), ResItemExcelVo.class)
                    .sheet("第一页")
                    // .registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumeIndex))
                    .registerWriteHandler(new ExcelMergeUtil(mergeRowIndex, mergeColumeIndex))
                    .doWrite(voList);
            writer.finish();
            output.flush();
        }

     导出的效果excel ,我是通过序号相同合并

    导出的数据类似

    序号日志名称日志时间字段名字段描述字段值
    1根据ID查询详情2021-01-13total总数25
    1根据ID查询详情2021-01-13total总数25
    1根据ID查询详情2021-01-13total总数25
    2获取日志列表2021-01-12logName日志名称查询
    2获取日志列表2021-01-12logTime日志时间2021-10-01 14:25:14
    2获取日志列表2021-01-12logUser查询人姓名王杰
    3查询用户信息2021-01-11userName用户名tqf_123
    3查询用户信息2021-01-11age年龄25
    3查询用户信息2021-01-11sex性别(0-男,1-女,2-未知)0
    更多相关内容
  • 在jsp、html页面中实现table表格按列合并相同数据单元格代码,可实现功能为:在一个table表格中,合并指定列中所有相同数据相邻行单元格内容。
  • table数据相同时合并单元格,原理:逐行进行比较,相同时隐藏第二行,对第一行添加rowspan 【table数据相同时合并单元格,原理:逐行进行比较,相同时隐藏第二行,对第一行添加rowspan】
  • using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using OpenXML.Model;... //表格数据 public static List<List>> _tabData; public Program
  • spreadjs_包含合并单元格数据绑定-demo
  • Labview 合并Excel多单元格 1-可合并表头,多方面合并,与手工操作一致,批量执行
  • easyExcel 2.1.7 poi 3.17 springboot 2.2.5 lombok 1.18.12
  • easyExcel导出合并单元格策略 WriteSheet writeSheet = EasyExcel.writerSheet(i, "Sheet" + (i + 1)) .registerWriteHandler(new CustomCellWriteHandler()) //设置合并单元格策略 .registerWriteHandler(new ...
  • el-element中el-table合并单元格 合并列。无限制列合并。通过循环数据数据获取该列需要合并的行数。
  • poi获取exccel有合并单元格数据,存入List
  • easyexcel处理合并单元格数据

    千次阅读 2022-07-01 14:55:38
    easyexcel处理excel合并单元格,将所有合并单元格填充对应数据

    一、背景

    一次工作任务是要解析excel数据,采用阿里的 easyexcel 工具进行解析,由于表格有合并单元格,但是 easyexcel 读取合并单元格只会读取一次,导致下面单元格数据为空,这样会影响有层级数据的识别,所以需要将合并单元格都填充上数据。由于我的excel列数是变化的,所以无法采用对象映射,获取出来的数据也是 List<Map<Integer, String>> 类型,废话不多说请看下面。

    二、解决

    2.0 先看一下处理结果

    在这里插入图片描述

    解析到一条数据:{"0":"*应用名称","1":"应用编码","2":"*一级菜单","3":"菜单编码","4":"*二级菜单","5":"菜单编码","6":"*功能菜单","7":"菜单编码","8":"功能角色1","9":"功能角色2","10":"功能角色3"}
    解析到一条数据:{"0":"测试应用11","6":"全量","8":"√","10":"√"}
    解析到一条数据:{"0":"测试应用22","2":"一级菜单1","4":"二级菜单1","6":"功能菜单1","8":"√","10":"√"}
    解析到一条数据:{"6":"功能菜单2","9":"√","10":"√"}
    解析到一条数据:{"6":"功能菜单3","10":"√"}
    解析到一条数据:{"4":"二级菜单2","6":"功能菜单4","8":"√","10":"√"}
    解析到一条数据:{"6":"功能菜单5","9":"√","10":"√"}
    解析到一条数据:{"2":"一级菜单2","4":"二级菜单3","6":"功能菜单6","8":"√","10":"√"}
    解析到一条数据:{"6":"功能菜单7","9":"√","10":"√"}
    解析到一条数据:{"6":"功能菜单8","9":"√","10":"√"}
    解析到一条数据:{"0":"测试应用33","2":"一级菜单3","6":"全量","8":"√","10":"√"}
    解析到一条数据:{"2":"一级菜单4","6":"全量","10":"√"}
    解析到一条数据:{"2":"一级菜单5","6":"全量","9":"√","10":"√"}
    解析到一条数据:{"2":"一级菜单6","6":"全量","9":"√","10":"√"}
    
    处理后数据:{"0":"*应用名称","1":"应用编码","2":"*一级菜单","3":"菜单编码","4":"*二级菜单","5":"菜单编码","6":"*功能菜单","7":"菜单编码","8":"功能角色1","9":"功能角色2","10":"功能角色3"}
    处理后数据:{"0":"测试应用11","6":"全量","8":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单1","4":"二级菜单1","6":"功能菜单1","8":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单1","4":"二级菜单1","6":"功能菜单2","9":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单1","4":"二级菜单1","6":"功能菜单3","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单1","4":"二级菜单2","6":"功能菜单4","8":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单1","4":"二级菜单2","6":"功能菜单5","9":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单2","4":"二级菜单3","6":"功能菜单6","8":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单2","4":"二级菜单3","6":"功能菜单7","9":"√","10":"√"}
    处理后数据:{"0":"测试应用22","2":"一级菜单2","4":"二级菜单3","6":"功能菜单8","9":"√","10":"√"}
    处理后数据:{"0":"测试应用33","2":"一级菜单3","6":"全量","8":"√","10":"√"}
    处理后数据:{"0":"测试应用33","2":"一级菜单4","6":"全量","10":"√"}
    处理后数据:{"0":"测试应用33","2":"一级菜单5","6":"全量","9":"√","10":"√"}
    处理后数据:{"0":"测试应用33","2":"一级菜单6","6":"全量","9":"√","10":"√"}
    

    2.1 引入easyexcel依赖

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

    2.1 创建EasyExcelListener类

    @Slf4j
    public class EasyExcelListener extends AnalysisEventListener<Map<Integer, String>> {
        /**
         * 数据
         */
        List<Map<Integer, String>> dataList = new ArrayList<>();
        /**
         * 正文起始行
         */
        private Integer headRowNumber;
        /**
         * 合并单元格
         */
        private List<CellExtra> extraMergeInfoList = new ArrayList<>();
    
        public EasyExcelListener(Integer headRowNumber) {
            this.headRowNumber = headRowNumber;
        }
    
        @Override
        public void invoke(Map<Integer, String> data, AnalysisContext context) {
            log.info("解析到一条数据:{}", JSON.toJSONString(data));
            dataList.add(data);
        }
    
        /**
         * 读取额外信息:合并单元格
         */
        @Override
        public void extra(CellExtra extra, AnalysisContext context) {
            log.info("读取到了一条额外信息:{}", JSON.toJSONString(extra));
            switch (extra.getType()) {
                case MERGE: {
                    if (extra.getRowIndex() >= headRowNumber) {
                        extraMergeInfoList.add(extra);
                    }
                    break;
                }
                default: break;
            }
        }
    
        @Override
        public void doAfterAllAnalysed(AnalysisContext analysisContext) {
            log.info("所有数据解析完成!");
        }
    
        /**
         * 返回解析出来的List
         */
        public List<Map<Integer, String>> getData() {
            return dataList;
        }
    
        /**
         * 返回解析出来的合并单元格List
         */
        public List<CellExtra> getExtraMergeInfoList() {
            return extraMergeInfoList;
        }
    }
    

    2.2 创建EasyExcelHelper类

    @Slf4j
    public class EasyExcelHelper<T> {
        /**
         * 返回解析后的List
         *
         * @param: fileName 文件名
         * @param: clazz Excel对应属性名
         * @param: sheetNo 要解析的sheet
         * @param: headRowNumber 正文起始行
         * @return java.util.List<T> 解析后的List
         */
        public List<Map<Integer, String>> getList(InputStream inputStream, Integer sheetNo, Integer headRowNumber) {
            EasyExcelListener listener = new EasyExcelListener(headRowNumber);
            try {
                EasyExcelFactory.read(inputStream, listener)
                        .excelType(ExcelTypeEnum.XLSX)
                        .extraRead(CellExtraTypeEnum.MERGE)
                        .sheet(sheetNo)
                        .headRowNumber(headRowNumber)
                        .doRead();
            } catch (Exception e) {
                log.error(e.getMessage());
            }
            List<CellExtra> extraMergeInfoList = listener.getExtraMergeInfoList();
            if (CollectionUtils.isEmpty(extraMergeInfoList)) {
                return listener.getData();
            }
            List<Map<Integer, String>> data = explainMergeData(listener.getData(), extraMergeInfoList, headRowNumber);
            return data;
        }
    
        /**
         * 处理合并单元格
         *
         * @param data               解析数据
         * @param extraMergeInfoList 合并单元格信息
         * @param headRowNumber      起始行
         * @return 填充好的解析数据
         */
        private List<Map<Integer, String>> explainMergeData(List<Map<Integer, String>> data, List<CellExtra> extraMergeInfoList, Integer headRowNumber) {
            //循环所有合并单元格信息
            extraMergeInfoList.forEach(cellExtra -> {
                int firstRowIndex = cellExtra.getFirstRowIndex() - headRowNumber;
                int firstColumnIndex = cellExtra.getFirstColumnIndex();
                int lastRowIndex = cellExtra.getLastRowIndex() - headRowNumber;
                int lastColumnIndex = cellExtra.getLastColumnIndex();
                // 获取初始值
                String initValue = getInitValueFromList(firstRowIndex, firstColumnIndex, data);
                // 设置值
                for (int i = firstRowIndex; i <= lastRowIndex; i++) {
                    for (int j = firstColumnIndex; j <= lastColumnIndex; j++) {
                        setInitValueToList(initValue, i, j, data);
                    }
                }
            });
            return data;
        }
    
        /**
         * 设置合并单元格的值
         *
         * @param filedValue  值
         * @param rowIndex    行
         * @param columnIndex 列
         * @param data        解析数据
         */
        public void setInitValueToList(String filedValue, Integer rowIndex, Integer columnIndex, List<Map<Integer, String>> data) {
            Map<Integer, String> object = data.get(rowIndex);
            object.put(columnIndex, String.valueOf(filedValue));
        }
    
        /**
         * 获取合并单元格的初始值
         * rowIndex对应list的索引
         * columnIndex对应实体内的字段
         *
         * @param firstRowIndex    起始行
         * @param firstColumnIndex 起始列
         * @param data             列数据
         * @return 初始值
         */
        private String getInitValueFromList(Integer firstRowIndex, Integer firstColumnIndex, List<Map<Integer, String>> data) {
            String filedValue = null;
            Map<Integer, String> object = data.get(firstRowIndex);
            for (Map.Entry<Integer, String> entry : object.entrySet()) {
                if (entry.getKey().equals(firstColumnIndex)) {
                    filedValue = entry.getValue();
                    break;
                }
            }
            return filedValue;
        }
    }
    

    2.3 测试使用

    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Boolean uploadAuthTemplate(@RequestPart("file") MultipartFile file) {
    	EasyExcelHelper<Map<Integer, String>> helper = new EasyExcelHelper<>();
    	// 参数 文件流,sheet页号,头行号
        List<Map<Integer, String>> listData = helper.getList(file.getInputStream(), 0, 1);
        log.info(JSON.toJSONString(listData));
        return true;
    }
    

    三、结语

    万般皆下品,唯有技术和远方。。。愿君有所收获。。。

    展开全文
  • 动态生成表格,并自动合并相同单元格插件,可在bootstrapTable子表使用
  • 主要介绍了jQuery实现合并表格单元格中相同行操作,结合实例形式分析了jQuery针对table表格实现单元格合并的相关操作技巧,需要的朋友可以参考下
  • jxls2.0支持合并单元格

    2019-02-19 19:04:20
    jxls2.0支持合并单元格合并单元格模板写入数据,jar包里已经包含了pom.xml,可以自行解压方便上传到maven私服,这种方式会带上依赖,否则要一个个手动添加依赖.pom在jar包里jxls-core\2.0\jxls-core-2.0\META-INF\...
  • demo实例 合并紧挨着的 单元格 通过js实现 希望对大家有帮助
  • layui table合并单元格.zip 跨行自动合并单元格
  • 主要介绍了vue 中 elment-ui table合并上下两行相同数据单元格,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 主要为大家详细介绍了bootstrap table实现合并单元格效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要根据A列的值,合并B、C列的对应单元格 pandas中的to_excel方法只能对索引进行合并,而xlsxwriter中,虽然提供有...
  • 对于合并单元格的excel,分页打印时,列单元格的内容可能只显示在第二页,显示格式不友好。针对这一问题,对每一页的列单元格需要分别进行合并操作。附件中的vba代码就解决了这个问题。把代码复制到宏,运行即可。
  • 今天跟大家分享一下Excel如何将合并单元格后面的数据合并 1.打开Excel文件 2.选中合并单元格区域 3.点击下图选项(Excel工具箱,百度即可了解详细下载安装信息,本文这里就不做详细解说。) ...

    今天跟大家分享一下Excel如何将合并单元格后面的数据合并

    1.打开Excel文件

    2.选中合并单元格区域

    3.点击下图选项(Excel工具箱,百度即可了解详细下载安装信息,本文这里就不做详细解说。)

    4.单击【合并转换】,选择【合并其它列】

    5.在要合并的列内录入F

    6.单击【换行符连接】,点击【确定】

    7.设置完成,结果如下图

    展开全文
  • 动态合并单元格

    2018-01-08 21:22:39
    用JS动态合并单元格算法,利用一个结果集List来生成,数据过多会加重客户断负担 --%> ${status.index>=tempEnd}"> <c:set var="rowspanCount" value="0"></c:set>清楚历史数据 --%> ${list}" varStatus="status2...
  • 数据进行处理,写了一个getSpanData通用方法。 用api中提供的span-method方法。 span-method方法用法: 通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列...
  • 在WPS表格中,我们经常会用到合并单元格。在很多情况下,使用合并单元格会使表格更加醒目、条理。但你遇到过提取合并单元格的数据的问题吗?...由于合并单元格只保留最上方的单元格数据。所以在目标表格“姓名”列应...

    在WPS表格中,我们经常会用到合并单元格。在很多情况下,使用合并单元格会使表格更加醒目、条理。但你遇到过提取合并单元格的数据的问题吗?如图1所示,左侧为某位老师辛辛苦苦建立的学生成绩汇总表,郁闷的是现在需要根据这张表还原学生在两次考试中的成绩(图1右侧)。

    d66fea0cf5ef4582a21f50ed1031e8fd.png

    图1

    一、提取合并单元格中的姓名

    观察原始表发现,每一姓名均为6个单元格合并而成。由于合并单元格只保留最上方的单元格数据。所以在目标表格“姓名”列应依次引用B3、B9、B15、……单元格数据。看这行数,这不就是高中时学过的那个等差数列嘛。

    由此就容易得到规律:J列单元格的当前行数乘6再减去21即B列姓名相应单元格行数。

    即J4=B(6*4-21),J5=B(6*5-21)。

    在WPS表格公式可是选择使用“INDIRECT”函数。它可以返回指定单元格的数据再配合“ROW()”函数获取当前行数。

    在J4单元格中输入公式“=INDIRECT("B"&(6*ROW()-21))”,向下拖动填充句柄至最后行(图2)。

    794dc2735de380e509f871e36b8b82a8.png

    图2

    二、提取合并单元格中的对应数据

    各位同学的语文成绩位于D3、D9、D15、……单元格,与姓名位于同一行,所以,只需要把上面的公式稍加改造即可。在K4单元格输入公式

    =INDIRECT("D"&(6*ROW()-21))

    再拖动句柄复制公式。

    然后在Q4单元格输入公式

    =INDIRECT("F"&(6*ROW()-21))

    再向下复制公式即可。比较公式即可知道,只是“D”与“F”的区别(图3)。

    befa03a47b1d06045d22c360d5092b2a.png

    图3

    语文成绩提取出来了,那其它几科也就容易了。以期中考试成绩为例。数学成绩比语文成绩下移了一行,所以:

    L4单元格公式应为“=INDIRECT("D"&(6*ROW()-20))“

    英语科:M4单元格公式应为“=INDIRECT("D"&(6*ROW()-19))”

    物理科:M4单元格公式应为“=INDIRECT("D"&(6*ROW()-18))”

    化学科:M4单元格公式应为“=INDIRECT("D"&(6*ROW()-17))”

    N4单元格公式则为“=INDIRECT("D"&(6*ROW()-16))”。

    然后向下填充公式后效果(图4)。

    9c53030e034a132d50ba2d4d6b2c9e55.png

    图4

    至于期末成绩,只需要将相应科目公式中的“D”改为“F”就行了。至此,任务完成。

    展开全文
  • 主要介绍了Python基于xlrd模块处理合并单元格,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 用表格进行页面布局,页面布局在各种浏览器的的兼容性, 都非常好, 而在react中使用表格布局, 合并单元格的写法比较特殊, 博主查了很久才找到正确的写法, 在这里分享一下 效果图 源码 react组件文件 import React, {...
  • 主要是对jquery合并内容相同的单元格示例代码进行了介绍。需要的朋友可以过来参考下,希望对大家有所帮助
  • 本代码是将layui的单元格进行合并,通过js的方式,动态根据表格的数据进行rowspan赋值,并展现合并后的表格
  • 支持大数据量导出excel。自动合并相同数据单元格,可根据id自动识别是否合并,支持自定义类型数据转换,根据实体类自动识别。
  • 需求:表格实现跨行合并,并且在合并完的单元格中显示图片 效果图: 源码: export default { data() { return { pic95: require('@/assets/produit/95.png'), pic99: require('@/assets/produit/99.png'), ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 60,086
精华内容 24,034
关键字:

如何计算合并后的单元格数据