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相关推荐

  1. 最简单的Excel导出(EasyPOI) 支持简单合并单元格,多Sheet

    1.介绍 Easy POI :http://easypoi.mydoc.io/ 特点: 1.设计精巧,使用简单 2.接口丰富,扩展简单 3.默认值多,write less do more 4.spri ...

  2. Easypoi Excel模板功能简要说明

    Easypoi Excel使用模板功能简要说明 该文章内容基于easypoi官方文档整理,对一些内容增加了更直白清晰的内容说明. jdk版本:1.8+ easypoi依赖版本:3.0+ 1.模板 指令 ...

  3. 创建Excel:基于POI+注解实现

    创建Excel:基于POI+注解实现 目标 思路 结构体生成Excel效果图 annotation Domain exception(非必需) util Demo 目标 其实网上已经有很多excel相 ...

  4. springboot + 若依 ruoyi + easypoi excel的导入导出(带图片)

    springboot + 若依 ruoyi + easypoi excel的导入导出(带图片) 一.官方文档 gitee地址 官方文档 二.快速开始 1.导入 引入依赖 <dependency& ...

  5. Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略

    Excel:Excel使用技巧经验总结之(利用Excel自带功能统计各个字段不同类别及其个数并进行图表可视化+非编程实现)图文教程之详细攻略 目录 利用Excel自带筛选功能统计各个字段不同类别及其个 ...

  6. Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略

    Excel:python结合Excel使用技巧经验总结之(将python输出的等间隔列数据直接粘贴复制存到物理表格内等)图文教程之详细攻略 目录 Excel使用技巧经验总结 将pandas.DataF ...

  7. Excel:解决Excel表格每一行所有字段在一个单元格的情况

    Excel:解决Excel表格每一行所有字段在一个单元格的情况 目录 解决问题 解决办法 解决问题 Excel表格每一行所有字段在一个单元格的情况 解决办法 哈哈,大功告成!

  8. Excel:利用Excel内置功能实现对某列表格按照条件进行升降序排列

    Excel:利用Excel内置功能实现对某列表格按照条件进行升降序排列 目录 实现功能 实现方法 实现功能 利用Excel内置功能实现对某列表格按照设置条件进行升降序排列 实现方法

  9. 关于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语句的正确 然后 ...

  10. 如何处理Docker错误消息:please add——insecure-registry

    本地安装Kubernetes时,遇到如下的错误消息: pleade add --insecure-registry gcr.io to daemon's arguments 解决方案:点击Docker ...

最新文章

  1. 有哪些简单易用的高效办公工具?
  2. Pytorch-nn.BatchNorm2d()
  3. 使用java.util.concurrent包处理多线程
  4. C++ socket 通信客户端和服务器端
  5. python数列分段_按范围分段的Python数组
  6. mysql中交集,并集,差集,左连接,右连接
  7. LINUX编译libusb
  8. php 加密解密算法
  9. POJ 2409 Let it Bead(Polya简单应用)
  10. Android系统源码目录解析
  11. smp irq affinity介绍
  12. 利用百度API进行淘宝评论关键词提取
  13. 移动互联网创业团队开发管理经验
  14. android button 图片与文字一起
  15. html中的div是什么意思?
  16. ChatGPT 如何获取API Key
  17. layui.table(表格)跨页多选
  18. JDK、JER、JVM三者间的联系与区别
  19. php共享汽车怎么扫码开车,共享汽车套路真多!看完恍然大悟
  20. 计算机怎么c盘一键还原,电脑怎么一键还原的操作方法详解

热门文章

  1. 数据结构之线性表,这一篇就够了,吐血总结,建议收藏~~
  2. win10如何切换计算机用户,Windows10系统下切换用户的多种技巧
  3. 诺基亚培育低端机市场 迂回战术威胁中华酷联
  4. #读源码+论文# 三维点云分割Deep Learning Based Semantic Labelling of 3D Point Cloud in Visual SLAM
  5. ELK日志分析系统理论加实操演练!!
  6. 数据库事务(Transaction)详解
  7. 天翎BPM流程引擎助力打造流程服务中台
  8. 笔记本CPU处理器HQ,H,U,M,型号之间的区别
  9. 密西根州立大学计算机qs分数,2020年密歇根州立大学QS世界排名
  10. Python爬虫爬取豆瓣TOP250