-
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-13 total 总数 25 1 根据ID查询详情 2021-01-13 total 总数 25 1 根据ID查询详情 2021-01-13 total 总数 25 2 获取日志列表 2021-01-12 logName 日志名称 查询 2 获取日志列表 2021-01-12 logTime 日志时间 2021-10-01 14:25:14 2 获取日志列表 2021-01-12 logUser 查询人姓名 王杰 3 查询用户信息 2021-01-11 userName 用户名 tqf_123 3 查询用户信息 2021-01-11 age 年龄 25 3 查询用户信息 2021-01-11 sex 性别(0-男,1-女,2-未知) 0 更多相关内容 -
table表格按列合并相同数据行单元格代码
2020-07-13 14:47:00在jsp、html页面中实现table表格按列合并相同数据行单元格代码,可实现功能为:在一个table表格中,合并指定列中所有相同数据相邻行单元格内容。 -
table数据相同合并单元格
2019-12-30 00:00:34table数据相同时合并单元格,原理:逐行进行比较,相同时隐藏第二行,对第一行添加rowspan 【table数据相同时合并单元格,原理:逐行进行比较,相同时隐藏第二行,对第一行添加rowspan】 -
OpenXml合并Table单元格代码实例
2020-12-31 21:10:19using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using OpenXML.Model;... //表格数据 public static List<List>> _tabData; public Program -
spreadjs_包含合并单元格的数据绑定-demo.zip
2021-09-09 13:33:33spreadjs_包含合并单元格的数据绑定-demo -
Labview 合并Excel多单元格
2022-03-25 09:36:02Labview 合并Excel多单元格 1-可合并表头,多方面合并,与手工操作一致,批量执行 -
利用easyExcel导出上万条数据,自定义策略合并单元格
2020-12-04 12:45:30easyExcel 2.1.7 poi 3.17 springboot 2.2.5 lombok 1.18.12 -
easyExcel导出合并单元格策略
2021-12-21 17:12:32easyExcel导出合并单元格策略 WriteSheet writeSheet = EasyExcel.writerSheet(i, "Sheet" + (i + 1)) .registerWriteHandler(new CustomCellWriteHandler()) //设置合并单元格策略 .registerWriteHandler(new ... -
el-table合并列 合并单元格
2020-09-03 10:01:39el-element中el-table合并单元格 合并列。无限制列合并。通过循环数据源数据获取该列需要合并的行数。 -
poi获取exccel有合并单元格的数据
2016-08-14 13:06:06poi获取exccel有合并单元格的数据,存入List -
easyexcel处理合并单元格数据
2022-07-01 14:55:38easyexcel处理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; }
三、结语
万般皆下品,唯有技术和远方。。。愿君有所收获。。。
-
js自动合并相同单元格Demo
2018-02-11 14:05:59动态生成表格,并自动合并相同单元格插件,可在bootstrapTable子表使用 -
jQuery实现合并表格单元格中相同行操作示例
2020-10-17 11:46:15主要介绍了jQuery实现合并表格单元格中相同行操作,结合实例形式分析了jQuery针对table表格实现单元格合并的相关操作技巧,需要的朋友可以参考下 -
jxls2.0支持合并单元格
2019-02-19 19:04:20jxls2.0支持合并单元格和合并单元格模板写入数据,jar包里已经包含了pom.xml,可以自行解压方便上传到maven私服,这种方式会带上依赖,否则要一个个手动添加依赖.pom在jar包里jxls-core\2.0\jxls-core-2.0\META-INF\... -
js合并单元格 相同内容的单元格合并
2018-02-08 10:02:24demo实例 合并紧挨着的 单元格 通过js实现 希望对大家有帮助 -
layui table合并单元格.zip
2021-01-06 14:49:13layui table合并单元格.zip 跨行自动合并单元格 -
vue 中 elment-ui table合并上下两行相同数据单元格
2020-10-15 20:10:54主要介绍了vue 中 elment-ui table合并上下两行相同数据单元格,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下 -
bootstrap table实现合并单元格效果
2020-10-17 14:40:08主要为大家详细介绍了bootstrap table实现合并单元格效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
python之DataFrame实现excel合并单元格
2020-12-23 18:56:44在工作中经常遇到需要将数据输出到excel,且需要对其中一些单元格进行合并,比如如下表表格,需要根据A列的值,合并B、C列的对应单元格 pandas中的to_excel方法只能对索引进行合并,而xlsxwriter中,虽然提供有... -
excel合并列单元格数据分页打印格式设置
2012-12-07 14:54:21对于合并列单元格的excel,分页打印时,列单元格的内容可能只显示在第二页,显示格式不友好。针对这一问题,对每一页的列单元格需要分别进行合并操作。附件中的vba代码就解决了这个问题。把代码复制到宏,运行即可。 -
Excel如何将合并单元格后面的数据合并
2021-09-12 17:48:19今天跟大家分享一下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... -
element实现合并单元格通用方法
2020-12-13 21:15:03对数据进行处理,写了一个getSpanData通用方法。 用api中提供的span-method方法。 span-method方法用法: 通过给table传入span-method方法可以实现合并行或列,方法的参数是一个对象,里面包含当前行row、当前列... -
巧妙提取合并单元格及对应单元格数据
2021-06-12 17:34:21在WPS表格中,我们经常会用到合并单元格。在很多情况下,使用合并单元格会使表格更加醒目、条理。但你遇到过提取合并单元格的数据的问题吗?...由于合并单元格只保留最上方的单元格数据。所以在目标表格“姓名”列应...在WPS表格中,我们经常会用到合并单元格。在很多情况下,使用合并单元格会使表格更加醒目、条理。但你遇到过提取合并单元格的数据的问题吗?如图1所示,左侧为某位老师辛辛苦苦建立的学生成绩汇总表,郁闷的是现在需要根据这张表还原学生在两次考试中的成绩(图1右侧)。
图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)。
图2
二、提取合并单元格中的对应数据
各位同学的语文成绩位于D3、D9、D15、……单元格,与姓名位于同一行,所以,只需要把上面的公式稍加改造即可。在K4单元格输入公式
=INDIRECT("D"&(6*ROW()-21))
再拖动句柄复制公式。
然后在Q4单元格输入公式
=INDIRECT("F"&(6*ROW()-21))
再向下复制公式即可。比较公式即可知道,只是“D”与“F”的区别(图3)。
图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)。
图4
至于期末成绩,只需要将相应科目公式中的“D”改为“F”就行了。至此,任务完成。
-
Python基于xlrd模块处理合并单元格
2020-09-16 11:18:28主要介绍了Python基于xlrd模块处理合并单元格,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
详解React中合并单元格的正确写法
2021-01-21 12:37:40用表格进行页面布局,页面布局在各种浏览器的的兼容性, 都非常好, 而在react中使用表格布局, 合并单元格的写法比较特殊, 博主查了很久才找到正确的写法, 在这里分享一下 效果图 源码 react组件文件 import React, {... -
jquery 合并内容相同的单元格(示例代码)
2020-10-26 13:12:24主要是对jquery合并内容相同的单元格示例代码进行了介绍。需要的朋友可以过来参考下,希望对大家有所帮助 -
layui合并单元格js代码.txt
2019-12-10 18:46:08本代码是将layui的单元格进行合并,通过js的方式,动态根据表格的数据进行rowspan赋值,并展现合并后的表格 -
导出自动合并单元格.java
2020-06-17 11:19:35支持大数据量导出excel。自动合并相同数据单元格,可根据id自动识别是否合并,支持自定义类型数据转换,根据实体类自动识别。 -
antd vue table跨行合并单元格,并且自定义内容实例
2021-01-18 21:01:21需求:表格实现跨行合并,并且在合并完的单元格中显示图片 效果图: 源码: export default { data() { return { pic95: require('@/assets/produit/95.png'), pic99: require('@/assets/produit/99.png'), ...