easypoi excel:Cannot add merged region X to sheet because it overlaps with an existing merged region
easypoi先介绍导入的pom文件的依赖版本:
<dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>4.1.0</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>4.1.0</version></dependency>
我们使用wps导入excel的时候,是没有这个错误的。但是当使用的是office excel的时候就会导致文件的格式会发生变化,如下图:
可以看到一行的数据,占了好多行。针对这种数据,使用
ExcelImportUtil.importExcelMore(inputStream, pojoClass, params);
是导入不进去的,会报错:Cannot add merged region T485:T499 to sheet because it overlaps with an existing merged region (T482:T485)."
那么应该咋修改呢?
ExcelImportUtil.importExcel(inputStream, pojoClass, params);
使用这个方法,就可以避免。但是我们又想保留导入的正确的数据和错误的数据,但是importExcel这个方法的返回值是List<T>
public static <T> List<T> importExcel(InputStream inputstream, Class<?> pojoClass, ImportParams params) throws Exception {return (new ExcelImportService()).importExcelByIs(inputstream, pojoClass, params, false).getList();}public static <T> ExcelImportResult<T> importExcelMore(InputStream inputstream, Class<?> pojoClass, ImportParams params) throws Exception {return (new ExcelImportService()).importExcelByIs(inputstream, pojoClass, params, true);}
那么应该咋办呢?如下代码:
public static <T> ExcelImportResult<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {if (inputStream == null) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);
// params.setSaveUrl("/excel/");params.setNeedSave(false);params.setNeedVerify(needVerfiy);params.setStartSheetIndex(1);try {
// return ExcelImportUtil.importExcelMore(inputStream, pojoClass, params);return (new ExcelImportService()).importExcelByIs(inputStream, pojoClass, params, false);} catch (NoSuchElementException e) {throw new IOException("excel文件不能为空");} catch (Exception e) {throw new IOException(e.getMessage());}}
needMore设置为false即可。
源码:
while(true) {if (i >= params.getStartSheetIndex() + params.getSheetNum()) {if (params.isNeedSave()) {this.saveThisExcel(params, pojoClass, isXSSFWorkbook, book);}importResult.setList(result);if (!needMore) {break;}ByteArrayInputStream successIs = new ByteArrayInputStream(baos.toByteArray());try {Workbook successBook = WorkbookFactory.create(successIs);importResult.setWorkbook(this.removeSuperfluousRows(successBook, this.failRow, params));importResult.setFailWorkbook(this.removeSuperfluousRows(book, this.successRow, params));importResult.setFailList(this.failCollection);importResult.setVerfiyFail(this.verifyFail);break;} finally {successIs.close();}}
就到这吧。
我自己的代码,结合了导入正确的数据和错误的数据,并且报出来哪一行错误。记录一下,与人方便。
//easypoi解析excel得到成功的集合和失败的集合Map<String, String> map = new HashMap<>();ExcelImportResult<UploadDataVo> result = ExcelUtils.importExcel(file, 0, 1, true, UploadDataVo.class);List<UploadDataVo> uploadDataVos = result.getList();List<UploadDataVo> failList = result.getFailList()==null?new ArrayList<UploadDataVo>():result.getFailList();ArrayList<Integer> objects = Lists.newArrayList();if (CollectionUtil.isNotEmpty(failList)) {failList.forEach(uploadDataVo -> {objects.add(uploadDataVo.getRowNum());});String collect = failList.stream().map(x -> x.getErrorMsg()).collect(Collectors.joining(","));map.put("message", "提示:" + collect);map.put("fail", "异常数据行号:" + JSONUtil.toJsonStr(objects));}map.put("total", "本次导入共" + (uploadDataVos.size() + failList.size()) + "条数据");map.put("success", "导入成功" + uploadDataVos.size() + "条数据");
@Data
@EqualsAndHashCode
public class UploadDataVo implements IExcelDataModel, IExcelModel , Serializable {private static final long serialVersionUID = 1L;/*** 行号*/private int rowNum;/*** 错误消息*/private String errorMsg;@Excel(name="产品编码")@NotEmpty(message = "[产品编码]不能为空")private String productCode;
}
工具类:
public class ExcelUtils {/*** excel 导出** @param list 数据* @param title 标题* @param sheetName sheet名称* @param pojoClass pojo类型* @param fileName 文件名称* @param isCreateHeader 是否创建表头* @param response*/public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException {ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);exportParams.setCreateHeadRows(isCreateHeader);defaultExport(list, pojoClass, fileName, response, exportParams);}/*** excel 导出** @param list 数据* @param title 标题* @param sheetName sheet名称* @param pojoClass pojo类型* @param fileName 文件名称* @param response*/public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));}/*** excel 导出** @param list 数据* @param pojoClass pojo类型* @param fileName 文件名称* @param response* @param exportParams 导出参数*/public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException {defaultExport(list, pojoClass, fileName, response, exportParams);}/*** excel 导出** @param list 数据* @param fileName 文件名称* @param response*/public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {defaultExport(list, fileName, response);}/*** 默认的 excel 导出** @param list 数据* @param pojoClass pojo类型* @param fileName 文件名称* @param response* @param exportParams 导出参数*/private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);downLoadExcel(fileName, response, workbook);}/*** 默认的 excel 导出** @param list 数据* @param fileName 文件名称* @param response*/private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);downLoadExcel(fileName, response, workbook);}/*** 下载** @param fileName 文件名称* @param response* @param workbook excel数据*/private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {try {response.setCharacterEncoding("UTF-8");response.setHeader("content-Type", "application/vnd.ms-excel");response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));workbook.write(response.getOutputStream());} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** @param filePath excel文件路径* @param titleRows 标题行* @param headerRows 表头行* @param pojoClass pojo类型* @param <T>* @return*/public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {if (StringUtils.isBlank(filePath)) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);params.setNeedSave(true);params.setSaveUrl("/excel/");try {return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);} catch (NoSuchElementException e) {throw new IOException("模板不能为空");} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** @param file excel文件* @param pojoClass pojo类型* @param <T>* @return*/public static <T> ExcelImportResult<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {return importExcel(file, 1, 1, pojoClass);}/*** excel 导入** @param file excel文件* @param titleRows 标题行* @param headerRows 表头行* @param pojoClass pojo类型* @param <T>* @return*/public static <T> ExcelImportResult<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {return importExcel(file, titleRows, headerRows, false, pojoClass);}/*** excel 导入** @param file 上传的文件* @param titleRows 标题行* @param headerRows 表头行* @param needVerfiy 是否检验excel内容* @param pojoClass pojo类型* @param <T>* @return*/public static <T> ExcelImportResult<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {if (file == null) {return null;}try {return importExcel(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);} catch (Exception e) {throw new IOException(e.getMessage());}}/*** excel 导入** @param inputStream 文件输入流* @param titleRows 标题行* @param headerRows 表头行* @param needVerfiy 是否检验excel内容* @param pojoClass pojo类型* @param <T>* @return*/public static <T> ExcelImportResult<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {if (inputStream == null) {return null;}ImportParams params = new ImportParams();params.setTitleRows(titleRows);params.setHeadRows(headerRows);
// params.setSaveUrl("/excel/");params.setNeedSave(false);params.setNeedVerify(needVerfiy);params.setStartSheetIndex(1);try {
// return ExcelImportUtil.importExcelMore(inputStream, pojoClass, params);return (new ExcelImportService()).importExcelByIs(inputStream, pojoClass, params, false);} catch (NoSuchElementException e) {throw new IOException("excel文件不能为空");} catch (Exception e) {throw new IOException(e.getMessage());}}/*** Excel 类型枚举*/enum ExcelTypeEnum {XLS("xls"), XLSX("xlsx");private String value;ExcelTypeEnum(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}
}
easypoi excel:Cannot add merged region X to sheet because it overlaps with an existing merged region相关推荐
- 最简单的Excel导出(EasyPOI) 支持简单合并单元格,多Sheet
1.介绍 Easy POI :http://easypoi.mydoc.io/ 特点: 1.设计精巧,使用简单 2.接口丰富,扩展简单 3.默认值多,write less do more 4.spri ...
- Easypoi Excel模板功能简要说明
Easypoi Excel使用模板功能简要说明 该文章内容基于easypoi官方文档整理,对一些内容增加了更直白清晰的内容说明. jdk版本:1.8+ easypoi依赖版本:3.0+ 1.模板 指令 ...
- 创建Excel:基于POI+注解实现
创建Excel:基于POI+注解实现 目标 思路 结构体生成Excel效果图 annotation Domain exception(非必需) util Demo 目标 其实网上已经有很多excel相 ...
- springboot + 若依 ruoyi + easypoi excel的导入导出(带图片)
springboot + 若依 ruoyi + easypoi excel的导入导出(带图片) 一.官方文档 gitee地址 官方文档 二.快速开始 1.导入 引入依赖 <dependency& ...
- Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略
Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略 目录 利用Excel自带筛选功能统计各个字段不同类别及其个 ...
- Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略
Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略 目录 Excel使用技巧经验总结 将pandas.DataF ...
- Excel:解决Excel表格每一行所有字段在一个单元格的情况
Excel:解决Excel表格每一行所有字段在一个单元格的情况 目录 解决问题 解决办法 解决问题 Excel表格每一行所有字段在一个单元格的情况 解决办法 哈哈,大功告成!
- Excel:利用Excel内置功能实现对某列表格按照条件进行升降序排列
Excel:利用Excel内置功能实现对某列表格按照条件进行升降序排列 目录 实现功能 实现方法 实现功能 利用Excel内置功能实现对某列表格按照设置条件进行升降序排列 实现方法
- 关于mysql数据库的外键插入报错:Cannot add or update a child row: a foreign key constraint fails,完整性问题
关于mysql的外键插入报错:Cannot add or update a child row: a foreign key constraint fails..... 首先确定sql语句的正确 然后 ...
- 如何处理Docker错误消息:please add——insecure-registry
本地安装Kubernetes时,遇到如下的错误消息: pleade add --insecure-registry gcr.io to daemon's arguments 解决方案:点击Docker ...
最新文章
- 有哪些简单易用的高效办公工具?
- Pytorch-nn.BatchNorm2d()
- 使用java.util.concurrent包处理多线程
- C++ socket 通信客户端和服务器端
- python数列分段_按范围分段的Python数组
- mysql中交集,并集,差集,左连接,右连接
- LINUX编译libusb
- php 加密解密算法
- POJ 2409 Let it Bead(Polya简单应用)
- Android系统源码目录解析
- smp irq affinity介绍
- 利用百度API进行淘宝评论关键词提取
- 移动互联网创业团队开发管理经验
- android button 图片与文字一起
- html中的div是什么意思?
- ChatGPT 如何获取API Key
- layui.table(表格)跨页多选
- JDK、JER、JVM三者间的联系与区别
- php共享汽车怎么扫码开车,共享汽车套路真多!看完恍然大悟
- 计算机怎么c盘一键还原,电脑怎么一键还原的操作方法详解
热门文章
- 数据结构之线性表,这一篇就够了,吐血总结,建议收藏~~
- win10如何切换计算机用户,Windows10系统下切换用户的多种技巧
- 诺基亚培育低端机市场 迂回战术威胁中华酷联
- #读源码+论文# 三维点云分割Deep Learning Based Semantic Labelling of 3D Point Cloud in Visual SLAM
- ELK日志分析系统理论加实操演练!!
- 数据库事务(Transaction)详解
- 天翎BPM流程引擎助力打造流程服务中台
- 笔记本CPU处理器HQ,H,U,M,型号之间的区别
- 密西根州立大学计算机qs分数,2020年密歇根州立大学QS世界排名
- Python爬虫爬取豆瓣TOP250